From e1f46225b424cd7dc7d9d2af618eef8a404813ac Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Wed, 28 Sep 2022 15:45:46 +0200 Subject: [PATCH 01/43] Merge pull request #29 from Systemorph/importCeProject Migrate Base code --- Constants/Consts.ipynb | 386 +++ Constants/Enums.ipynb | 269 ++ Constants/Validations.ipynb | 200 ++ DataModel/DataStructure.ipynb | 2139 ++++++++++++ Database/.gitignore | 1 + Database/Configure.ipynb | 131 + Database/Schema Delete.ipynb | 87 + Export/MapTemplate.ipynb | 338 ++ Files/300.ReportingNodes/ReportingNodes.csv | 10 + .../DataNodeParameters_CH_2020_12.csv | 22 + .../DataNodeStates_CH_2020_12.csv | 19 + Files/700.DataNodes/DataNodes_CH.csv | 36 + Files/800.Parameters/CreditDefaultRate.csv | 23 + Files/800.Parameters/ExchangeRate.csv | 14 + Files/800.Parameters/PartnerRating.csv | 4 + Files/800.Parameters/YieldCurve.csv | 11 + .../Actuals_CH_2020_12.csv | 33 + .../Actuals_CH_2021_3.csv | 62 + .../NominalCashflows_CH_2020_12.csv | 85 + .../NominalCashflows_CH_2021_3.csv | 158 + .../Openings_CH_2020_12.csv | 8 + Files/DimensionsAndPartitions.csv | 259 ++ Images/ActualFormat.png | Bin 0 -> 25544 bytes Images/CashflowFormat.png | Bin 0 -> 66204 bytes Images/OpeningFormat.png | Bin 0 -> 19729 bytes Images/SpecificationsCSM.PNG | Bin 0 -> 40913 bytes Images/SpecificationsImportActuals.PNG | Bin 0 -> 12211 bytes Images/SpecificationsImportCashflows.PNG | Bin 0 -> 38471 bytes Images/SpecificationsPL.PNG | Bin 0 -> 79272 bytes Images/Systemorph_logo.png | Bin 0 -> 17061 bytes Import/ImportResultPreview.ipynb | 344 ++ Import/ImportScopeCalculation.ipynb | 2296 +++++++++++++ Import/ImportStorage.ipynb | 387 +++ Import/Importers.ipynb | 1199 +++++++ .../InitSystemorphBaseToMemory.ipynb | 268 ++ Initialization/InitSystemorphToDatabase.ipynb | 314 ++ Initialization/InitSystemorphToMemory.ipynb | 147 + InputFormatDescription.ipynb | 113 + OverviewCalculationEngine.ipynb | 258 ++ Report/ReportConfigurationAndUtils.ipynb | 148 + Report/ReportScopes.ipynb | 1038 ++++++ Report/ReportStorage.ipynb | 241 ++ Report/Reports.ipynb | 516 +++ Test/AocStructureTest.ipynb | 704 ++++ Test/Data/CashflowComplex.csv | 9 + Test/Data/DataNodeParameter_Duplicate.csv | 13 + .../DataNodeParameter_InvalidDataNode.csv | 14 + .../DataNodeParameter_InvalidReinsCov.csv | 12 + .../BM_CH_2020_12_A.csv | 34 + .../BM_CH_2020_12_AA.csv | 8 + .../BM_CH_2020_12_APA.csv | 11 + .../BM_CH_2020_12_BE.csv | 181 + .../BM_CH_2020_12_BEPA.csv | 11 + .../BM_CH_2020_12_C.csv | 40 + .../BM_CH_2020_12_DA.csv | 21 + .../BM_CH_2020_12_F.csv | 17 + .../BM_CH_2020_12_OA.csv | 8 + .../BM_CH_2020_12_RA.csv | 94 + .../IfrsVariableBenchmarks/BM_CH_2021_3_A.csv | 39 + .../BM_CH_2021_3_AA.csv | 26 + .../BM_CH_2021_3_AAPA.csv | 11 + .../BM_CH_2021_3_APA.csv | 11 + .../BM_CH_2021_3_BE.csv | 471 +++ .../BM_CH_2021_3_BEPA.csv | 16 + .../IfrsVariableBenchmarks/BM_CH_2021_3_C.csv | 55 + .../BM_CH_2021_3_DA.csv | 25 + .../IfrsVariableBenchmarks/BM_CH_2021_3_F.csv | 17 + .../IfrsVariableBenchmarks/BM_CH_2021_3_L.csv | 22 + .../BM_CH_2021_3_LR.csv | 13 + .../BM_CH_2021_3_OA.csv | 26 + .../BM_CH_2021_3_OAPA.csv | 11 + .../BM_CH_2021_3_RA.csv | 215 ++ ...ableBenchmarks_2020_12_CH__Contractual.csv | 537 +++ ...iableBenchmarks_2021_3_CH__Contractual.csv | 1113 +++++++ Test/ExportIfrsVariable.ipynb | 124 + Test/ExportReportVariables.ipynb | 186 ++ Test/IfrsVariablesTest.ipynb | 327 ++ Test/ImportStorageTest.ipynb | 707 ++++ Test/MapTemplateAndImportTest.ipynb | 564 ++++ Test/QueriesTest.ipynb | 535 +++ Test/ReportStorageTest.ipynb | 127 + Test/ReportVariablesTest.ipynb | 256 ++ Test/ReportVariablesTestBase.ipynb | 161 + Test/SpecificationsFinancialPerformance.ipynb | 1692 ++++++++++ Test/SpecificationsImportActuals.ipynb | 705 ++++ Test/SpecificationsImportCashflows.ipynb | 2906 +++++++++++++++++ Test/SpecificationsSetup.ipynb | 137 + Test/SpecificationsTechnicalMargin.ipynb | 2576 +++++++++++++++ Test/TechnicalMarginTest.ipynb | 305 ++ Test/Tests.ipynb | 183 ++ Utils/ApplicationMessage.ipynb | 149 + Utils/UtilityMethods.ipynb | 1155 +++++++ 92 files changed, 28144 insertions(+) create mode 100644 Constants/Consts.ipynb create mode 100644 Constants/Enums.ipynb create mode 100644 Constants/Validations.ipynb create mode 100644 DataModel/DataStructure.ipynb create mode 100644 Database/.gitignore create mode 100644 Database/Configure.ipynb create mode 100644 Database/Schema Delete.ipynb create mode 100644 Export/MapTemplate.ipynb create mode 100644 Files/300.ReportingNodes/ReportingNodes.csv create mode 100644 Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv create mode 100644 Files/700.DataNodes/DataNodeStates_CH_2020_12.csv create mode 100644 Files/700.DataNodes/DataNodes_CH.csv create mode 100644 Files/800.Parameters/CreditDefaultRate.csv create mode 100644 Files/800.Parameters/ExchangeRate.csv create mode 100644 Files/800.Parameters/PartnerRating.csv create mode 100644 Files/800.Parameters/YieldCurve.csv create mode 100644 Files/900.TransactionalData/Actuals_CH_2020_12.csv create mode 100644 Files/900.TransactionalData/Actuals_CH_2021_3.csv create mode 100644 Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv create mode 100644 Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv create mode 100644 Files/900.TransactionalData/Openings_CH_2020_12.csv create mode 100644 Files/DimensionsAndPartitions.csv create mode 100644 Images/ActualFormat.png create mode 100644 Images/CashflowFormat.png create mode 100644 Images/OpeningFormat.png create mode 100644 Images/SpecificationsCSM.PNG create mode 100644 Images/SpecificationsImportActuals.PNG create mode 100644 Images/SpecificationsImportCashflows.PNG create mode 100644 Images/SpecificationsPL.PNG create mode 100644 Images/Systemorph_logo.png create mode 100644 Import/ImportResultPreview.ipynb create mode 100644 Import/ImportScopeCalculation.ipynb create mode 100644 Import/ImportStorage.ipynb create mode 100644 Import/Importers.ipynb create mode 100644 Initialization/InitSystemorphBaseToMemory.ipynb create mode 100644 Initialization/InitSystemorphToDatabase.ipynb create mode 100644 Initialization/InitSystemorphToMemory.ipynb create mode 100644 InputFormatDescription.ipynb create mode 100644 OverviewCalculationEngine.ipynb create mode 100644 Report/ReportConfigurationAndUtils.ipynb create mode 100644 Report/ReportScopes.ipynb create mode 100644 Report/ReportStorage.ipynb create mode 100644 Report/Reports.ipynb create mode 100644 Test/AocStructureTest.ipynb create mode 100644 Test/Data/CashflowComplex.csv create mode 100644 Test/Data/DataNodeParameter_Duplicate.csv create mode 100644 Test/Data/DataNodeParameter_InvalidDataNode.csv create mode 100644 Test/Data/DataNodeParameter_InvalidReinsCov.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv create mode 100644 Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv create mode 100644 Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv create mode 100644 Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv create mode 100644 Test/ExportIfrsVariable.ipynb create mode 100644 Test/ExportReportVariables.ipynb create mode 100644 Test/IfrsVariablesTest.ipynb create mode 100644 Test/ImportStorageTest.ipynb create mode 100644 Test/MapTemplateAndImportTest.ipynb create mode 100644 Test/QueriesTest.ipynb create mode 100644 Test/ReportStorageTest.ipynb create mode 100644 Test/ReportVariablesTest.ipynb create mode 100644 Test/ReportVariablesTestBase.ipynb create mode 100644 Test/SpecificationsFinancialPerformance.ipynb create mode 100644 Test/SpecificationsImportActuals.ipynb create mode 100644 Test/SpecificationsImportCashflows.ipynb create mode 100644 Test/SpecificationsSetup.ipynb create mode 100644 Test/SpecificationsTechnicalMargin.ipynb create mode 100644 Test/TechnicalMarginTest.ipynb create mode 100644 Test/Tests.ipynb create mode 100644 Utils/ApplicationMessage.ipynb create mode 100644 Utils/UtilityMethods.ipynb diff --git a/Constants/Consts.ipynb b/Constants/Consts.ipynb new file mode 100644 index 00000000..21850a86 --- /dev/null +++ b/Constants/Consts.ipynb @@ -0,0 +1,386 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "2kYu9e9ygUipdOuqA9Hk6A", + "cell_type": "markdown", + "source": [ + "

Consts

" + ], + "metadata": {} + }, + { + "id": "DmUpa-myfk6s7tnBoktcyw", + "cell_type": "markdown", + "source": [ + "# Numerical Precision" + ], + "metadata": {} + }, + { + "id": "KG3zmL2K_kGTNzWA2eQJvg", + "cell_type": "code", + "source": [ + "public const double Precision = 1E-5;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gMPLPUb7kUiJnLQWtEkkFA", + "cell_type": "code", + "source": [ + "public const double ProjectionPrecision = 1E-3;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gv0HnKTwuU--7Xo8e6UU2w", + "cell_type": "code", + "source": [ + "public const double BenchmarkPrecision = 1E-4;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gbuDd5t2Ike1Jq-lnVVIqg", + "cell_type": "markdown", + "source": [ + "# Time Period" + ], + "metadata": {} + }, + { + "id": "oX6yOw75DE-NwrYkdYTmzg", + "cell_type": "code", + "source": [ + "public const int CurrentPeriod = 0; " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2XFjLebnDEWBoNCyq6lKgg", + "cell_type": "code", + "source": [ + "public const int PreviousPeriod = -1; " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5ydvfd1abEm-CSTH-csz-g", + "cell_type": "code", + "source": [ + "public const int MonthInAYear = 12;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yhpv5BPDJUGKucF6Y_AVeQ", + "cell_type": "markdown", + "source": [ + "# Defaults" + ], + "metadata": {} + }, + { + "id": "uOfb6nvi8USI3mPOH8YvwQ", + "cell_type": "code", + "source": [ + "public const int DefaultDataNodeActivationMonth = 1;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZU5IN71RqEmHfRQSSCUvnw", + "cell_type": "code", + "source": [ + "public const double DefaultPremiumExperienceAdjustmentFactor = 1.0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KNUzhe58B0GBnCuZD1ATOg", + "cell_type": "markdown", + "source": [ + "# Names" + ], + "metadata": {} + }, + { + "id": "hZGPPDopiECnoXlB48cB2Q", + "cell_type": "code", + "source": [ + "public const string Main = nameof(Main);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "w5Zs2AGjxkWgRQfAGs8BIA", + "cell_type": "code", + "source": [ + "public const string Default = nameof(Default);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jAyhudwOJkmsPwMaZM1P4g", + "cell_type": "code", + "source": [ + "public const string ValueType = nameof(ValueType);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Aj_qnZxiqUeFHk088tNruA", + "cell_type": "markdown", + "source": [ + "GroupCurrency defines the SystemName (from Currency Dimension) to be used as the Group Currency." + ], + "metadata": {} + }, + { + "id": "pvlhKSXdW0Wt3dns45SWfQ", + "cell_type": "code", + "source": [ + "public const string GroupCurrency = \"CHF\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9SCJFj6zcUK_5Uczpicjjw", + "cell_type": "markdown", + "source": [ + "# Import Formats" + ], + "metadata": {} + }, + { + "id": "xEDrrk_AxUicpKHTSr6acA", + "cell_type": "code", + "source": [ + "public static class ImportFormats{", + "\n public const string Cashflow = nameof(Cashflow);", + "\n public const string Actual = nameof(Actual);", + "\n public const string DataNodeParameter = nameof(DataNodeParameter);", + "\n public const string SimpleValue = nameof(SimpleValue);", + "\n public const string Opening = nameof(Opening);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "DQHpY4V8xUOGR8L84B7DTg", + "cell_type": "markdown", + "source": [ + "# IFRS specific" + ], + "metadata": {} + }, + { + "id": "YjgOf6OCyUuxcwR9IhoZvA", + "cell_type": "code", + "source": [ + "public static class ValuationApproaches{", + "\n public const string BBA = nameof(BBA); //Building Block Approach", + "\n public const string VFA = nameof(VFA); //Variable Fee Approach", + "\n public const string PAA = nameof(PAA); //Premium Allocation Approach", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "pMhVfzvrjkyXcNpx0Tn4wA", + "cell_type": "code", + "source": [ + "public static class LiabilityTypes{", + "\n public const string LRC = nameof(LRC); //Liability for Remaining Coverage", + "\n public const string LIC = nameof(LIC); //Liability Incurred Claims", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1eDEjgoZmEOfPbRzZthlTQ", + "cell_type": "code", + "source": [ + "public static class CalculationTypes{", + "\n public const string BE = nameof(BE); //Best Estimate", + "\n public const string CU = nameof(CU); //Coverage Units", + "\n public const string RA = nameof(RA); //Risk Adjustment", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "b6cmqzNyQ0q0McHf-Rf5lw", + "cell_type": "code", + "source": [ + "public static class EstimateTypes{", + "\n public const string BE = nameof(BE); //Best Estimate", + "\n public const string RA = nameof(RA); //Risk Adjustment", + "\n public const string A = nameof(A); //Actuals", + "\n public const string AA = nameof(AA); //Advance Actuals", + "\n public const string OA = nameof(OA); //Overdue Actuals", + "\n public const string DA = nameof(DA); //Deferrable Actuals", + "\n public const string C = nameof(C); //Contractual Service Margin", + "\n public const string L = nameof(L); //Loss Component", + "\n public const string LR = nameof(LR); //Loss Recovery", + "\n public const string F = nameof(F); //factors", + "\n public const string FCF = nameof(FCF); //Fulfilment Cash flows", + "\n public const string BEPA = nameof(BEPA); //Experience Adjusted BE Premium to Csm", + "\n public const string APA = nameof(APA); //Experience Adjusted Written Actual Premium to Csm", + "\n public const string AAPA = nameof(AAPA); //Experience Adjusted Advance Actual Premium to Csm", + "\n public const string OAPA = nameof(OAPA); //Experience Adjusted Overdue Actual Premium to Csm", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vCJNvDF6D02HPepD8ay2pA", + "cell_type": "code", + "source": [ + "public static class AocTypes{", + "\n public const string BOP = nameof(BOP);", + "\n public const string MC = nameof(MC);", + "\n public const string RCU = nameof(RCU);", + "\n public const string CF = nameof(CF);", + "\n public const string IA = nameof(IA);", + "\n public const string YCU = nameof(YCU);", + "\n public const string CRU = nameof(CRU);", + "\n public const string WO = nameof(WO);", + "\n public const string EV = nameof(EV);", + "\n public const string CL = nameof(CL);", + "\n public const string EA = nameof(EA);", + "\n public const string AM = nameof(AM);", + "\n public const string FX = nameof(FX);", + "\n public const string EOP = nameof(EOP);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "OE45Je2KUk6WlHo9upd5fA", + "cell_type": "code", + "source": [ + "public static class Novelties{", + "\n public const string I = nameof(I); //In-Force", + "\n public const string N = nameof(N); //New Business", + "\n public const string C = nameof(C); //All Novelties Combined", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BUPmJSTjdkuP8nR7MJyQiw", + "cell_type": "code", + "source": [ + "public static class EconomicBases{", + "\n public const string L = nameof(L); //Locked Interest Rates", + "\n public const string C = nameof(C); //Current Interest Rates", + "\n public const string N = nameof(N); //Nominal Interest Rates", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-cRhXT5tKE-834Umpyaudw", + "cell_type": "code", + "source": [ + "public static class AmountTypes{", + "\n public const string ACA = nameof(ACA); //Attributable Commissions Acquisition", + "\n public const string AEA = nameof(AEA); //Attributable Expenses Acquisition", + "\n public const string CDR = nameof(CDR); //Credit Default Risk", + "\n public const string CL = nameof(CL); //Claims", + "\n public const string PR = nameof(PR); //Premiums", + "\n public const string NIC = nameof(NIC); //Claims Non-Investment component", + "\n public const string ICO = nameof(ICO); //Claims Investment component", + "\n public const string NE = nameof(NE); //Non Attributable Expenses", + "\n public const string ACM = nameof(ACM); //Attributable Commissions Maintenance", + "\n public const string AEM = nameof(AEM); //Attributable Expenses Maintenance", + "\n public const string AC = nameof(AC); //Attributable Commissions", + "\n public const string AE = nameof(AE); //Attributable Expenses", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "e33hFwGm9kmVNOsShmvn4w", + "cell_type": "markdown", + "source": [ + "# Insurance specific" + ], + "metadata": {} + }, + { + "id": "9n2de6iCUEKECrkoUtSuiw", + "cell_type": "code", + "source": [ + "public static class LineOfBusinesses{", + "\n public const string LI = nameof(LI); //Life", + "\n public const string NL = nameof(NL); //Non-Life", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Constants/Enums.ipynb b/Constants/Enums.ipynb new file mode 100644 index 00000000..5700a892 --- /dev/null +++ b/Constants/Enums.ipynb @@ -0,0 +1,269 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "HUFgBXkmYU6rV0daYBo-nQ", + "cell_type": "markdown", + "source": [ + "# Enumerables", + "\n", + "\nIn the case of data which is not expected to change over time, it is convenient to introduce such data as variables of type \"enumerable\"." + ], + "metadata": {} + }, + { + "id": "ALWeaAkPh0uiwQ9SYb9Y-w", + "cell_type": "markdown", + "source": [ + "## Exchange Rates", + "\n", + "\nFor exchange rates, we set the type for which the rates apply:" + ], + "metadata": {} + }, + { + "id": "W6x_0Pa3_kOAd3N9CBgcgQ", + "cell_type": "code", + "source": [ + "public enum FxType { Spot, Average }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "r50zPe2AP0KrCOR-fgpccg", + "cell_type": "code", + "source": [ + "public enum FxPeriod { NotApplicable, BeginningOfPeriod, Average, EndOfPeriod }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YCF3tVHQB0eUa0yWpiRD0g", + "cell_type": "markdown", + "source": [ + "## Currency Types" + ], + "metadata": {} + }, + { + "id": "cF0fRptcGE64Vr1b058rqg", + "cell_type": "markdown", + "source": [ + "Currency Types define which currency is used as standard at different aggregation levels (in the Data Level hierarchy).", + "\n- Functional: this is the standard Currency Type at Reporting Node level", + "\n- Group: this is the standard Currency Type at Group level", + "\n- Contractual: this is the standard Currency Type at Data Node level", + "\n- Transactional: this is the standard Currency Type at Transactional level (used typically for Actuals)" + ], + "metadata": {} + }, + { + "id": "zj07LR0PT0CesH4nRl1Sig", + "cell_type": "code", + "source": [ + "public enum CurrencyType { Functional, Group, Contractual, Transactional }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "wL17I9jyQ0eaeXrSdlvJyA", + "cell_type": "markdown", + "source": [ + "## Period Type" + ], + "metadata": {} + }, + { + "id": "3e3wVNw-rECnTHBTkVOfCQ", + "cell_type": "code", + "source": [ + "public enum PeriodType { NotApplicable, BeginningOfPeriod, EndOfPeriod }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Expd7Urm102om6-y2Skz4w", + "cell_type": "markdown", + "source": [ + "## Valuation Period" + ], + "metadata": {} + }, + { + "id": "dsJwHWIQPkOB29dEUCLHGg", + "cell_type": "code", + "source": [ + "public enum ValuationPeriod { NotApplicable, BeginningOfPeriod, MidOfPeriod, Delta, EndOfPeriod }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "iejG0G0VJ0q_tAg2HGHuOw", + "cell_type": "markdown", + "source": [ + "## Portfolio View" + ], + "metadata": {} + }, + { + "id": "0Pdzxbnsx0SOaIiUb_X1YQ", + "cell_type": "code", + "source": [ + "[Flags] public enum PortfolioView { Gross = 1, Reinsurance = 2, Net = Gross | Reinsurance }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "v7NVqB0p1Ei4vilTCiErFg", + "cell_type": "markdown", + "source": [ + "## Structure Type" + ], + "metadata": {} + }, + { + "id": "Kge1fD31n0S7BW0EiClT0g", + "cell_type": "code", + "source": [ + "public enum StructureType { None, AoC }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "S49a3Gcz_0S7apcSmQy3JA", + "cell_type": "markdown", + "source": [ + "## State" + ], + "metadata": {} + }, + { + "id": "mJADknA9Q0KQjmTmf03Blw", + "cell_type": "markdown", + "source": [ + "State describes the state in which a Data Node can be - There are two types of states:", + "\n- Active: visible in reports and queries", + "\n- Inactive: not visible in reports and queries" + ], + "metadata": {} + }, + { + "id": "lsRYxseYzUaLMcAn7JB2Qw", + "cell_type": "code", + "source": [ + "public enum State { Active, Inactive }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kgMLZfJ4PkCFRU4kLKSGcw", + "cell_type": "markdown", + "source": [ + "## Periodicity" + ], + "metadata": {} + }, + { + "id": "iV_fcqBE2E6B12CgJq2ybg", + "cell_type": "code", + "source": [ + "public enum Periodicity { Monthly, Quarterly, Yearly }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ndV2D2lQL0icIY9VirJweQ", + "cell_type": "markdown", + "source": [ + "## Input Source" + ], + "metadata": {} + }, + { + "id": "z6t0m-civUGAcBEAW0C3Nw", + "cell_type": "code", + "source": [ + "[Flags]", + "\npublic enum InputSource {NotApplicable = 0, Opening = 1, Actual = 2, Cashflow = 4} ", + "\n//Opening + Actual = 3,", + "\n//Opening + Cashflow = 5", + "\n//Actual + Cashflow = 6", + "\n//Opening + Actual + Cashflow = 7" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "aEqUAtvxPESgt-FHx2e7yA", + "cell_type": "markdown", + "source": [ + "## Data Type" + ], + "metadata": {} + }, + { + "id": "LR7R7DUA0k6Ywl5WjSrEvg", + "cell_type": "code", + "source": [ + "public enum DataType { Optional, Mandatory, Calculated, CalculatedTelescopic }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "euBhm6zy1Uib521-G3w3eQ", + "cell_type": "markdown", + "source": [ + "## Import Scope" + ], + "metadata": {} + }, + { + "id": "4PP7M-Sv9k6_6MsJWS1bUg", + "cell_type": "code", + "source": [ + "public enum ImportScope { Primary, Secondary }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Constants/Validations.ipynb b/Constants/Validations.ipynb new file mode 100644 index 00000000..f58110a8 --- /dev/null +++ b/Constants/Validations.ipynb @@ -0,0 +1,200 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "LgEd-jVnbEGK9QI-QWcVQw", + "cell_type": "markdown", + "source": [ + "

Errors and Warnings

" + ], + "metadata": {} + }, + { + "id": "-scbNYag2kmx_38hEmkBgA", + "cell_type": "code", + "source": [ + "#!import \"Enums\"", + "\n#!import \"Consts\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8xjDwqEVm0WjJuTlC2QERA", + "cell_type": "markdown", + "source": [ + "# Codes" + ], + "metadata": {} + }, + { + "id": "9CPbuC0YV0aSt5wA3uOxnw", + "cell_type": "code", + "source": [ + "public enum Warning {", + "\n // Import", + "\n ActiveDataNodeWithCashflowBOPI,", + "\n // Default", + "\n Generic", + "\n}; " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QWAQV2xUcEigl3eydHTJaA", + "cell_type": "code", + "source": [ + "public enum Error { ", + "\n // Import", + "\n NoMainTab, IncompleteMainTab, ParsingScientificNotation, ValueTypeNotFound, ValueTypeNotValid, AocTypeNotValid,", + "\n // Partition", + "\n PartitionNotFound, ParsedPartitionNotFound, PartititionNameNotFound, PartitionTypeNotFound,", + "\n // Dimensions", + "\n AmountTypeNotFound, EstimateTypeNotFound,CalculationTypeNotFound, ReportingNodeNotFound, AocTypeMapNotFound, AocTypeNotFound, PortfolioGicNotFound, PortfolioGricNotFound, ", + "\n InvalidAmountTypeEstimateType, MultipleTechnicalMarginOpening,", + "\n // Exchange Rate", + "\n ExchangeRateNotFound, ExchangeRateCurrency,", + "\n // Data Note State", + "\n ChangeDataNodeState, InactiveDataNodeState,", + "\n // Parameters", + "\n ReinsuranceCoverageDataNode, DuplicateInterDataNode, DuplicateSingleDataNode, InvalidDataNode, ", + "\n // Storage", + "\n DataNodeNotFound, PartnerNotFound, RatingNotFound, CreditDefaultRateNotFound, MissingPremiumAllocation, ReinsuranceCoverage, ", + "\n YieldCurveNotFound, YieldCurvePeriodNotApplicable, EconomicBasisNotFound, AccountingVariableTypeNotFound,", + "\n // Scopes", + "\n NotSupportedAocStepReference, MultipleEoP,", + "\n // Data completeness", + "\n MissingDataAtPosting, MissingCombinedLiability, MissingCoverageUnit, ", + "\n // Default", + "\n Generic", + "\n};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ThPESGETMUm31fuq-qS4_w", + "cell_type": "markdown", + "source": [ + "# Messages" + ], + "metadata": {} + }, + { + "id": "x3UlljewwEut3M0NRlUDDg", + "cell_type": "code", + "source": [ + "public static string Get (Error e, params string[] s) => (e, s.Length) switch ", + "\n{", + "\n // Import", + "\n (Error.NoMainTab , _) => $\"No Main tab in the parsed file.\",", + "\n (Error.IncompleteMainTab , _) => $\"Incomplete Main tab in the parsed file.\",", + "\n (Error.ParsingScientificNotation , 1) => $\"While parsing found real number in scientific notation: {s[0]}.\",", + "\n (Error.ValueTypeNotFound , _) => $\"Value Type not found.\",", + "\n (Error.ValueTypeNotValid , 1) => $\"The Value Type {s[0]} is invalid.\",", + "\n (Error.AocTypeNotValid , 1) => $\"The parsed AocType {s[0]} is invalid.\",", + "\n // Partition", + "\n (Error.PartitionNotFound , _) => $\"Partition do not found.\",", + "\n (Error.ParsedPartitionNotFound , 1) => $\"Parsed partition not available: ReportingNode {s[0]}.\",", + "\n (Error.ParsedPartitionNotFound , 4) => $\"Parsed partition not available: ReportingNode {s[0]}, Year {s[1]}, Month {s[2]}, Scenario {s[3]}.\",", + "\n (Error.PartitionTypeNotFound , 1) => $\"Partition type not found: {s[0]}.\",", + "\n // Dimensions", + "\n (Error.AmountTypeNotFound , 1) => $\"AmountType {s[0]} not found.\",", + "\n (Error.EstimateTypeNotFound , 1) => $\"EstimateType {s[0]} not found.\",", + "\n (Error.CalculationTypeNotFound , 1) => $\"CalculationType {s[0]} not found.\",", + "\n (Error.ReportingNodeNotFound , 1) => $\"Reporting Node {s[0]} not found.\",", + "\n (Error.AocTypeNotFound , 1) => $\"AocType {s[0]} not found.\",", + "\n (Error.AocTypeMapNotFound , 2) => $\"AocType {s[0]} and Novelty {s[1]} combination not defined in the mapping.\",", + "\n (Error.PortfolioGicNotFound , 2) => $\"Portfolio {s[0]} assigned to Group of Insurance Contract {s[1]} does not exist.\",", + "\n (Error.PortfolioGricNotFound , 2) => $\"Portfolio {s[0]} assigned to Group of Reinsurance Contract {s[1]} does not exist.\",", + "\n (Error.InvalidAmountTypeEstimateType , 2) => $\"Invalid combination of EstimateType {s[0]} and AmountType {s[1]}.\",", + "\n (Error.MultipleTechnicalMarginOpening , 1) => $\"Multiple opening for techincal margin are not allowed for DataNode {s[0]}.\",", + "\n // Exchange Rate", + "\n (Error.ExchangeRateNotFound , 2) => $\"Exchange Rate for {s[0]} {s[1]} is not present.\",", + "\n (Error.ExchangeRateCurrency , 1) => $\"{s[0]} does not have any Exchange Rate defined.\", ", + "\n // Data Node State", + "\n (Error.ChangeDataNodeState , 0) => $\"Data Node State can not change from Inactive state into Active state.\",", + "\n (Error.ChangeDataNodeState , 1) => $\"Data Node State for {s[0]} can not change from Inactive state into Active state.\",", + "\n (Error.ChangeDataNodeState , 3) => $\"Data Node State for {s[0]} can not change from {s[1]} state into {s[2]} state.\",", + "\n (Error.InactiveDataNodeState , 1) => $\"Data imported for inactive Data Node {s[0]}.\",", + "\n //Parameters", + "\n (Error.ReinsuranceCoverageDataNode , 2) => $\"Invalid Reinsurance Coverage parameter does not link a GroupOfReinsuranceContract to a GroupOfInsuranceContract. Provided GroupOfContracts are: {s[0]}, {s[1]}.\",", + "\n (Error.DuplicateInterDataNode , 2) => $\"Duplicated Inter-DataNode parameter for {s[0]}-{s[1]} is found.\",", + "\n (Error.DuplicateSingleDataNode , 1) => $\"Duplicated Single-DataNode parameter for {s[0]} is found.\",", + "\n (Error.InvalidDataNode , 1) => $\"Data imported for invalid Data Node {s[0]}.\",", + "\n // Storage", + "\n (Error.DataNodeNotFound , 1) => $\"DataNode {s[0]} not found.\",", + "\n (Error.PartnerNotFound , 1) => $\"Partner not found for DataNode {s[0]}.\",", + "\n (Error.RatingNotFound , 1) => $\"Rating not found for Partner {s[0]}.\",", + "\n (Error.CreditDefaultRateNotFound , 1) => $\"Credit Default Rate not found for rating {s[0]}.\",", + "\n (Error.MissingPremiumAllocation , 1) => $\"Premium Allocation Rate not found for Group of Contract {s[0]}.\", // TODO: this is now a warning to be produced by a validation in the importers (default is 1)", + "\n (Error.ReinsuranceCoverage , 1) => $\"Reinsurance Allocation Rate not found for Group of Insurance Contract {s[0]}.\",", + "\n (Error.YieldCurveNotFound , 3) => $\"Yield Curve not found for currency {s[0]}, year {s[1]}, and month {s[2]}.\",", + "\n (Error.YieldCurvePeriodNotApplicable , 2) => $\"YieldCurve period NotApplicable not valid for AocStep with AocType {s[0]} and Novelty {s[1]}.\",", + "\n (Error.EconomicBasisNotFound , 1) => $\"EconomicBasis not valid for DataNode {s[0]}.\",", + "\n (Error.AccountingVariableTypeNotFound , 1) => $\"AccountingVariableType {s[0]} not found.\",", + "\n // Scopes", + "\n (Error.NotSupportedAocStepReference , 1) => $\"Unsupported reference Aoc Step for Aoc Type {s[0]}.\",", + "\n (Error.MultipleEoP , 0) => $\"Closing Balance for both Csm and Lc are computed.\",", + "\n // Data Completeness", + "\n (Error.MissingDataAtPosting , 1) => $\"Missing imported data for {s[0]} DataNode.\",", + "\n (Error.MissingCombinedLiability , 2) => $\"Missing Combined Liability Aoc Type for DataNode {s[0]} and AmountType {s[1]}.\",", + "\n (Error.MissingCoverageUnit , 1) => $\"Missing Coverage Unit cash flow for {s[0]} DataNode.\",", + "\n // Default", + "\n (Error.Generic , _) => $\"{s[0]}\",", + "\n (_ , _) => $\"Error not found.\"", + "\n};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "PnguuqruSkaTERChlORdKw", + "cell_type": "code", + "source": [ + "public static string Get (Warning w, params string[] s) => (w, s.Length) switch {", + "\n // Import", + "\n (Warning.ActiveDataNodeWithCashflowBOPI , _) => $\"Cashflows for active DataNode has been parsed with AocType {AocTypes.BOP} and Novelty {Novelties.I} \",", + "\n // Default", + "\n (Warning.Generic , _) => $\"{s[0]}\",", + "\n (_ , _) => $\"Warning not found.\"", + "\n};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "COxOqdqYwUqx0ozqRQof0w", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/DataModel/DataStructure.ipynb b/DataModel/DataStructure.ipynb new file mode 100644 index 00000000..1e65f8b1 --- /dev/null +++ b/DataModel/DataStructure.ipynb @@ -0,0 +1,2139 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "E3XGdKdQXkSFZwQ0OR8f9Q", + "cell_type": "markdown", + "source": [ + "", + "\n

Data Model

", + "\n", + "\nThis notebook has the main structures used to hold data - This is usually called the **data model**." + ], + "metadata": {} + }, + { + "id": "wIRyXTP_f0aojedzQ_2yaw", + "cell_type": "markdown", + "source": [ + "# References", + "\nThis section initializes libraries and code from other notebooks, which will be used here, as well as information needed for querying data from the database." + ], + "metadata": {} + }, + { + "id": "_ldA06bDKEyrEr1rDJpRng", + "cell_type": "markdown", + "source": [ + "## Libraries" + ], + "metadata": {} + }, + { + "id": "iVjxSwqCvkCRk9OnawoClw", + "cell_type": "code", + "source": [ + "#r \"nuget:Systemorph.Workspace,1.2.0\"", + "\n#r \"nuget:Systemorph.Scopes,1.2.4\"", + "\n#r \"nuget:Systemorph.Import,1.3.0\"", + "\n#r \"nuget:Systemorph.Test,1.2.4\"", + "\n#r \"nuget:Systemorph.Export,1.3.0\"", + "\n#r \"nuget:Systemorph.DataSetReader,1.3.0\"", + "\n#r \"nuget:Systemorph.DataSource,1.2.0\"", + "\n#r \"nuget:Systemorph.DataSource.Conversions,1.2.0\"", + "\n#r \"nuget:Systemorph.Reporting,1.2.4\"", + "\n#r \"nuget:Systemorph.DomainDesigner,1.3.0\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tVqfp6kjPEWcWTsE7nmIJQ", + "cell_type": "markdown", + "source": [ + "## Usings" + ], + "metadata": {} + }, + { + "id": "H4cEfQ5jnE-pcrbgue7FNA", + "cell_type": "code", + "source": [ + "using System.ComponentModel.DataAnnotations;", + "\nusing System.ComponentModel.DataAnnotations.Schema;", + "\nusing Systemorph.Vertex.Grid.Model;", + "\nusing static Systemorph.Vertex.Arithmetics.ArithmeticOperations;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "r7mAcZwhpEOp8xf82HvdyQ", + "cell_type": "markdown", + "source": [ + "## Notebooks" + ], + "metadata": {} + }, + { + "id": "wkcyVZzJ5kqKCJm_siKkNQ", + "cell_type": "code", + "source": [ + "#!import \"../Constants/Enums\"", + "\n#!import \"../Constants/Consts\"", + "\n#!import \"../Constants/Validations\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HTeT_yYbpUCPrWtjwe9fdQ", + "cell_type": "markdown", + "source": [ + "# Data Infrastructure" + ], + "metadata": {} + }, + { + "id": "HrfAYsLiM0SFRqKe6IIlxA", + "cell_type": "markdown", + "source": [ + "", + "\n## Base Interfaces", + "\nThe following interfaces are used to define the granularity at which data is stored.", + "\n", + "\nFor instance, the IKeyed interface corresponds to the lowest granularity which is simply a unique identifier for a certain generic piece of data:" + ], + "metadata": {} + }, + { + "id": "-JHURlI5Z0mY6_UxQ7gfGA", + "cell_type": "code", + "source": [ + "public interface IKeyed", + "\n{ ", + "\n public Guid Id { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TLXXKZET0E-dDwCIcdZXBg", + "cell_type": "markdown", + "source": [ + "The interface IPartition identifies the partitions in the system." + ], + "metadata": {} + }, + { + "id": "A-Onlfa3vkqOVvHu6-JMQg", + "cell_type": "code", + "source": [ + "public interface IPartition : IKeyed {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "iF7QiEQqBE2pxD1M85J2Sw", + "cell_type": "markdown", + "source": [ + "The interface IPartitioned simply assigns a unique identifier for elements of a data partition - The exact definition of such elements can be found in the [partition](#partition) section below." + ], + "metadata": {} + }, + { + "id": "UI71Ps6BF0K27AoG-9UkDw", + "cell_type": "code", + "source": [ + "public interface IPartitioned", + "\n{", + "\n public Guid Partition { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "mwvvs9R7IE6s7-QzaQ44Iw", + "cell_type": "markdown", + "source": [ + "The interface IHierarchy is used for modelling dimensions which have an hierarchical structure, such as [Amount Type](#amount-type)." + ], + "metadata": {} + }, + { + "id": "udn_BFvLkE-kpOBDTNrOzg", + "cell_type": "code", + "source": [ + "public interface IHierarchy", + "\n{", + "\n [Display(Order = 10)]", + "\n public string Name { get; init; }", + "\n ", + "\n [Display(Order = 20)]", + "\n public string Parent { get; init; }", + "\n ", + "\n [Display(Order = 30)]", + "\n public string Child { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qlvXHTn5VUmrP2f97WrtTw", + "cell_type": "markdown", + "source": [ + "The interface IWithYearAndMonth allows to speficy to which year and month a certain piece of data applies to:" + ], + "metadata": {} + }, + { + "id": "jD1t0fnTnUGMALFqTwsLHA", + "cell_type": "code", + "source": [ + "public interface IWithYearAndMonth", + "\n{", + "\n public int Year { get; init; }", + "\n ", + "\n public int Month { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WbhV6bUsy0ukIAm920fzwg", + "cell_type": "markdown", + "source": [ + "", + "\n## Abstract Classes", + "\nThese classes are not reflected in the database, i.e. are not persisted." + ], + "metadata": {} + }, + { + "id": "EVd9ytkY40OTYvjWp5aziA", + "cell_type": "code", + "source": [ + "public abstract record KeyedRecord : IKeyed {", + "\n [Key]", + "\n [NotVisible] ", + "\n public Guid Id { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "h-P8iuN2zUqCz2F1HgnXjQ", + "cell_type": "code", + "source": [ + "public abstract record KeyedDimension : INamed {", + "\n [Key]", + "\n [IdentityProperty]", + "\n [StringLength(16)]", + "\n [Display(Order = 1)]", + "\n public string SystemName { get; init; }", + "\n ", + "\n [Display(Order = 2)]", + "\n [NotVisible]", + "\n public string DisplayName { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "q1r9nxY4cEudsXAFS_0LOA", + "cell_type": "code", + "source": [ + "public abstract record KeyedOrderedDimension : KeyedDimension, IOrdered {", + "\n [NotVisible]", + "\n public int Order { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "V0ZEujrm8EeHPz95bLGLOA", + "cell_type": "code", + "source": [ + "public abstract record KeyedOrderedDimensionWithExternalId : KeyedOrderedDimension {", + "\n [Display(Order = 100)]", + "\n [Conversion(typeof(JsonConverter))]", + "\n public string[] ExternalId { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1ZMlcc50Q0yVI7dZBvBCyQ", + "cell_type": "markdown", + "source": [ + "", + "\n# Dimensions", + "\n", + "\nDimensions are data which tipically can be given a short name, here called 'System Name'. They also change slowly with time. A typical example is currencies, and examples of System Names are EUR, CHF, etc.", + "\n", + "\nThe advantages of using Dimensions are:", + "\n- The data is easier to maintain (the data is said to be 'normalized');", + "\n- The business logic is easier to read;", + "\n- Easier scructuring of the data, e.g. in a data-cube." + ], + "metadata": {} + }, + { + "id": "Nh9SUewfGEisAbZfcpYfPA", + "cell_type": "markdown", + "source": [ + "", + "\n## Hierarchical Dimension With Level", + "\nHierarchical dimensions are useful to define for example the legal structure of a company (reporting nodes and their parents).", + "\n", + "\nBelow we introduce the concept of a hierarchical dimension with level, which is a simple way to keep track of the \"level\" in a hierarchical dimension." + ], + "metadata": {} + }, + { + "id": "4JGV542yw0KkgF5wA8Xc-A", + "cell_type": "code", + "source": [ + "//TODO: Should this be abstract or have a reference to the type?", + "\npublic record HierarchicalDimensionWithLevel(string SystemName, string DisplayName, string Parent, int Level) : IHierarchicalDimension;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3mdUv9EKwUaRHVRzBFxSNw", + "cell_type": "markdown", + "source": [ + "", + "\n## Amount Type" + ], + "metadata": {} + }, + { + "id": "oD4Rl6GEpEqnLIn_CUdivg", + "cell_type": "markdown", + "source": [ + "Amount Type is a dimension used to describe the nature of numbers. For example: Numbers associated to the payment of premiums have Amount Type 'Premiums'; Numbers associated to the payment of claims have Amount Type 'Claims'; Numbers associated to expenses have Amount Type 'Expenses'. ", + "\n", + "\nIt is defined as a hierarchical dimension so that higher-granularity types can be introduced. For example: 'Claim Expenses' have parent 'Claims'.", + "\n", + "\nAmount Types are a central piece in the IFRS 17 application and are used for instance to name the different types of cashflows. For example: There might be cashflows for 'Premiums'; Cashflows for 'Claims', etc. In case the mapping between cash flow and amount type is non-trivial, then specific mappings are introduced through the use of ExternalId." + ], + "metadata": {} + }, + { + "id": "ffEXk8fDRUSuFc1EOOWVXA", + "cell_type": "code", + "source": [ + "public record AmountType : KeyedOrderedDimensionWithExternalId, IHierarchicalDimension", + "\n{", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(AmountType))]", + "\n public string Parent { get; init; }", + "\n ", + "\n [Display(Order = 20)]", + "\n [Dimension(typeof(PeriodType))]", + "\n public PeriodType PeriodType { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xY7Lv0cnPk2ZqR7zMUKVAQ", + "cell_type": "markdown", + "source": [ + "We distinguish between amount types used for cashflows and actuals (**Present Value Amount Types**), and amount types used for deferrable values (**Deferrable Amount Types**). In particular, deferrable amount types are for costs and expenses that can be deferred to the future. These amounts are treated separately from the Present Value Amount Types because they are not considered for the calculation of Contractual Service Margin and Loss Component." + ], + "metadata": {} + }, + { + "id": "u1zwrsAl_06VNVKVjqY52g", + "cell_type": "code", + "source": [ + "public record PvAmountType : AmountType {} //TODO Rename ", + "\n", + "\npublic record DeferrableAmountType : AmountType {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uCEMSSPR00Oh87NXjPpxaQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Calculation Type", + "\nThis dimension is used to distinguish between e.g. **Best Estimate** values and **Risk Adjustment** values:" + ], + "metadata": {} + }, + { + "id": "ZNlHEPmkHky4j1HvhgN88A", + "cell_type": "code", + "source": [ + "public record CalculationType : KeyedOrderedDimension {", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(PeriodType))]", + "\n public PeriodType PeriodType { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vKJfcG-udU2bWMy_nL8WSQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Risk Driver", + "\n", + "\nRisk drivers are used to distinguish between the different Risk Adjustment numbers. For instance: Mortality, Disability, Longevity, etc.", + "\n", + "\nWhen only total risk adjustment values are used, then there is no need to use risk drivers." + ], + "metadata": {} + }, + { + "id": "fa88nNjOdk6ESB_dqpM35w", + "cell_type": "code", + "source": [ + "public record RiskDriver : KeyedOrderedDimension, IHierarchicalDimension", + "\n{", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(RiskDriver))]", + "\n public string Parent { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VkCT-HB9TkyWJJyAcX42QQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Estimate Type", + "\n", + "\nEstimate Type is a dimension used to distinguish the context to which numbers belong to. For instance: Numbers for present values have Estimate Type 'Present Value'; Numbers for Risk Adjustments have Estimate Type 'Risk Adjustment'." + ], + "metadata": {} + }, + { + "id": "PGODf3XfjEOJ2CfpWJNxvw", + "cell_type": "code", + "source": [ + "public record EstimateType : KeyedOrderedDimensionWithExternalId", + "\n{", + "\n [Display(Order = 110)]", + "\n public InputSource InputSource { get; init; }", + "\n ", + "\n [Display(Order = 120)]", + "\n public StructureType StructureType { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bo_ARw7-YEWDtJJsK8ODmA", + "cell_type": "markdown", + "source": [ + "", + "\n## Novelty", + "\n", + "\nNovelty is a [dimension](#dimensions) used to identity the novelty of the business. Typical examples of Novelty are New Busines, In-Force, and Combined." + ], + "metadata": {} + }, + { + "id": "mV4OXu-r_0e7k1vZthQ1IQ", + "cell_type": "code", + "source": [ + "public record Novelty : KeyedOrderedDimension {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "O-7_tXaPPEOL_eRj1Ev76g", + "cell_type": "markdown", + "source": [ + "", + "\n## Variable Type" + ], + "metadata": {} + }, + { + "id": "jFh4gN-zTEyK_KZ55DhlEw", + "cell_type": "code", + "source": [ + "public record VariableType : KeyedOrderedDimension, IHierarchicalDimension", + "\n{ ", + "\n [Display(Order = 10)]", + "\n public string Parent { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RJcV2vGuokmqX1cLgr8tcw", + "cell_type": "markdown", + "source": [ + "", + "\n### AoC Variable Type", + "\n", + "\nThe AocType describes the type of the Analysis of Change step - For example: Amortization, Cashflow, Combined Liabilities etc.", + "\n", + "\nThe **Combined Liability** AocType aims in capturing the difference between the sum of all relevant previous Aoc steps and the end of period Aoc step. Unexplained changes (not captured by any other defined AoC step), are then visible in this Aoc step. Note that the nominal cash flows input in the cashflow input file corresponds to cash flow projection for the end of period step.", + "\nIn addition, this step distinguishes itself from the others for:", + "\n- It is a mandatory AocType as it is used to trigger the Run off of the cashflow. This is achieved by providing a cash flow of 0s. ", + "\n- It is the first AocType for the Combined Novelty and therefore it carries the contribution of combining In force and New business.", + "\n- Its present value is computed as telescoping difference with the last AoC Step for the In-Force novelty and the New Business novelty.", + "\n- In the technical margin calculation it is used to merge the profitability of the In-Force and New business components, which may result in a forced switch." + ], + "metadata": {} + }, + { + "id": "uXawxEZ9akakX3cBhzIvkw", + "cell_type": "code", + "source": [ + "public record AocType : VariableType", + "\n{ ", + "\n [Display(Order = 30)]", + "\n [Dimension(typeof(AocType))]", + "\n public string Parent { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "wURsJ4y22UClSsa-dgRVKg", + "cell_type": "code", + "source": [ + "public record AocStep(string AocType, string Novelty){}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9FQQEf3waUyPGTjoJ3kPvA", + "cell_type": "markdown", + "source": [ + "", + "\n### PnL Variable Type", + "\n", + "\nThe PnlVariableType is used to describe the various profit and loss sections and the corresponding hierarchy." + ], + "metadata": {} + }, + { + "id": "yXjDtNxmtUKCm7l4rInNRw", + "cell_type": "code", + "source": [ + "public record PnlVariableType : VariableType {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6TMaVeubb0yfDj0zHl3dNQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Balance Sheet Variable Type", + "\n", + "\nThe BsVariableType is used to descibe the Anlysis of change of the Balance Sheet reports." + ], + "metadata": {} + }, + { + "id": "kmnM353ouUSOXqQD4IcV7Q", + "cell_type": "code", + "source": [ + "public record BsVariableType : VariableType {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WglnqvLArU6Ahc29yVDgSQ", + "cell_type": "markdown", + "source": [ + "## Accounting Variable Type", + "\nThe AccountingVariableType is used to describe the accounting events that are posted in the accounting output file." + ], + "metadata": {} + }, + { + "id": "tqFR7uu7BkOnFUvISdLF1A", + "cell_type": "code", + "source": [ + "public record AccountingVariableType : VariableType {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gQILcufhBU6Gh3ZoHDRIYA", + "cell_type": "markdown", + "source": [ + "", + "\n## Scenario", + "\nThe Scenario record holds the various scenarios for which calculations should also be performed." + ], + "metadata": {} + }, + { + "id": "WKR88bI5G0qwjmpDyGZTsw", + "cell_type": "code", + "source": [ + "public record Scenario : KeyedDimension {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "c-cppckU8UeROzwpBdL44A", + "cell_type": "markdown", + "source": [ + " The 'neutral' Scenario (i.e. the default one, with no-stress situations applied) is designated as 'Best Estimate'." + ], + "metadata": {} + }, + { + "id": "ysCBY_ONbUmbRFL_KEXoXg", + "cell_type": "markdown", + "source": [ + "", + "\n## Line Of Business" + ], + "metadata": {} + }, + { + "id": "XPrjV3N-LE-TKVM80pV5yQ", + "cell_type": "markdown", + "source": [ + "Line Of Business is a dimension used to identity insurance business according to usual business classifications (usually a market or company-specific business classification representing a convolution of risk covered, 1st party / 3rd party cover type, product type, etc...)", + "\nTypical examples of Line of Business are Motor, Property, Endowment, etc... This is a hierarchical dimension." + ], + "metadata": {} + }, + { + "id": "VxLXh8klyEi6UhXPn1ZKKw", + "cell_type": "code", + "source": [ + "public record LineOfBusiness : KeyedOrderedDimension, IHierarchicalDimension", + "\n{", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(LineOfBusiness))]", + "\n public string Parent { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "pnCYzQI05UWCUkXGHAB9QA", + "cell_type": "markdown", + "source": [ + "", + "\n## Currency" + ], + "metadata": {} + }, + { + "id": "PZEeN2QhsEGXT0BQ4Rjlag", + "cell_type": "markdown", + "source": [ + "Currency is a dimension used to identity the currency.", + "\nTypical examples of Currency are EUR, CHF, USD, etc..." + ], + "metadata": {} + }, + { + "id": "TUEcu5Y_ZE6Nv_pUG-_COQ", + "cell_type": "code", + "source": [ + "public record Currency : KeyedDimension {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TUfMA1ybakuqVJ73ERA3ZQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Economic Basis", + "\n", + "\nThe Economic Basis defines the discount type which is used in calculations. Examples are: Nominal, Current and Locked." + ], + "metadata": {} + }, + { + "id": "rt_ieWyHpU29K0fpiBXLcQ", + "cell_type": "code", + "source": [ + "public record EconomicBasis : KeyedDimension {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CJjymwgpJEiBZhPYBoZV-w", + "cell_type": "markdown", + "source": [ + "", + "\n## Valuation Approach", + "\nThis dimension holds the various methodologies used in the calculations: BBA, VFA and PAA." + ], + "metadata": {} + }, + { + "id": "oPjqx6DSTkyk2Pi5v9Bgww", + "cell_type": "code", + "source": [ + "public record ValuationApproach : KeyedDimension {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "v5-cD3t8RkaWxWs7t5oTxg", + "cell_type": "markdown", + "source": [ + "", + "\n## Liability Type", + "\nThe Liability Type distinguishes betweeen e.g. liabilities for incurred claims and liabilities for remaining coverage." + ], + "metadata": {} + }, + { + "id": "zZBD3LVJqUSlsfat1_eEDw", + "cell_type": "code", + "source": [ + "public record LiabilityType : KeyedDimension, IHierarchicalDimension", + "\n{", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(LiabilityType))]", + "\n public string Parent { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "JkEN-M0lnUaJ5FsC0QM6JQ", + "cell_type": "markdown", + "source": [ + "", + "\n## OCI Type", + "\nOther Comprehensive Income (OCI) Type describes how the financial contributions to the IFRS17 Financial Performance is apportioned between the P&L and the OCI sections." + ], + "metadata": {} + }, + { + "id": "pAjz1mAaPUGhHNTdyP54gw", + "cell_type": "code", + "source": [ + "public record OciType : KeyedDimension {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZvvcNAbtHki9DK9rkMj5PQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Profitability" + ], + "metadata": {} + }, + { + "id": "SpHNgrkn70WBckuZf-9rtA", + "cell_type": "markdown", + "source": [ + "Profitability is a dimension used in IFRS 17 to describe the profitability of a Group of Contracts (GIC/GRIC).", + "\nTypical examples of Profitability are Profitable, Non-Profitable, etc.." + ], + "metadata": {} + }, + { + "id": "rJS1Lqw9gUyBmW8LzFRIAw", + "cell_type": "code", + "source": [ + "public record Profitability : KeyedDimension {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5nzILMYUw06HnJmXUyLYgg", + "cell_type": "markdown", + "source": [ + "", + "\n## Partner", + "\nPartner is the counterparty of a reinsurance contract." + ], + "metadata": {} + }, + { + "id": "_vf2ckZDHkiTBUqDESRY7A", + "cell_type": "code", + "source": [ + "public record Partner : KeyedDimension {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "K48oHe7Yw0GIy27KBHbDtQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Credit Risk Rating", + "\nThis holds the credit risk rating of each Partner." + ], + "metadata": {} + }, + { + "id": "faZdNRqxWkqUXYnGZQNNLQ", + "cell_type": "code", + "source": [ + "public record CreditRiskRating : KeyedDimension {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LrcDCmrTYkiEFks8X5d5qQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Reporting Node", + "\nA Reporting Node is an element in the reporting structure of the company. It has a hierarchical structure and the end nodes is the level at which data is imported." + ], + "metadata": {} + }, + { + "id": "yfIk7Ocnc0SkfFXciN5yfQ", + "cell_type": "code", + "source": [ + "public record ReportingNode : KeyedDimension, IHierarchicalDimension ", + "\n{", + "\n [Display(Order = 20)]", + "\n [Dimension(typeof(ReportingNode))]", + "\n public string Parent { get; init; }", + "\n ", + "\n [Required]", + "\n [Display(Order = 40)]", + "\n [Dimension(typeof(Currency))]", + "\n public virtual string Currency { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dgSDvMwORkWAHKNhcKsOsQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Projection Configuration" + ], + "metadata": {} + }, + { + "id": "SXiQr9uXpEOar1SWj1NbHQ", + "cell_type": "markdown", + "source": [ + "Projections are configured by defining the following 2 parameters:", + "\n", + "\n- Shift defines how many months are in the cashflow file before the first value of the period in interest.
", + "\n- TimeStep defines how many months are in the period of interest.
", + "\n", + "\nBoth Shift and TimeStep are measured in terms of number of months.", + "\nFor instance, for the current year and year-to-date view we have $\\rm{Shift}=0$ and $TimeStep=3$ for the first quarter, $TimeStep=6$ for the 2nd quarter and so on." + ], + "metadata": {} + }, + { + "id": "5roF1i3RCkuAb120D2hlCw", + "cell_type": "code", + "source": [ + "public record ProjectionConfiguration : KeyedDimension", + "\n{", + "\n [IdentityProperty]", + "\n public int Shift { get; init; }", + "\n [IdentityProperty]", + "\n public int TimeStep { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0BJMDgWcZ0-7DaVBFvhhrg", + "cell_type": "markdown", + "source": [ + "", + "\n# Parameters" + ], + "metadata": {} + }, + { + "id": "lZdeQUGmGUmVPRibX3A4mQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Aoc Step Configuration" + ], + "metadata": {} + }, + { + "id": "NRbkQdbBAkSeX6wwNvqeLg", + "cell_type": "markdown", + "source": [ + "The record below holds parameters over time for each combination of AocType and Novelty. In particular:", + "\n- DataType identifies between Calculated aoc steps and Optional inputs or Mandatory inputs.", + "\n- InputSource identifies whether an aoc step is relevant for Actuals, Cashflow or both calculations.", + "\n- FxPeriod identifies which fx rate should be used.", + "\n- YcPeriod identifies which Yield Curve should be used (from current or previous period).", + "\n- CdrPeriod identifies which Credit Default Rate should be used (from current or previous period).", + "\n- ValuationPeriod identifies which value from the Cashflow corresponds to the Present Value.", + "\n- RcPeriod identifies which Reinsurance Coverage should be used (from current or previous period).", + "\n", + "\n
The values for each parameter can be found in [Enums Notebook](./Constants/Enums)." + ], + "metadata": {} + }, + { + "id": "fSKSGQxYvEWCjRwEU8Zp8A", + "cell_type": "code", + "source": [ + "public record AocConfiguration : KeyedRecord, IWithYearAndMonth, IOrdered", + "\n{", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 10)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Month { get; init; }", + "\n ", + "\n [IdentityProperty]", + "\n [Display(Order = 30)]", + "\n [Dimension(typeof(AocType))]", + "\n public string AocType { get; init; }", + "\n ", + "\n [IdentityProperty]", + "\n [Display(Order = 40)]", + "\n [Dimension(typeof(Novelty))]", + "\n public string Novelty { get; init; }", + "\n ", + "\n [Display(Order = 50)]", + "\n [Dimension(typeof(DataType))]", + "\n public DataType DataType { get; init; }", + "\n ", + "\n [Display(Order = 55)]", + "\n [Dimension(typeof(InputSource))]", + "\n public InputSource InputSource { get; init; }", + "\n ", + "\n [Display(Order = 60)]", + "\n [Dimension(typeof(FxPeriod))]", + "\n public FxPeriod FxPeriod { get; init; }", + "\n ", + "\n [Display(Order = 70)]", + "\n [Dimension(typeof(PeriodType), nameof(YcPeriod))]", + "\n public PeriodType YcPeriod { get; init; }", + "\n ", + "\n [Display(Order = 80)]", + "\n [Dimension(typeof(PeriodType), nameof(CdrPeriod))]", + "\n public PeriodType CdrPeriod { get; init; }", + "\n ", + "\n [Display(Order = 90)]", + "\n [Dimension(typeof(ValuationPeriod))]", + "\n public ValuationPeriod ValuationPeriod { get; init; }", + "\n ", + "\n [Display(Order = 100)]", + "\n [Dimension(typeof(PeriodType), nameof(RcPeriod))]", + "\n public PeriodType RcPeriod { get; init; }", + "\n ", + "\n [NotVisible]", + "\n public int Order { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9EDmAQK2o0CtkSqxrxadaw", + "cell_type": "markdown", + "source": [ + "", + "\n## Exchange Rate", + "\nThe record below holds the Exchange Rates over time and for each exchange type ([FxType](./Constants/Enums)). Exchange Rate must be updated every reporting period as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", + "\n", + "\nIn case the Exchange Rate for the current period is missing, an error is returned. " + ], + "metadata": {} + }, + { + "id": "0UriZBf9PkWxz4YC-Zj6jQ", + "cell_type": "code", + "source": [ + "public record ExchangeRate : KeyedRecord", + "\n{ ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(Currency))]", + "\n public string Currency { get; init; }", + "\n", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n public int Month { get; init; }", + "\n", + "\n [IdentityProperty]", + "\n [Required]", + "\n [Display(Order = 40)]", + "\n public FxType FxType { get; init; }", + "\n", + "\n [Display(Order = 50)]", + "\n public double FxToGroupCurrency { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "DqeuCXH1bkmJd_iD726ypg", + "cell_type": "markdown", + "source": [ + "", + "\n## Credit Default Rate", + "\nThe record below holds the Credit Default Rates over time for each [Credit Risk Rating](#credit-risk-rating). Credit Default Rate can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", + "\n", + "\nThe Credit Default Rate values must be entered with monthly granularity, i.e. every value corresponds to the default rate for a certain month. The first month entered in column Values0 always corresponds to January of the year entered in column Year. The last value is considered valid also for the following years (for which no value has been provided). ", + "\n", + "\nThe latest Credit Default Rate available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used as the current value during calculation." + ], + "metadata": {} + }, + { + "id": "dGtfTrO3iUaqdptZ0yybYw", + "cell_type": "code", + "source": [ + "public record CreditDefaultRate : KeyedRecord, IWithYearAndMonth", + "\n{ ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(CreditRiskRating))]", + "\n public string CreditRiskRating { get; init; }", + "\n", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n public int Month { get; init; }", + "\n ", + "\n [Conversion(typeof(PrimitiveArrayConverter))]", + "\n [Display(Order = 40)]", + "\n public double[] Values { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9_ycC9yzPkG8EqR3gTj3PA", + "cell_type": "markdown", + "source": [ + "", + "\n## Yield Curve", + "\nThe record below holds the Yield Curves across time for each [Currency](#currency) and [Scenario](#scenario).", + "\nYield curves can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", + "\n", + "\nThe Yield Curve values must be entered with **yearly** granularity, i.e. every value corresponds to the rate of the whole year starting from the year entered in column Year. The last value is considered valid also for the following years (for which no value has been provided). ", + "\n", + "\nWhen the current Yield Curve must be used in the calculation, the latest Yield Curve available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used." + ], + "metadata": {} + }, + { + "id": "3TbdMYHKKk2Wan-Egtuetg", + "cell_type": "code", + "source": [ + "public record YieldCurve : KeyedRecord, IWithYearAndMonth", + "\n{ ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(Currency))]", + "\n public string Currency { get; init; }", + "\n", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n public int Month { get; init; }", + "\n", + "\n [IdentityProperty]", + "\n [Display(Order = 35)]", + "\n public string Scenario { get; init; }", + "\n", + "\n [Conversion(typeof(PrimitiveArrayConverter))]", + "\n [Display(Order = 40)]", + "\n public double[] Values { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kR4nqN3MwkqRBS8Yeb4bOA", + "cell_type": "markdown", + "source": [ + "", + "\n## Partner Rating", + "\nThe record below holds the [Credit Risk Rating](#credit-risk-partner) for each [Partner](#partner) across time. Partner Rating can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. " + ], + "metadata": {} + }, + { + "id": "-yzxBGiz7U62zp3niNtqEA", + "cell_type": "code", + "source": [ + "public record PartnerRating : KeyedRecord, IWithYearAndMonth", + "\n{ ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(Partner))]", + "\n public string Partner { get; init; }", + "\n", + "\n [Required]", + "\n [Display(Order = 20)]", + "\n [Dimension(typeof(CreditRiskRating))]", + "\n public string CreditRiskRating { get; init; }", + "\n", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 40)]", + "\n public int Month { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4bFzr4BUxECkAZN1KK83Kg", + "cell_type": "markdown", + "source": [ + "", + "\n# Partitions", + "\nThe notion of Partition is used to define small but meaningful sets of data, called partitions. Partitions are then used to optimize the extraction of data from the database, i.e. only the data for a certain partition is retrieved." + ], + "metadata": {} + }, + { + "id": "lfo6j69S00S5MmeGEgWhWA", + "cell_type": "code", + "source": [ + "public abstract record IfrsPartition : IPartition {", + "\n [Key]", + "\n [PartitionId]", + "\n public Guid Id { get; init; }", + "\n", + "\n [Required]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(ReportingNode))]", + "\n [IdentityProperty]", + "\n public string ReportingNode { get; init; }", + "\n", + "\n [Display(Order = 50)]", + "\n [Dimension(typeof(Scenario))]", + "\n [IdentityProperty]", + "\n public string Scenario { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Oy6PSvNeAkOrHXzbWi144g", + "cell_type": "markdown", + "source": [ + "For instance, the data pertaining to a certain [Reporting Node](#reporting-node) for a certain [Scenario](#scenario) is called an IfrsPartition and assigned a unique identifier:" + ], + "metadata": {} + }, + { + "id": "YQl5TqjBQUui3Ao3FsgiUw", + "cell_type": "code", + "source": [ + "public record PartitionByReportingNode : IfrsPartition {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "M8p4dGJQHkC7dFwqXU4RXQ", + "cell_type": "markdown", + "source": [ + "The partition PartitionByReportingNodeAndPeriod is a further partition of the IfrsPartition sets - In particular, it defines sets for the data pertaining to a certain [Reporting Node](#reporting-node), [Scenario](#scenario), year and month. The value of the Month is the last month of the reporting period to which the data belongs to. " + ], + "metadata": {} + }, + { + "id": "a7nDH2imYUeP23B6WT5yZw", + "cell_type": "code", + "source": [ + "public record PartitionByReportingNodeAndPeriod : IfrsPartition {", + "\n [Display(Order = 30)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [IdentityProperty]", + "\n public int Year { get; init; }", + "\n", + "\n [Display(Order = 40)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [IdentityProperty]", + "\n public int Month { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TZvDAkF0M02LQtQKCZLJRA", + "cell_type": "markdown", + "source": [ + "", + "\n# Policy-related Data Structures", + "\n", + "\nThe data structures below are the pieces of the data model where policy-related data is held." + ], + "metadata": {} + }, + { + "id": "kjn-7dhJgEa7EDS2jG2CbA", + "cell_type": "markdown", + "source": [ + "", + "\n## Data Node", + "\n", + "\nA data node is basically a set of labels which identify data according to its:", + "\n- Reporting Node", + "\n- Scenario", + "\n- Contractual Currency", + "\n- FunctionalCurrency", + "\n- LineOfBusiness", + "\n- ValuationApproach", + "\n- OCI Type" + ], + "metadata": {} + }, + { + "id": "7I3_uOSDzkuHhcVJMukGlA", + "cell_type": "markdown", + "source": [ + "TODOs:", + "\n" + ], + "metadata": {} + }, + { + "id": "XlZfZAGgi0GjV_7P_tJtiQ", + "cell_type": "code", + "source": [ + "public record DataNode : KeyedDimension, IPartitioned {", + "\n [NotVisible]", + "\n [PartitionKey(typeof(PartitionByReportingNode))]", + "\n public Guid Partition { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(Currency))]", + "\n //[Required] // TODO: check", + "\n //[Immutable] // TODO: Not available yet", + "\n public string ContractualCurrency { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(Currency))]", + "\n //[Required] // TODO: check", + "\n //[Immutable]", + "\n public string FunctionalCurrency { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(LineOfBusiness))]", + "\n //[Immutable]", + "\n public string LineOfBusiness { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(ValuationApproach))]", + "\n [Required]", + "\n //[Immutable]", + "\n public string ValuationApproach { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(OciType))]", + "\n //[Immutable]", + "\n public string OciType { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0Zg-7p1UNU6Wdzok3kr-AA", + "cell_type": "markdown", + "source": [ + "", + "\n## Portfolios", + "\n", + "\nA Portfolio is a set of Group of Contracts. The relationship is set on the Group of Contracts (see below).", + "\n", + "\nPortfolios are of type DataNode and there are two types: Insurance Portfolio and Reinsurance Portfolios." + ], + "metadata": {} + }, + { + "id": "0P3rhAjUNUyBonuP1k9uHg", + "cell_type": "code", + "source": [ + "public record Portfolio : DataNode {}", + "\n", + "\npublic record InsurancePortfolio : Portfolio {}", + "\npublic record ReinsurancePortfolio : Portfolio {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xbAt9JzjCE614P7B97aiVA", + "cell_type": "markdown", + "source": [ + "", + "\n## Group of Contracts", + "\n", + "\nA Group of Contract is a set of contracts with the same Annual Cohort, Liability Type, Profitability and Partner (in case the contracts are done with a re-insurer).", + "\n", + "\nVarious Group of Contracts are put together into portfolios." + ], + "metadata": {} + }, + { + "id": "la_B6Lgw10-Y8UNDpmZ3gA", + "cell_type": "code", + "source": [ + "public record GroupOfContract : DataNode {", + "\n [NotVisible] ", + "\n [Dimension(typeof(int), nameof(AnnualCohort))]", + "\n //[Immutable]", + "\n public int AnnualCohort { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(LiabilityType))]", + "\n //[Immutable]", + "\n public string LiabilityType { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(Profitability))]", + "\n //[Immutable]", + "\n public string Profitability { get; init; }", + "\n ", + "\n [Required]", + "\n [NotVisible] ", + "\n [Dimension(typeof(Portfolio))]", + "\n //[Immutable]", + "\n public string Portfolio { get; init; }", + "\n ", + "\n public virtual string Partner { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qgBtX4_gZEeQFJWmImnXKg", + "cell_type": "markdown", + "source": [ + "A group of insurance contracts is called a **GIC** and has no information on Partner.", + "\n", + "\nOnly Groups of Reinsurance Contracts, defined below and usually called **GRIC**s, have Partner information.", + "\nAgain, there are Insurance GRICs and Reinsurance GRICs:" + ], + "metadata": {} + }, + { + "id": "IGY1DT71jECwSzukcliQKg", + "cell_type": "code", + "source": [ + "public record GroupOfInsuranceContract : GroupOfContract {", + "\n [Required]", + "\n [NotVisible] ", + "\n [Display(Name = \"InsurancePortfolio\")]", + "\n [Dimension(typeof(InsurancePortfolio))]", + "\n //[Immutable]", + "\n public string Portfolio { get => base.Portfolio; init => base.Portfolio = value; }", + "\n ", + "\n // TODO: for the case of internal reinsurance the Partner would be the reporting node, hence not null.", + "\n // If this is true we need the [Required] attribute here, add some validation at dataNode import ", + "\n // and to add logic in the GetNonPerformanceRiskRate method in ImportStorage.", + "\n [NotVisible] ", + "\n [NotMapped]", + "\n //[Immutable]", + "\n public override string Partner => null;", + "\n}", + "\n", + "\npublic record GroupOfReinsuranceContract : GroupOfContract {", + "\n [Required]", + "\n [NotVisible] ", + "\n [Display(Name = \"ReinsurancePortfolio\")]", + "\n [Dimension(typeof(ReinsurancePortfolio))]", + "\n //[Immutable]", + "\n public string Portfolio { get => base.Portfolio; init => base.Portfolio = value; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "STd2Dg5TnU-jBYDxq-VbnA", + "cell_type": "markdown", + "source": [ + "", + "\n## Data Node State", + "\n", + "\nThe Data State is used to track whether a GOC is Active or Inactive across time (year and month). ", + "\nIt is only possible to update the state of a Group of Contract from Active to Inactive." + ], + "metadata": {} + }, + { + "id": "l1RwYYRGQUuYklornedCUA", + "cell_type": "code", + "source": [ + "public record DataNodeState : KeyedRecord, IPartitioned, IWithYearAndMonth", + "\n{", + "\n [NotVisible]", + "\n [PartitionKey(typeof(PartitionByReportingNode))]", + "\n public Guid Partition { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n public string DataNode { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n [DefaultValue(DefaultDataNodeActivationMonth)]", + "\n public int Month { get; init; } = DefaultDataNodeActivationMonth;", + "\n ", + "\n [Required]", + "\n [Display(Order = 40)]", + "\n [DefaultValue(State.Active)]", + "\n public State State { get; init; } = State.Active;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "siMZOfujgkCvYRhglSafRw", + "cell_type": "markdown", + "source": [ + "", + "\n## Data Node Parameters", + "\n", + "\nData Node Parameters are used to keep track of other parameters pertaining to each Data Node, and their movements in time (year and month).", + "\n
PremiumAllocation : defines the weight of Premium to be included in the Experience Adjustement AocType of the Technical Margin and is valid only for Group of Insurance Contract with LiabilityType : Liability for Remaining Coverage.", + "\n
ReinsuranceCoverage : defines the weight of the underlying gross business to be considered in the computation of the allocation of the Technical Margin in a Reinsurance case.", + "\n", + "\nThe latest Data Node Parameters available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used as the current value during calculation." + ], + "metadata": {} + }, + { + "id": "Y9V4hdUwV0WlDgxhiVJ0lg", + "cell_type": "code", + "source": [ + "public record DataNodeParameter : KeyedRecord, IPartitioned, IWithYearAndMonth", + "\n{", + "\n [NotVisible]", + "\n [PartitionKey(typeof(PartitionByReportingNode))]", + "\n public Guid Partition { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n [DefaultValue(DefaultDataNodeActivationMonth)]", + "\n public int Month { get; init; } = DefaultDataNodeActivationMonth;", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n public string DataNode { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Cnr2el8xg0OjF0x79bM9lQ", + "cell_type": "code", + "source": [ + "public record SingleDataNodeParameter : DataNodeParameter {", + "\n [DefaultValue(DefaultPremiumExperienceAdjustmentFactor)]", + "\n [Range(0, 1, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n public double PremiumAllocation { get; init; } = DefaultPremiumExperienceAdjustmentFactor;", + "\n}", + "\n", + "\npublic record InterDataNodeParameter : DataNodeParameter {", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 20)]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n public string LinkedDataNode { get; init; }", + "\n ", + "\n [Range(0, 1, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n public double ReinsuranceCoverage { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WCZyCC4Qlkm0FjxSRHM0xw", + "cell_type": "markdown", + "source": [ + "## DataNodeData PocoType", + "\nThe DataNodeData type is not persisted (i.e. not stored in the database) and is used in order to hold Data Node data during data manipulations." + ], + "metadata": {} + }, + { + "id": "koNxFi27ZkuU4_2cCG2GMA", + "cell_type": "code", + "source": [ + "public record DataNodeData {", + "\n public string DataNode { get; init; }", + "\n ", + "\n //Portfolio", + "\n public string ContractualCurrency { get; init; }", + "\n public string FunctionalCurrency { get; init; }", + "\n public string LineOfBusiness { get; init; }", + "\n public string ValuationApproach { get; init; }", + "\n public string OciType { get; init; }", + "\n ", + "\n //GroupOfContract", + "\n public string Portfolio { get; init; }", + "\n public int AnnualCohort { get; init; }", + "\n public string LiabilityType { get; init; }", + "\n public string Profitability { get; init; }", + "\n public string Partner { get; init; }", + "\n ", + "\n //DataNodeState", + "\n public int Year { get; init; }", + "\n public int Month { get; init; }", + "\n public State State { get; init; }", + "\n public State PreviousState { get; init; }", + "\n ", + "\n public bool IsReinsurance { get; init; }", + "\n ", + "\n public DataNodeData(){}", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9zeoLgvZ8EKhCCDbihId8w", + "cell_type": "markdown", + "source": [ + "", + "\n## Raw Variables (Cashflows)", + "\n", + "\nRaw Variables are used to store **cashflows** on the database during import, i.e. *after* mappings are applied and *before* calculations are applied.", + "\n", + "\nThey are stored on the database for both audit and re-calculation purposes." + ], + "metadata": {} + }, + { + "id": "vy4oWvNmmUGJTicrwsX63Q", + "cell_type": "code", + "source": [ + "public abstract record BaseVariableIdentity {", + "\n [NotVisible]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n [IdentityProperty]", + "\n public string DataNode { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(AocType))]", + "\n [IdentityProperty]", + "\n public string AocType { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(Novelty))]", + "\n [IdentityProperty]", + "\n public string Novelty { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_bTxTL4-o0efG6zNvhuDjg", + "cell_type": "code", + "source": [ + "public abstract record BaseDataRecord : BaseVariableIdentity, IKeyed, IPartitioned {", + "\n [Key]", + "\n [NotVisible] ", + "\n public Guid Id { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [PartitionKey(typeof(PartitionByReportingNodeAndPeriod))]", + "\n public Guid Partition { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(AmountType))]", + "\n [IdentityProperty]", + "\n public string AmountType { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(int),nameof(AccidentYear))]", + "\n [IdentityProperty]", + "\n public int? AccidentYear { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "X688yB4HTEm3riHh8lTrug", + "cell_type": "markdown", + "source": [ + "Basically, RawVariable is defined for a certain Reporting Node, Scenario, Year, Month, Amount Type and Calculation Type:" + ], + "metadata": {} + }, + { + "id": "kfbf0LwJSEGaxyUuPFnsKg", + "cell_type": "code", + "source": [ + "public record RawVariable : BaseDataRecord", + "\n{", + "\n [Conversion(typeof(PrimitiveArrayConverter))]", + "\n public double[] Values { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(CalculationType))]", + "\n [IdentityProperty]", + "\n public string CalculationType { get; init; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "IeCO6PmNPEioYptDRrzHTA", + "cell_type": "markdown", + "source": [ + "", + "\n## Ifrs Variable", + "\n", + "\nIfrs Variables are used to store:", + "\n", + "\n- **Actual Values**", + "\n- **Present Values**", + "\n", + "\nPresent Values are calculated from the [raw variables](#raw-variables) during the import of cashflows.", + "\n", + "\nIfrs Variables are stored on the database, i.e. they are 'persisted', for performance purposes." + ], + "metadata": {} + }, + { + "id": "H9N-c0drk0GPoWh-VfRXzA", + "cell_type": "code", + "source": [ + "public record IfrsVariable : BaseDataRecord", + "\n{", + "\n public double Value { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(EstimateType))]", + "\n [IdentityProperty]", + "\n public string EstimateType { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(EconomicBasis))]", + "\n [IdentityProperty]", + "\n public string EconomicBasis { get; init; }", + "\n ", + "\n public IfrsVariable (){}", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MCh8EtPVKUyEIcixf6Q_1Q", + "cell_type": "markdown", + "source": [ + "", + "\n## Import Identity", + "\nThe Import Identity contains the data elements used to determine the data sets which are used when performing data manipulations, e.g. during a [data import](./Import/ImportScopeCalculation) - In particular, an Import Identity is defined by: DataNode, AocType, Novelty, and whether it's reinsurance data or not:" + ], + "metadata": {} + }, + { + "id": "w5SSaFTyYE-3Xj0yy0eobw", + "cell_type": "code", + "source": [ + "public record ImportIdentity : BaseVariableIdentity {", + "\n ", + "\n [NotVisible]", + "\n public bool IsReinsurance { get; init; }", + "\n ", + "\n [NotVisible]", + "\n public string ValuationApproach { get; init; }", + "\n ", + "\n [NotVisible]", + "\n public int ProjectionPeriod { get; init; }", + "\n ", + "\n public (string, string) AocStep => (AocType, Novelty);", + "\n ", + "\n public ImportScope ImportScope { get; init; }", + "\n ", + "\n public ImportIdentity(RawVariable rv){", + "\n DataNode = rv.DataNode;", + "\n AocType = rv.AocType;", + "\n Novelty = rv.Novelty;", + "\n }", + "\n ", + "\n public ImportIdentity(IfrsVariable iv){", + "\n DataNode = iv.DataNode;", + "\n AocType = iv.AocType;", + "\n Novelty = iv.Novelty;", + "\n }", + "\n", + "\n public ImportIdentity(){}", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "31-e-C4gwESKBN8E0Rr6gQ", + "cell_type": "markdown", + "source": [ + "", + "\n# Report Variable", + "\n", + "\nReport Variables are used to hold data after data manipulations and before being outputed in the form of a report. They are not persisted, i.e. they are not saved on the database." + ], + "metadata": {} + }, + { + "id": "2yvEMKViYE6wZPnuy7AClg", + "cell_type": "code", + "source": [ + "public record ReportVariable {", + "\n", + "\n [NotVisible]", + "\n [Dimension(typeof(ReportingNode))]", + "\n [IdentityProperty]", + "\n public string ReportingNode { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Scenario))]", + "\n [IdentityProperty]", + "\n public string Scenario { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Currency), nameof(FunctionalCurrency))]", + "\n [IdentityProperty]", + "\n //[AggregateBy]", + "\n public string FunctionalCurrency { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Currency), nameof(ContractualCurrency))]", + "\n [IdentityProperty]", + "\n //[AggregateBy]", + "\n public string ContractualCurrency { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n [IdentityProperty]", + "\n public string GroupOfContract { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Portfolio))]", + "\n [IdentityProperty]", + "\n public string Portfolio { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(LineOfBusiness))]", + "\n [IdentityProperty]", + "\n public string LineOfBusiness { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(LiabilityType))]", + "\n [IdentityProperty]", + "\n public string LiabilityType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Profitability), nameof(InitialProfitability))]", + "\n [IdentityProperty]", + "\n public string InitialProfitability { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(ValuationApproach))]", + "\n [IdentityProperty]", + "\n public string ValuationApproach { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(AnnualCohort))]", + "\n [IdentityProperty]", + "\n public int AnnualCohort { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(OciType))]", + "\n [IdentityProperty]", + "\n public string OciType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Partner))]", + "\n [IdentityProperty]", + "\n public string Partner { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [IdentityProperty]", + "\n public bool IsReinsurance { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(AccidentYear))]", + "\n [IdentityProperty]", + "\n public int AccidentYear { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Projection))]", + "\n [IdentityProperty]", + "\n //[AggregateBy]", + "\n public int Projection { get; init;}", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(VariableType))]", + "\n [IdentityProperty]", + "\n public string VariableType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Novelty))]", + "\n [IdentityProperty]", + "\n public string Novelty { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(AmountType))]", + "\n [IdentityProperty]", + "\n public string AmountType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(EstimateType))]", + "\n [IdentityProperty]", + "\n public string EstimateType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(EconomicBasis))]", + "\n [IdentityProperty]", + "\n //[AggregateBy]", + "\n public string EconomicBasis { get; init; }", + "\n ", + "\n public double Value { get; init; }", + "\n ", + "\n public ReportVariable(){}", + "\n public ReportVariable(ReportVariable rv){", + "\n ReportingNode = rv.ReportingNode;", + "\n Scenario = rv.Scenario;", + "\n FunctionalCurrency = rv.FunctionalCurrency;", + "\n ContractualCurrency = rv.ContractualCurrency;", + "\n GroupOfContract = rv.GroupOfContract;", + "\n Portfolio = rv.Portfolio;", + "\n LineOfBusiness = rv.LineOfBusiness;", + "\n LiabilityType = rv.LiabilityType;", + "\n InitialProfitability = rv.InitialProfitability;", + "\n ValuationApproach = rv.ValuationApproach;", + "\n AnnualCohort = rv.AnnualCohort;", + "\n OciType = rv.OciType;", + "\n Partner = rv.Partner;", + "\n IsReinsurance = rv.IsReinsurance;", + "\n AccidentYear = rv.AccidentYear;", + "\n Projection = rv.Projection;", + "\n VariableType = rv.VariableType;", + "\n Novelty = rv.Novelty;", + "\n AmountType = rv.AmountType;", + "\n EstimateType = rv.EstimateType;", + "\n EconomicBasis = rv.EconomicBasis;", + "\n Value = rv.Value;", + "\n }", + "\n public ReportVariable(DataNodeData dn, IfrsVariable iv){", + "\n FunctionalCurrency = dn.FunctionalCurrency;", + "\n ContractualCurrency = dn.ContractualCurrency;", + "\n GroupOfContract = dn.DataNode;", + "\n Portfolio = dn.Portfolio;", + "\n LineOfBusiness = dn.LineOfBusiness;", + "\n LiabilityType = dn.LiabilityType;", + "\n InitialProfitability = dn.Profitability;", + "\n ValuationApproach = dn.ValuationApproach;", + "\n AnnualCohort = dn.AnnualCohort;", + "\n OciType = dn.OciType;", + "\n Partner = dn.Partner;", + "\n IsReinsurance = dn.IsReinsurance;", + "\n AccidentYear = iv.AccidentYear ?? default;", + "\n VariableType = iv.AocType;", + "\n Novelty = iv.Novelty;", + "\n AmountType = iv.AmountType;", + "\n EstimateType = iv.EstimateType;", + "\n EconomicBasis = iv.EconomicBasis;", + "\n Value = iv.Value;", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WtIFU8efQE2aUaVim03Iog", + "cell_type": "markdown", + "source": [ + "# Args" + ], + "metadata": {} + }, + { + "id": "i8WBwS3IuUqLxaV5XGKWsg", + "cell_type": "code", + "source": [ + "public record Args(string ReportingNode, int Year, int Month, Periodicity Periodicity, string Scenario){}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6FcgQqQpzE2yPeqwZNRfiQ", + "cell_type": "code", + "source": [ + "public record ImportArgs : Args", + "\n{", + "\n public string ImportFormat { get; init; }", + "\n ", + "\n public ImportArgs(string reportingNode, int year, int month, Periodicity periodicity, string scenario, string importFormat)", + "\n : base(reportingNode, year, month, periodicity, scenario)", + "\n {", + "\n ImportFormat = importFormat;", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "mJUZ9khq1k-jUZcG-qZniQ", + "cell_type": "code", + "source": [ + "public record ReportArgs : Args", + "\n{", + "\n public string HierarchyName { get; init; }", + "\n ", + "\n public CurrencyType CurrencyType { get; init; }", + "\n ", + "\n public string ReportName { get; init; } // this is the key to which data to load (like loading behavior). If null, loads everything", + "\n ", + "\n public ReportArgs(string reportingNode, int year, int month, Periodicity periodicity, string scenario, string hierarchyName, CurrencyType currencyType)", + "\n : base(reportingNode, year, month, periodicity, scenario)", + "\n {", + "\n CurrencyType = currencyType;", + "\n HierarchyName = hierarchyName;", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Database/.gitignore b/Database/.gitignore new file mode 100644 index 00000000..34be061b --- /dev/null +++ b/Database/.gitignore @@ -0,0 +1 @@ +PersonalConnection.ipynb \ No newline at end of file diff --git a/Database/Configure.ipynb b/Database/Configure.ipynb new file mode 100644 index 00000000..2819a9af --- /dev/null +++ b/Database/Configure.ipynb @@ -0,0 +1,131 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "vWKQtrDv20CeZFovAj82Vw", + "cell_type": "markdown", + "source": [ + "

DataSource Configuration

" + ], + "metadata": {} + }, + { + "id": "ekOMREP2YkKF0vgtOn6cyQ", + "cell_type": "code", + "source": [ + "#!import \"../DataModel/DataStructure\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "eEI7AS2fc0-CFjAR_WzdHg", + "cell_type": "code", + "source": [ + "#!import \"PersonalConnection\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZoHg5nndvEWdxnUy6nU0aQ", + "cell_type": "code", + "source": [ + "using System.Reflection;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "V3sPPe7bkEOIAjZHtM5oTw", + "cell_type": "markdown", + "source": [ + "# Database Configure" + ], + "metadata": {} + }, + { + "id": "ZxIo5q84i02LBlbq4AQnNA", + "cell_type": "code", + "source": [ + "var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())", + "\n .Where(t => (t.IsAssignableTo(typeof(IKeyed)) || t.IsAssignableTo(typeof(KeyedDimension)))", + "\n && !t.IsInterface", + "\n && !t.IsAbstract", + "\n ).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Wi93Z_KSukSEMiLoOfsKXA", + "cell_type": "code", + "source": [ + "await DataSource.Configure().UseMsSql(opt => opt.WithConnectionString(connectionStringMsSql)", + "\n .WithTypes(allTypes)) .ConnectAsync();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4jSr3apQzEm6bXs7ot9uJQ", + "cell_type": "code", + "source": [ + "await DataSource.CommitAsync();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "SUiuO25f-0S6Uv5at0MehA", + "cell_type": "markdown", + "source": [ + "# Reset Workspace" + ], + "metadata": {} + }, + { + "id": "T0pNd11nrkuDwN6S0YgItg", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "sAYMeiwmiUWC-T3QYXi7aw", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Database/Schema Delete.ipynb b/Database/Schema Delete.ipynb new file mode 100644 index 00000000..49792b90 --- /dev/null +++ b/Database/Schema Delete.ipynb @@ -0,0 +1,87 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "documentInfo": "{\r\n \"authors\": [\r\n \"Peter Kunszt\"\r\n ],\r\n \"contributors\": [],\r\n \"tags\": [\r\n \"storage\",\r\n \"database\",\r\n \"persistence\",\r\n \"dependency\"\r\n ],\r\n \"title\": \"Multiple Storages with Persistence\",\r\n \"description\": \"Demo the usage of database backend to resolve a data dependency.\",\r\n \"createdDate\": \"Jan. 2022\",\r\n \"publishedDate\": \"Jan. 2022\",\r\n \"changelog\": [\r\n {\r\n \"version\": \"1.0\",\r\n \"description\": \"Initial Notebook\"\r\n }\r\n ]\r\n }" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "XekEwxVoCk6YtMSTaBi_6A", + "cell_type": "code", + "source": [ + "#!import \"PersonalConnection\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "aMGWTiny-EO8ZtyaiC0M2A", + "cell_type": "code", + "source": [ + "#r \"nuget:SqlConnection,1.0.4\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dKBE6yQHq0CZbS4Oq7ZXag", + "cell_type": "code", + "source": [ + "string[] split = connectionStringMsSql.Split(new char[] { '=', ':', ',', ';' });", + "\n", + "\nstring serverName = split[2];", + "\nstring database = split[5];", + "\nstring userID = split[9];", + "\nstring password = split[11];" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BBbDUGWgHUywoxk289vQ2A", + "cell_type": "code", + "source": [ + "using SQLConnection;", + "\nusing System;", + "\nusing System.Data.SqlClient;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "S-_OArgE70qFUpEbX12H3Q", + "cell_type": "code", + "source": [ + "string query = \"DECLARE @sql NVARCHAR(max)='' SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; 'FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' Exec Sp_executesql @sql\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "oeQryPr0l0uflGqNrUvmLw", + "cell_type": "code", + "source": [ + "int rowAffect = SqlServer.AzureSqlConnection(serverName, database, userID, password, query);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Export/MapTemplate.ipynb b/Export/MapTemplate.ipynb new file mode 100644 index 00000000..c1fb9d01 --- /dev/null +++ b/Export/MapTemplate.ipynb @@ -0,0 +1,338 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "J7Lk0NfjhkC9DBXVAnd4ag", + "cell_type": "markdown", + "source": [ + "

Map Template

" + ], + "metadata": {} + }, + { + "id": "nJozo1XeSkeGCLiQXUPlzA", + "cell_type": "markdown", + "source": [ + "This Notebook exports the Data nodes, states, and parameters for the target partition to a spreadsheet file which can be read, modified, and is ready to be re-imported." + ], + "metadata": {} + }, + { + "id": "T4LYGKNFjke1IDEPU8E44Q", + "cell_type": "markdown", + "source": [ + "After setting the desired target Partition, the Data present in the workspace is ready to be exported. " + ], + "metadata": {} + }, + { + "id": "J3Om4qznT0qnFdizsJg6gA", + "cell_type": "markdown", + "source": [ + "# Import dependencies" + ], + "metadata": {} + }, + { + "id": "jz0ZzjaNNkyPlNjH7p_9CQ", + "cell_type": "code", + "source": [ + "#!import \"../Utils/UtilityMethods\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4kGmVeM2F0y1LR3iEJJAaA", + "cell_type": "markdown", + "source": [ + "# Select Initialization" + ], + "metadata": {} + }, + { + "id": "nVFGNWhtb0iw49kOFNKpUQ", + "cell_type": "markdown", + "source": [ + "Choose to run the Map Template either with the set of Systemorph data in memory or with the data present in the Database. Uncomment the desired option." + ], + "metadata": {} + }, + { + "id": "MbQiJg5acUurtMhQFZOPtw", + "cell_type": "code", + "source": [ + "/* The DataSource is configured and connected to real database */", + "\n//#!eval-notebook \"Database/Configure\"", + "\n/* The Systemorph set of dimensions + mockdata are dispatched to the unconfigured in-memory DataSource */", + "\n#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Ma-JBoxkmUqAb81Pb2v8EA", + "cell_type": "markdown", + "source": [ + "# Workspace Initialization " + ], + "metadata": {} + }, + { + "id": "zaO0K3_d3UOftmtrwhqrFg", + "cell_type": "markdown", + "source": [ + "Firstly, the Workspace is initialized with basic dimensions and with Data Nodes. For a list of the dimensions please refer to the DataModel/DataStructure notebook." + ], + "metadata": {} + }, + { + "id": "BP4HG8krfkul6dXSvdGHnw", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CirOR3dQA0iqxXipYfNcFQ", + "cell_type": "markdown", + "source": [ + "# Map Template: Data Node" + ], + "metadata": {} + }, + { + "id": "z1pGwBuU20ywRLjN6Gj5eg", + "cell_type": "markdown", + "source": [ + "## Set Partition" + ], + "metadata": {} + }, + { + "id": "8y9ezk2H7EetGACPthoNUw", + "cell_type": "code", + "source": [ + "static var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XFPlV7vwiUCUY7llRpEeEQ", + "cell_type": "code", + "source": [ + "await Workspace.Partition.SetAsync( partition );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "7MTJTAXvjUCDuc6-sHSUQQ", + "cell_type": "markdown", + "source": [ + "## Export" + ], + "metadata": {} + }, + { + "id": "yBbsPeQ5XkO5M_mXJtkiTw", + "cell_type": "code", + "source": [ + "await Export.ToExcel(\"DataNodes\")", + "\n .WithSource(Workspace)", + "\n .PortfolioConfiguration()", + "\n .PortfolioConfiguration()", + "\n .GroupofContractConfiguration(typeof(ReinsurancePortfolio))", + "\n .GroupofContractConfiguration(typeof(InsurancePortfolio))", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "SG9iYPdfGkOJqrcbjN-cIQ", + "cell_type": "markdown", + "source": [ + "# Map Template: Data Node State" + ], + "metadata": {} + }, + { + "id": "go7LKWKxBECDgXOhv9Se8g", + "cell_type": "markdown", + "source": [ + "## Set Partition" + ], + "metadata": {} + }, + { + "id": "b7xD5r6TuE2QTO-J6L8q-Q", + "cell_type": "code", + "source": [ + "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "q1MIgSZcNE60Sx6cCGC9YA", + "cell_type": "code", + "source": [ + "await Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "reWr-I2FeUijpPeiXGdOCA", + "cell_type": "markdown", + "source": [ + "## Export" + ], + "metadata": {} + }, + { + "id": "iW-JFPjuS0q_aGWGSn4Ujg", + "cell_type": "code", + "source": [ + "var dataNodeStates = (await Workspace.Query()", + "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year).ToArrayAsync())", + "\n .GroupBy(x => x.DataNode)", + "\n .Select(x => x.OrderByDescending(y => y.Year).ThenByDescending(y => y.Month))", + "\n .Select(x => x.Last())", + "\n .ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "64_Gk6W_qkuh47zAJ1xcZw", + "cell_type": "code", + "source": [ + "await Export.ToExcel(\"DataNodeState\")", + "\n .WithSource(Workspace)", + "\n .StateEnumConfiguration() ", + "\n .DataNodeStateConfiguration(dataNodeStates)", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Aolg5llKGkWX3-v94jBP8A", + "cell_type": "markdown", + "source": [ + "# Map Template: Data Node Parameter" + ], + "metadata": {} + }, + { + "id": "amCy5h6BA0K6wxCh7NvZrg", + "cell_type": "markdown", + "source": [ + "## Set Partition" + ], + "metadata": {} + }, + { + "id": "kMTcDi7DFEC6FuMagh5uDg", + "cell_type": "code", + "source": [ + "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-tmD3uOmwUmFUX_q78nD7A", + "cell_type": "code", + "source": [ + "await Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "z6pkleZXd0mZN82EQprS3w", + "cell_type": "markdown", + "source": [ + "## Export" + ], + "metadata": {} + }, + { + "id": "0zdLZPrPw0Sm4w1TjesGMQ", + "cell_type": "code", + "source": [ + "var dataNodeParameters = (await Workspace.Query()", + "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year).ToArrayAsync())", + "\n .GroupBy(x => x.GetType().Name)", + "\n .ToDictionary(x => x.Key, ", + "\n x => x.GroupBy(y => y.DataNode)", + "\n .Select(y => y.OrderByDescending(z => z.Year).ThenByDescending(z => z.Month))", + "\n .Select(y => y.Last())", + "\n .ToArray() );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xp0dlpVqC0mQfbqqrpn8Aw", + "cell_type": "code", + "source": [ + "await Export.ToExcel(\"DataNodeParameter\")", + "\n .WithSource(Workspace)", + "\n .DataNodeParameterConfiguration(dataNodeParameters)", + "\n .MainTabConfiguration(partition)", + "\n.ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3tf3mjl0gUqui_fD_X7OmQ", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Files/300.ReportingNodes/ReportingNodes.csv b/Files/300.ReportingNodes/ReportingNodes.csv new file mode 100644 index 00000000..ffaab637 --- /dev/null +++ b/Files/300.ReportingNodes/ReportingNodes.csv @@ -0,0 +1,10 @@ +@@ReportingNode,,,, +SystemName,DisplayName,Parent,Currency +G,Group,,CHF +CH,Switzerland,G,CHF +DE,Germany,G,EUR +ES,Spain,G,EUR +FR,France,G,EUR +IT,Italy,G,EUR +UK,United Kingdom,G,GBP +SK,Slovakia,G,EUR diff --git a/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv b/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv new file mode 100644 index 00000000..19a655dc --- /dev/null +++ b/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv @@ -0,0 +1,22 @@ +@@Main,, +ReportingNode,Year,Month +CH,2020,12 +,, +@@SingleDataNodeParameter,, +DataNode,PremiumAllocation, +GicComplex,0.8, +DT1.1,0.8, +DT1.2,0.8, +DT1.3,1, +DT2.1,0.8, +DT2.2,0.8, +DT3.1,0.8, +DT4.1,0.8, +,, +@@InterDataNodeParameter,, +DataNode,LinkedDataNode,ReinsuranceCoverage +DT1.1,DTR1.1,1 +DT1.2,DTR1.2,1 +DT2.1,DTR2.1,1 +DT2.2,DTR2.2,1 +GricComplex,GicComplex,1 diff --git a/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv b/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv new file mode 100644 index 00000000..78802935 --- /dev/null +++ b/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv @@ -0,0 +1,19 @@ +@@Main,, +ReportingNode,Year,Month +CH,2020,12 +,, +@@DataNodeState,, +DataNode,State, +GicComplex,Active, +GricComplex,Active, +DT1.1,Active, +DT1.2,Active, +DT1.3,Active, +DT2.1,Active, +DT2.2,Active, +DT3.1,Active, +DT4.1,Active, +DTR1.1,Active, +DTR1.2,Active, +DTR2.1,Active, +DTR2.2,Active, diff --git a/Files/700.DataNodes/DataNodes_CH.csv b/Files/700.DataNodes/DataNodes_CH.csv new file mode 100644 index 00000000..54f5657f --- /dev/null +++ b/Files/700.DataNodes/DataNodes_CH.csv @@ -0,0 +1,36 @@ +@@Main,,,,,, +ReportingNode,,,,,, +CH,,,,,, +,,,,,, +@@InsurancePortfolio,,,,,, +SystemName,DisplayName,ContractualCurrency,LineOfBusiness,ValuationApproach,OciType, +DT,DT complex CF,USD,ANN,BBA,Default, +DT1,DT1 OCI,USD,ANN,BBA,Default, +DT2,DT2 NOCI,USD,ANN,BBA,, +DT3,DT3 RunOff,USD,ANN,BBA,Default, +DT4,DT4 OCI,USD,ANN,BBA,Default, +,,,,,, +@@GroupOfInsuranceContract,,,,,, +SystemName,DisplayName,InsurancePortfolio,AnnualCohort,LiabilityType,Profitability, +GicComplex,Gic test discounting,DT,2020,LRC,P, +DT1.1,DT1.1 OCI LRC PA 0.8,DT1,2020,LRC,P, +DT1.2,DT1.2 OCI LIC,DT1,2020,LIC,P, +DT1.3,DT1.3 OCI LRC PA 1,DT1,2020,LRC,P, +DT2.1,DT2.1 NOCI LRC PA 0.8,DT2,2020,LRC,P, +DT2.2,DT2.2 NOCI LIC,DT2,2020,LIC,P, +DT3.1,DT3.1 Runoff - PA 0.8,DT3,2020,LRC,P, +DT4.1,DT4.1 CSM PA 0.8,DT4,2020,LRC,P, +,,,,,, +@@ReinsurancePortfolio,,,,,, +SystemName,DisplayName,ContractualCurrency,LineOfBusiness,ValuationApproach,OciType, +DTR,DTR complex CF,USD,ANN,BBA,, +DTR1,DTR1 OCI,USD,ANN,BBA,Default, +DTR2,DTR2 NOCI,USD,ANN,BBA,, +,,,,,, +@@GroupOfReinsuranceContract,,,,,, +SystemName,DisplayName,ReinsurancePortfolio,AnnualCohort,LiabilityType,Profitability,Partner +GricComplex,Gric test for discounting,DTR,2020,LRC,P,PT1 +DTR1.1,DTR1.1 OCI LRC,DTR1,2020,LRC,P,PT1 +DTR1.2,DTR1.2 OCI LIC,DTR1,2020,LIC,P,PT1 +DTR2.1,DTR2.1 NOCI LRC,DTR2,2020,LRC,P,PT1 +DTR2.2,DTR2.2 NOCI LIC,DTR2,2020,LIC,P,PT1 diff --git a/Files/800.Parameters/CreditDefaultRate.csv b/Files/800.Parameters/CreditDefaultRate.csv new file mode 100644 index 00000000..b39c644e --- /dev/null +++ b/Files/800.Parameters/CreditDefaultRate.csv @@ -0,0 +1,23 @@ +@@CreditDefaultRate,,, +Year,Month,CreditRiskRating,Values0 +1900,12,AAA,0.00014 +1900,12,AA+,0.000242487 +1900,12,AA,0.00042 +1900,12,AA-,0.000469849 +1900,12,A+,0.000525615 +1900,12,A,0.000588 +1900,12,A-,0.000853615 +1900,12,BBB+,0.001239215 +1900,12,BBB,0.001799 +1900,12,BBB-,0.00297649 +1900,12,BB+,0.004924677 +1900,12,BB,0.008148 +1900,12,BB-,0.011522675 +1900,12,B+,0.016295046 +1900,12,B,0.023044 +1900,12,B-,0.031505634 +1900,12,CCC+,0.043074334 +1900,12,CCC,0.058891 +1900,12,CCC-,0.079972327 +1900,12,CC,0.108600179 +1900,12,C,0.147476 diff --git a/Files/800.Parameters/ExchangeRate.csv b/Files/800.Parameters/ExchangeRate.csv new file mode 100644 index 00000000..8ac834c7 --- /dev/null +++ b/Files/800.Parameters/ExchangeRate.csv @@ -0,0 +1,14 @@ +@@ExchangeRate +Currency,Year,Month,FxType,FxToGroupCurrency +EUR,2021,3,Average,1.2012 +EUR,2021,3,Spot,1.2013 +EUR,2020,12,Average,1.2014 +EUR,2020,12,Spot,1.2015 +USD,2021,3,Average,1.2016 +USD,2021,3,Spot,1.2017 +USD,2020,12,Average,1.2018 +USD,2020,12,Spot,1.2019 +GBP,2021,3,Average,1.4016 +GBP,2021,3,Spot,1.4017 +GBP,2020,12,Average,1.4018 +GBP,2020,12,Spot,1.4019 \ No newline at end of file diff --git a/Files/800.Parameters/PartnerRating.csv b/Files/800.Parameters/PartnerRating.csv new file mode 100644 index 00000000..8f9d717c --- /dev/null +++ b/Files/800.Parameters/PartnerRating.csv @@ -0,0 +1,4 @@ +@@PartnerRating +Partner,CreditRiskRating,Year,Month +PT1,AAA,2020,12 +PT1,BBB,2021,3 \ No newline at end of file diff --git a/Files/800.Parameters/YieldCurve.csv b/Files/800.Parameters/YieldCurve.csv new file mode 100644 index 00000000..892b7ee7 --- /dev/null +++ b/Files/800.Parameters/YieldCurve.csv @@ -0,0 +1,11 @@ +@@YieldCurve,,,,,, +Currency,Year,Month,Values0,Values1,Values2,Values3 +EUR,2020,3,0.008685495,0.008685495,0.018498471,0.019966839 +CHF,2020,3,0.002,0.002,0.002,0.002 +CHF,2021,3,0.1,0.1,0.1,0.1 +USD,2021,3,0.005,0.005,0.005,0.005 +USD,2020,12,0.002,0.002,0.002,0.002 +USD,2020,3,0.002,0.002,0.002,0.002 +USD,2020,1,0.002,0.002,0.002,0.002 +GBP,2021,3,0.005,0.005,0.005,0.005 +GBP,2020,3,0.002,0.002,0.002,0.002 diff --git a/Files/900.TransactionalData/Actuals_CH_2020_12.csv b/Files/900.TransactionalData/Actuals_CH_2020_12.csv new file mode 100644 index 00000000..12bfc994 --- /dev/null +++ b/Files/900.TransactionalData/Actuals_CH_2020_12.csv @@ -0,0 +1,33 @@ +@@Main,,,, +ReportingNode,Year,Month,, +CH,2020,12,, +@@Actual,,,, +DataNode,AocType,ValueType,AccidentYear,Value +DT1.1,CF,PR,,-400 +DT1.1,CF,NIC,,280 +DT1.1,CF,ACA,,10 +DT1.1,CF,AEA,,5 +DT1.2,CF,NIC,2020,280 +DT2.1,CF,PR,,-400 +DT2.1,CF,NIC,,280 +DT2.1,CF,ACA,,10 +DT2.1,CF,AEA,,5 +DT1.3,CF,PR,,-400 +DT1.3,CF,NIC,,280 +DT1.3,CF,ACA,,10 +DT1.3,CF,AEA,,5 +DT2.2,CF,NIC,2020,280 +DTR1.1,CF,PR,,200 +DTR1.1,CF,NIC,,-140 +DTR1.2,CF,NIC,2020,-140 +DTR2.1,CF,PR,,200 +DTR2.1,CF,NIC,,-140 +DTR2.2,CF,NIC,2020,-140 +DT3.1,CF,PR,,-400 +DT3.1,CF,NIC,,280 +DT3.1,CF,ACA,,10 +DT3.1,CF,AEA,,5 +DT4.1,CF,PR,,-400 +DT4.1,CF,NIC,,280 +DT4.1,CF,ACA,,10 +DT4.1,CF,AEA,,5 diff --git a/Files/900.TransactionalData/Actuals_CH_2021_3.csv b/Files/900.TransactionalData/Actuals_CH_2021_3.csv new file mode 100644 index 00000000..d52bae26 --- /dev/null +++ b/Files/900.TransactionalData/Actuals_CH_2021_3.csv @@ -0,0 +1,62 @@ +@@Main,,,, +ReportingNode,Year,Month,, +CH,2021,3,, +@@Actual,,,, +DataNode,AocType,ValueType,AccidentYear,Value +DT1.1,WO,PayablePR,,-4 +DT1.1,WO,ReceivablePR,,2 +DT1.1,CF,PayablePR,,5 +DT1.1,CF,ReceivablePR,,-3 +DT1.1,CF,PR,,-90 +DT1.1,CF,ICO,,6 +DT1.1,CF,NIC,,70 +DT1.1,CF,ACA,,10 +DT1.1,CF,AEA,,5 +DT1.2,CF,NIC,2020,76 +DT1.3,WO,PayablePR,,-4 +DT1.3,WO,ReceivablePR,,2 +DT1.3,CF,PayablePR,,5 +DT1.3,CF,ReceivablePR,,-3 +DT1.3,CF,PR,,-90 +DT1.3,CF,ICO,,6 +DT1.3,CF,NIC,,70 +DT1.3,CF,ACA,,10 +DT1.3,CF,AEA,,5 +DT2.1,WO,PayablePR,,-4 +DT2.1,WO,ReceivablePR,,2 +DT2.1,CF,PayablePR,,5 +DT2.1,CF,ReceivablePR,,-3 +DT2.1,CF,PR,,-90 +DT2.1,CF,ICO,,6 +DT2.1,CF,NIC,,70 +DT2.1,CF,ACA,,10 +DT2.1,CF,AEA,,5 +DT2.2,CF,NIC,2020,76 +DTR1.1,CF,PayablePR,,-2 +DTR1.1,CF,ReceivablePR,,1.5 +DTR1.1,CF,PR,,45 +DTR1.1,CF,NIC,,-35 +DTR1.2,CF,NIC,2020,-35 +DTR2.1,CF,PayablePR,,-2 +DTR2.1,CF,ReceivablePR,,1.5 +DTR2.1,CF,PR,,45 +DTR2.1,CF,NIC,,-35 +DTR2.2,CF,NIC,2020,-35 +DT3.1,WO,PayablePR,,-4 +DT3.1,WO,ReceivablePR,,2 +DT3.1,CF,PayablePR,,5 +DT3.1,CF,ReceivablePR,,-3 +DT3.1,CF,PR,,-90 +DT3.1,CF,ICO,,6 +DT3.1,CF,NIC,,70 +DT3.1,CF,ACA,,10 +DT3.1,CF,AEA,,5 +DT4.1,WO,PayablePR,,-4 +DT4.1,WO,ReceivablePR,,2 +DT4.1,CF,PayablePR,,5 +DT4.1,CF,ReceivablePR,,-3 +DT4.1,CF,PR,,-90 +DT4.1,CF,ICO,,6 +DT4.1,CF,NIC,,70 +DT4.1,CF,ACA,,10 +DT4.1,CF,AEA,,5 diff --git a/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv b/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv new file mode 100644 index 00000000..8808da31 --- /dev/null +++ b/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv @@ -0,0 +1,85 @@ +@@Main,,,,,,,,,,,,,,,,,,,,,,,,,,,, +ReportingNode,Year,Month,Scenario,,,,,,,,,,,,,,,,,,,,,,,,, +CH,2020,12,,,,,,,,,,,,,,,,,,,,,,,,,, +@@Cashflow,,,,,,,,,,,,,,,,,,,,,,,,,,,, +DataNode,AmountType,AocType,Novelty,AccidentYear,Values0,Values1,Values2,Values3,Values4,Values5,Values6,Values7,Values8,Values9,Values10,Values11,Values12,Values13,Values14,Values15,Values16,Values17,Values18,Values19,Values20,Values21,Values22,Values23 +DT1.1,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT1.1,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT1.1,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT1.1,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT1.1,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT1.1,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT1.1,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT1.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT1.2,NIC,BOP,N,2020,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT1.2,CU,BOP,N,2020,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT1.2,RA,BOP,N,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT1.2,NIC,CL,C,2020,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT1.2,CU,CL,C,2020,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT1.2,RA,CL,C,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT1.3,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT1.3,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT1.3,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT1.3,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT1.3,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT1.3,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT1.3,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT1.3,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT2.1,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT2.1,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT2.1,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT2.1,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT2.1,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT2.1,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT2.1,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT2.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT2.2,NIC,BOP,N,2020,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT2.2,CU,BOP,N,2020,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT2.2,RA,BOP,N,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT2.2,NIC,CL,C,2020,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT2.2,CU,CL,C,2020,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT2.2,RA,CL,C,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DTR1.1,PR,BOP,N,,50,0,0,50,0,0,50,0,0,50,0,0,0,50,0,0,50,0,0,50,0,0,50,0 +DTR1.1,NIC,BOP,N,,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 +DTR1.1,CU,BOP,N,,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 +DTR1.1,RA,BOP,N,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 +DTR1.1,PR,CL,C,,50,0,0,50,0,0,50,0,0,50,0,0,0,50,0,0,50,0,0,50,0,0,50,0 +DTR1.1,NIC,CL,C,,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 +DTR1.1,CU,CL,C,,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 +DTR1.1,RA,CL,C,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 +DTR1.2,NIC,BOP,N,2020,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 +DTR1.2,CU,BOP,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 +DTR1.2,RA,BOP,N,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 +DTR1.2,NIC,CL,C,2020,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 +DTR1.2,CU,CL,C,2020,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 +DTR1.2,RA,CL,C,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 +DTR2.1,PR,BOP,N,,50,0,0,50,0,0,50,0,0,50,0,0,0,50,0,0,50,0,0,50,0,0,50,0 +DTR2.1,NIC,BOP,N,,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 +DTR2.1,CU,BOP,N,,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 +DTR2.1,RA,BOP,N,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 +DTR2.1,PR,CL,C,,50,0,0,50,0,0,50,0,0,50,0,0,0,50,0,0,50,0,0,50,0,0,50,0 +DTR2.1,NIC,CL,C,,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 +DTR2.1,CU,CL,C,,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 +DTR2.1,RA,CL,C,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 +DTR2.2,NIC,BOP,N,2020,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 +DTR2.2,CU,BOP,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 +DTR2.2,RA,BOP,N,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 +DTR2.2,NIC,CL,C,2020,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 +DTR2.2,CU,CL,C,2020,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 +DTR2.2,RA,CL,C,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 +DT3.1,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT3.1,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT3.1,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT3.1,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT3.1,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT3.1,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT3.1,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT3.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT4.1,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT4.1,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT4.1,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT4.1,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT4.1,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 +DT4.1,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 +DT4.1,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 +DT4.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 diff --git a/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv b/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv new file mode 100644 index 00000000..7bd3bdce --- /dev/null +++ b/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv @@ -0,0 +1,158 @@ +@@Main,,,,,,,,,,,,,,,,,,,,,,,,, +ReportingNode,Year,Month,,,,,,,,,,,,,,,,,,,,,,, +CH,2021,3,,,,,,,,,,,,,,,,,,,,,,, +@@Cashflow,,,,,,,,,,,,,,,,,,,,,,,,, +DataNode,AmountType,AocType,Novelty,AccidentYear,Values0,Values1,Values2,Values3,Values4,Values5,Values6,Values7,Values8,Values9,Values10,Values11,Values12,Values13,Values14,Values15,Values16,Values17,Values18,Values19,Values20 +DT1.1,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 +DT1.1,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 +DT1.1,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 +DT1.1,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 +DT1.1,PR,BOP,N,,0,-10,0,0,-10,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0 +DT1.1,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT1.1,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 +DT1.1,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT1.1,PR,EV,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 +DT1.1,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT1.1,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 +DT1.1,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DT1.1,PR,CL,C,,0,-115,0,0,-115,0,0,-115,0,0,-115,0,0,0,0,0,0,0,0,0,0 +DT1.1,ICO,CL,C,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT1.1,NIC,CL,C,,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0 +DT1.1,CU,CL,C,,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 +DT1.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DT1.2,NIC,MC,I,2020,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 +DT1.2,CU,MC,I,2020,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 +DT1.2,RA,MC,I,2020,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 +DT1.2,NIC,BOP,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 +DT1.2,RA,BOP,N,2020,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT1.2,NIC,EV,N,2020,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 +DT1.2,RA,EV,N,2020,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DT1.2,NIC,CL,C,2020,30,30,30,30,30,30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0 +DT1.2,CU,CL,C,2020,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 +DT1.2,RA,CL,C,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DT1.3,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 +DT1.3,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 +DT1.3,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 +DT1.3,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 +DT1.3,PR,BOP,N,,0,-10,0,0,-10,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0 +DT1.3,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT1.3,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 +DT1.3,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT1.3,PR,EV,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 +DT1.3,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT1.3,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 +DT1.3,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DT1.3,PR,CL,C,,0,-115,0,0,-115,0,0,-115,0,0,-115,0,0,0,0,0,0,0,0,0,0 +DT1.3,ICO,CL,C,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT1.3,NIC,CL,C,,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0 +DT1.3,CU,CL,C,,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 +DT1.3,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DT2.1,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 +DT2.1,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 +DT2.1,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 +DT2.1,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 +DT2.1,PR,BOP,N,,0,-10,0,0,-10,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0 +DT2.1,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT2.1,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 +DT2.1,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT2.1,PR,EV,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 +DT2.1,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT2.1,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 +DT2.1,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DT2.1,PR,CL,C,,0,-115,0,0,-115,0,0,-115,0,0,-115,0,0,0,0,0,0,0,0,0,0 +DT2.1,ICO,CL,C,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT2.1,NIC,CL,C,,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0 +DT2.1,CU,CL,C,,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 +DT2.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DT2.2,NIC,MC,I,2020,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 +DT2.2,CU,MC,I,2020,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 +DT2.2,RA,MC,I,2020,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 +DT2.2,NIC,BOP,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 +DT2.2,RA,BOP,N,2020,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT2.2,NIC,EV,N,2020,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 +DT2.2,RA,EV,N,2020,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DT2.2,NIC,CL,C,2020,30,30,30,30,30,30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0 +DT2.2,CU,CL,C,2020,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 +DT2.2,RA,CL,C,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DTR1.1,PR,MC,I,,0,55,0,0,55,0,0,55,0,0,55,0,0,0,0,0,0,0,0,0,0 +DTR1.1,NIC,MC,I,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 +DTR1.1,CU,MC,I,,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5,0,0,0,0,0,0,0,0,0 +DTR1.1,RA,MC,I,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DTR1.1,PR,BOP,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 +DTR1.1,NIC,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR1.1,RA,BOP,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DTR1.1,PR,EV,N,,0,2.5,0,0,2.5,0,0,2.5,0,0,2.5,0,0,0,0,0,0,0,0,0,0 +DTR1.1,NIC,EV,N,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 +DTR1.1,RA,EV,N,,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,0,0,0,0,0,0,0,0,0 +DTR1.1,PR,CL,C,,0,57.5,0,0,57.5,0,0,57.5,0,0,57.5,0,0,0,0,0,0,0,0,0,0 +DTR1.1,NIC,CL,C,,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,0,0,0,0,0,0,0,0,0 +DTR1.1,CU,CL,C,,7.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,2.5,0,0,0,0,0,0,0,0,0 +DTR1.1,RA,CL,C,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,0,0,0,0,0,0,0,0,0 +DTR1.2,NIC,MC,I,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 +DTR1.2,CU,MC,I,2020,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5,0,0,0,0,0,0,0,0,0 +DTR1.2,RA,MC,I,2020,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DTR1.2,NIC,BOP,N,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR1.2,RA,BOP,N,2020,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DTR1.2,NIC,EV,N,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 +DTR1.2,RA,EV,N,2020,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,0,0,0,0,0,0,0,0,0 +DTR1.2,NIC,CL,C,2020,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,0,0,0,0,0,0,0,0,0 +DTR1.2,CU,CL,C,2020,7.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,2.5,0,0,0,0,0,0,0,0,0 +DTR1.2,RA,CL,C,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,0,0,0,0,0,0,0,0,0 +DTR2.1,PR,MC,I,,0,55,0,0,55,0,0,55,0,0,55,0,0,0,0,0,0,0,0,0,0 +DTR2.1,NIC,MC,I,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 +DTR2.1,CU,MC,I,,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5,0,0,0,0,0,0,0,0,0 +DTR2.1,RA,MC,I,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DTR2.1,PR,BOP,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 +DTR2.1,NIC,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR2.1,RA,BOP,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DTR2.1,PR,EV,N,,0,2.5,0,0,2.5,0,0,2.5,0,0,2.5,0,0,0,0,0,0,0,0,0,0 +DTR2.1,NIC,EV,N,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 +DTR2.1,RA,EV,N,,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,0,0,0,0,0,0,0,0,0 +DTR2.1,PR,CL,C,,0,57.5,0,0,57.5,0,0,57.5,0,0,57.5,0,0,0,0,0,0,0,0,0,0 +DTR2.1,NIC,CL,C,,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,0,0,0,0,0,0,0,0,0 +DTR2.1,CU,CL,C,,7.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,2.5,0,0,0,0,0,0,0,0,0 +DTR2.1,RA,CL,C,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,0,0,0,0,0,0,0,0,0 +DTR2.2,NIC,MC,I,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 +DTR2.2,CU,MC,I,2020,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5,0,0,0,0,0,0,0,0,0 +DTR2.2,RA,MC,I,2020,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DTR2.2,NIC,BOP,N,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR2.2,RA,BOP,N,2020,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DTR2.2,NIC,EV,N,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 +DTR2.2,RA,EV,N,2020,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,0,0,0,0,0,0,0,0,0 +DTR2.2,NIC,CL,C,2020,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,0,0,0,0,0,0,0,0,0 +DTR2.2,CU,CL,C,2020,7.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,2.5,0,0,0,0,0,0,0,0,0 +DTR2.2,RA,CL,C,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,0,0,0,0,0,0,0,0,0 +DT3.1,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 +DT3.1,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 +DT3.1,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 +DT3.1,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 +DT3.1,PR,BOP,N,,0,-10,0,0,-10,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0 +DT3.1,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT3.1,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 +DT3.1,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT3.1,PR,EV,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 +DT3.1,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT3.1,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 +DT3.1,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DT3.1,PR,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +DT3.1,ICO,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +DT3.1,NIC,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +DT3.1,CU,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +DT3.1,RA,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +DT4.1,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 +DT4.1,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 +DT4.1,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 +DT4.1,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 +DT4.1,PR,BOP,N,,0,-20,0,0,-20,0,0,-20,0,0,-20,0,0,0,0,0,0,0,0,0,0 +DT4.1,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT4.1,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 +DT4.1,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT4.1,PR,EV,N,,0,-33,0,0,-33,0,0,-33,0,0,-33,0,0,0,0,0,0,0,0,0,0 +DT4.1,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT4.1,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 +DT4.1,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DT4.1,PR,CL,C,,0,-143,0,0,-143,0,0,-143,0,0,-143,0,0,0,0,0,0,0,0,0,0 +DT4.1,ICO,CL,C,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DT4.1,NIC,CL,C,,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0 +DT4.1,CU,CL,C,,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 +DT4.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 diff --git a/Files/900.TransactionalData/Openings_CH_2020_12.csv b/Files/900.TransactionalData/Openings_CH_2020_12.csv new file mode 100644 index 00000000..b52ac64c --- /dev/null +++ b/Files/900.TransactionalData/Openings_CH_2020_12.csv @@ -0,0 +1,8 @@ +@@Main,,,, +ReportingNode,Year,Month,, +CH,2020,12,, +@@Opening,,,, +DataNode,EstimateType,AmountType,AccidentYear,Value +DT3.1,C,,,72.2 +DT3.1,AA,PR,,1.5 +DT3.1,OA,PR,,-1.5 diff --git a/Files/DimensionsAndPartitions.csv b/Files/DimensionsAndPartitions.csv new file mode 100644 index 00000000..80f592bd --- /dev/null +++ b/Files/DimensionsAndPartitions.csv @@ -0,0 +1,259 @@ +@@PvAmountType,,,,,,,,,,, +SystemName,DisplayName,Parent,Order,PeriodType,ExternalId0,ExternalId1,,,,, +PR,Premiums,,10,BeginningOfPeriod,PayablePR,ReceivablePR,,,,, +CL,Claims,,20,EndOfPeriod,,,,,,, +NIC,Non Investment Component,CL,30,EndOfPeriod,PayableNIC,ReceivableNIC,,,,, +ICO,Investment Component,CL,40,EndOfPeriod,PayableICO,ReceivableICO,,,,, +CDR,Credit Default Risk,CL,50,EndOfPeriod,,,,,,, +CE,Claim Expenses,CL,200,EndOfPeriod,,,,,,, +ALE,Allocated Loss Adjustment Expenses,CE,210,EndOfPeriod,,,,,,, +ULE,Unallocated Loss Adjustment Expenses,CE,220,EndOfPeriod,,,,,,, +AE,Attributable Expenses,,80,BeginningOfPeriod,,,,,,, +AEA,Aquisition,AE,90,BeginningOfPeriod,,,,,,, +AEM,Maintenance,AE,100,BeginningOfPeriod,,,,,,, +NE,Non Attributable Expenses,,110,BeginningOfPeriod,,,,,,, +AC,Attributable Commission,,120,BeginningOfPeriod,,,,,,, +ACA,Aquisition,AC,130,BeginningOfPeriod,,,,,,, +ACM,Maitenance,AC,140,BeginningOfPeriod,,,,,,, +,,,,,,,,,,, +@@DeferrableAmountType,,,,,,,,,,, +SystemName,DisplayName,Parent,Order,PeriodType,,,,,,, +DE,Deferrals,,10,EndOfPeriod,,,,,,, +DAE,Aquisition Expenses,DE,20,EndOfPeriod,,,,,,, +,,,,,,,,,,, +@@AocType,,,,,,,,,,, +SystemName,DisplayName,Parent,Order,,,,,,,, +BOP,Opening Balance,,10,,,,,,,, +MC,Model Correction,,20,,,,,,,, +PC,Portfolio Changes,,30,,,,,,,, +RCU,Reinsurance Coverage Update,PC,40,,,,,,,, +CF,Cash flow,,50,,,,,,,, +IA,Interest Accretion,,60,,,,,,,, +AU,Assumption Update,,70,,,,,,,, +FAU,Financial Assumption Update,,80,,,,,,,, +YCU,Yield Curve Update,FAU,90,,,,,,,, +CRU,Credit Risk Update,FAU,100,,,,,,,, +EV,Experience Variance,,110,,,,,,,, +WO,Write-Off,,120,,,,,,,, +CL,Combined Liabilities,,130,,,,,,,, +EA,Experience Adjustment,,140,,,,,,,, +AM,Amortization,,150,,,,,,,, +FX,FX Impact,,160,,,,,,,, +EOP,Closing Balance,,170,,,,,,,, +,,,,,,,,,,, +@@AocConfiguration,,,,,,,,,,, +AocType,Novelty,DataType,InputSource,FxPeriod,YcPeriod,CdrPeriod,ValuationPeriod,RcPeriod,Order,Year,Month +BOP,I,Optional,7,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,10,1900,1 +MC,I,Optional,4,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,20,1900,1 +RCU,I,Calculated,4,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,EndOfPeriod,30,1900,1 +CF,I,Calculated,4,Average,NotApplicable,BeginningOfPeriod,Delta,EndOfPeriod,40,1900,1 +IA,I,Calculated,5,Average,BeginningOfPeriod,BeginningOfPeriod,Delta,EndOfPeriod,50,1900,1 +AU,I,Optional,4,EndOfPeriod,BeginningOfPeriod,BeginningOfPeriod,EndOfPeriod,EndOfPeriod,60,1900,1 +YCU,I,CalculatedTelescopic,4,EndOfPeriod,EndOfPeriod,BeginningOfPeriod,EndOfPeriod,EndOfPeriod,70,1900,1 +CRU,I,CalculatedTelescopic,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,80,1900,1 +EV,I,Optional,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,90,1900,1 +BOP,N,Optional,4,Average,EndOfPeriod,EndOfPeriod,BeginningOfPeriod,EndOfPeriod,100,1900,1 +CF,N,Calculated,4,Average,NotApplicable,EndOfPeriod,Delta,EndOfPeriod,110,1900,1 +IA,N,Calculated,4,Average,EndOfPeriod,EndOfPeriod,Delta,EndOfPeriod,120,1900,1 +AU,N,Optional,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,130,1900,1 +EV,N,Optional,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,140,1900,1 +CF,C,Optional,2,Average,NotApplicable,NotApplicable,NotApplicable,NotApplicable,160,1900,1 +WO,C,Optional,2,Average,NotApplicable,NotApplicable,NotApplicable,NotApplicable,170,1900,1 +CL,C,Mandatory,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,180,1900,1 +EA,C,Calculated,4,EndOfPeriod,NotApplicable,NotApplicable,NotApplicable,EndOfPeriod,190,1900,1 +AM,C,Calculated,6,EndOfPeriod,NotApplicable,NotApplicable,NotApplicable,EndOfPeriod,200,1900,1 +FX,C,Calculated,0,NotApplicable,NotApplicable,NotApplicable,NotApplicable,NotApplicable,210,1900,1 +EOP,C,Calculated,6,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,220,1900,1 +,,,,,,,,,,, +@@CalculationType,,,,,,,,,,, +SystemName,DisplayName,PeriodType,Order,,,,,,,, +BE,Best Estimate,EndOfPeriod,10,,,,,,,, +RA,Risk Adjustment,EndOfPeriod,20,,,,,,,, +CU,Coverage Unit,EndOfPeriod,30,,,,,,,, +,,,,,,,,,,, +@@CreditRiskRating,,,,,,,,,,, +SystemName,DisplayName,,,,,,,,,, +AAA,AAA,,,,,,,,,, +AA+,AA+,,,,,,,,,, +AA,AA,,,,,,,,,, +AA-,AA-,,,,,,,,,, +A+,A+,,,,,,,,,, +A,A,,,,,,,,,, +A-,A-,,,,,,,,,, +BBB+,BBB+,,,,,,,,,, +BBB,BBB,,,,,,,,,, +BBB-,BBB-,,,,,,,,,, +BB+,BB+,,,,,,,,,, +BB,BB,,,,,,,,,, +BB-,BB-,,,,,,,,,, +B+,B+,,,,,,,,,, +B,B,,,,,,,,,, +B-,B-,,,,,,,,,, +CCC+,CCC+,,,,,,,,,, +CCC,CCC,,,,,,,,,, +CCC-,CCC-,,,,,,,,,, +CC,CC,,,,,,,,,, +C,C,,,,,,,,,, +I,I,,,,,,,,,, +,,,,,,,,,,, +@@Currency,,,,,,,,,,, +SystemName,DisplayName,,,,,,,,,, +USD,United States Dollar,,,,,,,,,, +CHF,Swiss Franc,,,,,,,,,, +DKK,Danish Krone,,,,,,,,,, +EUR,Euro,,,,,,,,,, +GBP,British Pound,,,,,,,,,, +HKD,Hong Kong Dollar,,,,,,,,,, +ITL,Italian Lira,,,,,,,,,, +PLN,Polish Zloty (since 01.01.95),,,,,,,,,, +SKK,Slovakian Krona,,,,,,,,,, +,,,,,,,,,,, +@@EconomicBasis,,,,,,,,,,, +SystemName,DisplayName,Order,,,,,,,,, +N,Nominal,1,,,,,,,,, +L,Locked-in,10,,,,,,,,, +C,Current,20,,,,,,,,, +,,,,,,,,,,, +@@EstimateType,,,,,,,,,,, +SystemName,DisplayName,Order,StructureType,InputSource,ExternalId0,ExternalId1,ExternalId2,,,, +BE,Best Estimate of Present Value,1,AoC,4,,,,,,, +RA,Risk Adjustment,10,AoC,4,,,,,,, +C,Contractual Service Margin,20,AoC,7,,,,,,, +L,Loss Component,30,AoC,7,,,,,,, +LR,Loss Recovery Component,40,AoC,7,,,,,,, +PL,Profit and Loss,50,None,7,,,,,,, +AA,Advance Actuals,60,AoC,3,PayablePR,ReceivableNIC,ReceivableICO,,,, +OA,Overdue Actuals,70,AoC,3,ReceivablePR,PayableNIC,PayableICO,,,, +DA,Deferrable Actuals,80,AoC,3,,,,,,, +A,Actuals,90,None,2,,,,,,, +F,Factors,100,None,4,,,,,,, +AAPA,Advance Actuals,110,None,2,,,,,,, +OAPA,Overdue Actuals,120,None,2,,,,,,, +APA,Actuals,130,None,2,,,,,,, +BEPA,Best Estimate of Present Value,140,None,4,,,,,,, +,,,,,,,,,,, +@@LiabilityType,,,,,,,,,,, +SystemName,DisplayName,,,,,,,,,, +LRC,Liability for Remaining Coverage,,,,,,,,,, +LIC,Liabilities for Incurred Claims,,,,,,,,,, +,,,,,,,,,,, +@@LineOfBusiness,,,,,,,,,,, +SystemName,DisplayName,Parent,,,,,,,,, +M,Multiline Life and Non-Life,,,,,,,,,, +LI,Life,M,,,,,,,,, +NL,Non-Life,M,,,,,,,,, +LIA,Liability,NL,,,,,,,,, +MAE,"Marine, Aviation & Energy",NL,,,,,,,,, +MOT,Motor,NL,,,,,,,,, +NAH,Non-Life Accident & Health,NL,,,,,,,,, +PEA,"Property, Engineering & Agriculture",NL,,,,,,,,, +ONL,Other Non-Life,NL,,,,,,,,, +ANN,Annuity,LI,,,,,,,,, +DIS,Disability,LI,,,,,,,,, +END,Endowment,LI,,,,,,,,, +HYB,Hybrid,LI,,,,,,,,, +ULI,Unit Linked,LI,,,,,,,,, +OLI,Other Life,LI,,,,,,,,, +,,,,,,,,,,, +@@Novelty,,,,,,,,,,, +SystemName,DisplayName,Order,,,,,,,,, +I,In Force,1,,,,,,,,, +N,New Business,10,,,,,,,,, +C,Combined,20,,,,,,,,, +,,,,,,,,,,, +@@OciType,,,,,,,,,,, +SystemName,DisplayName,,,,,,,,,, +Default,Default,,,,,,,,,, +,,,,,,,,,,, +@@Partner,,,,,,,,,,, +SystemName,DisplayName,,,,,,,,,, +PT1,Partner1,,,,,,,,,, +,,,,,,,,,,, +@@BsVariableType,,,,,,,,,,, +SystemName,DisplayName,Parent,Order,,,,,,,, +D,Changes in Balance,,10,,,,,,,, +,,,,,,,,,,, +@@PnlVariableType,,,,,,,,,,, +SystemName,DisplayName,Parent,Order,,,,,,,, +TCI,Total Comprehensive Income,,0,,,,,,,, +PNL,Profit and Loss,TCI,1,,,,,,,, +OCI,Other Comprehensive Income,TCI,2,,,,,,,, +ISR,Insurance Service Result,PNL,3,,,,,,,, +IR,Insurance Revenue,ISR,4,,,,,,,, +IR1,Premiums,IR,5,,,,,,,, +IR2,Exc. Investment Components,IR,6,,,,,,,, +IR3,CSM Amortization,IR,7,,,,,,,, +IR4,Acquistion Expenses Amortization,IR,8,,,,,,,, +IR5,Non-Financial LRC Changes (Exc. CSM Amortization),IR,9,,,,,,,, +IR6,Exc. Experience Adjustment on Premiums,IR,10,,,,,,,, +ISE,Insurance Service Expense,ISR,11,,,,,,,, +ISE1,Reinsurance Premiums,ISE,12,,,,,,,, +ISE2,Claims,ISE,13,,,,,,,, +ISE3,Expenses,ISE,14,,,,,,,, +ISE4,Commissions,ISE,15,,,,,,,, +ISE5,Exc. Investment Components,ISE,16,,,,,,,, +ISE6,Acquisition Expenses,ISE,17,,,,,,,, +ISE7,Reinsurance CSM Amortization,ISE,18,,,,,,,, +ISE8,LoReCo Release,ISE,19,,,,,,,, +ISE9,Loss Component Release,ISE,20,,,,,,,, +ISE10,Non-Financial Reinsurance LRC Changes (Exc. LC/LoReCo),ISE,21,,,,,,,, +ISE11,Loss Component / LoReCo Changes (Exc. Releases),ISE,22,,,,,,,, +ISE12,Non Financial LIC Changes,ISE,23,,,,,,,, +IFIE,Insurance Finance Income/Expense,PNL,24,,,,,,,, +IFIE1,Financial LRC Changes,IFIE,25,,,,,,,, +IFIE2,Financial LIC Changes,IFIE,26,,,,,,,, +OCI1,Financial LRC Changes,OCI,27,,,,,,,, +OCI2,Financial LIC Changes,OCI,28,,,,,,,, +,,,,,,,,,,, +@@Profitability,,,,,,,,,,, +SystemName,DisplayName,,,,,,,,,, +O,Onerous,,,,,,,,,, +P,Profitabile,,,,,,,,,, +U,Undetermined,,,,,,,,,, +,,,,,,,,,,, +@@RiskDriver,,,,,,,,,,, +SystemName,DisplayName,,,,,,,,,, +Default,Default,,,,,,,,,, +,,,,,,,,,,, +@@Scenario,,,,,,,,,,, +SystemName,DisplayName,,,,,,,,,, +BE,Best Estimate,,,,,,,,,, +,,,,,,,,,,, +@@ValuationApproach,,,,,,,,,,, +SystemName,DisplayName,,,,,,,,,, +BBA,Building Block Approach,,,,,,,,,, +,,,,,,,,,,, +@@PartitionByReportingNode,,,,,,,,,,, +ReportingNode,Id,,,,,,,,,, +CH,00000000-0000-0000-0000-000000000001,,,,,,,,,, +,,,,,,,,,,, +@@PartitionByReportingNodeAndPeriod,,,,,,,,,,, +ReportingNode,Year,Month,Id,,,,,,,, +CH,2020,12,10000000-0000-0000-0000-000000000000,,,,,,,, +CH,2021,3,20000000-0000-0000-0000-000000000000,,,,,,,, +CH,2021,9,30000000-0000-0000-0000-000000000000,,,,,,,, +CH,2021,12,35000000-0000-0000-0000-000000000000,,,,,,,, +CH,2022,3,40000000-0000-0000-0000-000000000000,,,,,,,, +,,,,,,,,,,, +@@ProjectionConfiguration,,,,,,,,,,, +SystemName,DisplayName,Shift,TimeStep,,,,,,,, +P0,End of January,0,1,,,,,,,, +P1,End of February,0,2,,,,,,,, +P2,End of March,0,3,,,,,,,, +P3,End of April,0,4,,,,,,,, +P4,End of May,0,5,,,,,,,, +P5,End of June,0,6,,,,,,,, +P6,End of July,0,7,,,,,,,, +P7,End of August,0,8,,,,,,,, +P8,End of September,0,9,,,,,,,, +P9,End of October,0,10,,,,,,,, +P10,End of November,0,11,,,,,,,, +P11,End of December,0,12,,,,,,,, +P12,End of Year+1,12,12,,,,,,,, +P13,End of Year+2,24,12,,,,,,,, +P14,End of Year+3,36,12,,,,,,,, +P15,End of Year+4,48,12,,,,,,,, +P16,Year+5 to Year+10,60,60,,,,,,,, +P17,Year+10 to Year+15,120,60,,,,,,,, +P18,Year+15 to Year+20,180,60,,,,,,,, +P19,Years Over +20,240,9999,,,,,,,, diff --git a/Images/ActualFormat.png b/Images/ActualFormat.png new file mode 100644 index 0000000000000000000000000000000000000000..e055a0a7fae2ea3eebedf69392d79299c25ab40b GIT binary patch literal 25544 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 literal 0 HcmV?d00001 diff --git a/Images/OpeningFormat.png b/Images/OpeningFormat.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd3a0d7487a0a82cbdacf4dd0e68ec56e58278f GIT binary patch literal 19729 zcmeFYWn5d)(=G}WN}*6%+zM^6;uH%GEyW4$?(Pz-NDWG{;*dbm;O-W*K(XQuffknl z#UaSq^nc#>o_p{4dOqEoA0f%k&XQScX3aeFOt_kg93eh6J_ZH`p@RHd4Gat%;4Rk3 zgL}Zsc@C!)@Pg^7A@>HO>=*48@B!QQHTX3KMrF*yD|6shtYbB0Et%WfTW*b*y}iA| z!^8Rcc?1HnzrX+Y@88wc)w;U6+1c5yuCCG1(W9fIfq{X(zP|DC@y^c9i;Ih!o13ev ztCN!x6bf~Edb+fC>lo@7^URC-?XFA0HntFE4-m_%R?LATcrV=g*%92M1eQ zTWM)&(b3T>D=QNd6JNf3X>V^YDk^GeX^D%Ala-a#)6=uDu`xF{mywZia&lT+Tuewv z(9zMcwzig&lXGxz;OFND=2BT%iAJM8eE9JB^XK#P^Kak2ot>RQAP{YB?H@mWY;0_J zcz75Z8vgn7M?*uSqoZScd)wRFTT4qzQ&W?VkI&uR-N3+ri;F8NDyprm?f38BYinye zJ3HOo-D6{8>FMc4Mn)AC6)r9=xw*Lu3kw+;8JnA%p`oFfnVHqq)vm6t+1c5Cetwsi zmveJ-H8nL>R#stQVPaxpAP|UygTu$i$JyCgR8*9mo!!jL?E3mTFfdR`O3K&QS6NwE zK|#UP)HEa{1Plfb4-c!UsTC9y38jCgr@<>%+aV6cdYi0SF+p`jsrdwV-OyOfla zXV0E_dU~p>t2Z?@#mC1(q0okghTz~}X=!OiMMZyqe*po3s;a8q-d+ z@SdKY!NI}S*4AIYex;_S#>B+f+S-eZ|7 z-@iLLI?~b6F)=YcdGh4>^XFf`e#OSd&dSQd#l>Y|VR`)cF$oC?IXO840|O~3sT)rw zD=RA%6%_#i0U;qF4i3)!`}c{6h=9#w$;fE{yj*!{sAvNF|NpBGj0ykVAV3ayZu0t` z7#NSb?w**vt_6VQkpHgm_O+I;2?{Zgn4?T$H_$=L$xM)PLVC{)XT0Vhq?W%cns-^m zZ6%glt7w0p>v_1C?fwH^1}w$?7tcvExAQQ8hX4P^|8WU~-0EIPV&p%g{f4p6NE?Vj zpLeao$I&4otRw`>6zLqrJurX6HLI?GMJpdN`9cmk^2tw3V5gslC`W(VEd5gvNhWF0 zZ>JC2BiNMde-}7dM6Kz^OS~sIc09_&z&H;wvY^;{U>wRwPtUqR4IeD0W;emt-alh? zdsz+TaP*Y0R*BE$3ov#*;~(f1Uhs3h3mYl9_P^KLF$CaZfTz@eahQVbbA~nbqDkUH?!kL{8&h^SM|h6m0F5 zSy)$Oj8f+W`^q7gK^>%3$^QEZ`!cL#%m03s+&+2OiakTHC}#TSq|Og?i>qHBL1>Ox z?Lwd-tMU5LpYRXv1}PKW0!pt+cHTt?ZC~G-@VG8a(3A!9KM_32h$uUpH0Her^!oT2B?GgNyYdDfeQNzi~nHwSro^Evhk=7g3WYRgTiAnd6Y&lB}Q)d81y!`BB zsb%Q8uC_QKMB~;tuaTZb|G5bWxr%=-I6UNR2s@b*xGqg?Yl1Z9-PVNoQLM_|mp9V)iq+aW}f|bh3Zbe*`S&KY_8g z^F(pyrgBG3c%z=_HYB$;F3h3www&!<5ZDxr_}|5Mz>6aCvn*t0`*`2*56J%KBDNG_ zwJ6}sfZ~=yWjr#C9xLH&A}yvH>z$2g3NiAP#yJdt-YS9wlyT0f|BbN11R0Mp@9i{g zzl+{sq$<~+n9l~uJ2wO=AXpUsdOYnlsmdh%crA}}&Rc*%^clax0GWVs@&VGo;q2o$ z?>C7K=yJB7XfAQC7p&uOoaab((W7_;lOej{N-wZVV#vZ0BW7#&k7d~B%-`h+mHf1q zr!?O%E$Fc&ssu@3Q++6I$Wf9f8xj2QKkFF=h? !ko!SkQbywyi)w^~x(8-S(`S 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 literal 0 HcmV?d00001 diff --git a/Images/SpecificationsCSM.PNG b/Images/SpecificationsCSM.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a04d351d21e730028ab328c8311e70b0f77f19fa GIT binary patch literal 40913 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 literal 0 HcmV?d00001 diff --git a/Images/SpecificationsImportActuals.PNG b/Images/SpecificationsImportActuals.PNG new file mode 100644 index 0000000000000000000000000000000000000000..7f3d5d05a460fba884f58baaeeb41c84a4617c0b GIT binary patch literal 12211 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 z zGk``Oerpa(iPi<=r!C%E(Bbz8?*40 zeoXb7UBBkFJOmZ7Sr7aXI8pmYHhAhV-?@TD7n_EOm#&vg17*k=pqc|P4L49fAuLnJ zj;Vh4IM%R8F8Dd=3akpkoM~0Fxa1r6R}r}6LY+dm!+e3Dr7%;A?Y4=)x3HVQrv`M4 zf%qeXzRp_J3YdH2el00r&Z&calkacOWznvJDX@m}FfEHSP8A4lC+nE z5dGFOdbH}wALTKgsp1+Cvg>Y(IS^OP2?BKgziM*W(*=$t?zGIcX+fRTY4Fmk3XXR&Xt!;o&W|MH&CB0u&P zXb7(@QTJ7`-FKL*FDE<+JrS;mEjYCM3a`|U8R-C>_~}ng#C0;#)epZjDcwE6fbE*# zAa+jVuLJiSrEskmTFO-?!Uq>27J(tl*yO!qbq$V80J7)MIY+}Y)Gd!rBkfA$EfLgDvDy*dt5{PSOeV~~r2T*aW%fiou`tzM>_ ox%0PE;r~}h%K!V16_2fjnV)nRz3RMsoja$#4qUrL^XL2j3jj;*0{{R3 literal 0 HcmV?d00001 diff --git a/Images/SpecificationsImportCashflows.PNG b/Images/SpecificationsImportCashflows.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bcb093c83f1aeed76336d9853ce6074735e120e8 GIT binary patch literal 38471 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 z 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", + "\nGiven the current status of the implementation, in order to display Actual reports it is necessary to set Actual format in the Args while to display Cashflow it is necessary to set Cashflow format." + ], + "metadata": {} + }, + { + "id": "trcP0qut1kWbOQTgIF35cg", + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;", + "\nvar economicBasis = \"L\" ;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2m1t-aisOEiw325jWesNXQ", + "cell_type": "code", + "source": [ + "var UniversePreview = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "AbkLGXiDFk6sdSdWtinXjA", + "cell_type": "code", + "source": [ + "var importStorage = UniversePreview.GetStorage();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "k9qNkaSwjUqp_Y_vGf9RwA", + "cell_type": "markdown", + "source": [ + "# Import Preview" + ], + "metadata": {} + }, + { + "id": "5EP-6YDPFkeMJcxDTaO7qw", + "cell_type": "markdown", + "source": [ + "## Present Value" + ], + "metadata": {} + }, + { + "id": "XTFLl2lau0SjbCIEtOTHpA", + "cell_type": "code", + "source": [ + "var identities = UniversePreview.GetScopes(importStorage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yEjsrBVzEk26kz9jgLkJ-Q", + "cell_type": "code", + "source": [ + "var pvs = UniversePreview.GetScopes(identities, o => o.WithStorage(importStorage)).SelectMany(x => x.PvCurrent.Concat(x.PvLocked));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ck9xZbpeDUyh_Tw6FOoxKg", + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(pvs", + "\n //.Where(x => x.DataNode == \"DTR1.1\")", + "\n )", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.EconomicBasis)", + "\n //.GroupColumnsBy(x => x.AmountType)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n //VariableType", + "\n //.GroupColumnsBy(x => x.DataNode)", + "\n //.GroupColumnsBy(x => x.Novelty)", + "\n .WithGridOptionsForIfrsVariable(720)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XIPJIPxfyEy6P4JYfRAXTA", + "cell_type": "markdown", + "source": [ + "## Risk Adjustment" + ], + "metadata": {} + }, + { + "id": "4bBaRnP3pE-ZbxPKKnxOCA", + "cell_type": "code", + "source": [ + "var ras = UniversePreview.GetScopes(identities).SelectMany(x => x.RaCurrent.Concat(x.RaLocked));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "AiOWaeI_Hku1SDbNB-xlXA", + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(ras)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.EconomicBasis)", + "\n //.GroupRowsBy(x => x.DataNode)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n //VariableType", + "\n //.GroupColumnsBy(x => x.DataNode)", + "\n //.GroupColumnsBy(x => x.Novelty)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "rqCr51d6kUGgBzGRAqrtXw", + "cell_type": "markdown", + "source": [ + "## Actuals" + ], + "metadata": {} + }, + { + "id": "vl8E9tTAT06fpVUcTfflbg", + "cell_type": "code", + "source": [ + "var actuals = UniversePreview.GetScopes(identities).SelectMany(x => x.Actual);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hQUJ7t1AB0O-L0PVYPqsVw", + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(actuals)", + "\n .WithQuerySource(Workspace)", + "\n .GroupRowsBy(x => x.AmountType)", + "\n //.GroupColumnsBy(x => x.DataNode)", + "\n .WithGridOptionsForIfrsVariable(550)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nwWJHZ5vTUuJsHqFTGwLQw", + "cell_type": "markdown", + "source": [ + "## Advance, Overdue Actuals" + ], + "metadata": {} + }, + { + "id": "UYvTQnP0NUe4pLm0fnYEAA", + "cell_type": "code", + "source": [ + "var aoActuals = UniversePreview.GetScopes(identities).SelectMany(x => x.AdvanceActual.Concat(x.OverdueActual));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1v6tcALrVEGG-vdRDV7HIQ", + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(aoActuals)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupColumnsBy(x => x.EstimateType)", + "\n .GroupColumnsBy(x => x.AmountType)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable(300)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ab2P4J7DO0mkVrlsP09fhQ", + "cell_type": "markdown", + "source": [ + "## Deferrable Actuals" + ], + "metadata": {} + }, + { + "id": "KCZlxRFa10CYDduJ65KMHg", + "cell_type": "code", + "source": [ + "var deferrableActuals = UniversePreview.GetScopes(identities).SelectMany(x => x.DeferrableActual);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zln4EOOdqUiUTFbwoqTirw", + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(deferrableActuals)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable(350)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "l5uZz5MhKUOYLsKpzNZwvQ", + "cell_type": "markdown", + "source": [ + "## Csm Lc LoReCo" + ], + "metadata": {} + }, + { + "id": "WZ_xvxUBtEKO2jingfCpRQ", + "cell_type": "code", + "source": [ + "var csm = UniversePreview.GetScopes(identities).SelectMany(x => x.Csms);", + "\nvar loss = UniversePreview.GetScopes(identities).SelectMany(x => x.Loss);", + "\nvar csmLcLoReCo = Enumerable.Empty().Concat(csm).Concat(loss);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RAN7qdbDLECNmb-kxUNx1A", + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(csmLcLoReCo", + "\n //.Where(x => x.DataNode == \"DT1.1\")", + "\n )", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupColumnsBy(x => x.EstimateType)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "GszVX-_KiEa9h0m0P0rlhQ", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Import/ImportScopeCalculation.ipynb b/Import/ImportScopeCalculation.ipynb new file mode 100644 index 00000000..2823aead --- /dev/null +++ b/Import/ImportScopeCalculation.ipynb @@ -0,0 +1,2296 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "a6wbTgZMQ0q5Of99FfYD-A", + "cell_type": "markdown", + "source": [ + "", + "\n

Import Scopes (IFRS17 Methodology Business Logic)

", + "\n", + "\nThis notebook contains the logic used to perform calculations upon import of data (actuals and cashflows). This is also called 'Data Loading' and the concept of Scope is used here to define the logic and provide the means of executing the logic." + ], + "metadata": {} + }, + { + "id": "6qZO0vcpd0GtSc7GvLlgBQ", + "cell_type": "markdown", + "source": [ + "# References", + "\nLibraries and other notebooks which are needed for this notebook are imported below." + ], + "metadata": {} + }, + { + "id": "G75a3tlrBkqn_MN5as22Jw", + "cell_type": "markdown", + "source": [ + "## Notebooks" + ], + "metadata": {} + }, + { + "id": "HQwfAINEvUqJK5l5FV_SOg", + "cell_type": "code", + "source": [ + "#!import \"ImportStorage\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kd06OH9YcE2hGUtgERwXhA", + "cell_type": "markdown", + "source": [ + "", + "\n# Scopes", + "\nScopes are used to define and perform data handling in a structured and easy-to-read-through fashion.", + "\n", + "\nThe IModel interface below will be used to execute calculations (i.e. evaluate the scopes) based on imported data." + ], + "metadata": {} + }, + { + "id": "3ye2s5-hWEWsy3YLTe5R-w", + "cell_type": "code", + "source": [ + "public interface IModel : IMutableScopeWithStorage{}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LjnVkU0bq0yP61Cb1_EMxA", + "cell_type": "markdown", + "source": [ + "## Getting Existing Identities", + "\n", + "\nAn [Identity](../DataModel/DataStructure#import-identity) is a set of identifiers for a certain set of data. In particular, an identity consists of a certain [AoC Type](../DataModel/DataStructure#aoc-type), [Novelty](../DataModel/DataStructure#novelty), [Data Node](../DataModel/DataStructure#data-node), Accident Year, and information on whether the data is for reinsurance or not. ", + "\n", + "\nGiven a certain Data Node and Accident Year, the interface GetIdentities returns all the existing identities (e.g. for Actuals and Cashflows) which have that Data Node and Accident Year." + ], + "metadata": {} + }, + { + "id": "SyhE8EzOsECEpMzUSS6kGQ", + "cell_type": "code", + "source": [ + "public interface AllCfIdentities : IScope // string represents a DataNode", + "\n{", + "\n public IEnumerable ids => GetStorage().GetAllAocSteps(InputSource.Cashflow)", + "\n .Select(aocStep => new ImportIdentity {", + "\n AocType = aocStep.AocType,", + "\n Novelty = aocStep.Novelty,", + "\n DataNode = Identity", + "\n });", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_LsQEeHMYE6G4pGS8dK4RQ", + "cell_type": "code", + "source": [ + "public interface GetIdentities : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().IsSecondaryScope(x.Identity))", + "\n .WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Actual)", + "\n .WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Cashflow)", + "\n .WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Opening)", + "\n );", + "\n ", + "\n private IEnumerable computedIdentities => new string[]{AocTypes.EA, AocTypes.AM, AocTypes.EOP}", + "\n .Select(aocType => new ImportIdentity {", + "\n AocType = aocType,", + "\n Novelty = Novelties.C,", + "\n DataNode = Identity", + "\n });", + "\n private IEnumerable allIdentities => ParsedIdentities.Concat(computedIdentities).Concat(SpecialIdentities).ToHashSet(); ", + "\n ", + "\n IEnumerable ParsedIdentities => Enumerable.Empty(); ", + "\n IEnumerable SpecialIdentities => Enumerable.Empty();", + "\n ", + "\n //Set DataNode properties and ProjectionPeriod", + "\n IEnumerable Identities => allIdentities.Select(id => id with { IsReinsurance = GetStorage().DataNodeDataBySystemName[id.DataNode].IsReinsurance,", + "\n ValuationApproach = GetStorage().DataNodeDataBySystemName[id.DataNode].ValuationApproach", + "\n });", + "\n /* .SelectMany(id => Enumerable.Range(0,GetStorage().GetProjectionCount() + 1)", + "\n .Select(pp => id with {ProjectionPeriod = pp })", + "\n );*/", + "\n}", + "\n", + "\npublic interface AllCashflowIdentities : GetIdentities", + "\n{", + "\n IEnumerable GetIdentities.SpecialIdentities => GetScope(Identity).ids;", + "\n}", + "\n", + "\n", + "\npublic interface GetActualIdentities : GetIdentities", + "\n{", + "\n private IEnumerable actualEstimateTypes => GetStorage().EstimateTypesByImportFormat[ImportFormats.Actual];", + "\n ", + "\n IEnumerable GetIdentities.ParsedIdentities => GetStorage().GetIfrsVariables(Identity).Where(iv => actualEstimateTypes.Contains(iv.EstimateType)).Select(v => new ImportIdentity(v));", + "\n IEnumerable GetIdentities.SpecialIdentities => GetScope(Identity).ids", + "\n .Concat(GetStorage().GetAllAocSteps(InputSource.Opening)", + "\n .Select(aocStep => new ImportIdentity {AocType = aocStep.AocType, ", + "\n Novelty = aocStep.Novelty,", + "\n DataNode = Identity", + "\n }));", + "\n}", + "\n", + "\npublic interface GetCashflowIdentities : GetIdentities", + "\n{", + "\n private bool isReinsurance => GetStorage().DataNodeDataBySystemName[Identity].IsReinsurance; //clean up in the next PR", + "\n ", + "\n IEnumerable GetIdentities.ParsedIdentities => GetStorage().GetRawVariables(Identity).Select(v => new ImportIdentity(v));", + "\n ", + "\n IEnumerable GetIdentities.SpecialIdentities => ParsedIdentities.Where(id => id.Novelty != Novelties.C)", + "\n .Select(id => id.Novelty).ToHashSet()", + "\n .SelectMany(n => (n == Novelties.N ", + "\n ? new string[]{AocTypes.IA, AocTypes.CF} //Add IA, CF, for New Business", + "\n : isReinsurance ", + "\n ? new string[]{AocTypes.IA, AocTypes.CF, AocTypes.YCU, AocTypes.CRU, AocTypes.RCU} //Add IA, CF, YCU, CRU, RCU for in force", + "\n : new string[]{AocTypes.IA, AocTypes.CF, AocTypes.YCU}) //Add IA, CF, YCU,", + "\n .Select(aocType => new ImportIdentity {", + "\n AocType = aocType,", + "\n Novelty = n,", + "\n DataNode = Identity }))", + "\n .Concat(new ImportIdentity {", + "\n AocType = AocTypes.CF, //Add CF for Deferral", + "\n Novelty = Novelties.C,", + "\n DataNode = Identity", + "\n }.RepeatOnce()) ", + "\n .Concat(GetStorage().GetAllAocSteps(InputSource.Opening)", + "\n .Select(aocStep => new ImportIdentity {AocType = aocStep.AocType, ", + "\n Novelty = aocStep.Novelty,", + "\n DataNode = Identity", + "\n })); ", + "\n}", + "\n", + "\npublic interface GetAllIdentities : GetIdentities", + "\n{", + "\n IEnumerable GetIdentities.SpecialIdentities => GetScope(Identity).ids", + "\n .Concat(GetStorage().GetAllAocSteps(InputSource.Actual)", + "\n .Select(aocStep => new ImportIdentity {AocType = aocStep.AocType, ", + "\n Novelty = aocStep.Novelty,", + "\n DataNode = Identity,", + "\n }));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZVtzxigEF0yEaftuPtLQlw", + "cell_type": "markdown", + "source": [ + "## Getting Amount Types", + "\n", + "\nSimilarly, given a certain Data Node and Accident Year, the interface ValidAmountType returns all the amount types which are used in imported data with that Data Node and Accident Year." + ], + "metadata": {} + }, + { + "id": "kE72GkEJNE2GPEnIe78RDA", + "cell_type": "code", + "source": [ + "public interface ValidAmountType : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow ||", + "\n x.GetStorage().IsSecondaryScope(x.Identity)));", + "\n ", + "\n IEnumerable BeAmountTypes => GetStorage().GetRawVariables(Identity)", + "\n .Where(rv => rv.AmountType != null)", + "\n .Select(x => x.AmountType)", + "\n .Concat(GetStorage().DataNodeDataBySystemName[Identity].IsReinsurance ? (AmountTypes.CDR).RepeatOnce() : Enumerable.Empty())", + "\n .ToHashSet();", + "\n ", + "\n ", + "\n IEnumerable ActualAmountTypes => GetStorage().GetIfrsVariables(Identity)", + "\n .Where(iv => GetStorage().EstimateTypesByImportFormat[ImportFormats.Actual].Contains(iv.EstimateType))", + "\n .Select(x => x.AmountType)", + "\n .ToHashSet();", + "\n}", + "\npublic interface BeAmountTypesFromIfrsVariables : ValidAmountType", + "\n{", + "\n IEnumerable ValidAmountType.BeAmountTypes => GetStorage().GetIfrsVariables(Identity)", + "\n .Where(iv => GetStorage().EstimateTypesByImportFormat[ImportFormats.Cashflow].Contains(iv.EstimateType) && iv.AmountType != null)", + "\n .Select(x => x.AmountType)", + "\n .ToHashSet();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "OppPBfh8o0-NsCYyUGOVLg", + "cell_type": "markdown", + "source": [ + "", + "\n## AoC Step Structure", + "\n", + "\nThe Aoc step structure is constructed from the data which is delivered as input. It is assumed that it depends only on the Group of Contrat (i.e. it is invariant across Amount types or Accident Year). " + ], + "metadata": {} + }, + { + "id": "54mTUE9VgUG3fW8ov6K3Uw", + "cell_type": "markdown", + "source": [ + "### ParentAocStep ", + "\nThe **ParentAocStep** scope computes and provides an important piece of information for each [Identity](../DataModel/DataStructure#import-identity), i.e. for a certain [AocType](../DataModel/DataStructure#aoc-type) and [Novelty](../DataModel/DataStructure#novelty).", + "\n", + "\nIt provides the list of the adjacent AocSteps prior to Identity one. It can be more than one only for the step **CL** where a parent for each novelty is considered.", + "\nParentAocStep is critical when computing the *telescoping* differences. ", + "\n", + "\nThey are defined as follows:", + "\n", + "\n$$", + "\n\\text{ParentAocStep}(\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{AoC step with AoC Type YCU and Novelty I} & \\text{if AocType CRU} \\\\", + "\n\\text{The last AoC step with Data Type != Calculated and same Novelty as the AocStep} & \\text{if AocType YCU} \\\\", + "\n\\text{The AoC step which comes before in terms of order (as defined by AocType)} & \\text{otherwise} \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n" + ], + "metadata": {} + }, + { + "id": "l9dack27s0Kc15M14T2vxg", + "cell_type": "code", + "source": [ + "public interface ParentAocStep : IScope<(ImportIdentity Id, string AmountType), ImportStorage>", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.AmountType != AmountTypes.CDR));", + "\n ", + "\n private HashSet ParsedAocSteps => GetScope(Identity.Id.DataNode).ParsedIdentities.Select(id => new AocStep(id.AocType, id.Novelty)).ToHashSet();", + "\n private IEnumerable OrderedParsedAocSteps => ParsedAocSteps.Concat(CalculatedTelescopicAocStep).OrderBy(x => GetStorage().AocConfigurationByAocStep[x].Order);", + "\n ", + "\n private Dictionary> ParentParsedIdentities => GetPreviousIdentities(OrderedParsedAocSteps);", + "\n private AocStep identityAocStep => new AocStep(Identity.Id.AocType, Identity.Id.Novelty);", + "\n ", + "\n IEnumerable CalculatedTelescopicAocStep => GetStorage().GetCalculatedTelescopicAocSteps();", + "\n ", + "\n IEnumerable Values => ", + "\n Identity.Id.AocType switch {", + "\n AocTypes.CRU => new AocStep(AocTypes.YCU, Novelties.I).RepeatOnce(),", + "\n AocTypes.YCU => OrderedParsedAocSteps.GetReferenceAocStepForCalculated(GetStorage().AocConfigurationByAocStep, identityAocStep).RepeatOnce(),", + "\n _ => ParentParsedIdentities.TryGetValue(identityAocStep, out var parents) ? parents : Enumerable.Empty(),", + "\n };", + "\n}", + "\n", + "\npublic interface ParentAocStepForCreditRisk : ParentAocStep", + "\n{", + "\n IEnumerable ParentAocStep.CalculatedTelescopicAocStep => ", + "\n GetStorage().GetCalculatedTelescopicAocSteps().Where(aoc => aoc.AocType != AocTypes.CRU);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5L-2OpNhxki8UNE8od5BLQ", + "cell_type": "markdown", + "source": [ + "### ReferenceAocStep", + "\n", + "\nThe **ReferenceAocStep** scope provides the AocStep from which to retrieve the data in order to compute its value (e.g. AoC step EA retrieves Present Values, while AoC step YCU retrieves Nominal).", + "\n", + "\nThey are defined as follows:", + "\n", + "\n$$", + "\n\\text{ReferenceAocStep}(\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{self} & \\text{if AocStep InputSource is not Calculated} \\\\", + "\n\\text{The last AoC step with Data Type != Calculated and same Novelty as the input AocStep} ~, & \\text{if AocType } \\in \\text{\\{RCU, CF, IA, YCU, CRU\\}} \\\\", + "\n\\text{AoC step with AoC Type CF and Novelty as the AocStep} & \\text{if AocType EA} \\\\", + "\n\\text{AoC step with AoC Type CL and Novelty C} & \\text{if AocType $\\in$ \\{AM, EOP\\}} \\\\", + "\n\\text{empty} & \\text{if AocType is BOP} \\\\", + "\n\\text{log NotSupportedAocStepReference error} & \\text{otherwise} \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere the last AocStep is obtained by ordering the AocSteps according to their order (as defined by its AocType) and taking the last one." + ], + "metadata": {} + }, + { + "id": "ItSTOo7qmE68A7gENSMguQ", + "cell_type": "code", + "source": [ + "public interface ReferenceAocStep : IScope ", + "\n{", + "\n private IEnumerable OrderedParsedAocSteps => GetScope(Identity.DataNode).ParsedIdentities", + "\n .Select(id => new AocStep(id.AocType, id.Novelty))", + "\n .Distinct()", + "\n .OrderBy(aocStep => GetStorage().AocConfigurationByAocStep[aocStep].Order);", + "\n private AocStep identityAocStep => new AocStep(Identity.AocType, Identity.Novelty);", + "\n private AocStep GetReferenceAocStep(string aocType) {", + "\n return aocType switch {", + "\n AocTypes.RCU or AocTypes.CF or AocTypes.IA or AocTypes.YCU or AocTypes.CRU => OrderedParsedAocSteps.GetReferenceAocStepForCalculated(GetStorage().AocConfigurationByAocStep, identityAocStep),", + "\n AocTypes.EA => new AocStep(AocTypes.CF, Identity.Novelty),", + "\n AocTypes.AM or AocTypes.EOP => new AocStep(AocTypes.CL, Novelties.C),", + "\n AocTypes.BOP => new AocStep(default, default), //BOP, C has DataType == Calculated. See ReferenceAocStep condition.", + "\n _ => (AocStep)ApplicationMessage.Log(Error.NotSupportedAocStepReference, Identity.AocType),", + "\n };", + "\n }", + "\n", + "\n // The Reference AocStep from which get data (Nominal or PV) to compute", + "\n AocStep Value => GetStorage().AocConfigurationByAocStep[identityAocStep].DataType == DataType.Calculated ", + "\n || GetStorage().AocConfigurationByAocStep[identityAocStep].DataType == DataType.CalculatedTelescopic ", + "\n ? GetReferenceAocStep(Identity.AocType)", + "\n : identityAocStep;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tzXoa0VDqUSEqPJLe4LCdA", + "cell_type": "markdown", + "source": [ + "### PreviousAocSteps", + "\nThe **PreviousAocSteps** scope computes and provides an other important piece of information for each [Identity](../DataModel/DataStructure#import-identity), i.e. for a certain [AocType](../DataModel/DataStructure#aoc-type) and [Novelty](../DataModel/DataStructure#novelty).", + "\n", + "\nIt provides the list of all previous AocSteps up to the **BOP** step, whereby a Combined novelty will branch into the InForce and New Business AocTypes.", + "\n", + "\nPreviousAocSteps is critical when computing aggregated values along the various dimensions (such as for example Line of Business) and ", + "\nis formed by the ParentAocStep and its parent and so on until there is no parent.", + "\n", + "\n$$", + "\n\\text{PreviousAocSteps}(\\rm{AocStep}) = \\{PAS_1, PAS_2, \\ldots\\}", + "\n$$", + "\nwhere", + "\n$$", + "\n\\rm{PAS}_1 = \\rm{ParentAocStep}(\\rm{AocStep})", + "\n$$", + "\n$$", + "\n\\rm{PAS}_2 = \\rm{ParentAocStep}(\\rm{PAS}_1).", + "\n$$", + "\n", + "\nThis scope depends on the InputSource (Actual or Cashflow) for which the PreviousSteps are requested due to the AocChain differences between Actual reports and the rest." + ], + "metadata": {} + }, + { + "id": "4AJrFGaLqEm52QmmXGl6pg", + "cell_type": "code", + "source": [ + "public interface PreviousAocSteps : IScope<(ImportIdentity Id, InputSource ScopeInputSource), ImportStorage> ", + "\n{ ", + "\n private AocStep identityAocStep => new AocStep(Identity.Id.AocType, Identity.Id.Novelty);", + "\n private int aocStepOrder => GetStorage().AocConfigurationByAocStep[identityAocStep].Order;", + "\n private HashSet allAocSteps => GetStorage().GetAllAocSteps(Identity.ScopeInputSource).ToHashSet();", + "\n IEnumerable Values => allAocSteps.Contains(identityAocStep)", + "\n ? GetScope(Identity.Id.DataNode).Identities", + "\n .Select(id => new AocStep(id.AocType, id.Novelty))", + "\n .Distinct()", + "\n .Where(aoc => allAocSteps.Contains(aoc) && ", + "\n GetStorage().AocConfigurationByAocStep[aoc].Order < aocStepOrder && ", + "\n (Identity.Id.Novelty != Novelties.C ? aoc.Novelty == Identity.Id.Novelty : true) )", + "\n .OrderBy(aoc => GetStorage().AocConfigurationByAocStep[aoc].Order)", + "\n : Enumerable.Empty();", + "\n} " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "JJ7sk4vUDUSWJJvVDpbZNw", + "cell_type": "markdown", + "source": [ + "The exact structure being return depends on the **order** of the AoC Steps (which is set by the [AoC Type](../DataModel/DataStructure#aoc-type)), and on which AoC steps exist.", + "\n", + "\nFor an example of the usage of the AocStep scope see [here](../Test/AocStructureTest)." + ], + "metadata": {} + }, + { + "id": "1qVdizG_x0OI3MI-IEVZKA", + "cell_type": "markdown", + "source": [ + "", + "\n## Discounting", + "\n", + "\nThe calculation of IFRS17 figures is based on cumulated discounted cashflows." + ], + "metadata": {} + }, + { + "id": "bKrNP0O7ZEOtm23hLJyEyg", + "cell_type": "markdown", + "source": [ + "", + "\n### Yield Curves", + "\n", + "\nThe Yield Curves used for the discounting calculations are functions of the [Currency](../DataModel/DataStructure#currency), the [Data Node](../DataModel/DataStructure#data-node) and the [Economic Basis](../DataModel/DataStructure#economic-basis).", + "\n", + "\nIn particular:", + "\n- For the **Locked-in** economic basis, the yield curve used is the latest available as per end of the DataNode's inception year;", + "\n- Whereas for the **Current** economic base, the yield curve used is the latest available as per the current period.", + "\n", + "\nThe algorithm which retrieves the latest available yield curve is [here](../Utils/UtilityMethods#yield-curve)." + ], + "metadata": {} + }, + { + "id": "DcHXuat1WUaOAFa_MsVSdQ", + "cell_type": "markdown", + "source": [ + "", + "\n### Interest and Discount Rates and Factors", + "\n", + "\nThe factors used for discounting have the same granularity as the cashflow, i.e. monthly. The yield curves have yearly granularity, so the annual Interest factor is 1 + interest rate. The monthly Interest Interest and Discount factors are obtained from the annual factors such that the product of 12 months results in the annual factors, as follows:", + "\n", + "\n$$", + "\n\\text{Discount}_i = ( 1 + \\text{YC}_i ) ^{-\\frac{1}{12}} ~,", + "\n$$", + "\nand ", + "\n$$", + "\n\\text{Interest}_i = ( 1 + \\text{YC}_i) ^{\\frac{1}{12}} ~,", + "\n$$", + "\n", + "\nwhere the index $i$ denotes years." + ], + "metadata": {} + }, + { + "id": "yCCcQcUwzEO1lzy3iwRM8Q", + "cell_type": "code", + "source": [ + "public interface MonthlyRate : IScope", + "\n{", + "\n private string EconomicBasis => GetContext();", + "\n ", + "\n private double[] YearlyYieldCurve => GetStorage().GetYearlyYieldCurve(Identity, EconomicBasis);", + "\n ", + "\n private double Perturbation => 0; //GetStorage().GetYieldCurvePerturbation(); => switch Args.Scenario { 10ptsU => 0.1, 10ptsD => -0.1, _ => default)", + "\n ", + "\n double[] Interest => YearlyYieldCurve.Select(rate => Math.Pow(1d + rate, 1d / 12d) + Perturbation).ToArray(); ", + "\n ", + "\n double[] Discount => Interest^(-1);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ON4hzALyrkapbo6dsJaCYA", + "cell_type": "markdown", + "source": [ + "For an example of these calculations see [here](../Test/SpecificationsImportCashflows#interest-and-discount-rates)." + ], + "metadata": {} + }, + { + "id": "wCY9O1rFG0OcsUmqNLVm4Q", + "cell_type": "markdown", + "source": [ + "", + "\n## Nominal Values", + "\n", + "\nThe nominal cashflow values correspond to the cashflows provided in the Cashflow input file. ", + "\n
These values are stored in the database as [RawVariable](../DataModel/DataStructure#raw-variables).", + "\n
Refer to the ReferenceAocStep of the AocStructure calculation to identify the correct AocType and Novelty to retrieve.", + "\n
Due to the Credit Default Risk of a reinsurance partner, the logic to compute the Nominal Cashflows for this Amount Type must be defined separately. " + ], + "metadata": {} + }, + { + "id": "YZrg-gGldUGe6pZF0Kh3Qw", + "cell_type": "code", + "source": [ + "public interface NominalCashflow : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.Identity.AmountType == AmountTypes.CDR));", + "\n", + "\n AocStep referenceAocStep => GetScope(Identity.Id).Value;", + "\n double[] Values => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, Identity.AmountType, Identity.CalculationType, Identity.AccidentYear);", + "\n}", + "\n", + "\npublic interface CreditDefaultRiskNominalCashflow : NominalCashflow", + "\n{", + "\n private double[] NominalClaimsCashflow => GetStorage().GetClaims()", + "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.CalculationType, Identity.AccidentYear))", + "\n .Aggregate();", + "\n ", + "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", + "\n ", + "\n private double[] PvCdrDecumulated { get {", + "\n var ret = new double[NominalClaimsCashflow.Length];", + "\n for (var i = NominalClaimsCashflow.Length - 1; i >= 0; i--)", + "\n ret[i] = Math.Exp(-nonPerformanceRiskRate) * ret.ElementAtOrDefault(i + 1) + NominalClaimsCashflow[i] - NominalClaimsCashflow.ElementAtOrDefault(i + 1);", + "\n return ret; } } ", + "\n ", + "\n double[] NominalCashflow.Values => PvCdrDecumulated - NominalClaimsCashflow;", + "\n}", + "\n", + "\npublic interface AllClaimsCashflow : NominalCashflow", + "\n{", + "\n double[] NominalCashflow.Values => GetStorage().GetClaims()", + "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.CalculationType, Identity.AccidentYear))", + "\n .Aggregate();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "OPI-l8iwREuVVszAP89Hqw", + "cell_type": "markdown", + "source": [ + "For a given month $i$ they are denoted as $\\rm{Nominal}_i$." + ], + "metadata": {} + }, + { + "id": "7RRmYOmkFEuqu8yfOR-0rw", + "cell_type": "markdown", + "source": [ + "For an example of nominal cashflow values see [here](../Test/SpecificationsImportCashflows#nominal-cashflow)." + ], + "metadata": {} + }, + { + "id": "q0ZU9L_OMUqLUKUOUcLuAw", + "cell_type": "markdown", + "source": [ + "", + "\n## Present Values", + "\n", + "\nPresent Values are calculated during the import of the cashflows and stored on the database. They are computed for the relevant Economic Basis, depending on the Valuation Basis.", + "\n", + "\nTheir calculation is described in the following sections and is summarized in the $\\rm{PV}$ formula [below](#present-value)." + ], + "metadata": {} + }, + { + "id": "4SsmFu7Uo0aIEmes8Z4LoQ", + "cell_type": "markdown", + "source": [ + "", + "\n### Cumulated Discounted Cashflows", + "\n", + "\nCumulated and Discounted cashflows $\\rm{CDC}$ are computed using the monthly discount rates and in a recursive manner, as follows:", + "\n", + "\n$$", + "\n\\text{CDC}_i(\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{Nominal}_i + \\text{CDC}_{i+1} \\cdot {\\text{Valid Discount}_{\\frac{i}{12}}} ~, & \\text{if Aoc Type's Period Type is Beginning Of Period} \\\\", + "\n\\big( \\text{Nominal}_i + \\text{CDC}_{i+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{i}{12}}} ~, & \\text{if Aoc Type's Period Type is End Of Period}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere Transaction Period depends on which Best Estimate value is being computed, in particular on what its [Amount Type](../DataModel/DataStructure#amount-type) is (each Amount Type has its own [Period Type](../Constants/Enums)); and $\\text{Valid Discount}$ stands for the fact that in case the Discount Curves are shorter than the required index, then their last element is returned.", + "\n", + "\n
Also here, the Credit Default Risk contribution is calculated separately. Since it is based on Claims, the Period Type is implicitly defined." + ], + "metadata": {} + }, + { + "id": "n0bMVVX8JUGCvXh-hcQi9g", + "cell_type": "code", + "source": [ + "public interface DiscountedCashflow : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? Accidentyear), ImportStorage>", + "\n{", + "\n private PeriodType periodType => GetStorage().GetPeriodType(Identity.AmountType, Identity.CalculationType); ", + "\n ", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR));", + "\n", + "\n [NotVisible]", + "\n string EconomicBasis => GetContext();", + "\n", + "\n [NotVisible]", + "\n double[] MonthlyDiscounting => GetScope(Identity.Id).Discount;", + "\n ", + "\n [NotVisible]", + "\n double[] NominalValues => GetScope(Identity).Values;", + "\n", + "\n double[] Values => NominalValues.ComputeDiscountAndCumulate(MonthlyDiscounting, periodType);", + "\n}", + "\n", + "\npublic interface DiscountedCreditRiskCashflow : DiscountedCashflow", + "\n{ ", + "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", + "\n ", + "\n double[] DiscountedCashflow.Values => NominalValues.ComputeDiscountAndCumulateWithCreditDefaultRisk(MonthlyDiscounting, nonPerformanceRiskRate);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "V8aa9nD9bUqsX54-bD1Hiw", + "cell_type": "markdown", + "source": [ + "For example calculations for Cumulated Discounted Cashflows see [here](../Test/SpecificationsImportCashflows#cumulated-discounted-cashflow)." + ], + "metadata": {} + }, + { + "id": "bYq1f5UE80q1fxb-AON3pA", + "cell_type": "markdown", + "source": [ + "", + "\n### Telescoping Difference", + "\n", + "\n", + "\nPresent Value figures for a specific period are typically reported through an analysis of change, where for each [AocStep](#aoc-steps-structure) the variation with respect to the preceding AocStep is shown.", + "\n", + "\nThe Telescoping Difference is basically the delta between two adjacent AoC steps, whereby the [ParentAocStep](#aoc-steps-structure) is used to determine the AoC step. ", + "\n", + "\nIt is defined as follows:", + "\n", + "\n$$", + "\n\\text{TelescopingDifference}_i = ", + "\n\\text{CDC}_{i}\\big(\\text{current AoC step}\\big) - \\text{CDC}_{i}\\big(\\text{parent AoC step}\\big)", + "\n$$", + "\n", + "\nwhere AocType is the AoC Type of the AoC Step for which the calculations are being performed." + ], + "metadata": {} + }, + { + "id": "cNNeXkyxjkiDODg6ARR5Zw", + "cell_type": "code", + "source": [ + "public interface TelescopicDifference : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? Accidentyear), ImportStorage>", + "\n{", + "\n [NotVisible]", + "\n string EconomicBasis => GetContext();", + "\n private double[] CurrentValues => GetScope(Identity).Values;", + "\n ", + "\n private double[] PreviousValues => (GetScope((Identity.Id, Identity.AmountType)))", + "\n .Values", + "\n .Select(aoc => GetScope((Identity.Id with {AocType = aoc.AocType, Novelty = aoc.Novelty}, Identity.AmountType, Identity.CalculationType, Identity.Accidentyear)).Values)", + "\n .Where(cf => cf.Count() > 0)", + "\n .Aggregate();", + "\n ", + "\n double[] Values => CurrentValues - PreviousValues;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "cYmNPbah5UaC9Iu3db7pqA", + "cell_type": "markdown", + "source": [ + "Examples of Telescoping Difference calculations for different AoC steps start [here](../Test/SpecificationsImportCashflows#modelcorrections)." + ], + "metadata": {} + }, + { + "id": "Z42Ysovu4UmepvVo0U429w", + "cell_type": "markdown", + "source": [ + "", + "\n### Present Value", + "\n", + "\nThe present value ($\\rm{PV}$) can be determined by taking the appropriate elements of the cumulated discounted cashflows. This is done as function of the two [projection parameters](../DataModel/DataStructure#projection-configuration) $\\rm{Shift}$ ($S$) and $\\rm{TimeStep}$ ($TS$):", + "\n", + "\n$$", + "\n\\text{PV}(S, TS) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{PV Base}_{S} ~, & \\text{if Valuation Period is Beginning of Period} \\\\", + "\n\\text{PV Base}_{S+TS/2 -1} ~, & \\text{if Valuation Period is Mid of Period} \\\\", + "\n\\sum_{i=S}^{S + TS - 1}\\text{PV Base}_{i} ~, & \\text{if Valuation Period is Delta} \\\\", + "\n\\text{PV Base}_{S + TS} ~, & \\text{if Valuation Period is End of Period} \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere [PV Base](#present-value-base) is defined below, and the term $TS/2$ uses MidpointRounding.AwayFromZero (as defined by *https:[]()//docs.microsoft.com/en-us/dotnet/api/system.midpointrounding?view=net-6.0)*: rounding to the nearest number, away from zero in the exact halfway case. Furthermore, if the array is smaller than the index, then the last element is returned.", + "\n", + "\nFor instance, for the current year and year-to-date view we have $S=0$ and $TS=3$ for the first quarter, $TS=6$ for the 2nd quarter and so on.", + "\nFor the projection values of next year first quarter we would have $S=12$ and $TS=3$, etc." + ], + "metadata": {} + }, + { + "id": "a_j0Wz_NsEeWjap6zY-mDA", + "cell_type": "code", + "source": [ + "public interface IWithGetValueFromValues : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "\n{", + "\n private int shift => GetStorage().GetShift(0);//Identity.Id.ProjectionPeriod", + "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.Id.ProjectionPeriod", + "\n ", + "\n public double GetValueFromValues(double[] Values)", + "\n {", + "\n return GetStorage().GetValuationPeriod(Identity.Id) switch {", + "\n ValuationPeriod.BeginningOfPeriod => Values.ElementAtOrDefault(shift),", + "\n ValuationPeriod.MidOfPeriod => Values.ElementAtOrDefault(shift + Convert.ToInt32(Math.Round(timeStep / 2d, MidpointRounding.AwayFromZero)) - 1),", + "\n ValuationPeriod.Delta => Values.Skip(shift).Take(timeStep).Sum(),", + "\n ValuationPeriod.EndOfPeriod => Values.ElementAtOrDefault(shift + timeStep),", + "\n ValuationPeriod.NotApplicable => default", + "\n };", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LX0IfHO1HkG3juJfHtyRsQ", + "cell_type": "markdown", + "source": [ + "An example of Projected Present Value calculations can be found [here](../Test/SpecificationsImportCashflows#present-value)." + ], + "metadata": {} + }, + { + "id": "JablJ7mjvkSSqXmjUWZ-mg", + "cell_type": "markdown", + "source": [ + "", + "\n### Interest Accretion", + "\n", + "\nSince the Interest Accretion cashflows are typically not provided as input (as they can be computed from its parent AocStep), its present values can be computed as follows:", + "\n", + "\n$$", + "\n\\text{InterestAccretion}_i(\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\big(\\text{CDC}_i(\\text{Parent AoC step}) - \\text{Nominal}_i(\\text{parent AoC step}) \\big) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, & \\text{if Amount Type's Transaction Period is Beginning of Period} \\\\", + "\n\\text{CDC}_i(\\text{parent AoC step}) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\n
Due to the Credit Default Risk of a reinsurance partner, the logic to compute the Interest Accretion for this Amount Type must be defined separately. Since it is based on Claims, the Period Type is implicitly defined." + ], + "metadata": {} + }, + { + "id": "vGVQDaWg2UeXvSxdJ18zpA", + "cell_type": "code", + "source": [ + "public interface IWithInterestAccretion : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "\n{", + "\n private double[] parentDiscountedValues => GetScope(Identity).Values; ", + "\n private double[] parentNominalValues => GetScope(Identity).Values;", + "\n private double[] monthlyInterestFactor => GetScope(Identity.Id).Interest;", + "\n ", + "\n double[] GetInterestAccretion() ", + "\n {", + "\n var periodType = GetStorage().GetPeriodType(Identity.AmountType, Identity.CalculationType);", + "\n var ret = new double[parentDiscountedValues.Length];", + "\n ", + "\n switch (periodType) {", + "\n case PeriodType.BeginningOfPeriod :", + "\n for (var i = 0; i < parentDiscountedValues.Length; i++)", + "\n ret[i] = (parentDiscountedValues[i] - parentNominalValues[i]) * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", + "\n break;", + "\n default :", + "\n for (var i = 0; i < parentDiscountedValues.Length; i++)", + "\n ret[i] = parentDiscountedValues[i] * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", + "\n break;", + "\n }", + "\n ", + "\n return ret;", + "\n }", + "\n}", + "\n", + "\npublic interface IWithInterestAccretionForCreditRisk : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "\n{", + "\n private double[] nominalClaimsCashflow => GetScope(Identity).Values;", + "\n private double[] nominalValuesCreditRisk => -1 * GetScope(Identity with {Id = Identity.Id with {AocType = AocTypes.CF}}).Values;", + "\n private double[] monthlyInterestFactor => GetScope(Identity.Id).Interest;", + "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", + "\n ", + "\n double[] GetInterestAccretion() ", + "\n {", + "\n var interestOnClaimsCashflow = new double[nominalClaimsCashflow.Length];", + "\n var interestOnClaimsCashflowCreditRisk = new double[nominalClaimsCashflow.Length];", + "\n var effectCreditRisk = new double[nominalClaimsCashflow.Length];", + "\n for (var i = nominalClaimsCashflow.Length - 1; i >= 0; i--) {", + "\n interestOnClaimsCashflow[i] = 1 / GetElementOrDefault(monthlyInterestFactor, i/12) * (interestOnClaimsCashflow.ElementAtOrDefault(i + 1) + nominalClaimsCashflow[i] - nominalClaimsCashflow.ElementAtOrDefault(i + 1));", + "\n interestOnClaimsCashflowCreditRisk[i] = 1 / GetElementOrDefault(monthlyInterestFactor, i/12) * (Math.Exp(-nonPerformanceRiskRate) * interestOnClaimsCashflowCreditRisk.ElementAtOrDefault(i + 1) + nominalClaimsCashflow[i] - nominalClaimsCashflow.ElementAtOrDefault(i + 1));", + "\n effectCreditRisk[i] = interestOnClaimsCashflow[i] - interestOnClaimsCashflowCreditRisk[i];", + "\n }", + "\n ", + "\n return effectCreditRisk - nominalValuesCreditRisk;", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "f_Nqjp76YUWFtL08hw0iTg", + "cell_type": "markdown", + "source": [ + "An example of the Interest Accretion calculations can be found [here](../Test/SpecificationsImportCashflows#interest-accretion)." + ], + "metadata": {} + }, + { + "id": "lWN9DuSvtkWi8KPDtnLcZA", + "cell_type": "markdown", + "source": [ + "", + "\n### Present Value Base", + "\n", + "\nThe PV Base values are valid for all choices of the [Economic Basis](../DataModel/DataStructure#economic-basis):", + "\n", + "\n$$", + "\n\\text{PV Base}_i (\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{rl}", + "\n\\text{CDC}_i ~, & \\text{if AoCType = BOP} \\\\", + "\n-\\text{Nominal}_i(\\text{Parent AoC step}) ~, & \\text{if AoCType = CF } \\\\", + "\n\\text{InterestAccretion}_i ~, & \\text{if AoCType = IA } \\\\", + "\n0 ~, & \\text{if AoCType = AM } \\\\\\", + "\n\\text{CDC}_i(\\text{Parent AoC step}) ~, & \\text{if AoCType = EOP } \\\\", + "\n\\text{TelescopingDifference}_i ~, & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere $i$ denotes the months, and the [$\\rm{TelescopingDifference}_i$](#telescopic-difference) and the [$\\rm{InterestAccretion}_i$](#interest-accretion) quantities are defined above." + ], + "metadata": {} + }, + { + "id": "NX2BdeLNxk2VWROO8E5pBg", + "cell_type": "code", + "source": [ + "public interface PvBase : IWithGetValueFromValues", + "\n{ ", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow", + "\n || x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode))", + "\n .WithApplicability(x => (x.Identity.Id.AocType == AocTypes.BOP && x.Identity.Id.Novelty != Novelties.C) || x.Identity.Id.AocType == AocTypes.EOP)", + "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.IA)", + "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.IA)", + "\n .WithApplicability(x => new string[]{AocTypes.BOP, AocTypes.EA, AocTypes.AM, AocTypes.RCU}.Contains(x.Identity.Id.AocType) ) //add here combination CRU for At !CDR?", + "\n );", + "\n ", + "\n [NotVisible][IdentityProperty][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => GetContext();", + "\n ", + "\n [NotVisible]", + "\n double[] Values => GetScope(Identity).Values;", + "\n ", + "\n public double Value => GetValueFromValues(Values);", + "\n}", + "\n", + "\npublic interface ComputePvBaseWithIfrsVariable : PvBase", + "\n{", + "\n double PvBase.Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.CalculationType, EconomicBasis, Identity.AccidentYear); //unify CalculationType and EstimateTypeGet", + "\n double[] PvBase.Values => Enumerable.Empty().ToArray();", + "\n}", + "\n", + "\npublic interface PvBaseFromDiscountedCashflow : PvBase", + "\n{", + "\n [NotVisible]", + "\n double[] PvBase.Values => GetScope(Identity).Values;", + "\n}", + "\n", + "\npublic interface CashflowAocStep : PvBase", + "\n{", + "\n [NotVisible]", + "\n double[] PvBase.Values => -1d * GetScope(Identity).Values;", + "\n}", + "\n", + "\npublic interface PvBaseWithInterestAccretion : PvBase, IWithInterestAccretion", + "\n{", + "\n [NotVisible]", + "\n double[] PvBase.Values => GetInterestAccretion();", + "\n}", + "\n", + "\npublic interface PvBaseWithInterestAccretionForCreditRisk : PvBase, IWithInterestAccretionForCreditRisk", + "\n{", + "\n [NotVisible]", + "\n double[] PvBase.Values => GetInterestAccretion();", + "\n}", + "\n", + "\npublic interface EmptyValuesAocStep : PvBase", + "\n{", + "\n [NotVisible]", + "\n double[] PvBase.Values => Enumerable.Empty().ToArray();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yZbP0Jm3ckC1XQBFERPm_g", + "cell_type": "markdown", + "source": [ + "An example of the Present Value Base calculations can be found [here](../Test/SpecificationsImportCashflows#present-value)." + ], + "metadata": {} + }, + { + "id": "lWMlf8gT5kGtPaXz4CcdLg", + "cell_type": "markdown", + "source": [ + "", + "\n### Current and Locked", + "\n", + "\nPV Current and PV Locked below basically hold the Present Values [PV](#present-value) computed using the **Current** yield curves and the **Locked** yield curves, respectively.", + "\n", + "\nValues are available for each AmountType (by calling PvLocked.ByAmountType):", + "\n", + "\n$$", + "\n\\text{PV Locked}(\\text{AoC step}, \\text{Amount Type}) = \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = L}}", + "\n$$", + "\n", + "\n$$", + "\n\\text{PV Current}(\\text{AoC step}, \\text{Amount Type}) = \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = C}}", + "\n$$", + "\n", + "\n", + "\nAnd aggregated values are also available as the sum over all [Amount Types](../DataModel/DataStructure#amount-type) (by calling PvLocked.Value):", + "\n", + "\n$$", + "\n\\text{PV Locked}(\\text{AoC step}) = \\sum_{\\text{Amount Types}} \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = L}}", + "\n$$", + "\n", + "\n$$", + "\n\\text{PV Current}(\\text{AoC step}) = \\sum_{\\text{Amount Types}} \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = C}}", + "\n$$", + "\n", + "\nThese are used in the BBA methodology, whereby in the CSM calculations only PV Locked is used, and both of them are stored in the database under the [IfrsVariable](../DataModel/DataStructure#ifrs-variable) data structure." + ], + "metadata": {} + }, + { + "id": "1wOqzclAjkaUcoGzwf1ldQ", + "cell_type": "code", + "source": [ + "public interface PvLocked : IScope", + "\n{ ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => EconomicBases.L;", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.BE;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", + "\n ", + "\n [NotVisible]", + "\n PvBase[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", + "\n .ToArray();", + "\n double Value => PresentValues.Aggregate().Value;", + "\n}", + "\n", + "\npublic interface PvCurrent : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => EconomicBases.C;", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.BE;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", + "\n ", + "\n [NotVisible]", + "\n PvBase[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", + "\n .ToArray();", + "\n ", + "\n double Value => PresentValues.Aggregate().Value;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6pCT1yWm30S4fz2w2Km62w", + "cell_type": "markdown", + "source": [ + "", + "\n## Risk Adjustment", + "\n", + "\nRisk Adjustment values ($\\rm{RA}$) are accessible from the [PV Base](#present-value-base) data and have [Calculation Type](../DataModel/DataStructure#calculation-type) $RA$. In particular, the Locked-In and Current values are given by:", + "\n", + "\n$$", + "\n\\text{RA Locked}(\\text{AoC step}) = \\text{PV}(\\text{AoC step})|_{\\text{Calculation Type = RA},~ \\text{Economic Basis = L}}", + "\n$$", + "\n", + "\n$$", + "\n\\text{RA Current}(\\text{AoC step}) = \\text{PV}(\\text{AoC step})|_{\\text{Calculation Type = RA},~ \\text{Economic Basis = C}}", + "\n$$", + "\n", + "\nwhere PV is defined [above](#present-value) and uses the input cashflows with Calculation Type = RA." + ], + "metadata": {} + }, + { + "id": "TrbvThWf6EergPrBDCULNQ", + "cell_type": "code", + "source": [ + "public interface RaLocked : IScope", + "\n{ ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => EconomicBases.L;", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.RA;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", + "\n ", + "\n PvBase[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray();", + "\n ", + "\n double Value => PresentValues.Aggregate().Value;", + "\n}", + "\npublic interface RaCurrent : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => EconomicBases.C;", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.RA;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", + "\n ", + "\n PvBase[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray(); ", + "\n ", + "\n double Value => PresentValues.Aggregate().Value;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "lCTjmXtNM0anxWCIugOk1g", + "cell_type": "markdown", + "source": [ + "", + "\n## Amortization", + "\n", + "\nFor the Amortization AoC Step (AoC Type **AM**), the amortization factors to be used are defined below." + ], + "metadata": {} + }, + { + "id": "1EJRTEzTH02xfXBuVK6aQQ", + "cell_type": "markdown", + "source": [ + "", + "\n### Coverage Units", + "\n", + "\nThe coverage unit (CU) of a GIC is introduced in the standard as the quantity of the service provided in that GIC. The service is", + "\nmeasured by considering the quantity of benefits provided as well as the expected coverage period of the GIC.", + "\n", + "\nThe cashflows of coverage units are retrieved from the discounted cashflows with [Calculation Type](../DataModel/DataStructure#calculation-type) CU." + ], + "metadata": {} + }, + { + "id": "8s4nf1G3h0O5cmlvAC3QLw", + "cell_type": "code", + "source": [ + "public interface CoverageUnitCashflow : IScope", + "\n{ ", + "\n [NotVisible] string EconomicBasis => GetContext();", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.CU;", + "\n ", + "\n double[] Values => GetScope((Identity, (string)null, CalculationType, (int?)null)).Values;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BTET6Z8yrkOpMBOGK5Bu3g", + "cell_type": "markdown", + "source": [ + "", + "\n### Amortization Factor" + ], + "metadata": {} + }, + { + "id": "m1VQAxKwaEuv9KI6qEVFxA", + "cell_type": "markdown", + "source": [ + "For a certain GIC, the monthly Amortization Factors $\\text{Monthly }AF_i$ are computed from the cashflows of the underlying coverage unit for that GIC:", + "\n", + "\n$$", + "\n\\text{Monthly }AF_i = 1 - \\frac{ \\text{Nominal}_i(CL)} {\\text{CDC}_i(CL) } ~.", + "\n$$", + "\n", + "\nwhere:", + "\n- $i$ denotes a monthly period;", + "\n- the nominal cash flows $\\text{Nominal}_i(CL)$ are the nominal cashflows of the coverage unit for the AoC Step **Combined Liability** (CL) (input data);", + "\n- and the corresponding cumulated discounted cashflows $\\text{CDC}_i$ are defined [above](#cumulated-discounted-cashflows)." + ], + "metadata": {} + }, + { + "id": "ilj2SgcU7kOjz53Sf946cw", + "cell_type": "code", + "source": [ + "public interface MonthlyAmortizationFactorCashflow : IScope", + "\n{", + "\n private double[] NominalCuCashflow => GetScope((Identity with {AocType = AocTypes.CL}, (string)null, CalculationTypes.CU, (int?)null)).Values;", + "\n private double[] DiscountedCuCashflow => GetScope(Identity with {AocType = AocTypes.CL}, o => o.WithContext(EconomicBasis)).Values;", + "\n ", + "\n [NotVisible] string EconomicBasis => GetContext();", + "\n ", + "\n double[] MonthlyAmortizationFactors => Identity.AocType switch {", + "\n AocTypes.AM => NominalCuCashflow.Zip(DiscountedCuCashflow, //Extract to an other scope with month in the identity to avoid Zip?", + "\n (nominal, discountedCumulated) => discountedCumulated >= Precision ", + "\n ? 1 - nominal / discountedCumulated ", + "\n : 0).ToArray(),", + "\n _ => Enumerable.Empty().ToArray(),", + "\n };", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bqUlBh41xUCZmzV497BLug", + "cell_type": "markdown", + "source": [ + "For a certain projection period - defined by the Shift, $S$, and the Time-Step, $TS$, parameters - the Amortization Factor is then given by the product of the corresponding monthly amortization factors:", + "\n", + "\n$$", + "\nAF = \\prod _{i = S}^{TS} \\text{Monthly }AF_i ~.", + "\n$$", + "\n", + "\nEach GIC will have his own AF." + ], + "metadata": {} + }, + { + "id": "6OE1dyBDq0-W4sMSuAQoeQ", + "cell_type": "code", + "source": [ + "public interface CurrentPeriodAmortizationFactor : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => ", + "\n s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow", + "\n || x.GetStorage().IsSecondaryScope(x.Identity.DataNode)));", + "\n ", + "\n private int shift => GetStorage().GetShift(0);//Identity.ProjectionPeriod", + "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.ProjectionPeriod", + "\n ", + "\n [NotVisible] string EconomicBasis => GetContext();", + "\n ", + "\n string EstimateType => EstimateTypes.F;", + "\n double Value => GetScope(Identity)", + "\n .MonthlyAmortizationFactors", + "\n .Skip(shift)", + "\n .Take(timeStep)", + "\n .Aggregate(1d, (x, y) => x * y);", + "\n}", + "\n", + "\npublic interface AmfFromIfrsVariable : CurrentPeriodAmortizationFactor", + "\n{", + "\n double CurrentPeriodAmortizationFactor.Value => GetStorage().GetValue(Identity, (string)null, EstimateType, EconomicBasis, (int?)null); //unify CalculationType and EstimateTypeGet", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jpW8fnmKpEi5m8fmZckqfA", + "cell_type": "markdown", + "source": [ + "", + "\n## Actual Values", + "\n", + "\nWe consider 4 types of Actual values, which are distinguished through their [Estimate Type](../DataModel/DataStructure#estimate-type):", + "\n- Actuals (A)", + "\n- Advance Actuals (AA)", + "\n- Overdue Actuals (OA)", + "\n- Deferrable Actuals (DA)", + "\n", + "\nwith the Estimate Type's system name shown between parenthesis above.", + "\n", + "\nThe following simplified AoC Chain applies for Advance and Overdue Actuals:", + "\n
 BOP", + "\n
 Release", + "\n
 Write-off", + "\n
 EOP" + ], + "metadata": {} + }, + { + "id": "EBK-msISl0WxxcRgAvBDWQ", + "cell_type": "markdown", + "source": [ + "", + "\n### Actual Base", + "\n", + "\nThe Actual Base sets values for actual, advance, and overdue as follows:", + "\n", + "\n$$", + "\n\\text{Actual Base} (\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{rl}", + "\n0 ~, & \\text{if AoC Step's AoC Type = AM} \\\\", + "\n\\text{Actual Base}(\\rm{BOP}) + \\text{Actual Base}(\\rm{CF}) + \\text{Actual Base}(\\rm{WO}) ~, & \\text{if AoC Step's AoC Type = EOP and EstimateType is not A} \\\\", + "\n\\text{Imported Actual} ~, & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere the value is also function of the [Estimate Type](../DataModel/DataStructure#EstimateType) and [Amount Type](../DataModel/DataStructure#AmountType), and the $\\text{Imported Actual}$ value is described [here]()." + ], + "metadata": {} + }, + { + "id": "_w7DsklRxEy1-gr0L3xnxQ", + "cell_type": "code", + "source": [ + "public interface ActualBase : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Actual ", + "\n && !x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode)", + "\n && x.Identity.Id.AocType == AocTypes.AM)", + "\n .WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow ", + "\n && !x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode)", + "\n && x.Identity.Id.AocType == AocTypes.EOP ", + "\n && x.Identity.EstimateType != EstimateTypes.A)", + "\n );", + "\n public double Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.EstimateType, Identity.AccidentYear); ", + "\n}", + "\n", + "\npublic interface EndOfPeriodActual : ActualBase", + "\n{", + "\n double ActualBase.Value => GetScope((Identity.Id, InputSource.Actual)).Values", + "\n .Sum(aocStep => GetScope((Identity.Id with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, Identity.AmountType, Identity.EstimateType, Identity.AccidentYear)).Value);", + "\n}", + "\n", + "\npublic interface EmptyValuesActual : ActualBase", + "\n{", + "\n double ActualBase.Value => 0;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hZgnWCXsbEm7b3a_M5X91Q", + "cell_type": "markdown", + "source": [ + "An example of Actual Base figures can be found [here](../Test/SpecificationsImportActuals#base-actual)." + ], + "metadata": {} + }, + { + "id": "seP-q4-pNEKPbBJB6XWgGQ", + "cell_type": "markdown", + "source": [ + "", + "\n### Actuals", + "\nThe Actuals correspond to ActualBase values with estimate type $A$.", + "\nThe only valid Aoc step is Release:", + "\n", + "\n$$", + "\n\\text{Actual} (\\text{Release}) = \\text{Actual Base} (\\text{Release})|_{\\text{Estimate Type} = A}", + "\n$$" + ], + "metadata": {} + }, + { + "id": "rA5FAU7rP0mVtOb_OMRAQQ", + "cell_type": "code", + "source": [ + "public interface Actual : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.A;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", + "\n ", + "\n [NotVisible]", + "\n ActualBase[] Actuals => GetScope(Identity.DataNode).ActualAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tQS8QPziAEWrDh1ztulzDw", + "cell_type": "markdown", + "source": [ + "", + "\n### Advance Actuals", + "\n", + "\n**Advance Actuals** are those cashflows with due date inside the reporting period but which occured *before* the reporting period - They include:", + "\n- Receivable Claims", + "\n- Receivable Expenses", + "\n- Payable Premiums", + "\n", + "\nAdvance Actuals are given by", + "\n", + "\n$$", + "\n\\text{Advance Actual} (\\text{AoC step}) = \\text{Actual Base} (\\text{AoC step})|_{\\text{Estimate Type} = AA}", + "\n$$" + ], + "metadata": {} + }, + { + "id": "BGCY3AvaxkWvnU8Py4UK5w", + "cell_type": "code", + "source": [ + "public interface AdvanceActual : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.AA;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", + "\n ", + "\n [NotVisible]", + "\n ActualBase[] Actuals => GetScope(Identity.DataNode).ActualAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "EDA0vEXMd0602tAx8vQ8Eg", + "cell_type": "markdown", + "source": [ + "", + "\n### Overdue Actuals", + "\n", + "\n**Overdue Actuals** are those cashflows with due date inside the reporting period but which occur *after* the reporting period - They contain:", + "\n- Payable Claims", + "\n- Payable Expenses", + "\n- Receivable Premiums", + "\n", + "\nThe sign convention is the inverse of the default behavior - In particular: Premiums have positive value, whereas Claims and Expenses have negative value.", + "\n", + "\nThe Overdue Actuals are given by", + "\n", + "\n$$", + "\n\\text{Overdue Actual} (\\text{AoC step}) = \\text{Actual Base} (\\text{AoC step})|_{\\text{Estimate Type} = OA}", + "\n$$" + ], + "metadata": {} + }, + { + "id": "JhdC-O-53k-OPdsSNtyTqQ", + "cell_type": "code", + "source": [ + "public interface OverdueActual : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.OA;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", + "\n ", + "\n [NotVisible]", + "\n ActualBase[] Actuals => GetScope(Identity.DataNode).ActualAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BU02PReB0UyuCXL3rgF7kw", + "cell_type": "markdown", + "source": [ + "", + "\n### Deferrable Actuals", + "\n", + "\nFinally, Deferrable Actuals are given by", + "\n", + "\n$$", + "\n\\text{Deferrable Actual} (\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{rl}", + "\n\\sum_{\\text{Amount Type}~\\in~\\text{\\{ACA, AEA}\\}}\\text{Actual Base}(\\rm{CF})|_{\\text{Estimate Type = A}} ~, & \\text{if AoC Step's AoC Type = CF } \\\\", + "\n- \\text{Amortization Factor} \\cdot \\big( \\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) \\big) ~, & \\text{if AoC Step's AoC Type = AM } \\\\", + "\n\\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) + \\text{Deferrable Actual}(\\rm{AM}) ~, & \\text{if AoC Step's AoC Type = EOP } \\\\", + "\n\\text{Input Actual}|_{\\text{Estimate Type = DA}} ~, & \\text{ otherwise } \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere $ACA$ and $AEA$ are *Aquisition* Amount Types from **Attributable Commission** and **Attributable Expenses**, respectively." + ], + "metadata": {} + }, + { + "id": "ydbJzjQG6kGLXvpaU9QqxQ", + "cell_type": "code", + "source": [ + "public interface DeferrableActual : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.ValuationApproach == ValuationApproaches.VFA, ", + "\n p => p.ForMember(s => s.EconomicBasis))", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.AM)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.EOP)", + "\n );", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.DA;", + "\n ", + "\n [NotVisible] string EconomicBasis => EconomicBases.L;", + "\n ", + "\n public double Value => GetStorage().GetValue(Identity, (string)null, EstimateType, (int?)null);", + "\n}", + "\n", + "\npublic interface DeferrableActualForCurrentBasis : DeferrableActual", + "\n{", + "\n [NotVisible] string DeferrableActual.EconomicBasis => EconomicBases.C;", + "\n}", + "\n", + "\npublic interface ReleaseDeferrable : DeferrableActual", + "\n{", + "\n double DeferrableActual.Value => GetStorage().GetAttributableExpenseAndCommissionAmountType().Sum(at => GetScope((Identity, at, EstimateTypes.A, (int?)null)).Value);", + "\n}", + "\n", + "\npublic interface AmortizationDeferrable : DeferrableActual", + "\n{", + "\n private double AmortizationFactor => GetScope(Identity, o => o.WithContext(EconomicBasis)).Value;", + "\n private double AggregatedDeferrable => GetScope((Identity, InputSource.Actual)).Values", + "\n .Sum(aocStep => GetScope(Identity with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}).Value);", + "\n double DeferrableActual.Value => -1d * AggregatedDeferrable * AmortizationFactor;", + "\n}", + "\n", + "\npublic interface EndOfPeriodDeferrable : DeferrableActual", + "\n{", + "\n double DeferrableActual.Value => GetScope((Identity, InputSource.Actual)).Values", + "\n .Sum(aocStep => GetScope(Identity with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}).Value);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "p-VbKXd52UuaKecFYnE8iQ", + "cell_type": "markdown", + "source": [ + "An example of Deferrable Actual figures can be found [here](../Test/SpecificationsImportActuals#deferrable-actual)." + ], + "metadata": {} + }, + { + "id": "Mtf0XXuvUkS76O6DBZUr4A", + "cell_type": "markdown", + "source": [ + "", + "\n## Contractual Service Margin, Loss Component and Loss Recovery Component", + "\n", + "\nThe Contractual Service Margin ($CSM$) denotes the unearned profit from an insurance contract or group of insurance contracts and plays a critical role in the calculation of profit & loss values. Similarly, the unearned loss is denoted by Loss Component ($LC$), Loss Recovery Component in the case of reinsurance contracts." + ], + "metadata": {} + }, + { + "id": "Wq-e5YleykGCYEopzDLT4A", + "cell_type": "markdown", + "source": [ + "## Experience Adjustment on Premium" + ], + "metadata": {} + }, + { + "id": "JwOnE_oxnE6u4nU3ZQku3Q", + "cell_type": "markdown", + "source": [ + "The Experience Adjustment (EA) on Premiums weights the cash-flow (CF aocSteps) for premium amount types by the PremiumAllocationFactor input for each group of insurance contract. ", + "\nThe contributions of present values and actuals are computed separately.", + "\n", + "\n$$", + "\nEA (\\rm{PV}) = \\text{Premium Allocation Factor} \\cdot \\big( PV (\\text{AocType = CF}) \\big)~, \\\\", + "\n$$", + "\n$$", + "\nEA (\\text{Actual}) = \\text{Premium Allocation Factor} \\cdot \\big( \\text{Actual}(\\text{AocType = CF}) + \\text{Advance Actual}(\\text{AocType = CF})+ \\text{Overdue Actual}(\\text{AocType = CF}) \\big) ~,", + "\n$$", + "\nwhere amount type premium and its children are considered, novelties in-force and new business are considered for $PV$ whereas novelty combined is considered for Actual. The allocation is always done in the finest granularity (novelty, line of business, ..) possible." + ], + "metadata": {} + }, + { + "id": "pEi0POgs0UejZ_BJaXi_LQ", + "cell_type": "code", + "source": [ + "public interface BeExperienceAdjustmentForPremium : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s", + "\n .WithApplicability(x => x.Identity.AocType != AocTypes.CF));", + "\n", + "\n string EstimateType => EstimateTypes.BEPA;", + "\n string EconomicBasis => EconomicBases.L;", + "\n ", + "\n PvBase[] ByAmountType => GetStorage().GetPremiums().Select(pr => GetStorage().GetPremiumAllocationFactor(Identity) * GetScope((Identity, pr, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis))).ToArray(); ", + "\n}", + "\n", + "\npublic interface DefaultValueBeExperienceAdjustmentForPremium : BeExperienceAdjustmentForPremium", + "\n{", + "\n PvBase[] BeExperienceAdjustmentForPremium.ByAmountType => Enumerable.Empty().ToArray();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CA2eQXhYYUevjiAr92nN6Q", + "cell_type": "code", + "source": [ + "public interface ActualExperienceAdjustmentForPremium : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s", + "\n .WithApplicability(x => x.Identity.AocType != AocTypes.CF));", + "\n ", + "\n public ActualBase[] ByAmountTypeAndEstimateType => GetStorage().GetPremiums().SelectMany(pr => ", + "\n GetStorage().ExperienceAdjustEstimateTypeMapping.Keys", + "\n .Select(et => GetStorage().GetPremiumAllocationFactor(Identity) * ", + "\n GetScope((Identity, pr, et, (int?)null)))).ToArray(); ", + "\n}", + "\n", + "\npublic interface DefaultValueActualExperienceAdjustmentForPremium : ActualExperienceAdjustmentForPremium", + "\n{", + "\n ActualBase[] ActualExperienceAdjustmentForPremium.ByAmountTypeAndEstimateType => Enumerable.Empty().ToArray();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "czmwLF-VTkKtolr0jqiX8w", + "cell_type": "markdown", + "source": [ + "", + "\n## Technical Margin", + "\n", + "\nFor the computation of the $CSM$ or $LC$ component values for each step of the [AoC Step Structure](#aoc-step-structure), it is convenient to introduce the ", + "\nnotion of technical margin $TM$. In the case of BBA methodology, the Locked-in interest rates discounting is applied to obtain the PV and RA values.", + "\n", + "\nThis can be summarized as follows:", + "\n", + "\n$$", + "\nTM(s) = \\left\\{", + "\n\\begin{array}{rl}", + "\nTM(\\rm{EOP}) \\text{ of the previous period} ~ & \\text{if }s = \\text{BOP and Novelty is In-Force}.", + "\n\\\\", + "\n0 ~ & \\text{if }s = \\text{CF}.", + "\n\\\\", + "\nIAF \\cdot~\\text{Aggregated}~TM(\\text{IA}) ~ & \\text{if }s = \\text{IA and Novelty is In-Force}.", + "\n\\\\", + "\n\\rm{Premiums} + \\text{Attributable Expense and Commissions} + \\text{Investment Claims} ~ & \\text{if }s = \\text{EA}.", + "\n\\\\", + "\n-AF \\cdot~\\text{Aggregated}~TM(\\text{AM})~ & \\text{if }s = \\text{AM}.", + "\n\\\\", + "\n\\text{PV}(\\text{s})\\bigg|_{\\substack{\\text{Non Attributable} \\\\ \\text{Amount Types} \\\\ \\text{excluded}}} ", + "\n+ \\text{RA}(\\text{s})~ & \\text{otherwise} ", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere", + "\n", + "\n$$", + "\n\\text{Aggregated}~TM (\\text{AoC step}) = \\sum_{s\\in\\text{ previous AoC steps}} TM(s)~.", + "\n$$", + "\n", + "\nand the Interest Accretion Factor ($IAF$) is given by", + "\n", + "\n$$", + "\nIAF = \\prod_{i=1}^{TS} \\text{Interest}_i - 1", + "\n$$", + "\n", + "\nwhere $\\text{Interest}_i$ is the monthly interest factor obtained from the [Yield Curve](#yield-curves) and $TS$ is the Time-Step.", + "\n", + "\nFinally, the Premiums, Attributable Expense and Commissions and Investment Claims terms are given by:", + "\n", + "\n$$", + "\n\\rm{Premiums} = \\sum_{\\text{Amount Type}\\in\\{\\text{PR and its children}\\}}", + "\nEA(\\rm{PV}) - EA(\\text{Actual}) ~,", + "\n$$", + "\n", + "\n$$", + "\n\\text{Attributable Expense and Commissions} = \\sum_{\\text{Amount Type}\\in\\{\\rm{ACA}, \\rm{AEA}\\}}", + "\n\\big(PV_{\\text{Novelty = I}} + PV_{\\text{Novelty = N}} \\big) - \\text{Actual}_{\\text{Novelty=C}} ~,", + "\n$$", + "\n", + "\n$$", + "\n\\text{Investment Claims } = \\sum_{\\text{Amount Type}\\in\\{\\text{ICO and its children}\\}}", + "\n\\big(PV_{\\text{Novelty = I}} + PV_{\\text{Novelty = N}} \\big) - \\big( \\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}}+ \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~,", + "\n$$", + "\n", + "\nwhere the AoC Step **CF** is implicit for all formulas, $PV$ is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **AA**, and **OA** (see details [here](#actual-values))." + ], + "metadata": {} + }, + { + "id": "uWXzMWj2I0mfBjJ6P43ZFg", + "cell_type": "code", + "source": [ + "public interface TechnicalMargin : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) => ", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.ValuationApproach == ValuationApproaches.VFA, p => p.ForMember(s => s.EconomicBasis))", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.BOP && x.Identity.Novelty == Novelties.I)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.IA && x.Identity.Novelty == Novelties.I)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.EA && !x.Identity.IsReinsurance)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.AM)", + "\n );", + "\n ", + "\n [NotVisible] string EconomicBasis => EconomicBases.L;", + "\n ", + "\n double Value => GetScope(Identity.DataNode).BeAmountTypes", + "\n .Except(GetStorage().GetNonAttributableAmountType())", + "\n .Sum(at => GetScope((Identity, at, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) +", + "\n GetScope(Identity).Value;", + "\n ", + "\n double AggregatedValue => GetScope((Identity, InputSource.Cashflow)).Values", + "\n .Sum(aoc => GetScope(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);", + "\n}", + "\n", + "\npublic interface TechnicalMarginForCurrentBasis : TechnicalMargin", + "\n{", + "\n [NotVisible] string TechnicalMargin.EconomicBasis => EconomicBases.C;", + "\n}", + "\n", + "\npublic interface TechnicalMarginForBOP : TechnicalMargin", + "\n{", + "\n private double ValueCsm => GetStorage().GetValue(Identity, null, EstimateTypes.C, null);", + "\n private double ValueLc => GetStorage().GetValue(Identity, null, EstimateTypes.L, null);", + "\n private double ValueLr => GetStorage().GetValue(Identity, null, EstimateTypes.LR, null);", + "\n ", + "\n double TechnicalMargin.Value => -1d * ValueCsm + ValueLc + ValueLr;", + "\n}", + "\n", + "\npublic interface TechnicalMarginDefaultValue : TechnicalMargin", + "\n{", + "\n double TechnicalMargin.Value => default;", + "\n}", + "\n", + "\npublic interface TechnicalMarginForIA : TechnicalMargin", + "\n{", + "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.Id.ProjectionPeriod", + "\n private int shift => GetStorage().GetShift(0);//Identity.Id.ProjectionPeriod", + "\n ", + "\n private double[] monthlyInterestFactor => GetScope(Identity, o => o.WithContext(EconomicBasis)).Interest;", + "\n ", + "\n private double interestAccretionFactor => Enumerable.Range(shift,timeStep)", + "\n .Select(i => GetElementOrDefault(monthlyInterestFactor, i/12))", + "\n .Aggregate(1d, (x, y) => x * y ) - 1d;", + "\n ", + "\n double TechnicalMargin.Value => AggregatedValue * interestAccretionFactor;", + "\n}", + "\n", + "\npublic interface TechnicalMarginForEA : TechnicalMargin", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilderInner(ApplicabilityBuilder builder) => ", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.IsReinsurance));", + "\n ", + "\n private string referenceAocType => GetScope(Identity).Value.AocType;", + "\n ", + "\n private double premiums => GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", + "\n .Sum(n => GetScope(Identity with {AocType = referenceAocType, Novelty = n}).ByAmountType.Sum(sc => sc.Value)) -", + "\n GetScope(Identity with {AocType = referenceAocType, Novelty = Novelties.C}).ByAmountTypeAndEstimateType.Sum(sc => sc.Value);", + "\n ", + "\n private double attributableExpenseAndCommissions => GetStorage().GetAttributableExpenseAndCommissionAmountType().Sum(d =>", + "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", + "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, d, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", + "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, d, EstimateTypes.A, (int?)null)).Value);", + "\n", + "\n private double investmentClaims => GetStorage().GetInvestmentClaims().Sum(ic =>", + "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", + "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, ic, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", + "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.A, (int?)null)).Value - ", + "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.AA, (int?)null)).Value -", + "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.OA, (int?)null)).Value);", + "\n ", + "\n double TechnicalMargin.Value => premiums + attributableExpenseAndCommissions + investmentClaims;", + "\n}", + "\n", + "\npublic interface TechnicalMarginForAM : TechnicalMargin", + "\n{", + "\n double TechnicalMargin.Value => -1d * AggregatedValue * GetScope(Identity, o => o.WithContext(EconomicBasis)).Value;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "eV_qYONYOU-QbM_aQVg7vg", + "cell_type": "markdown", + "source": [ + "", + "\n## Switch Logic", + "\n ", + "\nThe $CSM$ and $LC$ components are computed from the [technical margin](#technical-margin). In particular, for a given AoC step $s$, TM is allocated to the $LC$ when $\\text{Aggregated } TM$ is positive whereas it is allocated to the $CSM$ when $\\text{Aggregated } TM$ is negative:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\nCSM({\\text{Aoc step}}) = 0,~~ LC({\\text{AoC step}}) = TM({\\text{AoC step}}) ~ & \\text{if }\\text{Aggregated }TM({\\text{AoC step}}) > 0.", + "\n\\\\", + "\nCSM({\\text{Aoc step}}) = - TM({\\text{AoC step}}),~~ LC({\\text{AoC step}}) = 0 ~ & \\text{otherwise} ", + "\n\\end{array}", + "\n$$", + "\n", + "\n", + "\nThe figures reported under CSM are the opposite of the TM value in order to satisfy our sign convention.", + "\n", + "\nIt is possible to switch from $CSM$ to $LC$ and from $LC$ to $CSM$ at any AoC step $s$ with the only exception of **Amortization** where there is no switch from the previous step.", + "\nWhen a switch occurs the total contribution to the $CSM$ ($LC$) prior the switching step is brought to 0 and the remaing amount is allocated to $LC$ ($CSM$).", + "\n", + "\n", + "\n### Gross case (i.e. no reinsurance)", + "\n", + "\nThe switch logic is applied ***separately*** to the In-Force and New Business novelties. The Combined Liability Aoc Step **CL** will bring both contributions to CSM and LC together as the novelities are summed up.", + "\n", + "\nIn detail, and as we go through the AoC steps in the AoC chain, we have", + "\n", + "\n**A)** For the **BOP**:", + "\n$$", + "\n\\begin{array}{rl}", + "\nCSM(\\text{BOP}) &= CSM(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", + "\n\\\\", + "\nLC(\\text{BOP}) &= LC(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", + "\n\\end{array}", + "\n$$", + "\n", + "\n", + "\n**B)** For the **following AoC steps**, the switch logic is preferably formulated using the delta variations between steps, $\\Delta CSM$ and $\\Delta LC$ for the CSM and the LC respectively.", + "\n", + "\nThe switch logic for these AoC steps with the *exception* of Combined Liability is:", + "\n", + "\nIf $\\text{Aggregated }TM(\\text{AoC Step}) > 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) \\le 0$, then there is a switch from $LC$ to $CSM$:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step}) -\\text{Aggregated } TM(\\text{AoC Step})", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= -\\text{Aggregated } TM(\\text{AoC Step}) ", + "\n\\end{array}", + "\n$$", + "\n", + "\nOn the other hand, if $\\text{Aggregated }TM(\\text{AoC Step}) \\le 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) > 0$, then the switch is from $CSM$ to $LC$:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= \\text{Aggregated } TM(\\text{AoC Step}) ", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= TM(\\text{AoC Step}) + \\text{Aggregated } TM(\\text{AoC Step}) ", + "\n\\end{array}", + "\n$$", + "\n", + "\nIf there is no switch from $CSM$, i.e. $\\text{Aggregated }TM(\\text{AoC Step}) \\le 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) \\le 0 $, then:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step})", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= 0", + "\n\\end{array}", + "\n$$", + "\n", + "\nAnd finally, if there is no switch from $LC$, i.e. $\\text{Aggregated }TM(\\text{AoC Step}) > 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) \\ge 0 $, then:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= 0", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= TM(\\text{AoC Step})", + "\n\\end{array}", + "\n$$", + "\n", + "\n**C)** For the AoC step Combined Liability **CL**, the switch logic is similar to the one above, except that a switch from $LC$ to $CSM$ can happen **because of New Business and despite of In-Force**, in which case we have:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step}) -\\big(\\text{Aggregated } TM(\\text{Last In-Force AoC step})+TM(\\text{Last In-Force AoC step}) \\big)", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= -\\big(\\text{Aggregated } TM(\\text{Last In-Force AoC step}) + TM(\\text{Last In-Force AoC step}) \\big)", + "\n\\end{array}", + "\n$$", + "\n", + "\nIf, on the other hand, the switch from $LC$ to $CSM$ happens **because of In-Force and despite of New Business**, then we have:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step}) -\\big(\\text{Aggregated } TM(\\text{Last NB AoC step})+TM(\\text{Last NB AoC step}) \\big)", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= -\\big(\\text{Aggregated } TM(\\text{Last NB AoC step}) + TM(\\text{Last NB AoC step}) \\big)", + "\n\\end{array}", + "\n$$", + "\n", + "\nFor the switch in the other direction, i.e. from $CSM$ to $LC$ the formulas are similar except that LC and CSM are swapped.", + "\n", + "\n**D)** Finally, for the last AoC step, the **EOP**, we have:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\nCSM(\\text{EOP}) &= \\sum_{s~\\in~\\text{previous AoC steps}}\\Delta CSM(s)", + "\n\\\\", + "\nLC(\\text{EOP}) &= \\sum_{s~\\in~\\text{previous AoC steps}}\\Delta LC(s)", + "\n\\end{array}", + "\n$$", + "\n", + "\n", + "\n### Reinsurance case", + "\n", + "\nFor the reinsurance case, the switch logic is identical to the one described above, except that it uses the gross Technical Margins multiplied by the weights coming from the Reinsurance Coverage Parameter (see [Data Node Parameters](../DataModel/DataStructure#data-node-parameters)). In case a GRIC has multiple GICs, then these weighted $TM$s are aggregated." + ], + "metadata": {} + }, + { + "id": "UnZAtItpLkaBp5iMJesSzw", + "cell_type": "code", + "source": [ + "public interface AllocateTechnicalMargin: IScope", + "\n{", + "\n //Switch", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) => ", + "\n builder.ForScope(s => s", + "\n .WithApplicability(x => x.Identity.IsReinsurance && x.Identity.AocType == AocTypes.CL) ", + "\n .WithApplicability(x => x.Identity.IsReinsurance, ", + "\n p => p.ForMember(s => s.ComputedEstimateType)", + "\n .ForMember(s => s.HasSwitch))", + "\n .WithApplicability(x => x.GetStorage().IsSecondaryScope(x.Identity.DataNode)) ", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.BOP)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.CL)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.EOP)", + "\n );", + "\n ", + "\n [NotVisible] double AggregatedTechnicalMargin => GetScope(Identity).AggregatedValue; ", + "\n [NotVisible] double TechnicalMargin => GetScope(Identity).Value;", + "\n ", + "\n [NotVisible] string ComputedEstimateType => ComputeEstimateType(GetScope(Identity).AggregatedValue + TechnicalMargin);", + "\n [NotVisible] bool HasSwitch => ComputedEstimateType != ComputeEstimateType(GetScope(Identity).AggregatedValue);", + "\n ", + "\n //Allocate ", + "\n [NotVisible] string EstimateType => GetContext();", + "\n ", + "\n double Value => (HasSwitch, EstimateType == ComputedEstimateType) switch {", + "\n (true, true) => TechnicalMargin + AggregatedTechnicalMargin,", + "\n (true, false) => -1d * AggregatedTechnicalMargin,", + "\n (false, true) => TechnicalMargin,", + "\n _ => default", + "\n };", + "\n ", + "\n string ComputeEstimateType(double aggregatedTechnicalMargin) => aggregatedTechnicalMargin > Precision ? EstimateTypes.L : EstimateTypes.C;", + "\n}", + "\n", + "\npublic interface ComputeAllocateTechnicalMarginWithIfrsVariable : AllocateTechnicalMargin", + "\n{ ", + "\n double AllocateTechnicalMargin.TechnicalMargin => ComputeTechnicalMarginFromIfrsVariables(Identity);", + "\n double AllocateTechnicalMargin.AggregatedTechnicalMargin => GetScope((Identity, InputSource.Cashflow)).Values", + "\n .Sum(aoc => ComputeTechnicalMarginFromIfrsVariables(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}));", + "\n ", + "\n private double ComputeTechnicalMarginFromIfrsVariables(ImportIdentity id)", + "\n {", + "\n return GetStorage().GetValue(Identity, null, EstimateTypes.LR, null) +", + "\n GetStorage().GetValue(Identity, null, EstimateTypes.L, null) - ", + "\n GetStorage().GetValue(Identity, null, EstimateTypes.C, null);", + "\n }", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForReinsurance : AllocateTechnicalMargin", + "\n{ ", + "\n //TODO add Reinsurance Coverage Update (RCU, Novelty=I) AocStep", + "\n private IEnumerable underlyingGic => GetStorage().GetUnderlyingGic(Identity);", + "\n ", + "\n private double weightedUnderlyingTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", + "\n GetScope(Identity with {DataNode = gic}).TechnicalMargin);", + "\n ", + "\n private double weightedUnderlyingAggregatedTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", + "\n GetScope(Identity with {DataNode = gic}).AggregatedTechnicalMargin);", + "\n ", + "\n private string ComputeReinsuranceEstimateType(double aggregatedFcf) => aggregatedFcf > Precision ? EstimateTypes.LR : EstimateTypes.C;", + "\n ", + "\n [NotVisible] string AllocateTechnicalMargin.ComputedEstimateType => ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM + weightedUnderlyingTM);", + "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => ComputedEstimateType != ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM); ", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForReinsuranceCL : AllocateTechnicalMargin", + "\n{ ", + "\n //In common1", + "\n private IEnumerable underlyingGic => GetStorage().GetUnderlyingGic(Identity);", + "\n ", + "\n private double weightedUnderlyingTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", + "\n GetScope(Identity with {DataNode = gic}).TechnicalMargin);", + "\n ", + "\n private double weightedUnderlyingAggregatedTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", + "\n GetScope(Identity with {DataNode = gic}).AggregatedTechnicalMargin);", + "\n private string ComputeReinsuranceEstimateType(double aggregatedFcf) => aggregatedFcf > Precision ? EstimateTypes.LR : EstimateTypes.C;", + "\n ", + "\n string AllocateTechnicalMargin.ComputedEstimateType => ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM + weightedUnderlyingTM);", + "\n //In common2", + "\n private double balancingValue => GetScope((Identity, InputSource.Cashflow))", + "\n .Values", + "\n .GroupBy(x => x.Novelty)", + "\n .Select(g => g.Last())", + "\n .Sum(aoc => { ", + "\n var id = Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty};", + "\n return GetScope(id).ComputedEstimateType != ComputedEstimateType ? ", + "\n GetScope(id).TechnicalMargin + GetScope(id).AggregatedTechnicalMargin", + "\n : (double)default; });", + "\n ", + "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => Math.Abs(balancingValue) > Precision;", + "\n [NotVisible] double AllocateTechnicalMargin.AggregatedTechnicalMargin => balancingValue; ", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForCl : AllocateTechnicalMargin", + "\n{", + "\n private double balancingValue => GetScope((Identity, InputSource.Cashflow))", + "\n .Values", + "\n .GroupBy(x => x.Novelty)", + "\n .Select(g => g.Last())", + "\n .Sum(aoc => { ", + "\n var id = Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty};", + "\n return GetScope(id).ComputedEstimateType != ComputedEstimateType ? ", + "\n GetScope(id).TechnicalMargin + GetScope(id).AggregatedTechnicalMargin", + "\n : (double)default; });", + "\n", + "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => Math.Abs(balancingValue) > Precision;", + "\n ", + "\n [NotVisible] double AllocateTechnicalMargin.AggregatedTechnicalMargin => balancingValue;", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForBop : AllocateTechnicalMargin", + "\n{ ", + "\n bool AllocateTechnicalMargin.HasSwitch => false;", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForEop : AllocateTechnicalMargin", + "\n{", + "\n double AllocateTechnicalMargin.Value => GetScope((Identity, InputSource.Cashflow)).Values", + "\n .Sum(aoc => GetScope(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);", + "\n [NotVisible] string AllocateTechnicalMargin.ComputedEstimateType => ComputeEstimateType(AggregatedTechnicalMargin);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vY4oXJJJ8ke97-m8ASMsAw", + "cell_type": "markdown", + "source": [ + "For the **Group of Reinsurance Contracts** (GRICs), the switch is computed within the underlying GIC context and $CSM$ and $LR$ are then computed in the same manner as for the underlying GICs CSM and LC." + ], + "metadata": {} + }, + { + "id": "DqGSuXbt6USNumZ69sErWg", + "cell_type": "markdown", + "source": [ + "The scopes below are simply used to set the appropriate Estimate Type (C for $CSM$, L for $LC$ and LR for $LCR$), as well as to set $CSM$ values to be positive:" + ], + "metadata": {} + }, + { + "id": "n2dT4_znvk2eUSMMef6OIg", + "cell_type": "code", + "source": [ + "public interface Csm : IScope", + "\n{", + "\n [NotVisible]string EstimateType => EstimateTypes.C;", + "\n ", + "\n double Value => -1d * GetScope(Identity, o => o.WithContext(EstimateType)).Value;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1fUoYZjlOki4f5GCvCmpoA", + "cell_type": "code", + "source": [ + "public interface Lc : IScope", + "\n{", + "\n [NotVisible]string EstimateType => EstimateTypes.L;", + "\n ", + "\n double Value => GetScope(Identity, o => o.WithContext(EstimateType)).Value;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TmqOsKRObkaw3PKUdp_lDw", + "cell_type": "code", + "source": [ + "public interface LoReCo : IScope", + "\n{ ", + "\n [NotVisible]string EstimateType => EstimateTypes.LR;", + "\n ", + "\n double Value => GetScope(Identity, o => o.WithContext(EstimateType)).Value;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_ejvWQaq-kSPyTqB4Y2n9Q", + "cell_type": "markdown", + "source": [ + "## Computing All Scopes", + "\n", + "\nSince all the calculations defined in the various scopes are to be performed together, it is useful to introduce the scope ComputeAllScopes below, which given a certain Import Identity and Import Storage, performs all the calculations (defined above) based on the corresponding data:" + ], + "metadata": {} + }, + { + "id": "68_d30x6ZUGoP_UjvJ9SBg", + "cell_type": "code", + "source": [ + "public interface ComputeAllScopes: IScope //ComputeIfrsVariable", + "\n{", + "\n IEnumerable PvLocked => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n EstimateType = x.Identity.CalculationType, ", + "\n DataNode = x.Identity.Id.DataNode, ", + "\n AocType = x.Identity.Id.AocType, ", + "\n Novelty = x.Identity.Id.Novelty, ", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable PvCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n EstimateType = x.Identity.CalculationType, ", + "\n DataNode = x.Identity.Id.DataNode, ", + "\n AocType = x.Identity.Id.AocType, ", + "\n Novelty = x.Identity.Id.Novelty, ", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable RaCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n EstimateType = x.Identity.CalculationType, ", + "\n DataNode = x.Identity.Id.DataNode, ", + "\n AocType = x.Identity.Id.AocType, ", + "\n Novelty = x.Identity.Id.Novelty, ", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = null,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable RaLocked => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n EstimateType = x.Identity.CalculationType, ", + "\n DataNode = x.Identity.Id.DataNode, ", + "\n AocType = x.Identity.Id.AocType, ", + "\n Novelty = x.Identity.Id.Novelty, ", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = null,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n private string EconomicBasis => Identity.ValuationApproach == ValuationApproaches.VFA ? EconomicBases.C : EconomicBases.L;", + "\n private IEnumerable amortizationFactor => Identity.AocType == AocTypes.AM", + "\n ? GetScope(Identity, o => o.WithContext(EconomicBasis))", + "\n .RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n EconomicBasis = x.EconomicBasis,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n })", + "\n : Enumerable.Empty();", + "\n IEnumerable Actual => GetScope(Identity).Actuals.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.Identity.EstimateType,", + "\n DataNode = x.Identity.Id.DataNode,", + "\n AocType = x.Identity.Id.AocType,", + "\n Novelty = x.Identity.Id.Novelty,", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable AdvanceActual => GetScope(Identity).Actuals.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.Identity.EstimateType,", + "\n DataNode = x.Identity.Id.DataNode,", + "\n AocType = x.Identity.Id.AocType,", + "\n Novelty = x.Identity.Id.Novelty,", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable OverdueActual => GetScope(Identity).Actuals.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.Identity.EstimateType,", + "\n DataNode = x.Identity.Id.DataNode,", + "\n AocType = x.Identity.Id.AocType,", + "\n Novelty = x.Identity.Id.Novelty,", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable DeferrableActual => GetScope(Identity).RepeatOnce().Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n AccidentYear = null,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n ", + "\n IEnumerable BeEAForPremium => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", + "\n || Identity.IsReinsurance", + "\n ? Enumerable.Empty()", + "\n : GetScope(Identity)", + "\n .ByAmountType", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(sc => new IfrsVariable{ EstimateType = GetScope(Identity).EstimateType, ", + "\n DataNode = sc.Identity.Id.DataNode, ", + "\n AocType = sc.Identity.Id.AocType, ", + "\n Novelty = sc.Identity.Id.Novelty, ", + "\n AccidentYear = sc.Identity.AccidentYear,", + "\n EconomicBasis = sc.EconomicBasis,", + "\n AmountType = sc.Identity.AmountType,", + "\n Value = sc.Value,", + "\n Partition = sc.GetStorage().TargetPartition });", + "\n ", + "\n IEnumerable ActEAForPremium => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", + "\n || Identity.IsReinsurance", + "\n ? Enumerable.Empty()", + "\n : GetScope(Identity)", + "\n .ByAmountTypeAndEstimateType", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(sc => new IfrsVariable{ EstimateType = GetStorage().ExperienceAdjustEstimateTypeMapping[sc.Identity.EstimateType], ", + "\n DataNode = sc.Identity.Id.DataNode, ", + "\n AocType = sc.Identity.Id.AocType, ", + "\n Novelty = sc.Identity.Id.Novelty, ", + "\n AccidentYear = sc.Identity.AccidentYear,", + "\n //EconomicBasis = scope.EconomicBasis,", + "\n AmountType = sc.Identity.AmountType,", + "\n Value = sc.Value,", + "\n Partition = GetStorage().TargetPartition });", + "\n ", + "\n IEnumerable Csms => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", + "\n ? Enumerable.Empty()", + "\n : GetScope(Identity).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n", + "\n IEnumerable Loss => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", + "\n ? Enumerable.Empty()", + "\n : Identity.IsReinsurance ", + "\n ? GetScope(Identity).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n })", + "\n : GetScope(Identity).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n", + "\n /*private double validateSingleEoP => Math.Abs(ValueCsm) > Precision && Math.Abs(ValueLc) > Precision ", + "\n ? (double)ApplicationMessage.Log(Error.MultipleEoP)", + "\n : default;", + "\n */", + "\n IEnumerable CalculatedIfrsVariables => GetStorage().ImportFormat switch {", + "\n ImportFormats.Actual => Actual.Concat(AdvanceActual).Concat(OverdueActual).Concat(ActEAForPremium)", + "\n .Concat(DeferrableActual).Concat(Csms).Concat(Loss),", + "\n ImportFormats.Cashflow => PvLocked.Concat(PvCurrent).Concat(RaCurrent).Concat(RaLocked)", + "\n .Concat(amortizationFactor).Concat(BeEAForPremium)", + "\n .Concat(DeferrableActual).Concat(Csms).Concat(Loss),", + "\n ImportFormats.Opening => AdvanceActual.Concat(OverdueActual).Concat(DeferrableActual)", + "\n .Concat(Csms).Concat(Loss),", + "\n };", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "I56SQek6SkukwZ49PojX-g", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Import/ImportStorage.ipynb b/Import/ImportStorage.ipynb new file mode 100644 index 00000000..c1d8ede4 --- /dev/null +++ b/Import/ImportStorage.ipynb @@ -0,0 +1,387 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "zXp-Bu79BE-93BUbDiTYAg", + "cell_type": "markdown", + "source": [ + "", + "\n

Import Storage

", + "\n", + "\nThe Import Storage collects the following data upon import of a file:", + "\n", + "\n- Current Period (year, month)", + "\n- Previous Period", + "\n- [Partitions](../DataModel/DataStructure)", + "\n- [RawVariables](../DataModel/DataStructure)", + "\n- [IfrsVariables](../DataModel/DataStructure)", + "\n- [Projection Configuration](../DataModel/DataStructure)", + "\n- [YieldCurve](../DataModel/DataStructure)", + "\n- [AocType](../DataModel/DataStructure)", + "\n- [AmountType](../DataModel/DataStructure)", + "\n- [CalculationType](../DataModel/DataStructure)", + "\n- [DataNodes](../DataModel/DataStructure)", + "\n", + "\nSuch storage is then passed to calculations defined in the corresponding [Import Scopes](./ImportScopeCalculation)." + ], + "metadata": {} + }, + { + "id": "BBcl8VllBE2yH3necdNVxQ", + "cell_type": "code", + "source": [ + "#!import \"../Utils/UtilityMethods\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "aIs6_wKUtEKp2vLJAPpVpQ", + "cell_type": "markdown", + "source": [ + "# Import Storage" + ], + "metadata": {} + }, + { + "id": "kigCPC7MoEy40WWR1LAtFA", + "cell_type": "code", + "source": [ + "public class ImportStorage", + "\n{ ", + "\n private readonly IDataSource querySource; ", + "\n private readonly IWorkspace workspace;", + "\n private readonly Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache;", + "\n private readonly ImportArgs args;", + "\n ", + "\n // Constants", + "\n private static int periodicityInMonths => 3; // Revisit", + "\n ", + "\n //Format", + "\n public string ImportFormat => args.ImportFormat; ", + "\n ", + "\n //Time Periods ", + "\n public (int Year, int Month) CurrentReportingPeriod => (args.Year, args.Month);", + "\n public (int Year, int Month) PreviousReportingPeriod => (args.Year - 1, MonthInAYear); // YTD Logic", + "\n", + "\n //Partitions", + "\n public Guid PartitionByRn;", + "\n public Guid TargetPartition;", + "\n public Guid DefaultPartition;", + "\n public Guid PreviousPeriodPartition; ", + "\n", + "\n //Projections", + "\n private ProjectionConfiguration[] ProjectionConfiguration;", + "\n ", + "\n //DataNodes", + "\n public IDictionary DataNodeDataBySystemName { get; private set; }", + "\n public IDictionary> DataNodesByImportScope { get; private set; }", + "\n public IDictionary> AccidentYearsByDataNode { get; private set; }", + "\n //Variables", + "\n public IDictionary> RawVariablesByImportIdentity { get; private set; }", + "\n public IDictionary> IfrsVariablesByImportIdentity { get; private set; }", + "\n ", + "\n //Parameters", + "\n public Dictionary LockedInYieldCurve { get; private set; }", + "\n public Dictionary> CurrentYieldCurve { get; private set; }", + "\n public Dictionary> PartnerRating { get; private set; }", + "\n public Dictionary> CreditDefaultRates { get; private set; }", + "\n public Dictionary> SingleDataNodeParametersByGoc { get; private set; }", + "\n public Dictionary>> InterDataNodeParametersByGoc { get; private set; }", + "\n public Dictionary AocConfigurationByAocStep { get; private set; }", + "\n ", + "\n private Dictionary> aocStepByInputSource;", + "\n ", + "\n //Dimensions", + "\n public Dictionary AmountTypeDimension { get; private set; }", + "\n public Dictionary NoveltyDimension { get; private set; }", + "\n public Dictionary CalculationTypeDimension { get; private set; }", + "\n public Dictionary EstimateTypeDimension { get; private set; }", + "\n public Dictionary> EstimateTypesByImportFormat { get; private set; }", + "\n public Dictionary ExperienceAdjustEstimateTypeMapping { get; private set; } ", + "\n ", + "\n //Constructor", + "\n public ImportStorage(ImportArgs args, IDataSource querySource, IWorkspace workspace)", + "\n {", + "\n this.querySource = querySource;", + "\n this.workspace = workspace;", + "\n hierarchyCache = workspace.ToHierarchicalDimensionCache();", + "\n this.args = args;", + "\n }", + "\n ", + "\n //Initialize", + "\n public async Task InitializeAsync()", + "\n { ", + "\n //Dimensions", + "\n var estimateTypes = (await workspace.Query().ToArrayAsync());", + "\n ", + "\n EstimateTypeDimension = estimateTypes.ToDictionary(x => x.SystemName);", + "\n AmountTypeDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n NoveltyDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n CalculationTypeDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n ", + "\n ExperienceAdjustEstimateTypeMapping = new Dictionary{{EstimateTypes.A, EstimateTypes.APA}, {EstimateTypes.AA, EstimateTypes.AAPA}, {EstimateTypes.OA, EstimateTypes.OAPA}}; //TODO move this logic", + "\n ", + "\n //Hierarchy Cache", + "\n hierarchyCache.Initialize();", + "\n ", + "\n //EstimateType to load and to update", + "\n EstimateTypesByImportFormat = new InputSource[] { InputSource.Opening, InputSource.Actual, InputSource.Cashflow,}", + "\n .ToDictionary(x => x.ToString(), ", + "\n x => estimateTypes", + "\n .Where(et => et.InputSource.Contains(x))", + "\n .Select(et => et.SystemName)", + "\n .ToHashSet());", + "\n ", + "\n //ProjectionConfiguration : Current Period + projection for every Quarter End for current Year and next Years as in projectionConfiguration.csv", + "\n ProjectionConfiguration = (await workspace.Query()", + "\n .Where(x => x.Shift > 0 || x.TimeStep == args.Month || (x.TimeStep > args.Month && x.TimeStep % periodicityInMonths == 0))", + "\n .OrderBy(x => x.Shift).ThenBy(x => x.TimeStep).ToArrayAsync());", + "\n ", + "\n //Get Partitions", + "\n PartitionByRn = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode).ToArrayAsync()).Single().Id;", + "\n TargetPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", + "\n p.Year == CurrentReportingPeriod.Year &&", + "\n p.Month == CurrentReportingPeriod.Month &&", + "\n p.Scenario == args.Scenario).ToArrayAsync()).Single().Id;", + "\n DefaultPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", + "\n p.Year == CurrentReportingPeriod.Year &&", + "\n p.Month == CurrentReportingPeriod.Month &&", + "\n p.Scenario == null).ToArrayAsync()).Single().Id;", + "\n //Set Partitions", + "\n await querySource.Partition.SetAsync(PartitionByRn);", + "\n await workspace.Partition.SetAsync(PartitionByRn);", + "\n ", + "\n await querySource.Partition.SetAsync(TargetPartition);", + "\n await workspace.Partition.SetAsync(TargetPartition);", + "\n ", + "\n //Get data from Workspace (result of parsing)", + "\n var parsedRawVariables = await workspace.Query().ToArrayAsync();", + "\n var parsedIfrsVariables = await workspace.Query().ToArrayAsync();", + "\n ", + "\n //DataNodes", + "\n DataNodeDataBySystemName = await workspace.LoadDataNodesAsync(args);", + "\n ", + "\n //Accident Years", + "\n AccidentYearsByDataNode = (IDictionary>)", + "\n (ImportFormat == ImportFormats.Cashflow ? parsedRawVariables.Select(x => new {x.DataNode, x.AccidentYear}) : parsedIfrsVariables.Select(x => new {x.DataNode, x.AccidentYear}))", + "\n .ToDictionaryGrouped(x => x.DataNode, x => (ICollection)x.Select(y => y.AccidentYear).ToHashSet());", + "\n ", + "\n // Import Scopes and Data Node relationship parameters", + "\n InterDataNodeParametersByGoc = await workspace.LoadInterDataNodeParametersAsync(args);", + "\n ", + "\n var primaryScopeFromParsedVariables = (ImportFormat == ImportFormats.Cashflow ? parsedRawVariables.Select(x => x.DataNode) : parsedIfrsVariables.Select(x => x.DataNode)).ToHashSet();", + "\n var primaryScopeFromLinkedReinsurance = primaryScopeFromParsedVariables", + "\n .Where(goc => !DataNodeDataBySystemName[goc].IsReinsurance && DataNodeDataBySystemName[goc].LiabilityType == LiabilityTypes.LRC)", + "\n .SelectMany(goc => InterDataNodeParametersByGoc.TryGetValue(goc, out var interDataNodeParamByPeriod)", + "\n ? interDataNodeParamByPeriod[CurrentPeriod].Select(param => param.DataNode == goc ? param.LinkedDataNode : param.DataNode).Where(goc => !primaryScopeFromParsedVariables.Contains(goc))", + "\n : Enumerable.Empty())", + "\n .ToHashSet();", + "\n ", + "\n var primaryScope = primaryScopeFromParsedVariables.Concat(primaryScopeFromLinkedReinsurance).ToHashSet();", + "\n var secondaryScope = InterDataNodeParametersByGoc", + "\n .Where(kvp => primaryScope.Contains(kvp.Key))", + "\n .SelectMany(kvp => { var linkedGocs = kvp.Value[CurrentPeriod].Select(param => param.DataNode == kvp.Key ? param.LinkedDataNode : param.DataNode);", + "\n return linkedGocs.Where(goc => !primaryScope.Contains(goc));}).ToHashSet();", + "\n var allImportScopes = new HashSet(primaryScope.Concat(secondaryScope));", + "\n ", + "\n DataNodesByImportScope = new Dictionary> { { ImportScope.Primary, primaryScope }, { ImportScope.Secondary, secondaryScope } };", + "\n ", + "\n // Parameters", + "\n PartnerRating = await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Partner);", + "\n CreditDefaultRates = await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.CreditRiskRating);", + "\n SingleDataNodeParametersByGoc = await workspace.LoadSingleDataNodeParametersAsync(args);", + "\n LockedInYieldCurve = await workspace.LoadLockedInYieldCurveAsync(args, allImportScopes.Select(dn => DataNodeDataBySystemName[dn]));", + "\n CurrentYieldCurve = await workspace.LoadCurrentYieldCurveAsync(args, allImportScopes.Select(dn => DataNodeDataBySystemName[dn])); //TODO Rename this variable", + "\n ", + "\n AocConfigurationByAocStep = await querySource.LoadAocStepConfigurationAsDictionaryAsync(args.Year, args.Month); ", + "\n aocStepByInputSource = ((InputSource[])Enum.GetValues(typeof(InputSource))).ToDictionary(x => x,", + "\n x => AocConfigurationByAocStep", + "\n .Where(kvp => kvp.Value.InputSource.Contains(x))", + "\n .Select(kvp => kvp.Key)", + "\n .ToHashSet());", + "\n ", + "\n //Previous Period", + "\n var openingRawVariables = Enumerable.Empty();", + "\n var openingIfrsVariables = Enumerable.Empty();", + "\n", + "\n if(allImportScopes.Select(dn => DataNodeDataBySystemName[dn]).Any(dnd => dnd.Year < args.Year)) {", + "\n PreviousPeriodPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", + "\n p.Year == PreviousReportingPeriod.Year &&", + "\n p.Month == PreviousReportingPeriod.Month &&", + "\n p.Scenario == null).ToArrayAsync()).Single().Id;", + "\n ", + "\n await querySource.Partition.SetAsync(PreviousPeriodPartition);", + "\n ", + "\n //Perform queries to previous Period", + "\n openingRawVariables = (await querySource.Query()", + "\n .Where(rv => rv.Partition == PreviousPeriodPartition && rv.AocType == AocTypes.CL)", + "\n .Where(v => primaryScope.Contains(v.DataNode))", + "\n .ToArrayAsync())", + "\n .Select(rv => rv with {AocType = AocTypes.BOP, Novelty = Novelties.I, Values = rv.Values.Skip(MonthInAYear).ToArray(), Partition = TargetPartition});", + "\n ", + "\n openingIfrsVariables = (await querySource.Query()", + "\n .Where(iv => iv.Partition == PreviousPeriodPartition && iv.AocType == AocTypes.EOP)", + "\n .Where(v => allImportScopes.Contains(v.DataNode))", + "\n .ToArrayAsync())", + "\n .Select(iv => iv with {AocType = AocTypes.BOP, Novelty = Novelties.I, Partition = TargetPartition});", + "\n ", + "\n // TODO: print error if ", + "\n //openingRawVariables.Select(x => x.DataNode).ToHashSet() != dataNodesWithPreviousPeriod", + "\n }", + "\n ", + "\n //SetPartition to current Period", + "\n await querySource.Partition.SetAsync(TargetPartition);", + "\n ", + "\n if(primaryScope.Select(dn => DataNodeDataBySystemName[dn]).Any(dnd => dnd.Year == args.Year))", + "\n openingIfrsVariables = openingIfrsVariables.Concat(await querySource.Query()", + "\n .Where(iv => iv.Partition == TargetPartition && iv.AocType == AocTypes.BOP && iv.Novelty == Novelties.I)", + "\n .Where(iv => primaryScope.Contains(iv.DataNode) && EstimateTypesByImportFormat[InputSource.Opening.ToString()].Contains(iv.EstimateType) || secondaryScope.Contains(iv.DataNode))", + "\n .ToArrayAsync());", + "\n ", + "\n //Variables", + "\n var rawVariables = parsedRawVariables.Concat(openingRawVariables)", + "\n .Concat(await querySource.Query()", + "\n .Where(rv => rv.Partition == TargetPartition)", + "\n .Where(rv => primaryScopeFromLinkedReinsurance.Contains(rv.DataNode))", + "\n .ToArrayAsync());", + "\n RawVariablesByImportIdentity = (IDictionary>)rawVariables.ToDictionaryGrouped(v => v.DataNode, v => (ICollection)v.ToArray());", + "\n ", + "\n var ifrsVariables = parsedIfrsVariables.Concat(openingIfrsVariables)", + "\n .Concat(await querySource.Query()", + "\n .Where(iv => iv.Partition == TargetPartition && !(iv.AocType == AocTypes.BOP && iv.Novelty == Novelties.I))", + "\n .Where(iv => primaryScopeFromParsedVariables.Contains(iv.DataNode) && !EstimateTypesByImportFormat[ImportFormat].Contains(iv.EstimateType) ", + "\n || primaryScopeFromLinkedReinsurance.Contains(iv.DataNode) ", + "\n || secondaryScope.Contains(iv.DataNode))", + "\n .ToArrayAsync());", + "\n IfrsVariablesByImportIdentity = (IDictionary>)ifrsVariables.ToDictionaryGrouped(v => v.DataNode, v => (ICollection)v.ToArray());", + "\n }", + "\n ", + "\n //Getters", + "\n ", + "\n //Periods", + "\n public ValuationPeriod GetValuationPeriod(ImportIdentity id) => AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].ValuationPeriod;", + "\n public PeriodType GetYieldCurvePeriod(ImportIdentity id) => AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].YcPeriod;", + "\n public PeriodType GetCreditDefaultRiskPeriod(ImportIdentity id) => AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].CdrPeriod;", + "\n ", + "\n public IEnumerable GetAllAocSteps(InputSource source) => aocStepByInputSource[source];", + "\n public IEnumerable GetCalculatedTelescopicAocSteps() => AocConfigurationByAocStep.Where(kvp => kvp.Value.DataType == DataType.CalculatedTelescopic).Select(kvp => kvp.Key);", + "\n ", + "\n //YieldCurve", + "\n public double[] GetYearlyYieldCurve(ImportIdentity id, string economicBasis) {", + "\n var yc = GetYieldCurve(id, economicBasis);", + "\n return yc.Values.Skip(args.Year - yc.Year).ToArray(); //Check if the returned array is empty? Log Warning?", + "\n }", + "\n ", + "\n public YieldCurve GetYieldCurve(ImportIdentity id, string economicBasis) => (economicBasis, GetYieldCurvePeriod(id)) switch {", + "\n (EconomicBases.C, PeriodType.BeginningOfPeriod) => CurrentYieldCurve[DataNodeDataBySystemName[id.DataNode].ContractualCurrency][PreviousPeriod],", + "\n (EconomicBases.C, PeriodType.EndOfPeriod) => CurrentYieldCurve[DataNodeDataBySystemName[id.DataNode].ContractualCurrency][CurrentPeriod],", + "\n (EconomicBases.L, _ ) => LockedInYieldCurve[id.DataNode],", + "\n (_, PeriodType.NotApplicable) => (YieldCurve)ApplicationMessage.Log(Error.YieldCurvePeriodNotApplicable, id.AocType, id.Novelty),", + "\n (_, _) => (YieldCurve)ApplicationMessage.Log(Error.EconomicBasisNotFound, id.DataNode)", + "\n };", + "\n ", + "\n //int Identity.ProjectionPeriod ", + "\n public int GetProjectionCount() => ProjectionConfiguration.Count();", + "\n public int GetShift(int projectionPeriod) => ProjectionConfiguration[projectionPeriod].Shift;", + "\n public int GetTimeStep(int projectionPeriod) => ProjectionConfiguration[projectionPeriod].TimeStep;", + "\n ", + "\n public PeriodType GetPeriodType(string amountType, string calculationType) => ", + "\n amountType != null && AmountTypeDimension.TryGetValue(amountType, out var at) ", + "\n ? at.PeriodType", + "\n : calculationType != null && CalculationTypeDimension.TryGetValue(calculationType, out var ct) ", + "\n ? ct.PeriodType : PeriodType.EndOfPeriod;", + "\n", + "\n //Variables and Cashflows", + "\n public IEnumerable GetRawVariables(string dataNode) => RawVariablesByImportIdentity.TryGetValue(dataNode, out var variableCollection) ? variableCollection : Enumerable.Empty();", + "\n public IEnumerable GetIfrsVariables(string dataNode) => IfrsVariablesByImportIdentity.TryGetValue(dataNode, out var variableCollection) ? variableCollection : Enumerable.Empty();", + "\n ", + "\n public double[] GetValues(ImportIdentity id, Func whereClause) => GetRawVariables(id.DataNode).Where(v => (v.AocType, v.Novelty) == id.AocStep && whereClause(v)).Aggregate()?.Values ?? Enumerable.Empty().ToArray();", + "\n public double GetValue(ImportIdentity id, Func whereClause) => GetIfrsVariables(id.DataNode).Where(v => (v.AocType, v.Novelty) == id.AocStep && whereClause(v)).Aggregate()?.Value ?? 0;", + "\n ", + "\n public double[] GetValues(ImportIdentity id, string amountType, string calculationType, int? accidentYear) => GetValues(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.CalculationType == calculationType);", + "\n public double GetValue(ImportIdentity id, string amountType, string estimateType, int? accidentYear) => GetValue(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.EstimateType == estimateType);", + "\n public double GetValue(ImportIdentity id, string amountType, string estimateType, string economicBasis, int? accidentYear) => GetValue(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.EstimateType == estimateType && v.EconomicBasis == economicBasis);", + "\n ", + "\n //Novelty", + "\n private IEnumerable GetNoveltiesForAocType(string aocType, IEnumerable aocConfiguration) => aocConfiguration.Where(aocStep => aocStep.AocType == aocType).Select(aocStep => aocStep.Novelty);", + "\n public IEnumerable GetNovelties() => NoveltyDimension.Keys;", + "\n public IEnumerable GetNovelties(string aocType) => GetNoveltiesForAocType(aocType, AocConfigurationByAocStep.Keys);", + "\n public IEnumerable GetNovelties(string aocType, InputSource inputSource) => GetNoveltiesForAocType(aocType, aocStepByInputSource[inputSource]);", + "\n ", + "\n //Accident years", + "\n public IEnumerable GetAccidentYears(string dataNode) => AccidentYearsByDataNode.TryGetValue(dataNode, out var accidentYear) ? accidentYear : new int?[] { null };", + "\n ", + "\n // Parameters", + "\n public double GetNonPerformanceRiskRate (ImportIdentity identity) {", + "\n var period = GetCreditDefaultRiskPeriod(identity) == PeriodType.BeginningOfPeriod ? PreviousPeriod : CurrentPeriod;", + "\n ", + "\n if(!DataNodeDataBySystemName.TryGetValue(identity.DataNode, out var dataNodeData)) ApplicationMessage.Log(Error.DataNodeNotFound, identity.DataNode);", + "\n if(dataNodeData.Partner == null) ApplicationMessage.Log(Error.PartnerNotFound, identity.DataNode);", + "\n // if Partner == Internal then return 0;", + "\n if(!PartnerRating.TryGetValue(dataNodeData.Partner, out var rating)) ApplicationMessage.Log(Error.RatingNotFound, dataNodeData.Partner);", + "\n if(!CreditDefaultRates.TryGetValue(rating[period].CreditRiskRating, out var rate)) ApplicationMessage.Log(Error.CreditDefaultRateNotFound, rating[period].CreditRiskRating);", + "\n return rate[period].Values[0];", + "\n }", + "\n ", + "\n public double GetPremiumAllocationFactor(ImportIdentity id) => SingleDataNodeParametersByGoc.TryGetValue(id.DataNode, out var singleDataNodeParameter) ", + "\n ? singleDataNodeParameter[CurrentPeriod].PremiumAllocation : DefaultPremiumExperienceAdjustmentFactor;", + "\n ", + "\n // Data Node relationships", + "\n public IEnumerable GetUnderlyingGic(ImportIdentity id) => !InterDataNodeParametersByGoc.TryGetValue(id.DataNode, out var interDataNodeParameters)", + "\n ? Enumerable.Empty()", + "\n : interDataNodeParameters[CurrentPeriod].Select(x => x.DataNode != id.DataNode ? x.DataNode : x.LinkedDataNode).Where(goc => !DataNodeDataBySystemName[goc].IsReinsurance);", + "\n ", + "\n public double GetReinsuranceCoverage (ImportIdentity id, string gic) ", + "\n {", + "\n var targetPeriod = AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].RcPeriod == PeriodType.EndOfPeriod ? CurrentPeriod : PreviousPeriod;", + "\n return InterDataNodeParametersByGoc.TryGetValue(id.DataNode, out var interDataNodeParameters)", + "\n ? interDataNodeParameters[targetPeriod].FirstOrDefault(x => x.DataNode == gic || x.LinkedDataNode == gic).ReinsuranceCoverage", + "\n : (double)ApplicationMessage.Log(Error.ReinsuranceCoverage, id.DataNode);", + "\n }", + "\n ", + "\n // Import Scope", + "\n public bool IsPrimaryScope (string dataNode) => DataNodesByImportScope[ImportScope.Primary].Contains(dataNode);", + "\n public bool IsSecondaryScope (string dataNode) => DataNodesByImportScope[ImportScope.Secondary].Contains(dataNode);", + "\n ", + "\n // Other", + "\n public IEnumerable GetNonAttributableAmountType() => new string[]{AmountTypes.NE};", + "\n public IEnumerable GetAttributableExpenseAndCommissionAmountType() => new string[] {AmountTypes.ACA, AmountTypes.AEA}; //U+ specific", + "\n public IEnumerable GetInvestmentClaims() => hierarchyCache.Get(AmountTypes.ICO).Descendants(includeSelf : true).Select(x => x.SystemName);", + "\n public IEnumerable GetPremiums() => hierarchyCache.Get(AmountTypes.PR).Descendants(includeSelf : true).Select(x => x.SystemName);", + "\n public IEnumerable GetClaims() => hierarchyCache.Get(AmountTypes.CL).Descendants().Select(x => x.SystemName);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "AZV9Uq344ESUtVbb13Y6UA", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Import/Importers.ipynb b/Import/Importers.ipynb new file mode 100644 index 00000000..843a7409 --- /dev/null +++ b/Import/Importers.ipynb @@ -0,0 +1,1199 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "atie2kRp5EK_Lok_1cKKnA", + "cell_type": "markdown", + "source": [ + "", + "\n

Importer Methods

", + "\n" + ], + "metadata": {} + }, + { + "id": "YHW5Ovles0y2T26fE8ZOLw", + "cell_type": "code", + "source": [ + "#!import \"ImportScopeCalculation\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Wraw7o21Pk2HmWk4UAqqsA", + "cell_type": "markdown", + "source": [ + "# Parsing Storage" + ], + "metadata": {} + }, + { + "id": "R427JwfBrEqXKnAMHrgizg", + "cell_type": "code", + "source": [ + "public class ParsingStorage", + "\n{", + "\n private readonly IDataSource dataSource;", + "\n private readonly IWorkspace workspace;", + "\n private readonly ImportArgs args;", + "\n ", + "\n //Hierarchy Cache", + "\n public Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache HierarchyCache;", + "\n ", + "\n public ReportingNode ReportingNode { get; protected set; }", + "\n ", + "\n public Dictionary DataNodeDataBySystemName;", + "\n ", + "\n // Dimensions", + "\n public Dictionary CalculationType;", + "\n public Dictionary PvAmountType; ", + "\n public HashSet AocTypeMap;", + "\n private HashSet estimateTypes;", + "\n private HashSet amountTypes;", + "\n private Dictionary> amountTypesByEstimateType => GetAmountTypesByEstimateType(HierarchyCache);", + "\n public HashSet TechnicalMarginEstimateTypes => GetTechnicalMarginEstimateType(); ", + "\n public Dictionary> DimensionsWithExternalId;", + "\n ", + "\n // Partitions", + "\n public PartitionByReportingNode TargetPartitionByReportingNode;", + "\n public PartitionByReportingNodeAndPeriod TargetPartitionByReportingNodeAndPeriod;", + "\n ", + "\n //Constructor", + "\n public ParsingStorage(ImportArgs args, IDataSource dataSource, IWorkspace workspace)", + "\n {", + "\n this.args = args;", + "\n this.dataSource = dataSource;", + "\n this.workspace = workspace;", + "\n }", + "\n ", + "\n // Initialize", + "\n public async Task InitializeAsync()", + "\n {", + "\n //Partition Workspace and DataSource", + "\n TargetPartitionByReportingNode = (await workspace.Query().Where(p => p.ReportingNode == args.ReportingNode).ToArrayAsync()).SingleOrDefault(); ", + "\n ", + "\n if(TargetPartitionByReportingNode == null) ", + "\n { ApplicationMessage.Log(Error.ParsedPartitionNotFound, args.ReportingNode); return; } ", + "\n ", + "\n await workspace.Partition.SetAsync(TargetPartitionByReportingNode.Id);", + "\n await dataSource.Partition.SetAsync(TargetPartitionByReportingNode.Id);", + "\n ", + "\n if(args.Year != default(int) && args.Month != default(int))", + "\n {", + "\n TargetPartitionByReportingNodeAndPeriod = (await workspace.Query()", + "\n .Where(p => p.ReportingNode == args.ReportingNode &&", + "\n p.Year == args.Year &&", + "\n p.Month == args.Month &&", + "\n p.Scenario == args.Scenario).ToArrayAsync()).SingleOrDefault();", + "\n ", + "\n if(TargetPartitionByReportingNodeAndPeriod == null) ", + "\n { ApplicationMessage.Log(Error.ParsedPartitionNotFound, args.ReportingNode, args.Year.ToString(), args.Month.ToString(), args.Scenario); return; } ", + "\n ", + "\n await workspace.Partition.SetAsync(TargetPartitionByReportingNodeAndPeriod.Id);", + "\n await dataSource.Partition.SetAsync(TargetPartitionByReportingNodeAndPeriod.Id);", + "\n ", + "\n //Clean up the workspace", + "\n await workspace.DeleteAsync( await workspace.Query().ToArrayAsync() );", + "\n await workspace.DeleteAsync( await workspace.Query().ToArrayAsync() );", + "\n }", + "\n ", + "\n ReportingNode = (await dataSource.Query().Where(x => x.SystemName == args.ReportingNode).ToArrayAsync()).First();", + "\n var aocConfigurationByAocStep = await dataSource.LoadAocStepConfigurationAsync(args.Year, args.Month);", + "\n AocTypeMap = args.ImportFormat switch {", + "\n ImportFormats.Cashflow => aocConfigurationByAocStep.Where(x => x.InputSource.Contains(InputSource.Cashflow) &&", + "\n !new DataType[]{DataType.Calculated, DataType.CalculatedTelescopic}.Contains(x.DataType) )", + "\n .GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).ToHashSet(),", + "\n ImportFormats.Actual => aocConfigurationByAocStep.Where(x => x.InputSource.Contains(InputSource.Actual) &&", + "\n !new DataType[]{DataType.Calculated, DataType.CalculatedTelescopic}.Contains(x.DataType) && ", + "\n new AocStep(x.AocType, x.Novelty) != new AocStep(AocTypes.BOP, Novelties.I))", + "\n .GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).ToHashSet(),", + "\n ImportFormats.Opening => aocConfigurationByAocStep.Where(x => x.InputSource.Contains(InputSource.Opening) && x.DataType == DataType.Optional).GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).ToHashSet(),", + "\n ImportFormats.SimpleValue => aocConfigurationByAocStep.GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).Concat((await dataSource.Query().ToArrayAsync())", + "\n .Select(vt => new AocStep(vt.SystemName,null))).ToHashSet(),", + "\n _ => Enumerable.Empty().ToHashSet(),", + "\n };", + "\n ", + "\n //DataNodes", + "\n DataNodeDataBySystemName = args.ImportFormat == ImportFormats.Opening ", + "\n ? (await LoadDataNodesAsync(dataSource, args)).Where(kvp => kvp.Value.Year == args.Year).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)", + "\n : await LoadDataNodesAsync(dataSource, args);", + "\n // Dimensions", + "\n CalculationType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n PvAmountType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n amountTypes = (await dataSource.Query().ToArrayAsync()).Select(at => at.SystemName).ToHashSet();", + "\n estimateTypes = args.ImportFormat switch {", + "\n ImportFormats.SimpleValue => (await dataSource.Query().ToArrayAsync()).Select(et => et.SystemName).ToHashSet(),", + "\n ImportFormats.Opening => (await dataSource.Query().Where(et => et.StructureType == StructureType.AoC).ToArrayAsync())", + "\n .Where(et => et.InputSource.Contains(InputSource.Opening)) //This Contains overload cannot be used in DB", + "\n .Select(et => et.SystemName).ToHashSet(),", + "\n _ => Enumerable.Empty().ToHashSet(),", + "\n };", + "\n ", + "\n ", + "\n // DimensionsWithExternalId", + "\n DimensionsWithExternalId = new Dictionary>()", + "\n {", + "\n { typeof(PvAmountType), await GetDimensionWithExternalIdDictionaryAsync() },", + "\n { typeof(EstimateType), await GetDimensionWithExternalIdDictionaryAsync() }", + "\n };", + "\n ", + "\n //Hierarchy Cache", + "\n HierarchyCache = workspace.ToHierarchicalDimensionCache();", + "\n HierarchyCache.Initialize();", + "\n }", + "\n ", + "\n public async Task> GetDimensionWithExternalIdDictionaryAsync () where T : KeyedOrderedDimension", + "\n {", + "\n var dict = new Dictionary();", + "\n var items = await dataSource.Query().ToArrayAsync();", + "\n foreach (var item in items) {", + "\n dict.TryAdd(item.SystemName, item.SystemName);", + "\n if(typeof(T).IsAssignableTo(typeof(KeyedOrderedDimensionWithExternalId))) {", + "\n var externalIds = (string[])(typeof(T).GetProperty(nameof(KeyedOrderedDimensionWithExternalId.ExternalId)).GetValue(item));", + "\n if(externalIds == null) continue;", + "\n foreach (var extId in externalIds) ", + "\n dict.TryAdd(extId, item.SystemName);", + "\n }", + "\n }", + "\n return dict;", + "\n }", + "\n ", + "\n // Getters", + "\n public bool IsDataNodeReinsurance(string goc) => DataNodeDataBySystemName[goc].IsReinsurance;", + "\n public bool IsValidDataNode(string goc) => DataNodeDataBySystemName.ContainsKey(goc);", + "\n ", + "\n // Validations", + "\n public string ValidateEstimateType(string et, string goc) {", + "\n var allowedEstimateTypes = estimateTypes;", + "\n if (DataNodeDataBySystemName.TryGetValue(goc, out var dataNodeData) && dataNodeData.LiabilityType == LiabilityTypes.LIC)", + "\n estimateTypes.ExceptWith(TechnicalMarginEstimateTypes);", + "\n if(!allowedEstimateTypes.Contains(et))", + "\n ApplicationMessage.Log(Error.EstimateTypeNotFound, et);", + "\n return et;", + "\n }", + "\n ", + "\n public string ValidateAmountType(string at) {", + "\n if (at != null && !amountTypes.Contains(at))", + "\n ApplicationMessage.Log(Error.AmountTypeNotFound, at);", + "\n return at;", + "\n }", + "\n ", + "\n public AocStep ValidateAocStep(AocStep aoc) {", + "\n if (!AocTypeMap.Contains(aoc))", + "\n ApplicationMessage.Log(Error.AocTypeMapNotFound, aoc.AocType, aoc.Novelty);", + "\n return aoc;", + "\n }", + "\n ", + "\n public string ValidateDataNode(string goc) {", + "\n if (!DataNodeDataBySystemName.ContainsKey(goc))", + "\n ApplicationMessage.Log(Error.InvalidDataNode, goc);", + "\n return goc;", + "\n }", + "\n ", + "\n public void ValidateEstimateTypeAndAmountType(string estimateType, string amountType){", + "\n if (amountTypesByEstimateType.TryGetValue(estimateType, out var ats) && ats.Any() && !ats.Contains(amountType))", + "\n ApplicationMessage.Log(Error.InvalidAmountTypeEstimateType, estimateType, amountType);", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jLFF7eOl8EKi-EoKn60NkA", + "cell_type": "markdown", + "source": [ + "# Basics" + ], + "metadata": {} + }, + { + "id": "LAqrzcPzfU-9EsHmiVfxOg", + "cell_type": "markdown", + "source": [ + "## Clean the Database" + ], + "metadata": {} + }, + { + "id": "USkMObKefk2vtLjT3OjqKQ", + "cell_type": "code", + "source": [ + "async public Task CleanDatabaseAsync (Expression> filter = null) where T : class", + "\n{", + "\n var loadData = await DataSource.Query().Where(filter?? (Expression>)(x => true)).ToListAsync();", + "\n await DataSource.DeleteAsync(loadData);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "mUaUxMr_ekW_ZKMYlwu6WQ", + "cell_type": "code", + "source": [ + "async public Task CleanDatabaseFromPartitionAsync (Guid partitionId, Func filter = null) where T : class, IPartitioned", + "\n{", + "\n var loadData = (await DataSource.Query().Where(x => x.Partition == partitionId).ToArrayAsync())", + "\n .Where(filter?? (Func)(x => true)).ToList();", + "\n await DataSource.DeleteAsync(loadData);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3CLQow7bjE67Fq14luFOrw", + "cell_type": "markdown", + "source": [ + "## Update the Database" + ], + "metadata": {} + }, + { + "id": "EQ--NVPYYEqya9DtvVVluw", + "cell_type": "code", + "source": [ + "async public Task CommitToDatabase (Guid partitionId, bool snapshot = true, Func filter = null) where T : class, IPartitioned", + "\n{", + "\n if(snapshot) await CleanDatabaseFromPartitionAsync(partitionId, filter);", + "\n await DataSource.UpdateAsync( await Workspace.Query().ToArrayAsync() );", + "\n await DataSource.CommitAsync();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "alZOFNV3nECY6mw1jPOg9g", + "cell_type": "markdown", + "source": [ + "## Data Node Factory" + ], + "metadata": {} + }, + { + "id": "x30peNSotU-F4HtmYwmRFg", + "cell_type": "code", + "source": [ + "// TODO: think of a better Factory to instantiate DataNode/State/Parameter simultaneously while avoiding public contructors (see Factory Patterns)", + "\n// ATTENTION: this Factory method provides default states and parameters so that it is not mandatory to import them (=> simpler calculation engine). ", + "\n// This method weakness is that these defaults aren't always replaced with the imported values, e,g, when Month > DefaultDataNodeActivationMonth.", + "\n// Therefore they will remain in the DataSource (hopefully without producing any harm).", + "\npublic async Task DataNodeFactoryAsync ()", + "\n{", + "\n var partition = (Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode));", + "\n var existingGroupOfContracts = await DataSource.Query().Where(x => x.Partition == partition).ToArrayAsync();", + "\n var importedGroupOfContracts = await Workspace.Query().ToArrayAsync();", + "\n var listOfPartitionsWithPeriod = new List();", + "\n ", + "\n foreach (var groupOfContract in importedGroupOfContracts)", + "\n {", + "\n var name = groupOfContract.SystemName;", + "\n if(!existingGroupOfContracts.Any(x => x.SystemName == name))", + "\n {", + "\n var state = new DataNodeState { DataNode = name, Year = groupOfContract.AnnualCohort, Partition = partition };", + "\n var parameter = new SingleDataNodeParameter { DataNode = name, Year = groupOfContract.AnnualCohort, Partition = partition };", + "\n await Workspace.UpdateAsync(state);", + "\n if(groupOfContract is GroupOfInsuranceContract) await Workspace.UpdateAsync(parameter);", + "\n }", + "\n }", + "\n ", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n //Hot fix: Disabling default as using Annual Cohort breakes Opening importer logic. ", + "\n //await CommitToDatabase(partition, snapshot: false);", + "\n //await CommitToDatabase(partition, snapshot: false);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "plZbdAKxhE2ZjyY7T43g-Q", + "cell_type": "markdown", + "source": [ + "# Importers" + ], + "metadata": {} + }, + { + "id": "6w4ObiZRmUaMLel1WMHQNA", + "cell_type": "markdown", + "source": [ + "## Parse and Upload: Dimensions" + ], + "metadata": {} + }, + { + "id": "hC50TsmYNkKo6cyJ1A0uRQ", + "cell_type": "code", + "source": [ + "public async Task UploadDimensionsAsync (string fileName) where T: class ", + "\n{", + "\n await CleanDatabaseAsync();", + "\n var importLog = await Import.FromFile(fileName).WithType().WithTarget(DataSource).ExecuteAsync();", + "\n return importLog;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zPGrABD22kCbEaJxlm9CYw", + "cell_type": "markdown", + "source": [ + "## Parse Main Tab and return Args" + ], + "metadata": {} + }, + { + "id": "l1JQnGEPfEylauUl-Y-Kqw", + "cell_type": "code", + "source": [ + "public async Task GetArgsFromMainAsync(string file)", + "\n{", + "\n var extension = System.IO.Path.GetExtension(file);", + "\n var stream = await Project.FileStorage.ReadAsync(file);", + "\n var mainTab = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).Tables[Main];", + "\n ", + "\n if(mainTab == null) ApplicationMessage.Log(Error.NoMainTab);", + "\n if(mainTab.Rows.Count() == 0) ApplicationMessage.Log(Error.IncompleteMainTab);", + "\n if(ApplicationMessage.HasErrors()) return null;", + "\n ", + "\n var main = mainTab.Rows.First();", + "\n var scenario = mainTab.Columns.Where(x => x.ColumnName == nameof(PartitionByReportingNode.Scenario)).Count() > 0? ", + "\n (string)main[nameof(PartitionByReportingNode.Scenario)] : default(string);", + "\n ", + "\n var partitionName = typeof(IPartition).Name switch ", + "\n {", + "\n nameof(PartitionByReportingNode) => new ImportArgs( (string)main[nameof(PartitionByReportingNode.ReportingNode)],", + "\n default(int),", + "\n default(int),", + "\n default(Periodicity),", + "\n scenario,", + "\n default(string)),", + "\n ", + "\n nameof(PartitionByReportingNodeAndPeriod) => new ImportArgs( (string)main[nameof(PartitionByReportingNodeAndPeriod.ReportingNode)], ", + "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Year)], typeof(int)),", + "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Month)], typeof(int)),", + "\n default(Periodicity),", + "\n scenario,", + "\n default(string)),", + "\n ", + "\n _ => null", + "\n };", + "\n ", + "\n if (partitionName == null) ApplicationMessage.Log(Error.PartitionTypeNotFound, typeof(IPartition).Name); ", + "\n return partitionName;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Nc8XqguDwEywNGHzIg3C4A", + "cell_type": "markdown", + "source": [ + "### Parse and Upload: Data Nodes" + ], + "metadata": {} + }, + { + "id": "TryM-sop6USTlvmWqP14CQ", + "cell_type": "markdown", + "source": [ + "### Portfolio and Group of contract" + ], + "metadata": {} + }, + { + "id": "XxwGlJ5PS02O5OtQsb1v8g", + "cell_type": "code", + "source": [ + "public async Task UploadDataNodesToWorkspaceAsync(string fileName)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization()", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n Activity.Start();", + "\n var args = await GetArgsFromMainAsync(fileName);", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var storage = new ParsingStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var errors = new List();", + "\n var importLogPortfolios = await Import.FromFile(fileName)", + "\n .WithType((dataset, datarow) => new InsurancePortfolio {", + "\n SystemName = datarow.Field(nameof(DataNode.SystemName)),", + "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n ContractualCurrency = datarow.Field(nameof(DataNode.ContractualCurrency)),", + "\n FunctionalCurrency = storage.ReportingNode.Currency,", + "\n LineOfBusiness = datarow.Field(nameof(DataNode.LineOfBusiness)),", + "\n ValuationApproach = datarow.Field(nameof(DataNode.ValuationApproach)),", + "\n OciType = datarow.Field(nameof(DataNode.OciType))", + "\n })", + "\n .WithType((dataset, datarow) =>new ReinsurancePortfolio {", + "\n SystemName = datarow.Field(nameof(DataNode.SystemName)),", + "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n ContractualCurrency = datarow.Field(nameof(DataNode.ContractualCurrency)),", + "\n FunctionalCurrency = storage.ReportingNode.Currency,", + "\n LineOfBusiness = datarow.Field(nameof(DataNode.LineOfBusiness)),", + "\n ValuationApproach = datarow.Field(nameof(DataNode.ValuationApproach)),", + "\n OciType = datarow.Field(nameof(DataNode.OciType))", + "\n })", + "\n .WithTarget(Workspace)", + "\n .ExecuteAsync();", + "\n ", + "\n var portfolios = await Workspace.Query().ToDictionaryAsync(x => x.SystemName);", + "\n var importLogGroupOfContracts = await Import.FromFile(fileName)", + "\n .WithType((dataset, datarow) => {", + "\n var gicSystemName = datarow.Field(nameof(DataNode.SystemName));", + "\n var pf = datarow.Field(nameof(InsurancePortfolio));", + "\n if(!portfolios.TryGetValue(pf, out var portfolioData))", + "\n {", + "\n ApplicationMessage.Log(Error.PortfolioGicNotFound, pf, gicSystemName);", + "\n return null;", + "\n }", + "\n var gic = new GroupOfInsuranceContract {", + "\n SystemName = gicSystemName,", + "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n ContractualCurrency = portfolioData.ContractualCurrency,", + "\n FunctionalCurrency = portfolioData.FunctionalCurrency,", + "\n LineOfBusiness = portfolioData.LineOfBusiness,", + "\n ValuationApproach = portfolioData.ValuationApproach,", + "\n OciType = portfolioData.OciType,", + "\n AnnualCohort = Convert.ToInt32(datarow.Field(nameof(GroupOfContract.AnnualCohort))),", + "\n LiabilityType = datarow.Field(nameof(GroupOfContract.LiabilityType)),", + "\n Profitability = datarow.Field(nameof(GroupOfContract.Profitability)),", + "\n Portfolio = pf", + "\n };", + "\n return ExtendGroupOfContract(gic, datarow);", + "\n })", + "\n .WithType((dataset, datarow) => {", + "\n var gricSystemName = datarow.Field(nameof(DataNode.SystemName));", + "\n var pf = datarow.Field(nameof(ReinsurancePortfolio));", + "\n if(!portfolios.TryGetValue(pf, out var portfolioData))", + "\n {", + "\n ApplicationMessage.Log(Error.PortfolioGicNotFound, pf, gricSystemName);", + "\n return null;", + "\n }", + "\n var gric = new GroupOfReinsuranceContract {", + "\n SystemName = gricSystemName,", + "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n ContractualCurrency = portfolioData.ContractualCurrency,", + "\n FunctionalCurrency = portfolioData.FunctionalCurrency,", + "\n LineOfBusiness = portfolioData.LineOfBusiness,", + "\n ValuationApproach = portfolioData.ValuationApproach,", + "\n OciType = portfolioData.OciType,", + "\n AnnualCohort = Convert.ToInt32(datarow.Field(nameof(GroupOfContract.AnnualCohort))),", + "\n LiabilityType = datarow.Field(nameof(GroupOfContract.LiabilityType)),", + "\n Profitability = datarow.Field(nameof(GroupOfContract.Profitability)),", + "\n Portfolio = pf,", + "\n Partner = datarow.Field(nameof(GroupOfContract.Partner))", + "\n };", + "\n return ExtendGroupOfContract(gric, datarow);", + "\n })", + "\n .WithTarget(Workspace)", + "\n .ExecuteAsync();", + "\n ", + "\n return Activity.Finish().Merge(importLogPortfolios).Merge(importLogGroupOfContracts);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ek8lfAoNYUuv38Cg7Ld7UA", + "cell_type": "code", + "source": [ + "public async Task UploadDataNodesAsync(string fileName)", + "\n{", + "\n var log = await UploadDataNodesToWorkspaceAsync(fileName);", + "\n var partition = (Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode));", + "\n ", + "\n await DataNodeFactoryAsync(); ", + "\n return log;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "EWnSq0n9wkmoyganTsWoYw", + "cell_type": "markdown", + "source": [ + "### Data Node State" + ], + "metadata": {} + }, + { + "id": "GPjdrCFjTEiPfTQ_5EzELg", + "cell_type": "code", + "source": [ + "public async Task ValidateDataNodeStatesAsync(Dictionary persistentDataNodeByDataNode)", + "\n{", + "\n foreach(var importedDataNodeState in await Workspace.Query().ToArrayAsync())", + "\n {", + "\n if(persistentDataNodeByDataNode.TryGetValue(importedDataNodeState.DataNode, out var currentPersistentDataNode))", + "\n {", + "\n if(importedDataNodeState.State < currentPersistentDataNode.State)", + "\n ApplicationMessage.Log(Error.ChangeDataNodeState, importedDataNodeState.DataNode, ", + "\n currentPersistentDataNode.State.ToString(), ", + "\n importedDataNodeState.State.ToString());", + "\n", + "\n if(importedDataNodeState.State == currentPersistentDataNode.State)", + "\n await Workspace.DeleteAsync(importedDataNodeState);", + "\n }", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Onp_ZdRWQ0-oaDr1QwZdYg", + "cell_type": "code", + "source": [ + "public async Task UploadDataNodeStateToWorkspaceAsync(string fileName)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync() );", + "\n ", + "\n Activity.Start();", + "\n var args = await GetArgsFromMainAsync(fileName);", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var storage = new ParsingStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var importLog = await Import.FromFile(fileName).WithType(", + "\n (dataset, datarow) => new DataNodeState {", + "\n DataNode = datarow.Field(nameof(DataNodeState.DataNode)),", + "\n State = (State)Enum.Parse(typeof(State), datarow.Field(nameof(DataNodeState.State))),", + "\n Year = args.Year,", + "\n Month = args.Month,", + "\n Partition = storage.TargetPartitionByReportingNode.Id", + "\n }", + "\n ).WithTarget(Workspace).ExecuteAsync();", + "\n", + "\n await ValidateDataNodeStatesAsync(storage.DataNodeDataBySystemName);", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LvFi94RVy0C36bUPNXZIuQ", + "cell_type": "code", + "source": [ + "public async Task UploadDataNodeStateAsync(string fileName)", + "\n{", + "\n var log = await UploadDataNodeStateToWorkspaceAsync(fileName);", + "\n await CommitToDatabase((Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode)), snapshot: false); ", + "\n return log;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "l1yjjsQ6P0OSf1PWW_AL8w", + "cell_type": "markdown", + "source": [ + "### DataNode Parameters" + ], + "metadata": {} + }, + { + "id": "Q5PAOqsi5kOktzneex2EZA", + "cell_type": "code", + "source": [ + "public async Task UploadDataNodeParameterToWorkspaceAsync(string fileName, Guid targetPartitionByReportingNodeId)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync() );", + "\n ", + "\n Activity.Start();", + "\n var args = await GetArgsFromMainAsync(fileName) with {ImportFormat = ImportFormats.DataNodeParameter};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var storage = new ParsingStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var singleDataNode = new List();", + "\n var interDataNode = new List<(string,string)>();", + "\n ", + "\n var importLog = await Import.FromFile(fileName)", + "\n .WithType( (dataset, datarow) => {", + "\n", + "\n //read and validate DataNodes", + "\n var dataNode = datarow.Field(nameof(DataNode));", + "\n if(!storage.IsValidDataNode(dataNode)) { ApplicationMessage.Log(Error.InvalidDataNode, dataNode); return null; }", + "\n", + "\n //check for duplicates", + "\n if(singleDataNode.Contains(dataNode)) { ApplicationMessage.Log(Error.DuplicateSingleDataNode, dataNode); return null; }", + "\n singleDataNode.Add(dataNode);", + "\n ", + "\n //Instantiate SingleDataNodeParameter", + "\n return new SingleDataNodeParameter {", + "\n Year = args.Year,", + "\n Month = args.Month,", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n", + "\n DataNode = dataNode,", + "\n PremiumAllocation = (datarow.Field(nameof(SingleDataNodeParameter.PremiumAllocation)))", + "\n .ToString().CheckStringForExponentialAndConvertToDouble(),", + "\n };", + "\n })", + "\n .WithType( (dataset, datarow) => {", + "\n", + "\n //read and validate DataNodes", + "\n var dataNode = datarow.Field(nameof(InterDataNodeParameter.DataNode));", + "\n if(!storage.IsValidDataNode(dataNode)) { ApplicationMessage.Log(Error.InvalidDataNode, dataNode); return null; }", + "\n", + "\n var linkedDataNode = datarow.Field(nameof(InterDataNodeParameter.LinkedDataNode));", + "\n if(!storage.IsValidDataNode(linkedDataNode)) { ApplicationMessage.Log(Error.InvalidDataNode, linkedDataNode); return null; }", + "\n var dataNodes = new string[]{dataNode, linkedDataNode}.OrderBy(x => x).ToArray();", + "\n", + "\n //validate ReinsuranceGross Link", + "\n var isDn1Reinsurance = storage.IsDataNodeReinsurance(dataNodes[0]);", + "\n var isDn2Reinsurance = storage.IsDataNodeReinsurance(dataNodes[1]);", + "\n var isGrossReinsuranceLink = (isDn1Reinsurance && !isDn2Reinsurance) != (!isDn1Reinsurance && isDn2Reinsurance);", + "\n var reinsCov = (datarow.Field(nameof(InterDataNodeParameter.ReinsuranceCoverage)))", + "\n .ToString().CheckStringForExponentialAndConvertToDouble();", + "\n if(!isGrossReinsuranceLink && Math.Abs(reinsCov) > Precision )", + "\n ApplicationMessage.Log(Error.ReinsuranceCoverageDataNode, dataNodes[0], dataNodes[1]); // TODO: is this error or warning?", + "\n", + "\n //check for duplicates", + "\n if(interDataNode.Contains((dataNodes[0], dataNodes[1])) || interDataNode.Contains((dataNodes[1], dataNodes[0])))", + "\n ApplicationMessage.Log(Error.DuplicateInterDataNode, dataNodes[0], dataNodes[1]); // TODO: is this error or warning?", + "\n", + "\n interDataNode.Add((dataNodes[0], dataNodes[1])); ", + "\n //Instantiate InterDataNodeParameter", + "\n return new InterDataNodeParameter {", + "\n Year = args.Year,", + "\n Month = args.Month,", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n DataNode = dataNodes[0],", + "\n LinkedDataNode = dataNodes[1],", + "\n ReinsuranceCoverage = reinsCov,", + "\n };", + "\n })", + "\n .WithTarget(Workspace)", + "\n .ExecuteAsync();", + "\n ", + "\n targetPartitionByReportingNodeId = storage.TargetPartitionByReportingNode.Id;", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "FpMgj56nhUWiJDn-bke8XQ", + "cell_type": "code", + "source": [ + "public async Task UploadDataNodeParameterAsync(string fileName)", + "\n{", + "\n Guid partitionId = new Guid();", + "\n var log = await UploadDataNodeParameterToWorkspaceAsync(fileName, partitionId);", + "\n ", + "\n await CommitToDatabase(partitionId, snapshot: false);", + "\n await CommitToDatabase(partitionId, snapshot: false); ", + "\n ", + "\n return log;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "NayXrFB1fUCjVZsyuv3HCA", + "cell_type": "markdown", + "source": [ + "## Parse and Upload: Variables" + ], + "metadata": {} + }, + { + "id": "6nCpBsFe4kylRPgDYwMg9A", + "cell_type": "markdown", + "source": [ + "### Validation for Active Data Node States" + ], + "metadata": {} + }, + { + "id": "aVUxILOVD0WCQ3Kd9uMtaA", + "cell_type": "code", + "source": [ + "public async Task ValidateForDataNodeStateActiveAsync(Dictionary dataNodes) where T : BaseDataRecord", + "\n{ ", + "\n foreach(var item in (await Workspace.Query().ToArrayAsync()).GroupBy(x => x.DataNode))", + "\n if(!dataNodes.ContainsKey(item.First().DataNode))", + "\n ApplicationMessage.Log(Error.InactiveDataNodeState, item.First().DataNode);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WFAodnYhh0S4UQHkB4pFcQ", + "cell_type": "markdown", + "source": [ + "### Cashflow as Raw Variable and Ifrs Variable" + ], + "metadata": {} + }, + { + "id": "a2sXTTFuxk6by0RB9IyY5g", + "cell_type": "code", + "source": [ + "public async Task ParseCashflowsToWorkspaceAsync(string fileName, ImportArgs args)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n Activity.Start();", + "\n var parsingStorage = new ParsingStorage(args, DataSource, Workspace);", + "\n await parsingStorage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var importLog = await Import.FromFile(fileName)", + "\n .WithType ( (dataset, datarow) => {", + "\n var aocType = datarow.Field(nameof(RawVariable.AocType));", + "\n var novelty = datarow.Field(nameof(RawVariable.Novelty));", + "\n var dataNode = datarow.Field(nameof(DataNode));", + "\n ", + "\n if(!parsingStorage.DataNodeDataBySystemName.TryGetValue(dataNode, out var dataNodeData)) {", + "\n ApplicationMessage.Log(Error.InvalidDataNode, dataNode);", + "\n return null;", + "\n }", + "\n ", + "\n // Error if AocType is not present in the mapping", + "\n if(!parsingStorage.AocTypeMap.Contains(new AocStep(aocType, novelty))) {", + "\n ApplicationMessage.Log(Error.AocTypeMapNotFound, aocType, novelty);", + "\n return null;", + "\n }", + "\n ", + "\n // Filter out cashflows for DataNode that were created in the past and are still active and come with AocType = BOPI", + "\n if(dataNodeData.Year < args.Year && aocType == AocTypes.BOP && novelty == Novelties.I) {", + "\n ApplicationMessage.Log(Warning.ActiveDataNodeWithCashflowBOPI);", + "\n return null;", + "\n }", + "\n ", + "\n var amountTypeFromFile = datarow.Field(nameof(RawVariable.AmountType));", + "\n var isCalculationType = parsingStorage.CalculationType.ContainsKey(amountTypeFromFile);", + "\n var amountType = isCalculationType ? null : amountTypeFromFile;", + "\n var calculationType = isCalculationType ? amountTypeFromFile : CalculationTypes.BE;", + "\n ", + "\n var values = datarow.Table.Columns.Where(c => c.ColumnName.StartsWith(nameof(RawVariable.Values))).OrderBy(c => c.ColumnName.Length).ThenBy(c => c.ColumnName)", + "\n .Select(x => datarow.Field(x.ColumnName).CheckStringForExponentialAndConvertToDouble()).Prune();", + "\n ", + "\n // Filter out empty raw variables for AocType != CL", + "\n if(values.Length == 0 && aocType != AocTypes.CL) return null; //TODO: extend this check for all mandatory step and not just for CL", + "\n ", + "\n var item = new RawVariable {", + "\n DataNode = dataNode,", + "\n AocType = aocType,", + "\n Novelty = novelty,", + "\n AmountType = amountType,", + "\n CalculationType = calculationType,", + "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(RawVariable.AccidentYear))), out var tempVal)? tempVal : (int?)null,", + "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", + "\n Values = Multiply(GetSign((aocType, amountType, calculationType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), values)", + "\n };", + "\n return item;", + "\n }, ImportFormats.Cashflow", + "\n ).WithTarget(Workspace).ExecuteAsync();", + "\n ", + "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3iGcaiP12U-Jc2zU_pPCQw", + "cell_type": "code", + "source": [ + "public async Task UploadCashflowsAsync(string fileName)", + "\n{", + "\n Activity.Start();", + "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Cashflow};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var parsingLog = await ParseCashflowsToWorkspaceAsync(fileName, args);", + "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n var storage = new ImportStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n var universe = Scopes.ForStorage(storage).ToScope();", + "\n var identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);", + "\n var ivs = universe.GetScopes(identities).SelectMany(x => x.CalculatedIfrsVariables);", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n await Workspace.UpdateAsync(ivs);", + "\n await CommitToDatabase(storage.TargetPartition, ", + "\n snapshot : true, ", + "\n filter : x => storage.EstimateTypesByImportFormat[ImportFormats.Cashflow].Contains(x.EstimateType) && ", + "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode)); ", + "\n await CommitToDatabase(storage.TargetPartition, ", + "\n snapshot : true,", + "\n filter : x => storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode));", + "\n", + "\n return Activity.Finish().Merge(parsingLog); ", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BzW1jMILIk-dXDuU0pbd3w", + "cell_type": "markdown", + "source": [ + "### Actuals as Ifrs Variable" + ], + "metadata": {} + }, + { + "id": "4CYHZInVJUOfrmoLQKbolQ", + "cell_type": "code", + "source": [ + "public async Task ParseActualsToWorkspaceAsync(string fileName, ImportArgs args)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n Activity.Start();", + "\n var parsingStorage = new ParsingStorage(args, DataSource, Workspace);", + "\n await parsingStorage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var importLog = await Import.FromFile(fileName)", + "\n .WithType ( (dataset, datarow) => {", + "\n var dataNode = datarow.Field(nameof(DataNode));", + "\n if(!parsingStorage.DataNodeDataBySystemName.TryGetValue(dataNode, out var dataNodeData)) {", + "\n ApplicationMessage.Log(Error.InvalidDataNode, dataNode);", + "\n return null;", + "\n }", + "\n ", + "\n var valueType = datarow.Field(ValueType);", + "\n if(valueType == null) { ", + "\n ApplicationMessage.Log(Error.ValueTypeNotFound); ", + "\n return null; ", + "\n }", + "\n ", + "\n var amountType = parsingStorage.DimensionsWithExternalId[typeof(PvAmountType)].TryGetValue(valueType, out var at)? at : null;", + "\n var isStdActual = parsingStorage.PvAmountType.ContainsKey(valueType);", + "\n var estimateType = isStdActual? EstimateTypes.A : parsingStorage.DimensionsWithExternalId[typeof(EstimateType)].TryGetValue(valueType, out var et)? et : null;", + "\n if(estimateType == null || amountType == null) { ", + "\n ApplicationMessage.Log(Error.ValueTypeNotValid, valueType);", + "\n return null;", + "\n }", + "\n ", + "\n var aocType = datarow.Field(nameof(IfrsVariable.AocType));", + "\n if((!isStdActual && aocType != AocTypes.CF && aocType != AocTypes.WO) || (isStdActual && aocType != AocTypes.CF) ) {", + "\n ApplicationMessage.Log(Error.AocTypeNotValid, aocType);", + "\n return null;", + "\n }", + "\n ", + "\n var item = new IfrsVariable {", + "\n DataNode = dataNode,", + "\n AocType = aocType,", + "\n Novelty = Novelties.C,", + "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(IfrsVariable.AccidentYear))), out var tempAccYear)? tempAccYear : (int?)null,", + "\n AmountType = amountType,", + "\n EstimateType = estimateType,", + "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", + "\n Value = Multiply(GetSign((aocType, amountType, estimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()),", + "\n };", + "\n return item;", + "\n }, ImportFormats.Actual", + "\n ).WithTarget(Workspace).ExecuteAsync();", + "\n ", + "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xeJTsq8-HEqh4t1fxKDzcg", + "cell_type": "code", + "source": [ + "public async Task UploadActualAsync(string fileName)", + "\n{", + "\n Activity.Start();", + "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Actual};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var parsingLog = await ParseActualsToWorkspaceAsync(fileName, args);", + "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", + "\n", + "\n var storage = new ImportStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n", + "\n var universe = Scopes.ForStorage(storage).ToScope();", + "\n var identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);", + "\n var ivs = universe.GetScopes(identities).SelectMany(x => x.CalculatedIfrsVariables);", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n", + "\n await Workspace.UpdateAsync(ivs);", + "\n await CommitToDatabase(storage.TargetPartition, ", + "\n snapshot : true, ", + "\n filter : x => storage.EstimateTypesByImportFormat[ImportFormats.Actual].Contains(x.EstimateType) && ", + "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode));", + "\n", + "\n return Activity.Finish().Merge(parsingLog);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "GBB66l28v06C1ovuu7oKAA", + "cell_type": "markdown", + "source": [ + "# Simple Value Import" + ], + "metadata": {} + }, + { + "id": "0eUHQv8O1kSXjjquLKakNQ", + "cell_type": "markdown", + "source": [ + "## Simple Value to Workspace" + ], + "metadata": {} + }, + { + "id": "BdMAjdPmX0y00AXxMyx40w", + "cell_type": "code", + "source": [ + "public async Task ParseSimpleValueToWorkspaceAsync(string fileName, ImportArgs args, Guid targetPartitionByReportingNodeAndPeriodId)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n Activity.Start();", + "\n var importFormat = args.ImportFormat;", + "\n var parsingStorage = new ParsingStorage(args, DataSource, Workspace);", + "\n await parsingStorage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish(); ", + "\n", + "\n var importLog = await Import.FromFile(fileName)", + "\n .WithType ( (dataset, datarow) => {", + "\n var dataNode = parsingStorage.ValidateDataNode(datarow.Field(nameof(DataNode)));", + "\n var amountType = parsingStorage.ValidateAmountType(datarow.Field(nameof(IfrsVariable.AmountType)));", + "\n var estimateType = parsingStorage.ValidateEstimateType(datarow.Field(nameof(IfrsVariable.EstimateType)), dataNode); //TODO LIC/LRC dependence", + "\n var aocStep = importFormat == ImportFormats.SimpleValue ", + "\n ? parsingStorage.ValidateAocStep(new AocStep (datarow.Field(nameof(IfrsVariable.AocType)), ", + "\n datarow.Field(nameof(IfrsVariable.Novelty))))", + "\n : new AocStep(AocTypes.BOP, Novelties.I);", + "\n var economicBasis = importFormat == ImportFormats.SimpleValue ", + "\n ? datarow.Field(nameof(IfrsVariable.EconomicBasis)) ", + "\n : null;", + "\n ", + "\n parsingStorage.ValidateEstimateTypeAndAmountType(estimateType, amountType);", + "\n ", + "\n var iv = new IfrsVariable {", + "\n DataNode = dataNode,", + "\n AocType = aocStep.AocType,", + "\n Novelty = aocStep.Novelty,", + "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(IfrsVariable.AccidentYear))), out var accidentYear) ? accidentYear : (int?)null,", + "\n AmountType = amountType,", + "\n EstimateType = estimateType,", + "\n EconomicBasis = economicBasis,", + "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", + "\n Value = GetSign((aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), parsingStorage.HierarchyCache)", + "\n * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()", + "\n };", + "\n return iv;", + "\n }, importFormat", + "\n ).WithTarget(Workspace).ExecuteAsync();", + "\n ", + "\n HashSet availableEstimateTypes = parsingStorage.TechnicalMarginEstimateTypes;", + "\n var multipleOp = await Workspace.Query().Where(iv => availableEstimateTypes.Contains(iv.EstimateType))", + "\n .GroupBy(iv => iv.DataNode)", + "\n .Where(g => g.Count() > 1).ToArrayAsync();", + "\n //.Select(g => ApplicationMessage.Log(Error.MultipleTechnicalMarginOpening, g.Key));", + "\n ", + "\n foreach (var op in multipleOp)", + "\n ApplicationMessage.Log(Error.MultipleTechnicalMarginOpening, op.Key);", + "\n ", + "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", + "\n targetPartitionByReportingNodeAndPeriodId = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id;", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9OUXaxBq9UWnDfTVkzZWxQ", + "cell_type": "markdown", + "source": [ + "## Simple Value as IfrsVariable" + ], + "metadata": {} + }, + { + "id": "LQsJefixt0iCd-c5YpFk0A", + "cell_type": "code", + "source": [ + "public async Task UploadSimpleValueAsync(string fileName)", + "\n{", + "\n Activity.Start();", + "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.SimpleValue};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n Guid partitionId = new Guid();", + "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(fileName, args, partitionId);", + "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n Workspace.Query().Select(v => new {v.DataNode, v.AccidentYear}).Distinct();", + "\n ", + "\n await CommitToDatabase(partitionId, ", + "\n snapshot : true,", + "\n filter : x => Workspace.Query().Select(v => v.DataNode).Distinct().Contains(x.DataNode));", + "\n ", + "\n return Activity.Finish().Merge(parsingLog);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tyyiqAeFX0Gc5OKA_lmSEw", + "cell_type": "markdown", + "source": [ + "## Openings as IfrsVariable" + ], + "metadata": {} + }, + { + "id": "bkCo7-z9F0-_18aRV7Upqw", + "cell_type": "code", + "source": [ + "public async Task UploadOpeningAsync(string fileName)", + "\n{", + "\n Activity.Start();", + "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Opening};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n Guid partitionId = new Guid();", + "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(fileName, args, partitionId);", + "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n var storage = new ImportStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n var universe = Scopes.ForStorage(storage).ToScope();", + "\n var identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);", + "\n var ivs = universe.GetScopes(identities).SelectMany(x => x.CalculatedIfrsVariables);", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n", + "\n await Workspace.UpdateAsync(ivs);", + "\n await CommitToDatabase(storage.TargetPartition, ", + "\n snapshot : true,", + "\n filter : x => storage.EstimateTypesByImportFormat[ImportFormats.Opening].Contains(x.EstimateType) && ", + "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode ));", + "\n", + "\n return Activity.Finish().Merge(parsingLog);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YqhevtPH3EiTicAIQesk-g", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Initialization/InitSystemorphBaseToMemory.ipynb b/Initialization/InitSystemorphBaseToMemory.ipynb new file mode 100644 index 00000000..25f07ab0 --- /dev/null +++ b/Initialization/InitSystemorphBaseToMemory.ipynb @@ -0,0 +1,268 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "IsXau2AxIU6GrqDFBctd_g", + "cell_type": "markdown", + "source": [ + "

In Memory Initialization of unconfigured DataSource

", + "\n

Reference Data and DataNode

", + "\n", + "\n" + ], + "metadata": {} + }, + { + "id": "7UYbILtPnkuX3ekPtoWAWA", + "cell_type": "code", + "source": [ + "#!import \"../Import/Importers\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "X1GMcf7BW0mzdwq86kKuRQ", + "cell_type": "markdown", + "source": [ + "# Set default DataSource" + ], + "metadata": {} + }, + { + "id": "fVAqI420SkWAgNT6ijl6Fg", + "cell_type": "code", + "source": [ + "await DataSource.SetAsync();", + "\nDataSource.Reset(x => x.ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "82iGxa0-z0StnHV9TIuQDQ", + "cell_type": "markdown", + "source": [ + "# Initialize Workspace" + ], + "metadata": {} + }, + { + "id": "t74nFVf0AkOncugJ2F8jUQ", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "K898FO9wPUmvy-obSQrJ3Q", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QppbRvo4lUWN-7dYzi7zqw", + "cell_type": "markdown", + "source": [ + "# Import Dimensions, Partitions" + ], + "metadata": {} + }, + { + "id": "4T9Mtqgv8kuSz7Ro7CfcOw", + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithTarget(DataSource)", + "\n .ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "DCmPy2JDPEqrwPZceL6ncA", + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/300.ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "pg7FYVPT8E-V8CHNAvl1Wg", + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "\n .WithType()", + "\n .WithType()", + "\n .WithTarget(DataSource)", + "\n .ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RxTzyhca0kSB8pMpuzIcug", + "cell_type": "markdown", + "source": [ + "# Import Parameters" + ], + "metadata": {} + }, + { + "id": "zVvAMvAHzEWwm2mzvadTng", + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/YieldCurve.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KdJRkfTVH0KUAXsSPQetHg", + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/ExchangeRate.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "oxIQKMoo5UqjKAtjcdn32Q", + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/PartnerRating.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4CDsZoshXE6BZbDJYoXD_w", + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/CreditDefaultRate.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uu3vipnW30CDEQcLQ1ezyA", + "cell_type": "markdown", + "source": [ + "# Import DataNodes and DataNodeParameters" + ], + "metadata": {} + }, + { + "id": "DzfZozeHJk-8yJ_uH5jKUA", + "cell_type": "code", + "source": [ + "await UploadDataNodesAsync(\"../Files/700.DataNodes/DataNodes_CH.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "A8AUrboHqESmsdhkjXLh_Q", + "cell_type": "code", + "source": [ + "await UploadDataNodeStateAsync(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "p1m4aehU1kSmNpWDzIpE0A", + "cell_type": "code", + "source": [ + "await UploadDataNodeParameterAsync(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "pEqNN1RpCkSiVxiqryS-vQ", + "cell_type": "markdown", + "source": [ + "# Reset Workspace" + ], + "metadata": {} + }, + { + "id": "pqpb7AWAy06nubi3ydQCPA", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Uc9njlRC-kiAccvmjSF5xw", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Initialization/InitSystemorphToDatabase.ipynb b/Initialization/InitSystemorphToDatabase.ipynb new file mode 100644 index 00000000..862b85ef --- /dev/null +++ b/Initialization/InitSystemorphToDatabase.ipynb @@ -0,0 +1,314 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "Cy8T4hrL4kO_Gfnm6Z5XTg", + "cell_type": "markdown", + "source": [ + "

Physical Database Initialization

" + ], + "metadata": {} + }, + { + "id": "TW3qAJFbN0GzvfZswIQD9g", + "cell_type": "code", + "source": [ + "#!import \"../Database/Configure\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WW6qYyWLN0CDzizR6oTSFw", + "cell_type": "code", + "source": [ + "#!import \"../Import/Importers\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MKwi685La0Shl61un7unGg", + "cell_type": "markdown", + "source": [ + "# Initialize Workspace" + ], + "metadata": {} + }, + { + "id": "19uyY1p_DEafziYCP4_ajg", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VaUXNeTpnkqp4qvlkZT1tA", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ujiYx54U70a1Lk7al17aNQ", + "cell_type": "markdown", + "source": [ + "# Import Dimensions, Partitions" + ], + "metadata": {} + }, + { + "id": "iHL9ANV_7EqKGUtvOzgh9A", + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithTarget(DataSource)", + "\n .ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WITsBPPMmkapIKK3ocjeCA", + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/300.ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "UBG4zPFBzEGM9I8BwyLHBg", + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "\n .WithType()", + "\n .WithType()", + "\n .WithTarget(DataSource)", + "\n .ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "x_FX7ZmdQkqPWJ_8inZXIg", + "cell_type": "markdown", + "source": [ + "# Import Parameters" + ], + "metadata": {} + }, + { + "id": "OecjLAV7AkiT3KhjiiJnog", + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/YieldCurve.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Ii5PJHvCl0Cx2m89VaFSQg", + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/ExchangeRate.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XRyJuiNql0mkE-hZETImsg", + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/PartnerRating.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bGA-LWJqmUmMqydPlYBymQ", + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/CreditDefaultRate.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "UzoF3kC3bkSV0tPlgFIH4Q", + "cell_type": "markdown", + "source": [ + "# Import DataNodes and DataNodeParameters" + ], + "metadata": {} + }, + { + "id": "7D_GmV2jsUa_BlNeRX202w", + "cell_type": "code", + "source": [ + "await UploadDataNodesAsync(\"../Files/700.DataNodes/DataNodes_CH.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BNrbXnwP-USpPbMvCQJkQw", + "cell_type": "code", + "source": [ + "await UploadDataNodeStateAsync(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Gbq1iNgL5ku27G-9ZCDgyw", + "cell_type": "code", + "source": [ + "await UploadDataNodeParameterAsync(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "mIAgGfevFkSw8FcNW7S_Dw", + "cell_type": "markdown", + "source": [ + "# Import Cashflow and Actuals" + ], + "metadata": {} + }, + { + "id": "Dx3T6KwOi0-h1_MxtEvu0Q", + "cell_type": "code", + "source": [ + "await UploadOpeningAsync(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "7rQXgufixki5Mr5wvIqvmg", + "cell_type": "code", + "source": [ + "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9teVf5xzQ0Gkra1zUNiPVw", + "cell_type": "code", + "source": [ + "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "teSj9-cIHEKxQBYlxrSUaw", + "cell_type": "code", + "source": [ + "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "eopo9jQQJECpkYPGIcToIg", + "cell_type": "code", + "source": [ + "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "I9rluX4YaE2AXRNtnwzghw", + "cell_type": "markdown", + "source": [ + "# Reset Workspace" + ], + "metadata": {} + }, + { + "id": "vjYLEV52S0yEzRX-hbQu5g", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CQDkkzwLSUi-ZedmBK9uVg", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Initialization/InitSystemorphToMemory.ipynb b/Initialization/InitSystemorphToMemory.ipynb new file mode 100644 index 00000000..211f88c1 --- /dev/null +++ b/Initialization/InitSystemorphToMemory.ipynb @@ -0,0 +1,147 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "p3DIOKsMYUawUuOBORa9iQ", + "cell_type": "markdown", + "source": [ + "

In Memory Initialization of unconfigured DataSource

", + "\n", + "\n" + ], + "metadata": {} + }, + { + "id": "M0C3GJVwOkKVrGYTzCLVXw", + "cell_type": "code", + "source": [ + "#!eval-notebook \"InitSystemorphBaseToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ekrl841-jk6Qu-cUbOdg9g", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "55NcBpz1JU2BhAj8tZAtbg", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "oSjApvqd006sATOwdgj9fA", + "cell_type": "markdown", + "source": [ + "# Import of Transactional Data" + ], + "metadata": {} + }, + { + "id": "_44_VnWkr0KGvFIltkjYlw", + "cell_type": "code", + "source": [ + "await UploadOpeningAsync(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-lteFKun20qSXUvjgV0Rtw", + "cell_type": "code", + "source": [ + "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "eZ5TTE-VyEqMqe4FJhoSxw", + "cell_type": "code", + "source": [ + "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "wvXE8jKoiE6GQKf0u2Ja5g", + "cell_type": "code", + "source": [ + "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "y-vXTvD7pEuT7CEINzNlxg", + "cell_type": "code", + "source": [ + "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CFPyThMEyUSs9Z01gQRMXg", + "cell_type": "markdown", + "source": [ + "# Reset Workspace" + ], + "metadata": {} + }, + { + "id": "6BRncOutP0KF8VwCVa1jYw", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qQmhez-Ep0G2G01ULLKy-g", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/InputFormatDescription.ipynb b/InputFormatDescription.ipynb new file mode 100644 index 00000000..edb44e59 --- /dev/null +++ b/InputFormatDescription.ipynb @@ -0,0 +1,113 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "l1JMz4NpDU2Lk2MWRSzYLA", + "cell_type": "markdown", + "source": [ + "

Structure of the Cashflows, Actuals and Openings Files

", + "\n", + "\nThis Notebook documents the structure of Cashflows, Actuals and Opening input files.", + "\n", + "\n", + "\n# The Cashflows File Structure ", + "\n", + "\n", + "\n
" + ], + "metadata": {} + }, + { + "id": "EHUOzfMOXkWnTeS5CUKVRg", + "cell_type": "markdown", + "source": [ + "A cashflow file is named **NominalCashflows** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Cashflow**.", + "\n", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month and Scenario for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partitions) to which the data belongs.", + "\n", + "\nThe **Cashflow** section contains the cash flow data. Several pieces of information are required to characterize a cash flow correctly:", + "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [AocType](./DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [Novelty](./DataModel/DataStructure#novelty) : entered with its SystemName,", + "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims.", + "\n", + "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](./DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", + "\n
The cash flow is entered in the columns named ValuesN where N goes from 0 to the lenght of cash flow. The Value0 corresponds to January of the Year entered in the **Main** section for every combination of AocType and Novelty. " + ], + "metadata": {} + }, + { + "id": "--aqUDIEv0Cij8PWGTssJg", + "cell_type": "markdown", + "source": [ + "", + "\n# The Actuals File Structure ", + "\n", + "\n", + "\n
" + ], + "metadata": {} + }, + { + "id": "auImDZLVDEy-rTLf8gfd_w", + "cell_type": "markdown", + "source": [ + "An Actuals file is named **Actuals** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Actual**.", + "\n", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partition) to which the data belong.", + "\n", + "\nThe **Actual** section contains the actuals data. Several pieces of information are required to to characterize an Actuals amount correctly:", + "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AocType](./DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [ValueType](./DataModel/DataStructure#amount-type) : corresponds to AmountType SystemName extended with the ExternalId,", + "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." + ], + "metadata": {} + }, + { + "id": "7spVD7c5bkejHCPT5UwVTQ", + "cell_type": "markdown", + "source": [ + "", + "\n# The Openings File Structure ", + "\n", + "\n", + "\n
" + ], + "metadata": {} + }, + { + "id": "xvO-5fBVq0CNPmlNpqDGsw", + "cell_type": "markdown", + "source": [ + "An Openings file is named **Openings** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Opening**. In an AoC for one period, we only need one file with the year/month combination of the beginning of the period. Some GICs do not need any entries in Openings.", + "\n", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partition) to which the data belong.", + "\n", + "\nThe **Opening** section contains values at opening of an analysis. Several pieces of information are required to to characterize an Opening amount correctly:", + "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [EstimateType](./DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/OverviewCalculationEngine.ipynb b/OverviewCalculationEngine.ipynb new file mode 100644 index 00000000..8fe93bea --- /dev/null +++ b/OverviewCalculationEngine.ipynb @@ -0,0 +1,258 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "n-YC5c-J-Uq-NYiRZe6gCg", + "cell_type": "markdown", + "source": [ + "

IFRS17 Calculation Engine - an Overview

" + ], + "metadata": {} + }, + { + "id": "Z0Z4HkpVQUWm6q2GfAjRhg", + "cell_type": "markdown", + "source": [ + "Version of 01 Sep 2022" + ], + "metadata": {} + }, + { + "id": "YvapB2YH1029s0tnPiMdjg", + "cell_type": "markdown", + "source": [ + "# Introduction", + "\n", + "\nThe Systemorph's IFRS 17 Calculation Engine is a solution to conduct all the essential IFRS 17 calculations based on some key inpute: modeled future **cashflows** and actual amounts, for a **groups of insurance contracts** and other relevant parameters (Yield Curve, Fx, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\n", + "\nThis notebook provides an **overview** of Systemorph's IFRS 17 Calculation Engine with brief introductions to all the main steps.", + "\n", + "\nThere are numerous **links** to several notebooks of the Calculation Engine. These notebooks contain specifications, code and also some detailed explanations with formulas in markdown blocks. The most important ones in this respect are [DataModel/DataStructure](./DataModel/DataStructure#data-structure), [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) and [ReportScopes](./Report/ReportScopes#report-scopes)." + ], + "metadata": {} + }, + { + "id": "3xZL2IO6zkqknoPSVOK6AA", + "cell_type": "markdown", + "source": [ + "", + "\n# IFRS 17", + "\n", + "\nIFRS 17 is a new accounting standard for insurance contracts. The previous standard IFRS 4, which is based on nominal accounting, is replaced by the economic accounting standard IFRS 17.", + "\n", + "\nExplanatory **videos** on **IFRS 17** and a **demo application** can be found on Systemorph's website. Some key points are repeated here briefly.", + "\n", + "\nIFRS 17 deals with insurance contracts which are on the liability side of the balance sheet. Other accounting standards deal with other parts of the business, primarily IFRS 9 for invested assets.", + "\n", + "\nInsurance policies need to be allocated to homogeneous groups of insurance contracts (GICs) according to high-level principles established by the IFRS 17 standard, such as contract type, line of business, annual cohort etc. Insurers have some degree of freedom to optmize those GICs, as long as they respect the high-level principles.", + "\n", + "\nInsurance contracts generate different types of cashflows. For example, **Amount Type** is a dimension refering to premiums, claims, expenses of different kinds, etc. for these cashflows. The Calculation Engine presented here expects input files of all the projected cashflows for each GIC, for different regular time points (quarterly or monthly, ...) and corresponding actual amounts observed for a given period. ", + "\n", + "\nEach cashflow is characterized by all the necessary attributes: business unit, start time, amount type, novelty of business etc. and projected cashflow amounts in a regular time grid until the final run-off of all contracts.", + "\n", + "\nIf the entered cashflows are nominal (the usual case), the the present value (PV) of each cashflow is computed using proper yield curves for discounting.", + "\n", + "\nA central element of IFRS 17 is the Analysis of Change (AoC). The present value of the business (future cashflows) changes from the beginning to the end of the accounting period due to different effects, each of them constituting a modeled AoC step.", + "\n", + "\nIn IFRS 17, the value of future profitable business has a component called the Contractual Service Margin (CSM), defined at GIC level. The profit measured as CSM is recognized slowly over time rather than immediately in financial performance statements. On the other hand, a GIC can be onerous and produce a Loss Component (LC) instead, which needs to be recognized immediately.", + "\n", + "\nSeveral reports on the valuation of cashflows, balance sheet and financial performance can be produced, each dealing with different aspects, such as", + "\n - Present Value of Future Cash Flows (PVFCF)", + "\n - Contractual Service Margin (CSM) and Loss Component (LC)", + "\n - Liability for Remaining Coverage (LRC)", + "\n - Liability for Incurred Claims (LIC)", + "\n - Financial Performance", + "\n - Accounting Events" + ], + "metadata": {} + }, + { + "id": "LcfKBqhuPEe9gyQfTle0Qg", + "cell_type": "markdown", + "source": [ + "", + "\n# Data Model, Data Input, Data Import", + "\n", + "\nThe IFRS 17 calculations are based on a well-defined **data model**. The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model.", + "\n", + "\nInput files as listed below are used to provide the necessary information on the business to be modeled. These files are part of the IFRS 17 Calculation Engine and can be used as templates for users intending to model their own business and adapt some files accordingly. ", + "\n", + "\nThe IFRS 17 calculations start by importing the data input files, and the more complex logic of the IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." + ], + "metadata": {} + }, + { + "id": "E1xdnYPKM0u0NqVxOjLBJw", + "cell_type": "markdown", + "source": [ + "", + "\n## Data Model", + "\n", + "\nThe data model includes the definition of reporting nodes and dimensions to be used, including identities, amount types, group of insurance contracts and many more.", + "\n", + "\nThe notebook [DataModel/DataStructure](./DataModel/DataStructure#data-structure) defines the data records, dimensions and interfaces of the data model. There is a long section on the many [dimensions](./DataModel/DataStructure#dimensions) used to characterize the business and its IFRS 17 model.", + "\n", + "\nThe [input files](#data-input-dim-nodes) ReportingNodes and especially DimensionsAndPartitions provide an overview of data structures actually used. Some dimensions are hierarchical, so some entries have parent entries.", + "\n", + "\nMany abbreviations and acronyms used later in the documentation and the code are the **system names**, where the corresponding display names can be found together with the attributes." + ], + "metadata": {} + }, + { + "id": "GGqaecTDuE6XUrAnYdsG-g", + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Reporting nodes, dimensions and partitions", + "\n", + "\nSee folders *Files* (DimensionsAndPartitions) and *Files/300.ReportingNodes* (ReportingNodes).", + "\n- **ReportingNodes**: List of business units, often per country, with system name and display name, currency and \"G\" for the whole group", + "\n- **DimensionsAndPartitions**: The many dimensions (21) required to characterize all of the data and results, with system names and display names. This information is quite stable, but some information related to partitions refers to the reporting nodes " + ], + "metadata": {} + }, + { + "id": "LhUX4L3Xc0C0rq4_Y9J6qQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Groups of insurance and reinsurance contracts", + "\n", + "\nSee folder Files/700.DataNodes. The information is about data nodes, that is Groups of Insurance Contracts (GICs) and Groups of Reinsurance Contracts (GRICs) and portfolios of these.", + "\n- **DataNodes**: List of all GICs and GRICs, each with several attributes and the portfolios to which they belong; an additional attribute of GRICs being the reinsurance partner", + "\n- **DataNodeParameters** *\\_* *\\_* *\\_*: List of those GICs and GRICs that are actually used for the given reporting node/year/month combination with few attributes; if needed, more such files may be added for other reporting node/year/month combinations", + "\n- **DataNodeStates** *\\_* *\\_* *\\_*: Switching data nodes on and off, the normal state is (\"Active\") for all the GICs and GRICs of the reporting node/year/month combination; if needed, more such files may be added for other reporting node/year/month combinations" + ], + "metadata": {} + }, + { + "id": "QMmg_-Sg9UOvWDKPIfPCqw", + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Parameters from financial markets", + "\n", + "\nSee folder Files/800.Parameters.", + "\n- **YieldCurve**: List of all yield curves to be used, for different currencies and as-of dates (year/month), using a yearly grid of interest rate maturities extending as far as needed", + "\n- **ExchangeRate**: List of exchange rates to be used, for different currencies and as-of dates (year/month), with a type (Spot/Average); defined as the value of 1 foreign unit expressed in the group currency of the insurance company ", + "\n- **CreditDefaultRate**: For relevant year/month combinations, each with a full list of all credit ratings in S&P notation with their default rate (= probabilty of default within 1 year)", + "\n- **PartnerRating**: For each reinsurance partner of a relevant GRIC, the rating in S&P notation with the as-of date (year/month)" + ], + "metadata": {} + }, + { + "id": "rVg0MlnQdkC77prbiq421A", + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Groups of insurance and reinsurance contracts", + "\n", + "\nSee folder Files/900.TransactionalData.", + "\n- **Actuals** *\\_* *\\_* *\\_*: List of all actual amounts for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types and other attributes; we need at least two such files for the two dates of the Analysis of Change", + "\n- **Openings** *\\_* *\\_* *\\_*: List of the opening amounts for some GICs that are used by the given reporting node. The year/month combination corresponds to the beginning of the planned Analysis of Change period, so only one such file is required. The entries are by EstimateType and AmountType.", + "\n- **NominalCashflows** *\\_* *\\_* *\\_*: List of all projected cash flows for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types, novelty types and other attributes, where the cash flow amounts are given in a regular sequence extending as far as needed; we need at least two such files for the two dates of the Analysis of Change", + "\n", + "\nThe structure of the [Actuals](./InputFormatDescription#actual), [Openings](./InputFormatDescription#opening) and [NominalCashflows](./InputFormatDescription#cashflow) files is explained in a special [notebook](./InputFormatDescription).", + "\n", + "\nThe less usual option of having discounted instead of nominal cash flows in the input is also supported." + ], + "metadata": {} + }, + { + "id": "JVl9TW0NJkS6zsxTFpcDXg", + "cell_type": "markdown", + "source": [ + "", + "\n## Data import and related calculations", + "\n", + "\nSeveral notebooks organize the data import. Methods for importing and accessing data are in the class [ImportStorage](./Import/ImportStorage#import-storage). Methods for further calculations to be done upon import are in [ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation).", + "\n", + "\nHowever, the import as such is conducted by other notebooks which use the methods of ImportStorage and ImportScopeCalculation in a chain of notebook imports:", + "\n", + "\nImportStorage --> ImportScopeCalculation --> [Importers](./Import/Importers#importers) --> [InitSystemorphBaseToMemory](./Initialization/InitSystemorphBaseToMemory#init-base-to-memory) --> [InitSystemorphToMemory](./Initialization/InitSystemorphToMemory#init-base-to-memory).", + "\n", + "\nThe latter two notebooks initialize and store the imported and derived data in memory for further usage. To store the data in a physical database, [InitSystemorphToDatabase](./Initialization/InitSystemorphToDatabase#init-to-database) can be employed.", + "\n", + "\nThe calculations of ImportScopeCalculation cover a large part of the IFRS 17 methodology and are explained in the section below." + ], + "metadata": {} + }, + { + "id": "oey1-V5ihE2fKiURTRNp1A", + "cell_type": "markdown", + "source": [ + "", + "\n# IFRS 17 Model Calculations", + "\n", + "\nThe notebook **[ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation)** has all the calculations to be executed upon data import. The methods used are explained there with formulas. The centerpiece is the Analysis of Change (AoC) of the insurance business over one period (here: quarter). The formulas often use acronyms (system names) as explained in the [section](#data-input-dim-nodes) on *DimensionsAndPartitions*.", + "\n", + "\nThe main concepts and parts of ImportScopeCalculation are listed here, with links.", + "\n- Structure and sequence of the **[Analysis of Change (AoC)](./Import/ImportScopeCalculation#aoc-step-structure)** steps for the given period", + "\n- **[Discounting](./Import/ImportScopeCalculation#discounting-calculation)** projected cash flows using [yield curves](#data-input-parameters) (current or locked in)", + "\n- **[Nominal](./Import/ImportScopeCalculation#nominal-values)** cash flow amounts per AoC step", + "\n- **[Present Values (PV)](./Import/ImportScopeCalculation#present-values)** of cash flow amounts for all AoC steps:", + "\n - [Cumulated discounted](./Import/ImportScopeCalculation#cumulated-discounted-cashflows) cash flow amounts for all AoC steps", + "\n - [Telescoping difference](./Import/ImportScopeCalculation#telescopic-difference) calculation of cumulated discounted cashflows per AoC step, where the total PV change over the period is the telescoping sum of all these differences", + "\n - [Present Value calculation](./Import/ImportScopeCalculation#present-value) at the beginning and end of the period, with its underlying [PV base](./Import/ImportScopeCalculation#present-value-base) calculations for different AoC types and for [current and locked-in](./Import/ImportScopeCalculation#current-and-locked) yield curves", + "\n - [Interest accretion](./Import/ImportScopeCalculation#interest-accretion) cash flow calculation (one of the AoC steps)", + "\n- **[Risk Adjustment (RA)](./Import/ImportScopeCalculation#risk-adjustment)** calculation, a requirement of the IFRS 17 standard", + "\n- **[Amortization](./Import/ImportScopeCalculation#amortization)**, the AoC step dealing with the reduction of the remaining exposure over the period:", + "\n - [Coverage Unit (CU)](./Import/ImportScopeCalculation#coverage-units), the quantity of services provided by a given GIC, considering one period (reflecting the run-off pattern of the GIC)", + "\n - [Amortization factor](./Import/ImportScopeCalculation#amortization-factor), the relative size of the amortization of a GIC, monthly and for a longer time interval", + "\n- **[Actuals](./Import/ImportScopeCalculation#actual-values)**, treatment of actual values per GIC or GRIC, distinguished according to by their Estimate Type: Ordinary Actuals, Advance Actuals, Overdue Actuals and Deferrable Actuals", + "\n - Calculation of [Actuals Base](./Import/ImportScopeCalculation#actual-base) values for a given GIC and per Estimate Type and Amount Type", + "\n - Different Estimate Types of Actuals and their calculations: Ordinary [Actuals](./Import/ImportScopeCalculation#actuals), [Advance Actuals](./Import/ImportScopeCalculation#advance-actuals) paid before the due date which is inside the AoC period, [Overdue Actuals](./Import/ImportScopeCalculation#overdue-actuals) paid after the AoC period, [Deferrable Actuals](./Import/ImportScopeCalculation#overdue-actuals) whose recognition is deferred (typically used for expenses of different kinds)", + "\n- **[Contractual Service Margin (CSM), Loss Component LC) and Loss Recovery Component (LRC)](./Import/ImportScopeCalculation#csm)**, modeling the treatment of unearned profits (CSM) and losses (LC, LRC) as required by the IFRS 17 standard, per GIC or GRIC:", + "\n - [Fulfillment Cashflow (FCF)](./Import/ImportScopeCalculation#fulfillment-cashflow), same as the aforementioned cumulated discounted cashflow, now adding the risk adjustment component as a basis for CSM and LC calculations", + "\n - [Technical Margin](./Import/ImportScopeCalculation#technical-margin), which is the FCF with special rules for different AoC steps including the Amortization step, also using and calculating the Interest Accretion Factor, Premiums, Deferrals and Investment Claims", + "\n - [Switch Logic for CSM and LC](./Import/ImportScopeCalculation#technical-margin), switching between CSM and LC for a given AoC step in the AoC period; one of the two is always zero depending on the sign of the Technical Margin; distinguishing the [gross case](./Import/ImportScopeCalculation#gross-case) (no reinsurance) from the [reinsurance case](./Import/ImportScopeCalculation#reinsurance-case) which applies reinsurance coverage weights" + ], + "metadata": {} + }, + { + "id": "BnM9Jki8OEedq18buCnW9A", + "cell_type": "markdown", + "source": [ + "", + "\n# Reports", + "\n", + "\nSeveral types of reports can be generated from the same model basis. The notebook **[ReportScopes](./Report/ReportScopes#report-scopes)** has many methods to produce different reports to be executed after the end of all data imports.", + "\n", + "\nThe reports are generated with the help of **DataCube**, a Systemorph tool that allows for the targeted retrieval of information from a large multi-dimensional (in-memory) database, selecting the desired categories, items and degrees of granularity and aggregation across different dimensions.", + "\n", + "\nSome reports of ReportScopes just present existing data from the database, namely the imported data and the results already calculated using the methods of [ImportScopes](#model-calc).", + "\n", + "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#financial-performance).", + "\n", + "\nWhile the ReportScopes notebook provides the calculation formulas for different reports, the production of reports is done by a notebook such as **[Reports](./Report/Reports#report-production)** which imports ReportScopes." + ], + "metadata": {} + }, + { + "id": "au5gK98z6EWDe-C7Wm3Img", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Report/ReportConfigurationAndUtils.ipynb b/Report/ReportConfigurationAndUtils.ipynb new file mode 100644 index 00000000..628b0f04 --- /dev/null +++ b/Report/ReportConfigurationAndUtils.ipynb @@ -0,0 +1,148 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "RcqlbIqLC0GUIOHkkIM0fA", + "cell_type": "markdown", + "source": [ + "

Report Configuration And Utils

" + ], + "metadata": {} + }, + { + "id": "JWFelad9jEy9FfjxYAaBwA", + "cell_type": "code", + "source": [ + "#!import \"../Utils/UtilityMethods\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YyjCBXNsHk2Q8c-G2NlyIA", + "cell_type": "code", + "source": [ + "using Systemorph.Vertex.Pivot.Reporting.Builder;", + "\nusing System.Collections.Immutable;", + "\n", + "\npublic static DataCubeReportBuilder, TVariable, TVariable ,TVariable> ReportGridOptions(", + "\n this DataCubeReportBuilder, TVariable, TVariable, TVariable> reportBuilder,", + "\n int reportHeight = 700,", + "\n int valueColumnWidth = 250,", + "\n int headerColumnWidth = 250,", + "\n int groupDefaultExpanded = 2)", + "\n => reportBuilder.WithGridOptions(go => go", + "\n .WithColumns(cols => cols.Modify(\"Value\",c => c.WithWidth(valueColumnWidth).WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", + "\n .WithRows(rows => rows", + "\n .Where(r => !(r.RowGroup.Coordinates.Last() == \"NullGroup\"))", + "\n .Select(r => r with { RowGroup = r.RowGroup with { Coordinates = r.RowGroup.Coordinates.Where(c => c != \"NullGroup\").ToImmutableList() } })", + "\n .ToArray())", + "\n .WithAutoGroupColumn(c => c.WithWidth(headerColumnWidth) with { Pinned = \"left\" })", + "\n with { Height = reportHeight, GroupDefaultExpanded = groupDefaultExpanded, OnGridReady = null } );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "iBIqwkn9SUCQTW4I5tiVIg", + "cell_type": "code", + "source": [ + "public static string CurrencyGrouper(CurrencyType currencyType) => currencyType switch {", + "\n CurrencyType.Contractual => \"ContractualCurrency\",", + "\n CurrencyType.Functional => \"FunctionalCurrency\",", + "\n _ => string.Empty };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "M1TrAAwxbEaxJ2r5B3SSkw", + "cell_type": "markdown", + "source": [ + "# Queries" + ], + "metadata": {} + }, + { + "id": "K7EO5RzzdUq_sjJvMccxoA", + "cell_type": "markdown", + "source": [ + "## Query Report Variables" + ], + "metadata": {} + }, + { + "id": "bRSyLeKBd0KijXxUwm4o-w", + "cell_type": "code", + "source": [ + "public static async Task> QueryReportVariablesAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", + "\n ", + "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario });", + "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario, Year = args.Year, Month = args.Month });", + "\n ", + "\n return await workspace.Query()", + "\n .Join(workspace.Query(),", + "\n dn => dn.SystemName,", + "\n iv => iv.DataNode,", + "\n (dn, iv) => new ReportVariable {", + "\n // From Args/Inputs", + "\n ReportingNode = args.ReportingNode,", + "\n Scenario = args.Scenario,", + "\n ", + "\n // From Data Node", + "\n Portfolio = dn.Portfolio,", + "\n GroupOfContract = dn.SystemName,", + "\n ", + "\n FunctionalCurrency = dn.FunctionalCurrency,", + "\n ContractualCurrency = dn.ContractualCurrency,", + "\n ", + "\n ValuationApproach = dn.ValuationApproach,", + "\n OciType = dn.OciType,", + "\n InitialProfitability = dn.Profitability,", + "\n LiabilityType = dn.LiabilityType,", + "\n AnnualCohort = dn.AnnualCohort,", + "\n LineOfBusiness = dn.LineOfBusiness,", + "\n ", + "\n // Reinsurance", + "\n IsReinsurance = dn is GroupOfReinsuranceContract, ", + "\n Partner = dn.Partner,", + "\n ", + "\n // From Variable", + "\n EstimateType = iv.EstimateType,", + "\n VariableType = iv.AocType,", + "\n Novelty = iv.Novelty,", + "\n AmountType = iv.AmountType,", + "\n EconomicBasis = iv.EconomicBasis,", + "\n ", + "\n //LIC", + "\n AccidentYear = iv.AccidentYear == null ? default : (int)iv.AccidentYear,", + "\n ", + "\n Value = iv.Value })", + "\n .ToArrayAsync();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Report/ReportScopes.ipynb b/Report/ReportScopes.ipynb new file mode 100644 index 00000000..534b3bc3 --- /dev/null +++ b/Report/ReportScopes.ipynb @@ -0,0 +1,1038 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "RC8Ga5S2p0C8yAmyjz_N-g", + "cell_type": "markdown", + "source": [ + "", + "\n

Report Scopes (IFRS17 Methodology Business Logic)

", + "\n", + "\nThis notebook contains the logic used to perform calculations upon reporting of data." + ], + "metadata": {} + }, + { + "id": "LVx2yOMaFE6N2gnro5w9Qg", + "cell_type": "markdown", + "source": [ + "# References", + "\nLibraries and other notebooks which are needed for this notebook are imported below." + ], + "metadata": {} + }, + { + "id": "9AZzZxEXwkCvLIoKhmBQlQ", + "cell_type": "markdown", + "source": [ + "## Notebooks" + ], + "metadata": {} + }, + { + "id": "MTpy2cXeG0GmCbe_aOWmBw", + "cell_type": "code", + "source": [ + "#!import \"ReportStorage\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "upikmN8zjU-hYfL_NTHY1A", + "cell_type": "markdown", + "source": [ + "# Scopes" + ], + "metadata": {} + }, + { + "id": "Zs3wCzFnZ0mgnoovzVtI4g", + "cell_type": "markdown", + "source": [ + "## Helper Scopes" + ], + "metadata": {} + }, + { + "id": "kMmCRDkymECPHAt_8qMONw", + "cell_type": "markdown", + "source": [ + "### Universe" + ], + "metadata": {} + }, + { + "id": "09cKY7l-c0WdVsk5Eqhscw", + "cell_type": "code", + "source": [ + "public interface IUniverse: IScopeWithStorage {}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KadX2iXWl02PhqX5WatT_A", + "cell_type": "markdown", + "source": [ + "## Data Transformation" + ], + "metadata": {} + }, + { + "id": "syVjSAh1tEazuQzXYkPajw", + "cell_type": "markdown", + "source": [ + "### Retrieve Raw Data" + ], + "metadata": {} + }, + { + "id": "MRPDIFQlykKNky6h_5dzzg", + "cell_type": "code", + "source": [ + "public interface Data: IScope<(ReportIdentity ReportIdentity, string EstimateType), ReportStorage>, IDataCube {", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().EstimateTypesWithoutAoc.Contains(x.Identity.EstimateType)));", + "\n ", + "\n protected IDataCube RawData => GetStorage().GetVariables(Identity.ReportIdentity, Identity.EstimateType);", + "\n", + "\n private IDataCube RawEops => RawData.Filter((\"VariableType\", AocTypes.EOP));", + "\n private IDataCube NotEopsNotCls => RawData.Filter((\"VariableType\", \"!EOP\"),(\"VariableType\", \"!CL\")); // TODO negation must be hardcoded (also to avoid string concatenation)", + "\n ", + "\n private IDataCube CalculatedCl => (RawEops - NotEopsNotCls)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = AocTypes.CL });", + "\n ", + "\n private IDataCube CalculatedEops => (NotEopsNotCls + CalculatedCl)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => x with { VariableType = AocTypes.EOP, Novelty = Novelties.C });", + "\n ", + "\n IDataCube Data => NotEopsNotCls + CalculatedCl + CalculatedEops;", + "\n}", + "\npublic interface DataWrittenActual: Data {", + "\n IDataCube Data.Data => RawData;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yus8OX8BukyLFOjUwOQLLA", + "cell_type": "markdown", + "source": [ + "### Foreign Exchange (FX) Rates" + ], + "metadata": {} + }, + { + "id": "cJq9jrxRrEitDC2cNGnQLg", + "cell_type": "code", + "source": [ + "public interface Fx: IScope<(string ContractualCurrency, string FunctionalCurrency, FxPeriod FxPeriod, (int, int) Period, CurrencyType CurrencyType), ReportStorage> { ", + "\n private double groupFxRate => Identity.CurrencyType switch {", + "\n CurrencyType.Group => GetStorage().GetFx(Identity.Period, Identity.FunctionalCurrency, GroupCurrency, FxPeriod.Average),", + "\n _ => 1", + "\n };", + "\n ", + "\n private double GetFunctionalFxRate(FxPeriod fxPeriod) => Identity.CurrencyType switch {", + "\n CurrencyType.Contractual => 1,", + "\n _ => GetStorage().GetFx(Identity.Period, Identity.ContractualCurrency, Identity.FunctionalCurrency, fxPeriod)", + "\n };", + "\n ", + "\n double Fx => GetFunctionalFxRate(Identity.FxPeriod) * groupFxRate;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "sFdrnO2l-kaXQVOwaTfu4Q", + "cell_type": "code", + "source": [ + "public interface FxData: IScope<(ReportIdentity ReportIdentity, CurrencyType CurrencyType, string EstimateType), ReportStorage>, IDataCube {", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().EstimateTypesWithoutAoc.Contains(x.Identity.EstimateType)));", + "\n ", + "\n protected IDataCube Data => GetScope((Identity.ReportIdentity, Identity.EstimateType)).Data", + "\n .SelectToDataCube(x => GetScope((Identity.ReportIdentity.ContractualCurrency, ", + "\n Identity.ReportIdentity.FunctionalCurrency, ", + "\n GetStorage().GetFxPeriod(GetStorage().Args.Period, x.VariableType, x.Novelty),", + "\n (Identity.ReportIdentity.Year, Identity.ReportIdentity.Month),", + "\n Identity.CurrencyType", + "\n )).Fx * x);", + "\n ", + "\n private IDataCube Eops => Data.Filter((\"VariableType\", AocTypes.EOP));", + "\n private IDataCube NotEops => Data.Filter((\"VariableType\", \"!EOP\")); // TODO negation must be hardcoded (also to avoid string concatenation)", + "\n ", + "\n private IDataCube Fx => (Eops - NotEops)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = AocTypes.FX });", + "\n ", + "\n IDataCube FxData => Data + Fx;", + "\n}", + "\n", + "\npublic interface FxDataWrittenActual: FxData {", + "\n IDataCube FxData.FxData => Data;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "c-y9Rq20yU-c1k-zkJbtZA", + "cell_type": "markdown", + "source": [ + "## Present Value" + ], + "metadata": {} + }, + { + "id": "uD97mWuNn0i7IDWGmZcNvQ", + "cell_type": "markdown", + "source": [ + "", + "\n### Best Estimate", + "\n", + "\nBest Estimate of Present Value (PV) report includes contributions from the [Present Value](../Import/ImportScopeCalculation#current-and-locked) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." + ], + "metadata": {} + }, + { + "id": "JgpSiRtFuEmUmFnBtZdTRA", + "cell_type": "code", + "source": [ + "public interface BestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube BestEstimate => Identity.Id switch {", + "\n { ValuationApproach: ValuationApproaches.BBA, IsOci: true } => GetScope(Identity).LockedBestEstimate,", + "\n _ => GetScope(Identity).CurrentBestEstimate };", + "\n}", + "\n", + "\npublic interface LockedBestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube LockedBestEstimate => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BE)).FxData", + "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.L));", + "\n}", + "\n", + "\npublic interface CurrentBestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube CurrentBestEstimate => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BE)).FxData", + "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.C));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "o4YOxEue9U2IsUWtpQRwNg", + "cell_type": "markdown", + "source": [ + "", + "\n### Risk Adjustment", + "\n", + "\nRisk Adjustment (RA) report includes contributions from the [Risk Adjustment](../Import/ImportScopeCalculation#risk-adjustment) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." + ], + "metadata": {} + }, + { + "id": "j6tStuZslUWvsTYy34vFCQ", + "cell_type": "code", + "source": [ + "public interface RiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube RiskAdjustment => Identity.Id switch {", + "\n { ValuationApproach: ValuationApproaches.BBA, IsOci: true } => GetScope(Identity).LockedRiskAdjustment,", + "\n _ => GetScope(Identity).CurrentRiskAdjustment };", + "\n}", + "\n", + "\npublic interface LockedRiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube LockedRiskAdjustment => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.RA)).FxData", + "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.L));", + "\n}", + "\n", + "\npublic interface CurrentRiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube CurrentRiskAdjustment => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.RA)).FxData", + "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.C));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "P-vfX_L3rkW_9Lmf31RxpA", + "cell_type": "markdown", + "source": [ + "", + "\n## Fulfillment Cashflows", + "\nFulfillment Cashflows (FCF) report includes contributions from the [Best Estimate](#best-estimate) of Present Value and [Risk Adjustment](#risk-adjustment) Present Value." + ], + "metadata": {} + }, + { + "id": "KK0mF25Mf0aFBgqRlpZL9g", + "cell_type": "code", + "source": [ + "public interface Fcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube BestEstimate => GetScope(Identity).BestEstimate;", + "\n private IDataCube RiskAdjustment => GetScope(Identity).RiskAdjustment;", + "\n ", + "\n IDataCube Fcf => BestEstimate + RiskAdjustment;", + "\n}", + "\n", + "\npublic interface CurrentFcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube { ", + "\n private IDataCube BestEstimate => GetScope(Identity).CurrentBestEstimate;", + "\n private IDataCube RiskAdjustment => GetScope(Identity).CurrentRiskAdjustment;", + "\n ", + "\n IDataCube CurrentFcf => BestEstimate + RiskAdjustment;", + "\n}", + "\n", + "\npublic interface LockedFcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube { ", + "\n private IDataCube BestEstimate => GetScope(Identity).LockedBestEstimate;", + "\n private IDataCube RiskAdjustment => GetScope(Identity).LockedRiskAdjustment;", + "\n ", + "\n IDataCube LockedFcf => BestEstimate + RiskAdjustment;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BnSosIcbCUqw1lbDI0LxPw", + "cell_type": "markdown", + "source": [ + "", + "\n## LRC Technical Margin: CSM, LC, LoReCo", + "\n", + "\nContractual Service Margin (CSM), Loss Component (LC), Loss Recovery Component (LoReCo) reports of the Liability for Remaining Coverage (LRC) include contributions from the calculation of [CSM](../Import/ImportScopeCalculation#csm), [LC](../Import/ImportScopeCalculation#csm), and [LoReCo](../Import/ImportScopeCalculation#csm), respectively." + ], + "metadata": {} + }, + { + "id": "ZPTctq2WjkinG6niMamqoA", + "cell_type": "code", + "source": [ + "public interface Csm: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Csm => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.C)).FxData;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "cG4TSd1LZ0iIWMjgLaB7iA", + "cell_type": "code", + "source": [ + "public interface Lc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Lc => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.L)).FxData;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2pNl3ECznUOsfhcu-OWIPQ", + "cell_type": "code", + "source": [ + "public interface Loreco: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Loreco => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.LR)).FxData;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "t2D8_dXH90uK90VYE8I_Fg", + "cell_type": "code", + "source": [ + "public interface LrcTechnicalMargin: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube Csm => GetScope(Identity).Csm;", + "\n private IDataCube Lc => GetScope(Identity).Lc;", + "\n private IDataCube Loreco => GetScope(Identity).Loreco;", + "\n ", + "\n IDataCube LrcTechnicalMargin => Lc + Loreco - 1 * Csm;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QXA-wNeyfkStz-eabLqYkw", + "cell_type": "markdown", + "source": [ + "", + "\n## Written, Accruals and Deferrals ", + "\n", + "\nWritten Actual (Actual) report includes contributions from the [Actual](../Import/ImportScopeCalculation#actuals) import. ", + "\n
Accrual Actuals (Advance, Overdue Actual) report includes contributions from the [Advance](../Import/ImportScopeCalculation#advance-actuals) and [Overdue](../Import/ImportScopeCalculation#overdue-actuals) Actual calculation.", + "\n
Deferral (Deferral Actual) report includes contributions from the calculation of [Deferral](../Import/ImportScopeCalculation#deferrable-actuals) Actual." + ], + "metadata": {} + }, + { + "id": "6oQzlalJiEKtr4FVgbf30g", + "cell_type": "code", + "source": [ + "public interface WrittenAndAccruals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Written => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.A)).FxData;", + "\n IDataCube Advance => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.AA)).FxData;", + "\n IDataCube Overdue => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.OA)).FxData;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ezZf5dedgUuHkuUp-bBDDg", + "cell_type": "code", + "source": [ + "public interface Deferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Deferrals => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.DA)).FxData;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "FSsDY7cH70S2Lu3yXeXw3w", + "cell_type": "markdown", + "source": [ + "## Experience Adjustment", + "\n", + "\nExperience Adjustment (EA) report includes contributions from the [Written](#written-accrual-deferral) Actual report and the [Best Estimate](#best-estimate) of Present Value report (only the *Cash flow* AocStep). " + ], + "metadata": {} + }, + { + "id": "JRn9_o5AL06364MC1z7Fkg", + "cell_type": "code", + "source": [ + "public interface ExperienceAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube WrittenCashflow => GetScope(Identity).Written", + "\n .Filter((\"VariableType\", AocTypes.CF));", + "\n ", + "\n private IDataCube BestEstimateCashflow => GetScope(Identity).BestEstimate", + "\n .Filter((\"VariableType\", AocTypes.CF))", + "\n .SelectToDataCube(rv => rv with { EconomicBasis = null, Novelty = Novelties.C });", + "\n", + "\n IDataCube ActuarialExperienceAdjustment => WrittenCashflow - BestEstimateCashflow;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9YDqvT60sUuBmJmZL-tF7w", + "cell_type": "markdown", + "source": [ + "", + "\n## LIC Actuarial (Actuarial Liability for Incurred Claims)", + "\n", + "\nLiability of Incurred Claims (LIC Actuarial) report includes the contributions from [Fulfillment cashflow](#fulfillment-cashflows)." + ], + "metadata": {} + }, + { + "id": "N9PQzPef10meQscdc39AtQ", + "cell_type": "code", + "source": [ + "public interface LicActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube LicActuarial => GetScope(Identity).CurrentFcf.Filter((\"LiabilityType\", LiabilityTypes.LIC));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BWNVgJ7kVUuivi0spCqfcw", + "cell_type": "markdown", + "source": [ + "## LIC (Liability for Incurred Claims)", + "\n", + "\nLiability of Incurred Claims (LIC) report includes the contributions from [Lic Actuarial](#lic-actuarial) (Fullfilment Cashflow), [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." + ], + "metadata": {} + }, + { + "id": "TDQUKQ-ZLEuPyI1q0ZU9yg", + "cell_type": "code", + "source": [ + "public interface Lic: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube licActuarial => GetScope(Identity).LicActuarial;", + "\n private IDataCube accrual => GetScope(Identity).Advance.Filter((\"LiabilityType\", LiabilityTypes.LIC)) + ", + "\n GetScope(Identity).Overdue.Filter((\"LiabilityType\", LiabilityTypes.LIC));", + "\n private IDataCube licData => licActuarial + accrual;", + "\n ", + "\n private IDataCube bop => licData.Filter((\"VariableType\", AocTypes.BOP));", + "\n private IDataCube delta => licData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = \"D\" });", + "\n private IDataCube eop => licData.Filter((\"VariableType\",AocTypes.EOP));", + "\n ", + "\n IDataCube Lic => bop + delta + eop;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jFBlyVq-A0G7tmw5YdUm2Q", + "cell_type": "markdown", + "source": [ + "", + "\n## LRC Actuarial (Actuarial Liability for Remaining Coverage)", + "\n", + "\nLiability for Remaining Coverage (LRC) report includes all the contributions from [Fulfillment cashflow](#fulfillment-cashflows), [Contructual Sevice Margin](#technical-margin), [Loss Component](#technical-margin), and [Loss Recovery Component](#technical-margin)." + ], + "metadata": {} + }, + { + "id": "Nh6Na96xYkGFXBLGuTXAWQ", + "cell_type": "code", + "source": [ + "public interface LrcActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube Fcf => GetScope(Identity).CurrentFcf.Filter((\"LiabilityType\", LiabilityTypes.LRC));", + "\n private IDataCube Csm => GetScope(Identity).Csm;", + "\n private IDataCube Loreco => GetScope(Identity).Loreco;", + "\n ", + "\n IDataCube LrcActuarial => Fcf + Csm + Loreco;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ivAB2SOatESuXm7mpgcW5w", + "cell_type": "markdown", + "source": [ + "## LRC (Liability for Remaining Coverage)", + "\n", + "\nLiability for Remaining Coverage (LRC) report includes all the contributions from [LRC Actuarial](#lrc-actuarial) (Fulfillment Cashflow, Contructual Sevice Margin, Loss Component, Loss Recovery Component) and, [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." + ], + "metadata": {} + }, + { + "id": "G1fG1yC8kEyGuJfovw39HA", + "cell_type": "code", + "source": [ + "public interface Lrc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube lrcActuarial => GetScope(Identity).LrcActuarial;", + "\n private IDataCube accrual => GetScope(Identity).Advance.Filter((\"LiabilityType\", LiabilityTypes.LRC)) + ", + "\n GetScope(Identity).Overdue.Filter((\"LiabilityType\", LiabilityTypes.LRC));", + "\n private IDataCube lrcData => lrcActuarial + accrual;", + "\n ", + "\n private IDataCube bop => lrcData.Filter((\"VariableType\",AocTypes.BOP));", + "\n private IDataCube delta => lrcData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = \"D\" });", + "\n private IDataCube eop => lrcData.Filter((\"VariableType\",AocTypes.EOP));", + "\n ", + "\n IDataCube Lrc => bop + delta + eop;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "q-X5STJu20-7PdTNWxysqg", + "cell_type": "markdown", + "source": [ + "", + "\n# IFRS 17 Financial Performance" + ], + "metadata": {} + }, + { + "id": "_F85lUYI8USa7GLuh0CFYA", + "cell_type": "markdown", + "source": [ + "The IFRS 17 Financial Performance aims at disclosing the deltas (i.e. difference between EoP and BoP, or the Change in Estimate) of the IFRS 17 Balance Sheet items (LRC, LIC) and the relevant incurred cashflows (Premiums, Claims, Expenses, etc...) for the given period.", + "\n", + "\nIn addition, the IFRS 17 Financial Performance must split the results into at least 4 distinct sections:", + "\n - Insurance Revenue ($IR$)", + "\n - Insurance Service Expense ($ISE$)", + "\n - Insurance Finance Income/Expense ($IFIE$)", + "\n - Other Comprehensive Income ($OCI$)", + "\n", + "\nThese can be structured in a hierarchy, such that aggregation and intermediate results can be shown separately.", + "\nAlso the granularity for some relevant items (e.g. Gross LRC vs Reinsurance LRC) must be split into the different sections, as the notion of Insurance Revenue and Insurance Service Expense must be consistent.", + "\n", + "\nThe overall formulas for each of the sections above are as follows:", + "\n$$", + "\n\\begin{array}{rl}", + "\nIR =& -\\Delta \\text{ Gross Non-Financial LRC } - \\text{ Incurred Incoming Cashflows } - \\text{ Claims Investment Component } + \\text{ Amortization of the Insurance Acquisition Cashflows} - \\text{ Experience Adjustment On Premium }", + "\n\\\\", + "\nISE =& -\\Delta \\text{ Reinsurance Non-Financial LRC } - \\Delta \\text{ Non-Financial LIC } - \\Delta \\text{ Loss Component } - \\text{ Incurred Outgoing Cashflows } - \\text{ Amortization of the Insurance Acquisition Cashflows}", + "\n\\\\", + "\nIFIE =& -\\Delta \\text{ Financial LRC } - \\Delta \\text{ Financial LIC }", + "\n\\\\", + "\nOCI =& \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Valuation Rates } + \\Delta \\text{ LIC at Valuation Rates } - \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Current Rates } - \\Delta \\text{ LIC at Current Rates }", + "\n\\end{array}", + "\n$$", + "\n", + "\nFor CSM, LC and LoReCo (and implicit Amortization Factors / Coverage Units), the yield curve used is according to the methodology choice (e.g. BBA uses Locked-In rates). ", + "\n", + "\nThe Fulfillment Cashflows components for LIC and LRC are discounted using the appropriate yield curve (Locked-In or Current) according to the choice of the OCI option and methodology. We can distinguish 2 cases for the Building Block approach (BBA):", + "\n - BBA, OCI option ***disabled***: FCF computed using Current rates", + "\n - BBA, OCI option ***enabled***: FCF computed using Locked-In rates", + "\n", + "\nIn the case when the OCI option is disabled, the OCI contribution is zero. Otherwise, we have:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\nOCI =& \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Locked-In Rates } + \\Delta \\text{ LIC at Locked-In Rates } - \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Current Rates } - \\Delta \\text{ LIC at Current Rates }", + "\n\\end{array}", + "\n$$", + "\n", + "\nUsually, some more details on the items above are desired (e.g. separating the LRC into its components FCF, RA, CSM/LC or explicitly showing the CSM Amortization vs. other financial/non-financial adjustments to the CSM estimation). These are specific to each implementation and depend on the data granularity (e.g. how the Amount Types, AoC steps are detailed and structured). This level of detail is omitted from the generic documentation presented here, but are implicit to the way each item above is calculated. Nevertheless, this extra granularity is available when the reports are generated and sliced by the corresponding dimensions. " + ], + "metadata": {} + }, + { + "id": "yUjR-vS6yUm5Enx3ZvkzIA", + "cell_type": "markdown", + "source": [ + "## Fulfillment Cashflows (excluding the Loss Component)" + ], + "metadata": {} + }, + { + "id": "y-_vkbeDdk-drcNsqFxKgw", + "cell_type": "markdown", + "source": [ + "Let us first describe the Balance Sheet items, where we need to disclose the Changes in Estimate in the Financial Performance.", + "\nAs mentioned, often the LRC and LIC contributions are broken down into smaller parts for disclosure and reconciliation purposes.", + "\n", + "\nThe Fulfillment Cashflows (which may include onerous contributions in some interpretations when a Loss Component is defined) contributions to the Financial Performance (Insurance Result and OCI) are detailed below.", + "\nThe main requisite is to ensure the right mapping of its non-financial and financial components into the appropriate sections of the Financial Performance.", + "\n", + "\nFurthermore, we also need to distinguish the Reinsurance contributions to the LRC, as they are considered to be expenses and not revenue.", + "\nThe OCI contribution is also performed here, as the only contributions to the OCI come from the FCF under the current methodology assumptions.", + "\nTo all contributions a sign flip is applied. ", + "\n", + "\nIn particular: ", + "\n- Financial component includes the AocType Interest Accreation, Yield Curve Update, and Credit Risk Update,", + "\n- Non-Financial component includes all the remaining AocTypes.", + "\n- Oci component includes the difference between the movement occured in the period computed applying the discounting with the current yield curve and the discounting with the locked-in yield curve.", + "\n", + "\nThe Financial contributions are reported in 'Financial LIC Changes' for a Group of Contract with Liability Type LIC and to 'Financial LRC Changes' for a Group of Contract with Liability Type LRC.", + "\n
The Non Financial contributions are reported in 'Non Financial LIC Changes' for a Group of Contract with Liability Type LIC. For a Group of Contract with Liability Type LRC, they are reported in 'Non-Financial LRC Changes (Exc. CSM Amortization)' for a Group of Insurance Contract and in 'Non-Financial Reinsurance LRC Changes (Exc. LC/LoReCo)' for a Group of Reinsurance Contract.", + "\n
The Oci contributions are reported in the 'Other Comprehensive Income' section under 'Financial LIC Changes' or a Group of Contract with Liability Type LIC and to 'Financial LRC Changes' for a Group of Contract with Liability Type LRC." + ], + "metadata": {} + }, + { + "id": "WkhNSKUFjkaCCaIOupDs4w", + "cell_type": "code", + "source": [ + "public interface FcfChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube FcfDeltas => GetScope(Identity).Fcf.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).Fcf.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n ", + "\n private IDataCube CurrentFcfDeltas => GetScope(Identity).CurrentFcf.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).CurrentFcf.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n", + "\n // Non-Financial Fp", + "\n private string variableTypeNonFinancial => Identity.Id switch {", + "\n { LiabilityType: LiabilityTypes.LRC, IsReinsurance: false } => \"IR5\",", + "\n { LiabilityType: LiabilityTypes.LRC, IsReinsurance: true } => \"ISE10\",", + "\n { LiabilityType: LiabilityTypes.LIC } => \"ISE12\"", + "\n };", + "\n ", + "\n private IDataCube NonFinancialFcfDeltas => FcfDeltas", + "\n .Filter((\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")); ", + "\n ", + "\n IDataCube FpNonFinancial => -1 * NonFinancialFcfDeltas", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeNonFinancial }); ", + "\n ", + "\n // Financial Fp", + "\n private string variableTypeFpFinancial => Identity.Id switch {", + "\n { LiabilityType: LiabilityTypes.LRC } => \"IFIE1\",", + "\n { LiabilityType: LiabilityTypes.LIC } => \"IFIE2\",", + "\n };", + "\n ", + "\n // OCI ", + "\n private string variableTypeOciFinancial => Identity.Id switch {", + "\n { LiabilityType: LiabilityTypes.LRC } => \"OCI1\",", + "\n { LiabilityType: LiabilityTypes.LIC } => \"OCI2\",", + "\n };", + "\n ", + "\n private IDataCube FinancialFcfDeltas => FcfDeltas.Filter((\"VariableType\", AocTypes.IA)) + ", + "\n FcfDeltas.Filter((\"VariableType\", AocTypes.YCU)) +", + "\n FcfDeltas.Filter((\"VariableType\", AocTypes.CRU));", + "\n ", + "\n IDataCube FpFinancial => -1 * FinancialFcfDeltas", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeFpFinancial});", + "\n", + "\n IDataCube OciFinancial => (FcfDeltas - CurrentFcfDeltas)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeOciFinancial});", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MlJhmth_qkiiKsC8XSxAdw", + "cell_type": "markdown", + "source": [ + "Subsequently, the Contractual Service Margin (CSM), Loss Component (LC) and Loss Recovery Component (LoReCo) are also divided into non-financial and financial components. In addition the corresponding amortization/releases (CSM Amortization, LC Release and LoReCo Release) are also explicitly shown." + ], + "metadata": {} + }, + { + "id": "yqLNUINQEk2fACiFnKzGhg", + "cell_type": "markdown", + "source": [ + "## Contractual Service Margin (CSM)", + "\n", + "\nCsm contributes to the 'Insurance Revenue' in the case of a Group of Insurance Contract and to the 'Insurance Service Expense' in the case of a Group of Reinsurance Contract and to the 'Insurance Finance Income/Expense'. To all contributions a sign flip is applied. ", + "\nIn particular, the CSM figures are separated in three cathegories: ", + "\n- Amortization (including to AocType Amortization),", + "\n- Financial contributions (including the AocTypes Interest Accreation, Yield Curve Update, and Credit Risk Update),", + "\n- Non Financial contributions (including all the remaining AocTypes).", + "\n", + "\n
The Amortization contribution is reported in 'Insurance Revenue' under 'CSM Amortization' or in 'Insurance Service Expense' under 'Reinsurance CSM Amortization' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively. ", + "\n
The Financial contributions are reported in 'Financial LRC Changes'.", + "\n
The Non Financial contributions are reported in 'Non-Financial LRC Changes (Exc. CSM Amortization)' and 'Non-Financial Reinsurance LRC Changes (Exc. LC/LoReCo)' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively. " + ], + "metadata": {} + }, + { + "id": "JZhM9-mDEUKaqcD8QoIvCg", + "cell_type": "code", + "source": [ + "public interface CsmChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n ", + "\n private (string amortization, string nonFinancial) variableType => Identity.Id switch {", + "\n { IsReinsurance: false} => (\"IR3\", \"IR5\"),", + "\n { IsReinsurance: true } => (\"ISE7\", \"ISE10\")", + "\n };", + "\n ", + "\n private IDataCube Csm => GetScope(Identity).Csm.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).Csm.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n ", + "\n IDataCube Amortization => -1 * Csm.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = variableType.amortization });", + "\n ", + "\n IDataCube NonFinancialChanges => -1 * Csm", + "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = variableType.nonFinancial });", + "\n ", + "\n IDataCube FinancialChanges => -1 * (Csm.Filter((\"VariableType\", AocTypes.IA)) +", + "\n Csm.Filter((\"VariableType\", AocTypes.YCU)) +", + "\n Csm.Filter((\"VariableType\", AocTypes.CRU)) )", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yylNI472I0u4OuR1Bllheg", + "cell_type": "markdown", + "source": [ + "## Loss Component (LC)", + "\n", + "\nLC contributes to the 'Insurance Service Expense' and to the 'Insurance Finance Income/Expense'. To all contributions a sign flip is applied. ", + "\nIn particular, the LC figures are separated in three cathegories: ", + "\n- Amortization (including to AocType Amortization),", + "\n- Financial contributions (including the AocTypes Interest Accreation, Yield Curve Update, and Credit Risk Update),", + "\n- Non Financial contributions (including all the remaining AocTypes).", + "\n", + "\n
The Amortization contribution is reported in 'Loss Component Release'.", + "\n
The Financial contributions are reported in 'Financial LRC Changes'.", + "\n
The Non Financial contributions are reported in 'Loss Component / LoReCo Changes (Exc. Releases)'." + ], + "metadata": {} + }, + { + "id": "52YpETmY1kmKN_CcZj4cpw", + "cell_type": "code", + "source": [ + "public interface LcChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n ", + "\n private IDataCube Lc => GetScope(Identity).Lc.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).Lc.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n ", + "\n IDataCube Amortization => -1 * Lc.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = \"ISE9\" });", + "\n ", + "\n IDataCube NonFinancialChanges => -1 * Lc", + "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE11\" });", + "\n ", + "\n IDataCube FinancialChanges => -1 * (Lc.Filter((\"VariableType\", AocTypes.IA)) +", + "\n Lc.Filter((\"VariableType\", AocTypes.YCU)) +", + "\n Lc.Filter((\"VariableType\", AocTypes.CRU)) )", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1-0UxQCxX0-LKLJ0MCCYUw", + "cell_type": "markdown", + "source": [ + "## Loss Recovery Component (LoReCo)", + "\n", + "\nLoReCo contributes to the 'Insurance Service Expense' and to the 'Insurance Finance Income/Expense'. To all contributions a sign flip is applied. ", + "\nIn particular, the LoReCo figures are separated in three cathegories: ", + "\n- Amortization (including to AocType Amortization),", + "\n- Financial contributions (including the AocTypes Interest Accreation, Yield Curve Update, and Credit Risk Update),", + "\n- Non Financial contributions (including all the remaining AocTypes).", + "\n", + "\n
The Amortization contribution is reported in 'LoReCo Release'.", + "\n
The Financial contributions are reported in 'Financial LRC Changes'.", + "\n
The Non Financial contributions are reported in 'Loss Component / LoReCo Changes (Exc. Releases)'." + ], + "metadata": {} + }, + { + "id": "d6UE4RWht0uRmVVVLSV2VA", + "cell_type": "code", + "source": [ + "public interface LorecoChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n ", + "\n private IDataCube Loreco => GetScope(Identity).Loreco.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).Loreco.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n ", + "\n IDataCube Amortization => -1 * Loreco.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = \"ISE8\" });", + "\n ", + "\n IDataCube NonFinancialChanges => -1 * Loreco", + "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE11\" });", + "\n ", + "\n IDataCube FinancialChanges => -1 * (Loreco.Filter((\"VariableType\", AocTypes.IA)) +", + "\n Loreco.Filter((\"VariableType\", AocTypes.YCU)) +", + "\n Loreco.Filter((\"VariableType\", AocTypes.CRU)) )", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Ugt3GrQOf0Or0r17sFKx6Q", + "cell_type": "markdown", + "source": [ + "## Incurred Actuals" + ], + "metadata": {} + }, + { + "id": "zhrluPCsVUSl09Ib5324jA", + "cell_type": "markdown", + "source": [ + "After the main Balance Sheet items, we need to disclose the Incurred Cashflows (i.e. Actuals) for the period in the Financial Performance (which includes the effect of Advance and Overdue Accruals, but Write-Off amounts are not taken into account).", + "\nAs another requirement, we exclude any investment components explicitly.", + "\n", + "\nThese contributions are splitted by Amount Type to the following sections:", + "\n- Premiums contributions are reported under 'Insurance Revenue' in 'Premiums' section or in 'Insurance Service Expense' under 'Reinsurance Premiums' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively,", + "\n- Claims Non-Investment Component contributions are reported under 'Insurance Revenue' in 'Claims' section,", + "\n- Claims Investment Component contributions are reported under 'Insurance Service Expense' in 'Acquisition Expenses' section and under 'Insurance Revenue' in 'Exc. Investment Components' section with a sign change,", + "\n- Expenses contributions are reported under 'Insurance Service Expense' in 'Expenses' section,", + "\n- Commissions contributions are reported under 'Insurance Service Expense' in 'Commissions' section." + ], + "metadata": {} + }, + { + "id": "UfES8juT2kSi22gODGLDCw", + "cell_type": "code", + "source": [ + "public interface IncurredActuals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube WrittenAndAccruals => GetScope(Identity).Filter((\"VariableType\", \"CF\"));", + "\n ", + "\n private string premiumsVariableType => Identity.Id switch {", + "\n { IsReinsurance: false} => \"IR1\",", + "\n { IsReinsurance: true } => \"ISE1\"", + "\n }; ", + "\n ", + "\n IDataCube Premiums => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.PR))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = premiumsVariableType });", + "\n ", + "\n IDataCube ClaimsNic => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.NIC))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE2\" });", + "\n ", + "\n private IEnumerable ClaimsIco => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.ICO));", + "\n ", + "\n IDataCube ClaimsIcoToIr => ClaimsIco.SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR2\" });", + "\n IDataCube ClaimsIcoToIse => (-1 * ClaimsIco).SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE5\" });", + "\n ", + "\n IDataCube Expenses => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.AE))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE3\" });", + "\n", + "\n IDataCube Commissions => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.AC))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE4\" });", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LwsvN0yOSkCOVRXLN381JQ", + "cell_type": "markdown", + "source": [ + "## Incurred Deferrals and Acquisition Expenses" + ], + "metadata": {} + }, + { + "id": "wiPCBpKmKUq9k5vGf5XfNg", + "cell_type": "markdown", + "source": [ + "The next item are the Deferrals, where the Amortization is the only contribution explicitly shown, but these do not have any direct impact on the Financial Performance under the current methodology assumptions. The Amortization contribution is here considered with its sign changed. This contribution is allocated under 'Insurance Service Expense' in 'Acquisition Expenses' section and under 'Insurance Revenue' in 'Acquistion Expenses Amortization' section with a sign change. " + ], + "metadata": {} + }, + { + "id": "aSfW_K2sMkiui5Kyu0MiDA", + "cell_type": "code", + "source": [ + "public interface IncurredDeferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube Deferrals => GetScope(Identity).Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\"));", + "\n ", + "\n private IDataCube Amortization => -1 * Deferrals", + "\n .Filter((\"VariableType\", AocTypes.AM));", + "\n ", + "\n IDataCube AmortizationToIr => (-1 * Amortization).SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR4\" });", + "\n IDataCube AmortizationToIse => Amortization.SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE6\" });", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "SOtkVo0ffEKckF0hH2Q6YQ", + "cell_type": "markdown", + "source": [ + "## Experience Adjustment on Premium (allocation to CSM vs P&L recognition)" + ], + "metadata": {} + }, + { + "id": "Pgc61JA6rU6RdoGTvHFhIQ", + "cell_type": "markdown", + "source": [ + "The figures disclosed in the Financial Performance as described above consider full Premiums for past, current and future services (for Best Estimate and Actuals).", + "\nHowever, we applied the Premium Allocation factor in the CSM computations to adjust for the experience. To correct this, we need to exclude the Experience Adjustment on Premium part in the Financial Performance to avoid double counting and it is allocated under 'Insurance Revenue' in the 'Exc. Experience Adjustment on Premiums' section." + ], + "metadata": {} + }, + { + "id": "3rmklNkYPkSHioMl14xxiw", + "cell_type": "code", + "source": [ + "public interface ExperienceAdjustmentOnPremium: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube WrittenPremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.APA)).FxData;", + "\n private IDataCube AdvancePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.AAPA)).FxData;", + "\n private IDataCube OverduePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.OAPA)).FxData;", + "\n private IDataCube BestEstimatePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BEPA)).FxData;", + "\n ", + "\n IDataCube ExperienceAdjustmentOnPremium => (WrittenPremiumToCsm + AdvancePremiumToCsm + OverduePremiumToCsm - BestEstimatePremiumToCsm)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR6\" });", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zr-GVPs8uUWdzPGwaINBrQ", + "cell_type": "markdown", + "source": [ + "## Financial Performance" + ], + "metadata": {} + }, + { + "id": "-aWqJjLyD0qw69pCfTydUg", + "cell_type": "markdown", + "source": [ + "As the last step, all the contributions above are calculated and combined into the Financial Performance, which will be used to generate the final report." + ], + "metadata": {} + }, + { + "id": "3eqY3uzwA0aCp5NOV-TpWw", + "cell_type": "code", + "source": [ + "public interface FinancialPerformance: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n ", + "\n private IDataCube FcfChangeInEstimate => GetScope(Identity);", + "\n private IDataCube CsmChangeInEstimate => GetScope(Identity);", + "\n private IDataCube LcChangeInEstimate => GetScope(Identity);", + "\n private IDataCube LorecoChangeInEstimate => GetScope(Identity);", + "\n private IDataCube IncurredActuals => GetScope(Identity);", + "\n private IDataCube IncurredDeferrals => GetScope(Identity);", + "\n private IDataCube ExperienceAdjustmentOnPremium => GetScope(Identity);", + "\n ", + "\n IDataCube FinancialPerformance => FcfChangeInEstimate + CsmChangeInEstimate + LcChangeInEstimate + LorecoChangeInEstimate + IncurredActuals + IncurredDeferrals + ExperienceAdjustmentOnPremium;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xgem_L0voUyElSD53tj9BQ", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Report/ReportStorage.ipynb b/Report/ReportStorage.ipynb new file mode 100644 index 00000000..7eea19f9 --- /dev/null +++ b/Report/ReportStorage.ipynb @@ -0,0 +1,241 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "HEuASoWo4UGVdx8dGf6u_A", + "cell_type": "markdown", + "source": [ + "", + "\n

Report Storage and Identity

", + "\n", + "\nThe Report Identity is a record collecting all information needed to define the granularity in which the calculation are performed.", + "\n", + "\nThe Report Storage collects the required data and parameters used in the calculations.", + "\n", + "\nBoth Storage and Identity are defined to support the calculations defined in the corresponding [Report Scopes](./ReportScopes)." + ], + "metadata": {} + }, + { + "id": "lH7xWMjez0q8ciCz4Qykww", + "cell_type": "code", + "source": [ + "#!import \"ReportConfigurationAndUtils\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2dj3bWBcRkGx9h4euZjMZA", + "cell_type": "markdown", + "source": [ + "# Report Identity" + ], + "metadata": {} + }, + { + "id": "XYiuv9tTxk218jeGK45wwg", + "cell_type": "code", + "source": [ + "[IdentityAggregationBehaviour(IdentityAggregationBehaviour.Aggregate)]", + "\npublic record ReportIdentity {", + "\n ", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n public int Year { get; init; }", + "\n", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n public int Month { get; init; }", + "\n", + "\n [Dimension(typeof(ReportingNode))]", + "\n public string ReportingNode { get; init; }", + "\n ", + "\n [Dimension(typeof(Scenario))]", + "\n public string Scenario { get; init; }", + "\n", + "\n [Dimension(typeof(Currency), nameof(ContractualCurrency))]", + "\n public string ContractualCurrency { get; init; }", + "\n ", + "\n [Dimension(typeof(Currency), nameof(FunctionalCurrency))]", + "\n public string FunctionalCurrency { get; init; }", + "\n", + "\n [NotAggregated]", + "\n [Dimension(typeof(int), nameof(Projection))]", + "\n public int Projection { get; init; }", + "\n", + "\n [Dimension(typeof(LiabilityType))]", + "\n public string LiabilityType { get; init; }", + "\n ", + "\n [Dimension(typeof(ValuationApproach))]", + "\n public string ValuationApproach { get; init; }", + "\n ", + "\n public bool IsReinsurance { get; init; } //TODO use ReinsuranceType", + "\n ", + "\n public bool IsOci { get; init; } ", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Xp1yqkllkEeactK1U1Wfbw", + "cell_type": "markdown", + "source": [ + "# Report Storage" + ], + "metadata": {} + }, + { + "id": "vXC3nuN1jUaN-35vvZ9pWA", + "cell_type": "code", + "source": [ + "public class ReportStorage {", + "\n protected readonly IWorkspace workspace;", + "\n private readonly Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchicalDimensionCache;", + "\n private readonly Systemorph.Vertex.Pivot.Reporting.IReportFactory reportFactory;", + "\n ", + "\n // Current Storage Settings", + "\n public ((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args {get; private set;}", + "\n ", + "\n // Cache for Aux Data ", + "\n private Dictionary<(int year, int month), Dictionary>> exchangeRatesByCurrencyByFxTypeAndPeriod = new(); // Fx Rates", + "\n private Dictionary<(int year, int month), Dictionary> fxPeriodsByAocStepAndPeriod = new(); // FxParameter", + "\n ", + "\n public HashSet EstimateTypesWithoutAoc {get; private set;}", + "\n ", + "\n // Cache for Variables and Parameters", + "\n private Dictionary<((int year, int month) period, string reportingNode, string scenario), Dictionary>>> variablesDictionary = new();", + "\n ", + "\n // Constructor", + "\n public ReportStorage(IWorkspace workspace, Systemorph.Vertex.Pivot.Reporting.IReportFactory reportFactory) {", + "\n this.workspace = workspace;", + "\n this.hierarchicalDimensionCache = workspace.ToHierarchicalDimensionCache();", + "\n this.reportFactory = reportFactory;", + "\n }", + "\n ", + "\n // Initializers", + "\n public async Task InitializeReportIndependentCacheAsync() {", + "\n // Hierarchical Dimensions", + "\n hierarchicalDimensionCache.Initialize();", + "\n hierarchicalDimensionCache.Initialize(); ", + "\n hierarchicalDimensionCache.Initialize();", + "\n hierarchicalDimensionCache.Initialize();", + "\n }", + "\n ", + "\n public async Task InitializeAsync((int year, int month) period, string reportingNode, string scenario, CurrencyType currencyType) {", + "\n // Report Dependent Cache", + "\n", + "\n // Setting the Args --> Temp for the moment", + "\n Args = (period, reportingNode, scenario, currencyType);", + "\n ", + "\n EstimateTypesWithoutAoc = (await workspace.Query().Where(x => x.StructureType != StructureType.AoC).Select(x => x.SystemName).ToArrayAsync()).ToHashSet();", + "\n ", + "\n // FX && Fx Parameters", + "\n if(!exchangeRatesByCurrencyByFxTypeAndPeriod.TryGetValue(period, out var exchangeRatesByCurrencyByFxType) || !fxPeriodsByAocStepAndPeriod.TryGetValue(period, out var fxPeriodsByAocStep)) {", + "\n exchangeRatesByCurrencyByFxType = await workspace.GetExchangeRatesDictionaryAsync(period.year, period.month);", + "\n exchangeRatesByCurrencyByFxTypeAndPeriod.Add(period, exchangeRatesByCurrencyByFxType);", + "\n fxPeriodsByAocStep = (await workspace.LoadAocStepConfigurationAsync(period.year, period.month)).Where(x => x.FxPeriod != FxPeriod.NotApplicable).ToDictionary(x => new AocStep(x.AocType, x.Novelty), x => (FxPeriod)x.FxPeriod);", + "\n fxPeriodsByAocStepAndPeriod.Add(period, fxPeriodsByAocStep);", + "\n }", + "\n ", + "\n // Variables", + "\n foreach(var rn in GetLeaves(reportingNode)) { ", + "\n if(!variablesDictionary.TryGetValue((period, rn, scenario), out var variablesByIdentity)) {", + "\n variablesByIdentity = (await workspace.QueryReportVariablesAsync((period.year, period.month, rn, scenario)))", + "\n .ToDictionaryGrouped(x => new ReportIdentity {", + "\n Year = period.year,", + "\n Month = period.month,", + "\n ReportingNode = x.ReportingNode,", + "\n Scenario = x.Scenario,", + "\n Projection = x.Projection,", + "\n ContractualCurrency = x.ContractualCurrency,", + "\n FunctionalCurrency = x.FunctionalCurrency,", + "\n ValuationApproach = x.ValuationApproach,", + "\n LiabilityType = x.LiabilityType,", + "\n IsReinsurance = x.IsReinsurance,", + "\n IsOci = !string.IsNullOrWhiteSpace(x.OciType) },", + "\n x => x.ToDictionaryGrouped(y => y.EstimateType,", + "\n y => y.ToArray().ToDataCube()));", + "\n ", + "\n variablesDictionary.Add((period, rn, scenario), variablesByIdentity);", + "\n }", + "\n }", + "\n }", + "\n ", + "\n // Getters for Data", + "\n public IDataCube GetVariables(ReportIdentity reportIdentity, params string[] estimateTypes)", + "\n => (!variablesDictionary.TryGetValue(((reportIdentity.Year, reportIdentity.Month), reportIdentity.ReportingNode, reportIdentity.Scenario), out var variablesByIdentity) || !variablesByIdentity.TryGetValue(reportIdentity, out var variablesByEstimateType))", + "\n ? Enumerable.Empty().ToDataCube()", + "\n : estimateTypes.Length switch {", + "\n 0 => variablesByEstimateType.SelectMany(x => x.Value).ToDataCube(),", + "\n 1 => variablesByEstimateType.TryGetValue(estimateTypes.First(), out var variables)", + "\n ? variables.ToDataCube()", + "\n : Enumerable.Empty().ToDataCube(),", + "\n _ => estimateTypes.Select(et => variablesByEstimateType.TryGetValue(et, out var variables)", + "\n ? variables.ToDataCube()", + "\n : Enumerable.Empty())", + "\n .Aggregate((x, y) => x.Concat(y))", + "\n .ToDataCube()", + "\n };", + "\n ", + "\n // Other getters", + "\n public IWorkspace Workspace => workspace;", + "\n public Systemorph.Vertex.Pivot.Reporting.IReportFactory Report => reportFactory;", + "\n", + "\n public Systemorph.Vertex.Hierarchies.IHierarchy GetHierarchy() where T : class, IHierarchicalDimension => hierarchicalDimensionCache.Get();", + "\n ", + "\n public HashSet<(ReportIdentity, CurrencyType)> GetIdentities((int year, int month) period, string reportingNode, string scenario, CurrencyType currencyType)", + "\n => GetLeaves(reportingNode)", + "\n .SelectMany(rn => variablesDictionary.TryGetValue((period, rn, scenario), out var inner) ? inner.Keys.Select(x => (x, currencyType)) : Enumerable.Empty<(ReportIdentity, CurrencyType)>())", + "\n .ToHashSet();", + "\n ", + "\n public double GetFx((int year, int month) period, string currentCurrency, string targetCurrency, FxPeriod fxPeriod) {", + "\n if (currentCurrency == targetCurrency) return 1;", + "\n if(!exchangeRatesByCurrencyByFxTypeAndPeriod.TryGetValue(period, out var exchangeRatesByCurrencyByFxType))", + "\n throw new Exception ($\"No exchange rates for Period {period} were found.\");", + "\n return GetCurrencyToGroupFx(exchangeRatesByCurrencyByFxType, currentCurrency, fxPeriod, GroupCurrency)", + "\n / GetCurrencyToGroupFx(exchangeRatesByCurrencyByFxType, targetCurrency, fxPeriod, GroupCurrency);", + "\n }", + "\n ", + "\n public FxPeriod GetFxPeriod((int year, int month) period, string aocType, string novelty) => fxPeriodsByAocStepAndPeriod[period][new AocStep(aocType, novelty)];", + "\n ", + "\n // Helpers", + "\n public HashSet GetLeaves(string systemName) where T : class, IHierarchicalDimension {", + "\n var descendants = hierarchicalDimensionCache.Get(systemName).Descendants(includeSelf: true);", + "\n return descendants.Where(x => !descendants.Select(y => y.Parent).Contains(x.SystemName)).Select(x => x.SystemName).ToHashSet();", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Gl9OQV-72kGG19Hx1igOHw", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Report/Reports.ipynb b/Report/Reports.ipynb new file mode 100644 index 00000000..99f0a490 --- /dev/null +++ b/Report/Reports.ipynb @@ -0,0 +1,516 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "1U3-hU_f80qwkFwNsbnfIQ", + "cell_type": "markdown", + "source": [ + "

Reports

", + "\n", + "\n" + ], + "metadata": {} + }, + { + "id": "me2hD-9UBkqUzPChAMdGSA", + "cell_type": "markdown", + "source": [ + "# Infrastructure and Configuration" + ], + "metadata": {} + }, + { + "id": "u0H8pAlgYkS1PDtJ2VPLCw", + "cell_type": "markdown", + "source": [ + "## Initialize data" + ], + "metadata": {} + }, + { + "id": "uGtbh5xjQkit56ozbyiS5g", + "cell_type": "code", + "source": [ + "/* DataSource is configured and connected to real database */", + "\n//#!eval-notebook \"../Database/Configure\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TDC5BXyEaEeRJ3z9MmQClw", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jZ-XCFkJ2kqGHwxkU5vMWA", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QyUqnd2bSkOLW_SKU1cJBw", + "cell_type": "markdown", + "source": [ + "## Imports and Configurations" + ], + "metadata": {} + }, + { + "id": "I99Rcm-9LUmvvSjstjY9Hw", + "cell_type": "code", + "source": [ + "#!import \"ReportScopes\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LpptbT8Q_ESVOFAw3M1HQg", + "cell_type": "code", + "source": [ + "var reportStorage = new ReportStorage(Workspace, Report);", + "\nawait reportStorage.InitializeReportIndependentCacheAsync();", + "\nvar mostRecentPartition = (await Workspace.Query().Where(x => x.Scenario == null).OrderBy(x => x.Year).ThenBy(x => x.Month).ToArrayAsync()).Last();", + "\nvar reportingNodeRoot = (await Workspace.Query().Where(x => x.Parent == null).ToArrayAsync()).First().SystemName;", + "\nawait reportStorage.InitializeAsync((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);", + "\nvar identities = reportStorage.GetIdentities((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "COjZVjOdgkSk8q3E6JHEgg", + "cell_type": "markdown", + "source": [ + "## Calling Scope" + ], + "metadata": {} + }, + { + "id": "SMyYdCikXUua1hdjbI4OmA", + "cell_type": "code", + "source": [ + "var universe = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "538kYx9ba0GWU4_h7XqOqA", + "cell_type": "markdown", + "source": [ + "# Report Settings and Storage Update" + ], + "metadata": {} + }, + { + "id": "UuYESB0ub0-pmUPR8T6jIQ", + "cell_type": "code", + "source": [ + "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args =", + "\n //((2020, 12), reportingNodeRoot, null,CurrencyType.Contractual)", + "\n ((2021, 3), reportingNodeRoot, null,CurrencyType.Contractual)", + "\n //((2021, 12), reportingNodeRoot, null,CurrencyType.Contractual)", + "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Functional)", + "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Group)", + "\n ;", + "\n", + "\nawait reportStorage.InitializeAsync(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);", + "\nidentities = reportStorage.GetIdentities(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "spXqsA5i2k-QnXdIiPiN8g", + "cell_type": "markdown", + "source": [ + "# Present Value" + ], + "metadata": {} + }, + { + "id": "D2Y8VUl5EkSZ6EaxxjHxQw", + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedBestEstimate + universe.GetScopes(identities).Aggregate().CurrentBestEstimate)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "IB3NvnT2k0uFqLZP9EBMAw", + "cell_type": "markdown", + "source": [ + "# Risk Adjustment" + ], + "metadata": {} + }, + { + "id": "Vx4bYAkCsE2OfLFbPg380w", + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedRiskAdjustment + universe.GetScopes(identities).Aggregate().CurrentRiskAdjustment)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"EconomicBasis\", \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ncU2iZ7tvEy2fxjWmU3Iqg", + "cell_type": "markdown", + "source": [ + "# Actuals" + ], + "metadata": {} + }, + { + "id": "lUNkYQ-KvUqVSA4cxDP-cg", + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Written", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"AmountType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 450)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5p79FR5-wUKCtkk4E1UKsQ", + "cell_type": "markdown", + "source": [ + "## Advance, Overdue Actuals" + ], + "metadata": {} + }, + { + "id": "9xxC0nELUk6ZaH6064_mqw", + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Advance + universe.GetScopes(identities).Aggregate().Overdue)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EstimateType\")", + "\n .ReportGridOptions(reportHeight: 400)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5wuvd2c6O02jxhFkFp49GA", + "cell_type": "markdown", + "source": [ + "## Deferrable Actuals" + ], + "metadata": {} + }, + { + "id": "FlZFgvuEikyv4qcH6xvZYw", + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Deferrals", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 400)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MAO2KskzTEeZSNhRJLd0Zg", + "cell_type": "markdown", + "source": [ + "# Fulfilment Cashflow" + ], + "metadata": {} + }, + { + "id": "yQAAlgUfUkuF5u60nLLPcw", + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Fcf ", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")//, \"EstimateType\")//, \"AmountType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uF8DY0mc7UqiiYqQ6l6uxQ", + "cell_type": "markdown", + "source": [ + "# Actuarial Experience Adjustment" + ], + "metadata": {} + }, + { + "id": "HhH_UKImy0CsdcsI6-f6NA", + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().ActuarialExperienceAdjustment", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"EstimateType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"AmountType\" )//\"LiabilityType\", \"EstimateType\")", + "\n .ReportGridOptions(reportHeight: 300, headerColumnWidth: 300)", + "\n .ToReport() " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4P1Lq_n2rkC67MsvbYyLeg", + "cell_type": "markdown", + "source": [ + "# LRC Technical Margin" + ], + "metadata": {} + }, + { + "id": "2qHsCZAs806CvGJgBNEVVQ", + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().LrcTechnicalMargin", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 600)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3F3PhlQxqkWBa0AnU5W6mA", + "cell_type": "markdown", + "source": [ + "# Contractual Service Margin / Loss Component / Loss Recovery Component" + ], + "metadata": {} + }, + { + "id": "gs0gMZiNAk2Jx8IKLuVcvA", + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Csm + universe.GetScopes(identities).Aggregate().Lc + universe.GetScopes(identities).Aggregate().Loreco)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"EstimateType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "39j6UxhSA0uSJNFLzSMRYg", + "cell_type": "markdown", + "source": [ + "# LRC Actuarial" + ], + "metadata": {} + }, + { + "id": "4kG8l2FHpkCjcnv-q5Rwkw", + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LrcActuarial)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"LiabilityType\",\"GroupOfContract\",*/ \"EstimateType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Igfu5McpcUa4ORph4McI6g", + "cell_type": "markdown", + "source": [ + "# LRC" + ], + "metadata": {} + }, + { + "id": "jQtxFjgD9U2imsZ5CiVx2g", + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lrc)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType),\"GroupOfContract\", \"EstimateType\")", + "\n .ReportGridOptions(300)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dZ8KVTA4WkuJZdxC09iuiQ", + "cell_type": "markdown", + "source": [ + "# LIC Actuarial" + ], + "metadata": {} + }, + { + "id": "CAXoAvfKdk6VKSgwRZplgA", + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LicActuarial)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "q1RxJxSTCk2zVjInVNdAzg", + "cell_type": "markdown", + "source": [ + "# LIC" + ], + "metadata": {} + }, + { + "id": "rc1o2W9lvUOBLnbn-MxRRw", + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lic)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", + "\n .ReportGridOptions(300)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dI-BtkhyEkOSQkwJRxs0dQ", + "cell_type": "markdown", + "source": [ + "# Financial Performance" + ], + "metadata": {} + }, + { + "id": "e7jpS8lNhE2913hj-FXjxw", + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().FinancialPerformance", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CIY_4o8vO0KJafPttQEQcA", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/AocStructureTest.ipynb b/Test/AocStructureTest.ipynb new file mode 100644 index 00000000..b2411ca2 --- /dev/null +++ b/Test/AocStructureTest.ipynb @@ -0,0 +1,704 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "htuauFORRUW_vpe-m5qdCw", + "cell_type": "markdown", + "source": [ + "

Test Aoc Management

" + ], + "metadata": {} + }, + { + "id": "PeSv4LBGr0qLd08ewzJ6WA", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6hiubyTezEuZjfp-gctWmw", + "cell_type": "markdown", + "source": [ + "# Workspace Initialization " + ], + "metadata": {} + }, + { + "id": "54oSWDPLHEuTAVk-tNUBfA", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "JNf9Tz4s4UG65OvUoirk8Q", + "cell_type": "markdown", + "source": [ + "# Test" + ], + "metadata": {} + }, + { + "id": "LYX1kYxLHEyxrah6NZumRA", + "cell_type": "code", + "source": [ + "var args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Cashflow);", + "\nvar partition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", + "\n x.Month == args.Month && x.Scenario == args.Scenario);", + "\nif(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MfcAgK-1_ECiXK9qP48R_Q", + "cell_type": "code", + "source": [ + "public async Task CheckAocStepStructureAsync(IEnumerable inputVariables, ", + "\n Dictionary> parentBm, ", + "\n Dictionary referenceBm, ", + "\n Dictionary> fullAocBm,", + "\n Dictionary> parentBmCdr = null)", + "\n{", + "\n //Save test input data", + "\n var importFormat = ImportFormats.Cashflow;", + "\n var inputSource = InputSource.Cashflow;", + "\n if (inputVariables.First() is RawVariable)", + "\n {", + "\n await Workspace.UpdateAsync(inputVariables.Cast());", + "\n }", + "\n if (inputVariables.First() is IfrsVariable)", + "\n {", + "\n await Workspace.UpdateAsync(inputVariables.Cast());", + "\n importFormat = ImportFormats.Actual;", + "\n inputSource = InputSource.Actual;", + "\n }", + "\n ", + "\n var newArgs = args with {ImportFormat = importFormat };", + "\n //Set up import storage and test universe", + "\n var testStorage = new ImportStorage(newArgs, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n var isReinsurance = testStorage.DataNodeDataBySystemName[inputVariables.First().DataNode].IsReinsurance;", + "\n var testUniverse = Scopes.ForStorage(testStorage).ToScope();", + "\n //Clean up Workspace", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", + "\n ", + "\n var errors = new List();", + "\n ", + "\n var goc = inputVariables.First().DataNode;", + "\n var identities = testUniverse.GetScopes(testStorage.DataNodesByImportScope[ImportScope.Primary].Where(dn => dn == goc)).SelectMany(s => s.Identities);", + "\n ", + "\n //Assert Parents", + "\n if (importFormat != ImportFormats.Actual)", + "\n {", + "\n var parents = testUniverse.GetScopes(identities.Select(id => (object)(id, \"PR\")), o => o.WithStorage(testStorage)).Where(x => x.Values != Enumerable.Empty()).ToArray();", + "\n if (parentBm.Count() != parents.Count()) ", + "\n {", + "\n var computedIds = parents.Select(s => $\"AocType:{s.Identity.Id.AocType}, Novelty:{s.Identity.Id.Novelty}\");", + "\n var expectedIds = parentBm.Keys.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n errors.Add( $\"Parent count does not match expected: \\n Computed {parents.Count()} \\n {string.Join(\"\\n\", computedIds)} \\n Expected {parentBm.Count()} \\n {string.Join(\"\\n\", expectedIds)}.\" );", + "\n }", + "\n ", + "\n foreach(var kvp in parentBm)", + "\n {", + "\n var scopeParents = parents.Where(y => y.Identity.Id.AocType == kvp.Key.AocType && y.Identity.Id.Novelty == kvp.Key.Novelty);", + "\n if(scopeParents.Count() != 1)", + "\n errors.Add( $\"Parent not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");", + "\n else{", + "\n var scopeParent = scopeParents.First();", + "\n if( kvp.Value.Intersect(scopeParent.Values).Count() != kvp.Value.Count() ||", + "\n kvp.Value.Intersect(scopeParent.Values).Count() != scopeParent.Values.Count()){", + "\n var computedAocSteps = scopeParent.Values.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n var expectedAocSteps = kvp.Value.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\"); ", + "\n errors.Add( $\"Parents of {kvp.Key.AocType}, {kvp.Key.Novelty} do not match expected value: \\n Computed: \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected: \\n {string.Join(\"\\n\", expectedAocSteps)}.\" );", + "\n }", + "\n }", + "\n }", + "\n ", + "\n //Parents for CDR", + "\n if(isReinsurance)", + "\n {", + "\n var parentsCdr = testUniverse.GetScopes(identities.Select(id => (object)(id, AmountTypes.CDR)), o => o.WithStorage(testStorage));", + "\n ", + "\n var countP = parentsCdr.Where(x => x.Values != Enumerable.Empty()).Count();", + "\n if (parentBmCdr.Count() != countP) ", + "\n errors.Add( $\"Parent count for AmountType CDR does not match expected: \\n Computed {countP} \\n Expected {parentBm.Count()}.\" );", + "\n ", + "\n foreach(var kvp in parentBmCdr)", + "\n {", + "\n var scopeParents = parentsCdr.Where(y => y.Identity.Id.AocType == kvp.Key.AocType && y.Identity.Id.Novelty == kvp.Key.Novelty);", + "\n if(scopeParents.Count() != 1)", + "\n errors.Add( $\"Parent for CDR not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");", + "\n else{", + "\n var scopeParent = scopeParents.First();", + "\n if( kvp.Value.Intersect(scopeParent.Values).Count() != kvp.Value.Count() || ", + "\n kvp.Value.Intersect(scopeParent.Values).Count() != scopeParent.Values.Count() ){", + "\n var computedAocSteps = scopeParent.Values.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n var expectedAocSteps = kvp.Value.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\"); ", + "\n errors.Add( $\"Parents of {kvp.Key.AocType}, {kvp.Key.Novelty} for AmountType CDR do not match expected value: \\n Computed: \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected: \\n {string.Join(\"\\n\", expectedAocSteps)}.\" );", + "\n }", + "\n }", + "\n } ", + "\n }", + "\n }", + "\n ", + "\n //Assert Reference", + "\n if (importFormat != ImportFormats.Actual)", + "\n {", + "\n var reference = testUniverse.GetScopes(identities, o => o.WithStorage(testStorage)).ToArray();", + "\n var countR = reference.Select(x => x.Value).Count();", + "\n if (referenceBm.Count() != countR) ", + "\n errors.Add( $\"Reference count does not match expected: \\n Computed {countR} \\n Expected {referenceBm.Count()}.\" );", + "\n ", + "\n foreach(var kvp in referenceBm)", + "\n {", + "\n var scopeReferences = reference.Where(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", + "\n if(scopeReferences.Count() != 1)", + "\n errors.Add( $\"Reference not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");", + "\n else{", + "\n var scopeReference = scopeReferences.First();", + "\n if( kvp.Value.AocType != scopeReference.Value.AocType || kvp.Value.Novelty != scopeReference.Value.Novelty )", + "\n errors.Add( $\"Reference of {kvp.Key.AocType}, {kvp.Key.Novelty} do not match expected value: \\n Computed {scopeReference.Value} \\n Expected {kvp.Value}.\" );", + "\n }", + "\n }", + "\n }", + "\n ", + "\n //Assert FullAoc", + "\n var fullAoc = testUniverse.GetScopes(identities.Select(id => (object)(id, inputSource)), o => o.WithStorage(testStorage)).Where(s => s.Values.Any());", + "\n var count = fullAoc.Count();", + "\n if (fullAocBm.Count() != count)", + "\n {", + "\n var computedAocSteps = fullAoc.Select(x => $\"AocType:{x.Identity.Id.AocType}, Novelty:{x.Identity.Id.Novelty}\");", + "\n var benchmarkKeys = fullAocBm.Keys.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n errors.Add( $\"Full Aoc count does not match expected: \\n Computed {count} \\n Expected {fullAocBm.Count()}.\" ); ", + "\n errors.Add( $\"In particular, \\n Computed Identities \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected \\n {string.Join(\"\\n\", benchmarkKeys)}.\" ); ", + "\n }", + "\n ", + "\n foreach(var kvp in fullAocBm)", + "\n {", + "\n var scopeAocFulls = fullAoc.Where(y => y.Identity.Id.AocType == kvp.Key.AocType && y.Identity.Id.Novelty == kvp.Key.Novelty);", + "\n if(scopeAocFulls.Count() != 1){", + "\n errors.Add( $\"Full AocStep not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");}", + "\n else{", + "\n var scopeAocFull = scopeAocFulls.First();", + "\n if( kvp.Value.Intersect(scopeAocFull.Values).Count() != kvp.Value.Count() || ", + "\n kvp.Value.Intersect(scopeAocFull.Values).Count() != scopeAocFull.Values.Count() ){", + "\n var computedAocSteps = scopeAocFull.Values.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n var expectedAocSteps = kvp.Value.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\"); ", + "\n errors.Add( $\"AocFull for {kvp.Key.AocType}, {kvp.Key.Novelty} do not match expected value: \\n Computed \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected: \\n {string.Join(\"\\n\", expectedAocSteps)}.\" );", + "\n }", + "\n }", + "\n }", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}", + "\n" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "sEcSO-bqzkGlpQkC24-htw", + "cell_type": "markdown", + "source": [ + "# Use Cases" + ], + "metadata": {} + }, + { + "id": "sFPFk32D7kKGHRGhl37IyA", + "cell_type": "markdown", + "source": [ + "## Gross Cashflow: InForce, NewBusiness, and Combined" + ], + "metadata": {} + }, + { + "id": "_X2FswBBHkucp_w7bEqyxQ", + "cell_type": "code", + "source": [ + "var groupOfContract = \"DT1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6ZmdltQ8CUOJk6c8XSMxMg", + "cell_type": "code", + "source": [ + "var inputRawVariables = new RawVariable[]{", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "EMS3W2YP1EqkmV577yS3hg", + "cell_type": "code", + "source": [ + "var parentBm = new Dictionary>()", + "\n {", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "cgrcf9GgL0qpSZnalLTzEw", + "cell_type": "code", + "source": [ + "var referenceBm = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"I\"), new AocStep(\"BOP\",\"I\")},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"BOP\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"CF\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"IA\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"EV\",\"N\"), new AocStep(\"EV\",\"N\")},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Wpd4fY5nQkmaPPkyvSEzSQ", + "cell_type": "code", + "source": [ + "var fullAocBm = new Dictionary>()", + "\n {", + "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"IA\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n //{new AocStep(\"BOP\",\"N\"), Enumerable.Empty()},", + "\n {new AocStep(\"CF\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"IA\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\")}},", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\")}},", + "\n ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"),", + "\n }},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), ", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"EA\",\"C\"), new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", + "\n ", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "oYv6SIpvrU6FXuQerivFwg", + "cell_type": "code", + "source": [ + "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zbuVbeynlkiuaJciPMHc-A", + "cell_type": "markdown", + "source": [ + "## Reinsurance Cashflow: InForce, NewBusiness, and Combined" + ], + "metadata": {} + }, + { + "id": "lEAJ2MIIVkKmGnzEBLjE5g", + "cell_type": "code", + "source": [ + "groupOfContract = \"DTR1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jeehsZ9rD0uLhdYDkJo9sQ", + "cell_type": "code", + "source": [ + "inputRawVariables = new RawVariable[]{", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2Oou9pdvEU65Hdaz4jGLnw", + "cell_type": "code", + "source": [ + "parentBm = new Dictionary>()", + "\n {", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"CRU\",\"I\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}}, ", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "fd9Sd0Ya9kSZbiDpI3tpJw", + "cell_type": "code", + "source": [ + "var parentBm_CDR = new Dictionary>()", + "\n {", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", + "\n {new AocStep(\"CRU\",\"I\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}}, ", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"CRU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "naCBsHzkPk60cOaBsv40Fg", + "cell_type": "code", + "source": [ + "referenceBm = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"I\"), new AocStep(\"BOP\",\"I\")},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"RCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"CF\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"CRU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"BOP\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"CF\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"IA\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"EV\",\"N\"), new AocStep(\"EV\",\"N\")},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "A_BMNMYCE0irAqOEzK1Beg", + "cell_type": "code", + "source": [ + "fullAocBm = new Dictionary>()", + "\n {", + "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"RCU\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep[]{new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep[]{new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"IA\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n {new AocStep(\"CRU\",\"I\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n //{new AocStep(\"BOP\",\"N\"), Enumerable.Empty()},", + "\n {new AocStep(\"CF\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"IA\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\")}},", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\")}},", + "\n ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"),", + "\n }},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"EA\",\"C\"), new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", + "\n ", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ThWShXVvcUeceCGqOsJthQ", + "cell_type": "code", + "source": [ + "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm, parentBm_CDR)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8u10a9u8l0yb0XI7eilD8A", + "cell_type": "markdown", + "source": [ + "## Cashflow: InForce, and Combined" + ], + "metadata": {} + }, + { + "id": "BCk5iXiD6UiLl7KNQkQ1-Q", + "cell_type": "code", + "source": [ + "var groupOfContract = \"DT1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_XL2aS8gh02VveW4LpykZQ", + "cell_type": "code", + "source": [ + "inputRawVariables = new RawVariable[]{", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Qd3QDM8xY0WrVZsN4inIDg", + "cell_type": "code", + "source": [ + "parentBm = new Dictionary>()", + "\n {", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}},", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "lf7sWYGVQEijVikbiCG9oQ", + "cell_type": "code", + "source": [ + "referenceBm = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"I\"), new AocStep(\"BOP\",\"I\")},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "B6t0lIf3ik-YHWgWpyX0YQ", + "cell_type": "code", + "source": [ + "fullAocBm = new Dictionary>()", + "\n {", + "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\")}},", + "\n ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"), ", + "\n }},", + "\n ", + "\n {new AocStep(\"EA\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"CL\",\"C\"),}},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"CL\",\"C\"), new AocStep(\"EA\",\"C\"),}},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"CL\",\"C\"), new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"),}},", + "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qceSk87wOEOmawmXy5Vdag", + "cell_type": "code", + "source": [ + "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "lo7SItfxOEOhFjgPs9KTHQ", + "cell_type": "markdown", + "source": [ + "## Actual" + ], + "metadata": {} + }, + { + "id": "LLQgmrk5cUamp-TV5Bw0MA", + "cell_type": "code", + "source": [ + "var groupOfContract = \"DT1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HHKnGuczVE-EGxdD1vi1JQ", + "cell_type": "code", + "source": [ + "var inputIfrsVariables = new IfrsVariable[]{", + "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"AA\"},", + "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"CF\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"AA\"},", + "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"CF\", Novelty = \"C\", AccidentYear = null, AmountType = \"ACA\", EstimateType = \"A\"},", + "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"WO\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"OA\"},", + "\n};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yv06kc8H40iji3wgMDEmEg", + "cell_type": "code", + "source": [ + "parentBm = null;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "E62fDv7kNkeH__lCPrFn8g", + "cell_type": "code", + "source": [ + "referenceBm = null;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xNjIoqwi4kqov8CpJoZu5A", + "cell_type": "code", + "source": [ + "fullAocBm = new Dictionary>()", + "\n {", + "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", + "\n {new AocStep(\"CF\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"),}},", + "\n {new AocStep(\"WO\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"),}},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"), new AocStep(\"WO\",\"C\"),}},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"), new AocStep(\"WO\",\"C\"), new AocStep(\"AM\",\"C\"),}},", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "cokUNY_q6Eai_BLP8RbvEA", + "cell_type": "code", + "source": [ + "await CheckAocStepStructureAsync(inputIfrsVariables, parentBm, referenceBm, fullAocBm)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QwRsslb8LE-OzVKMQJyfJQ", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/Data/CashflowComplex.csv b/Test/Data/CashflowComplex.csv new file mode 100644 index 00000000..150c4a31 --- /dev/null +++ b/Test/Data/CashflowComplex.csv @@ -0,0 +1,9 @@ +@@Main,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +ReportingNode,Year,Month,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +CH,2021,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +@@Cashflow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +DataNode,AmountType,AocType,Novelty,AccidentYear,Values0,Values1,Values2,Values3,Values4,Values5,Values6,Values7,Values8,Values9,Values10,Values11,Values12,Values13,Values14,Values15,Values16,Values17,Values18,Values19,Values20,Values21,Values22,Values23,Values24,Values25,Values26,Values27,Values28,Values29,Values30,Values31,Values32,Values33,Values34,Values35,Values36,Values37,Values38,Values39,Values40,Values41,Values42,Values43,Values44,Values45,Values46,Values47,Values48,Values49,Values50,Values51,Values52,Values53,Values54,Values55,Values56,Values57,Values58,Values59,Values60,Values61,Values62,Values63,Values64,Values65,Values66,Values67,Values68,Values69,Values70,Values71,Values72,Values73,Values74,Values75,Values76,Values77,Values78,Values79,Values80,Values81,Values82,Values83,Values84,Values85,Values86,Values87,Values88,Values89,Values90,Values91,Values92,Values93,Values94,Values95,Values96,Values97,Values98,Values99,Values100,Values101,Values102,Values103,Values104,Values105,Values106,Values107,Values108,Values109,Values110,Values111,Values112,Values113,Values114,Values115,Values116,Values117,Values118,Values119,Values120,Values121,Values122,Values123,Values124,Values125,Values126,Values127,Values128,Values129,Values130,Values131,Values132,Values133,Values134,Values135,Values136,Values137,Values138,Values139,Values140,Values141,Values142,Values143,Values144,Values145,Values146,Values147,Values148,Values149,Values150,Values151,Values152,Values153,Values154,Values155,Values156,Values157,Values158,Values159,Values160,Values161,Values162,Values163,Values164,Values165,Values166,Values167,Values168,Values169,Values170,Values171,Values172,Values173,Values174,Values175,Values176,Values177,Values178,Values179,Values180,Values181,Values182,Values183,Values184,Values185,Values186,Values187,Values188,Values189,Values190,Values191,Values192,Values193,Values194,Values195,Values196,Values197,Values198,Values199,Values200,Values201,Values202,Values203,Values204,Values205,Values206,Values207,Values208,Values209,Values210,Values211,Values212,Values213,Values214,Values215,Values216,Values217,Values218,Values219,Values220,Values221,Values222,Values223,Values224,Values225,Values226,Values227,Values228,Values229,Values230,Values231,Values232,Values233,Values234,Values235,Values236,Values237,Values238,Values239,Values240,Values241,Values242,Values243,Values244,Values245,Values246,Values247,Values248,Values249,Values250,Values251,Values252,Values253,Values254,Values255,Values256,Values257,Values258,Values259,Values260,Values261,Values262,Values263,Values264,Values265,Values266,Values267,Values268,Values269,Values270,Values271,Values272,Values273,Values274,Values275,Values276,Values277,Values278,Values279,Values280,Values281,Values282,Values283,Values284,Values285,Values286,Values287,Values288,Values289,Values290,Values291,Values292,Values293,Values294,Values295,Values296,Values297,Values298,Values299,Values300,Values301,Values302,Values303,Values304,Values305,Values306,Values307,Values308,Values309,Values310,Values311,Values312,Values313,Values314,Values315,Values316,Values317,Values318,Values319,Values320,Values321,Values322,Values323,Values324,Values325,Values326,Values327,Values328,Values329,Values330,Values331,Values332,Values333,Values334,Values335,Values336,Values337,Values338,Values339,Values340,Values341,Values342,Values343,Values344,Values345,Values346,Values347,Values348,Values349,Values350,Values351,Values352,Values353,Values354,Values355,Values356,Values357,Values358,Values359,Values360,Values361,Values362,Values363,Values364,Values365,Values366,Values367,Values368,Values369,Values370,Values371,Values372,Values373,Values374,Values375,Values376,Values377,Values378,Values379,Values380,Values381,Values382,Values383,Values384,Values385,Values386,Values387,Values388,Values389,Values390,Values391,Values392,Values393,Values394,Values395,Values396,Values397,Values398,Values399,Values400,Values401,Values402,Values403,Values404,Values405,Values406,Values407,Values408,Values409,Values410,Values411,Values412,Values413,Values414,Values415,Values416,Values417,Values418,Values419,Values420,Values421,Values422,Values423,Values424,Values425,Values426,Values427,Values428,Values429,Values430,Values431,Values432,Values433,Values434,Values435,Values436,Values437,Values438,Values439,Values440,Values441,Values442,Values443,Values444,Values445,Values446,Values447,Values448,Values449,Values450,Values451,Values452,Values453,Values454,Values455,Values456,Values457,Values458,Values459,Values460,Values461,Values462,Values463,Values464,Values465,Values466,Values467,Values468,Values469,Values470,Values471,Values472,Values473,Values474,Values475,Values476,Values477,Values478,Values479,Values480,Values481,Values482,Values483,Values484,Values485,Values486,Values487,Values488,Values489,Values490,Values491,Values492,Values493,Values494,Values495,Values496,Values497,Values498,Values499,Values500,Values501,Values502,Values503,Values504,Values505,Values506,Values507,Values508,Values509,Values510,Values511,Values512,Values513,Values514,Values515,Values516,Values517,Values518,Values519,Values520,Values521,Values522,Values523,Values524,Values525,Values526,Values527,Values528,Values529,Values530,Values531,Values532,Values533,Values534,Values535,Values536,Values537,Values538,Values539,Values540,Values541,Values542,Values543,Values544,Values545,Values546,Values547,Values548,Values549,Values550,Values551,Values552,Values553,Values554,Values555,Values556,Values557,Values558,Values559,Values560,Values561,Values562,Values563,Values564,Values565,Values566,Values567,Values568,Values569,Values570,Values571,Values572,Values573,Values574,Values575,Values576,Values577,Values578,Values579,Values580,Values581,Values582,Values583,Values584,Values585,Values586,Values587,Values588,Values589,Values590,Values591,Values592,Values593,Values594,Values595,Values596,Values597,Values598,Values599,Values600,Values601,Values602,Values603,Values604,Values605,Values606,Values607,Values608,Values609,Values610,Values611,Values612,Values613,Values614,Values615,Values616,Values617,Values618,Values619,Values620,Values621,Values622,Values623,Values624,Values625,Values626,Values627,Values628,Values629,Values630,Values631,Values632,Values633,Values634,Values635,Values636,Values637,Values638,Values639,Values640,Values641,Values642,Values643,Values644,Values645,Values646,Values647,Values648,Values649,Values650,Values651,Values652,Values653,Values654,Values655,Values656,Values657,Values658,Values659,Values660,Values661,Values662,Values663,Values664,Values665,Values666,Values667,Values668,Values669,Values670,Values671,Values672,Values673,Values674,Values675,Values676,Values677,Values678,Values679,Values680,Values681,Values682,Values683,Values684,Values685,Values686,Values687,Values688,Values689,Values690,Values691,Values692,Values693,Values694,Values695,Values696,Values697,Values698,Values699,Values700,Values701,Values702,Values703,Values704,Values705,Values706,Values707,Values708,Values709,Values710 +GricComplex,PR,CL,C,,2535,2529.591892,2500.971466,2430.585538,2407.863515,2388.488278,2368.366653,2339.830977,2320.140291,2273.265222,2260.159425,2238.704077,2196.317904,2183.379553,2150.583114,2081.624057,2054.038174,2029.380502,2004.867,1973.795957,1951.298307,1906.807541,1891.795768,1871.415088,1834.717693,1824.096114,1798.843011,1746.456017,1728.414842,1712.811725,1696.919127,1675.202665,1660.273625,1626.338933,1617.051755,1602.551809,1573.50648,1566.223126,1545.642015,1500.618943,1485.101264,1471.691271,1458.024238,1439.336088,1426.49893,1397.342507,1389.349718,1376.874475,1351.917587,1345.631534,1327.947885,1289.256361,1275.909196,1264.385251,1252.632234,1236.549581,1225.511406,1200.462439,1193.584031,1182.850738,1161.408247,1155.981809,1140.790031,1107.541577,1096.061618,1086.15935,1076.052965,1062.2116,1052.720985,1031.202771,1025.283378,1016.04856,997.627389,992.941506,979.891922,951.322487,941.448188,932.939999,924.249948,912.335664,904.175567,885.693476,880.598899,872.653466,856.829492,852.780943,841.573815,817.027071,808.533905,801.224309,793.752395,783.496234,776.480692,760.608477,756.223418,749.387426,735.795916,732.295962,722.67351,701.585003,694.279654,687.487246,680.310694,671.245483,665.234157,650.624971,646.397834,640.31947,628.457131,624.279582,613.950308,595.920763,589.722054,584.413043,578.971894,571.235961,566.135054,554.303845,550.929183,545.954891,536.01646,533.082302,525.872489,510.402366,505.085981,500.542004,495.878976,489.420143,485.047928,475.084784,472.137592,467.536806,459.019242,456.837145,450.500103,437.226131,432.664523,428.773768,424.77577,418.758891,415.479018,406.937395,404.160412,400.789774,393.334791,390.583535,385.733524,374.347985,370.021735,367.106731,363.680719,358.247179,355.176172,347.862729,345.225915,342.204272,335.571645,333.598321,329.333118,319.580314,315.883566,313.39974,310.356707,305.93402,303.428411,297.054395,294.688864,292.127447,286.680988,284.243411,279.403322,271.073443,267.937598,265.843591,263.369511,259.501629,257.382104,251.95089,250.074808,247.62104,242.893904,241.278094,238.096766,230.968585,228.294465,226.515106,224.40864,221.099932,218.874233,214.239531,212.3946,210.381112,206.346581,204.908511,201.969429,195.882317,193.613658,192.113106,190.330955,187.02216,185.69914,181.53645,180.261133,178.547194,174.840502,172.671425,170.305844,165.12151,163.209808,161.827249,160.272358,157.526774,156.424373,153.136609,151.828351,150.20211,147.296501,145.8847,143.987564,139.567059,137.950795,136.733595,135.31309,132.667487,131.690934,128.524939,127.489555,125.899557,123.042852,121.573681,119.597167,115.856644,114.51792,113.568523,112.442615,110.485137,109.739054,107.254266,106.355763,105.175668,103.109102,101.916002,100.383355,97.204395,96.081872,95.334515,94.391918,92.087043,91.843203,89.705346,88.926952,88.088462,86.076229,85.170848,83.91389,81.216869,80.279748,79.599023,78.850524,76.969043,76.74736,74.811335,74.09963,73.436294,71.777863,71.064435,69.729808,67.447501,66.670563,66.171247,65.55432,64.079762,64.002865,62.418998,61.860578,61.085223,59.525951,58.938565,58.147296,56.213338,55.566483,55.155117,54.520921,53.052354,52.8323,51.312151,50.641714,49.564211,48.413012,47.575887,46.603098,44.923331,44.339567,44.120779,43.637844,42.567534,42.510234,41.348922,40.937179,40.323123,39.644633,39.254046,38.61007,37.189927,36.705286,36.589741,36.228865,35.381056,35.30749,34.400439,34.088652,33.639242,32.858583,32.597263,31.814357,30.616207,30.216112,30.083814,29.659393,29.006568,28.838553,28.123609,27.82572,27.505515,26.881867,26.514412,26.016861,25.155379,24.783384,24.724873,24.375525,23.809376,23.694684,23.0923,22.814353,22.446277,21.87896,21.665012,21.052249,20.330607,20.001897,19.806058,19.270405,18.776857,18.402442,17.600043,16.98997,16.349945,15.585697,15.296223,14.332207,13.910344,13.730037,13.618621,13.315707,13.062009,13.074016,12.610448,12.450154,12.180972,11.861997,11.66443,11.472037,11.120686,10.976256,10.907613,10.656991,10.477164,10.488239,10.115394,9.989199,9.785769,9.525763,9.404736,9.245715,8.952039,8.835588,8.779592,8.564791,8.433803,8.471712,8.150164,8.074549,7.897652,7.659182,7.527585,7.370979,7.126355,7.033467,6.97567,6.812404,6.710878,6.724247,6.448918,6.383495,6.247768,6.021226,5.894113,5.830816,5.627456,5.553957,5.509868,5.370177,5.277645,5.283421,5.043569,4.992218,4.886959,4.714544,4.570135,4.467831,4.300496,4.244234,4.218879,4.09173,4.004928,4.040279,3.858655,3.781702,3.749967,3.612046,3.489492,3.438379,3.300169,3.256925,3.231102,3.144557,3.083374,3.10631,2.971356,2.900361,2.858999,2.728992,2.658252,2.605795,2.491918,2.459196,2.434088,2.360742,2.319218,2.335527,2.217669,2.162964,2.131048,2.040739,1.939135,1.927354,1.833922,1.809807,1.810205,1.750119,1.709149,1.723628,1.608383,1.54343,1.513679,1.446362,1.387593,1.363856,1.287713,1.268321,1.253607,1.224893,1.206252,1.232444,1.14952,1.114651,1.094043,1.055615,1.000988,0.966047,0.90364,0.891716,0.881553,0.861573,0.841638,0.853611,0.785267,0.759584,0.73874,0.718652,0.682821,0.676818,0.642906,0.634406,0.626018,0.613798,0.603837,0.61164,0.569702,0.556739,0.543796,0.527619,0.499177,0.476766,0.4491,0.443143,0.435551,0.42298,0.412787,0.42408,0.392718,0.381038,0.364958,0.33691,0.309739,0.305352,0.283063,0.279303,0.274289,0.26919,0.262734,0.274897,0.251743,0.246111,0.237415,0.229053,0.214244,0.206365,0.195721,0.193113,0.19054,0.186816,0.184327,0.188109,0.170697,0.161307,0.155606,0.144367,0.136746,0.127205,0.118752,0.117156,0.115582,0.113181,0.110597,0.114376,0.102565,9.707382,9.182816,8.869774,8.168963,7.884605,7.201829,7.104195,7.007888,6.912886,6.727616,7.175704,6.456904,6.369242,6.112679,5.856798,5.529753,5.257648,4.693818,4.629154,0.045653,4.432051,4.371011,4.771019,4.251425,4.133046,4.010365,3.765305,3.553587,3.252025,3.207362,3.163315,3.050608,3.008676,2.967323,0.028673,2.827956,2.789061,2.750681,2.549613,2.51453,2.368616,2.33583,2.3035,2.271619,2.240181,2.209179,2.178603,0.021119,2.082789,1.961219,1.847835,1.731422,1.615505,1.593216,1.571235,1.549559,1.528183,1.507103,1.48631,1.465801,1.414554,1.352859,1.334246,1.279065,1.183801,1.167469,1.151362,1.135478,1.119814,1.104366,1.089128,1.074097,1.059257,9.760279,9.625791,8.918206,7.073597,6.97569,6.87914,6.783928,6.690036,6.270355,6.183604,6.098022,6.0135,5.93012,5.539274,4.289967,3.9598,3.904416,3.849807,3.795962,3.742871,3.690523,3.638907,3.587987,3.266077,3.220245,3.175056,3.130471,2.825156,2.785268,2.745943,2.707174,2.668953,2.631272,2.594123,2.111307,2.081558,2.052229,2.023313,1.542083,1.323224,1.304528,1.286097,1.267927,1.250013,1.232353,1.214942,1.197747,1.180766,1.164026,1.147523,9.583019,9.447679,9.314252,9.182708,9.053023,8.925169,8.799121,8.674854,8.55194,8.430371,8.310531,8.192395,8.07572,7.960083,7.846102,7.733753,7.623013,7.513858,7.406267,7.300217,7.195393,7.091786,6.989671,6.889027,6.78962,6.691044,6.593899,6.498165,6.403821,6.310848,6.219224,6.12893,6.039656,5.951393,5.864421,5.778721,5.69399,5.609986,5.527223,5.44568,5.365341,5.286187,5.208201,4.133606,3.086537,3.041284,2.996695,2.95276,9.915302,9.770027 +GricComplex,NIC,CL,C,,33535.87259,34226.13899,35866.8437,35451.31356,35047.2134,34735.40594,34456.75704,34290.73436,34184.26867,34067.66181,33994.19262,33936.81916,33860.23049,33920.99342,34447.17073,33915.76595,33396.41408,32951.02441,32515.54295,32160.3836,31854.40643,31562.14214,31317.65217,31095.08164,30891.30473,30761.34018,30916.75429,30528.19887,30146.88478,29800.17738,29459.8904,29163.23988,28896.67459,28621.88906,28369.72013,28127.44566,27894.52205,27679.31593,27624.1548,27276.62774,26937.26122,26624.25065,26325.40601,26055.3607,25818.43841,25580.76237,25355.67277,25145.04585,24942.23209,24769.52397,24724.29188,24412.87144,24107.27116,23820.83727,23546.77522,23302.623,23091.58515,22872.75656,22675.67512,22489.47881,22302.92252,22149.52562,22106.50014,21827.77828,21554.12559,21302.92909,21055.59979,20842.8176,20659.53343,20465.65555,20279.55591,20109.01245,19941.65289,19791.90948,19753.28503,19503.97108,19259.59753,19042.15141,18826.21936,18632.40376,18457.89799,18291.10043,18136.50295,17986.12736,17841.87427,17727.47016,17690.69409,17467.10495,17247.85766,17047.24234,16851.69196,16673.37397,16523.58274,16368.79309,16228.6635,16096.61305,15965.2048,15853.77126,15813.40766,15613.25065,15418.04039,15237.28332,15067.06796,14909.10818,14768.29743,14614.78308,14479.09815,14356.39748,14217.62335,14103.06012,14021.76677,13844.26502,13670.43639,13511.50902,13356.7006,13209.84121,13087.7532,12946.23175,12826.76079,12718.33045,12586.42694,12487.13981,12415.53739,12258.22962,12104.29653,11962.02898,11826.69161,11702.41869,11591.32992,11480.98248,11364.62507,11258.96336,11162.58296,11066.01657,11020.3166,10880.47425,10743.60366,10615.7354,10494.77672,10373.85063,10272.08981,10167.1258,10075.84734,9976.617737,9873.784291,9793.452834,9738.535436,9614.811563,9493.715955,9382.712349,9274.120706,9168.392271,9074.563452,8983.408475,8890.638889,8802.914628,8712.391834,8645.726124,8604.581385,8495.071966,8388.406094,8286.821547,8189.952954,8099.64263,8017.649133,7929.116104,7845.784672,7758.150379,7673.791533,7593.141781,7510.084844,7414.380573,7320.724307,7234.631513,7148.337636,7069.788214,6992.803322,6924.043065,6852.525872,6758.490391,6683.379481,6624.230727,6579.863813,6495.901093,6413.806703,6337.205467,6264.267111,6186.39002,6100.370234,6037.623325,5964.328582,5898.777579,5833.708765,5778.623149,5728.834826,5655.631174,5584.076607,5513.152398,5445.663212,5377.151901,5314.735844,5248.599168,5179.96521,5121.775037,5058.276758,4988.743097,4918.971964,4855.969474,4794.410997,4737.409332,4675.744516,4619.399207,4558.72763,4512.149916,4448.987656,4388.083355,4342.966868,4293.099344,4252.139077,4197.590645,4144.629682,4086.409605,4031.800661,3969.929594,3911.509996,3851.614416,3806.620608,3742.262477,3684.059481,3632.872153,3592.936223,3546.782022,3501.720716,3457.274233,3412.905514,3368.660208,3324.01036,3284.486945,3231.366847,3186.241729,3149.002801,3110.773438,3074.784295,3035.213888,2996.699751,2960.901906,2918.577258,2874.197674,2829.695919,2789.890863,2752.980964,2714.702217,2670.822059,2639.805393,2597.739454,2564.243761,2531.670974,2497.48136,2468.053663,2426.584729,2391.711248,2351.881112,2313.196028,2286.160467,2253.866916,2226.436184,2184.120775,2155.907698,2128.51922,2100.795774,2073.148231,2048.385659,2025.0897,1995.021858,1966.142097,1930.739863,1893.495615,1874.22198,1853.132371,1829.1403,1805.929023,1783.971081,1757.858364,1727.577513,1703.181775,1672.825172,1639.266949,1601.521186,1571.858572,1534.683048,1505.050081,1485.623051,1466.682836,1446.644697,1427.94535,1406.641458,1380.213187,1358.234732,1335.820374,1316.060212,1300.382785,1277.871789,1254.12873,1237.883891,1222.070044,1207.890021,1192.094125,1176.797243,1158.235032,1141.262466,1124.673342,1108.547008,1089.592557,1069.433382,1046.398207,1032.81553,1019.603188,1003.756714,990.580559,975.374562,960.605272,943.730653,929.188024,916.631898,903.500041,888.276223,870.430324,859.148348,848.120185,837.186224,824.094522,812.208099,799.647175,787.628456,774.914754,757.705942,743.065376,731.779311,711.699468,702.45661,690.424631,678.580749,663.166238,648.618608,624.12076,603.565108,582.415702,559.277957,536.857092,520.484869,487.114615,480.778456,474.492534,467.261587,460.788758,452.467662,444.594102,437.455104,429.308789,421.390702,414.833113,408.435316,398.075146,392.88443,387.738115,382.52232,376.978509,369.09776,362.613226,354.1242,348.567925,343.38234,337.629242,331.182311,323.169908,318.947206,314.758993,310.803,306.10757,301.699621,297.798319,292.506665,287.051657,280.419845,274.590526,268.561197,260.363862,256.954353,253.571647,248.912245,245.972759,242.285135,237.854082,232.551795,227.333399,223.05758,217.063713,212.668939,206.22415,203.517097,200.82965,196.943179,193.159049,189.440226,185.240484,180.479086,177.397226,174.091408,170.434345,165.720877,158.087694,156.010706,153.946704,150.716587,147.17816,143.581596,141.471073,138.177806,135.060287,132.934619,129.859753,124.758217,119.040288,117.474331,115.916152,112.88817,111.446444,109.246746,106.67424,105.223314,102.406054,99.84368,96.512743,93.082381,87.401628,86.249419,85.102088,83.036783,81.908159,80.497321,78.817502,77.447286,75.581881,73.670299,71.123444,67.132175,64.043847,63.197561,62.352608,61.414085,60.151507,58.497989,56.533312,54.59964,52.108631,50.228226,48.816235,46.713061,44.472247,43.886278,43.299438,42.365887,41.664588,41.009714,40.185602,39.079098,38.209455,37.332986,36.278399,34.431733,31.318798,30.906184,30.499117,30.016918,29.413235,28.669802,27.495236,26.078926,25.109785,24.294291,23.732585,21.892021,20.914212,20.637655,20.364776,20.104216,19.730784,19.398678,18.821077,18.516932,18.272469,17.801747,17.412207,16.49007,14.133229,13.946084,13.761491,13.501017,13.048942,12.709121,12.403982,12.147019,11.744218,11.191513,10.354495,9.258459,8.690802,8.576092,8.46293,8.341174,8.162127,7.875185,7.677418,7.586228,7.439121,7.231159,7.009123,6.547528,5.653089,5.577711,5.503344,5.432088,5.274719,5.210844,5.048875,4.521423,4.149387,3.964219,3.670722,3.351165,2.692363,2.656459,2.621038,2.587918,2.533526,2.463246,2.414022,2.261357,2.095748,1.940548,1.821631,1.445258,1.186766,1.170793,1.15504,1.141303,1.127417,1.045521,1.033222,1.002319,0.991524,0.887035,0.830358,0.80995,0.680213,0.670895,0.661709,0.654246,0.628288,0.619713,0.61292,0.607171,0.588391,0.583136,0.563105,0.529856,0.479119,0.472379,0.465753,0.431571,0.425476,0.420386,0.394927,0.391603,0.388046,0.384942,0.34191,0.34595,0.325343,0.320682,0.316088,0.31156,0.307097,0.303571,0.29969,0.287254,0.284454,0.260042,0.240548,0.226147,0.209627,0.206612,0.203641,0.200713,0.197827,0.195702,0.193167,0.191584,0.180651,0.16699,0.164965,0.14469,0.135317,0.133384,0.131479,0.129602,0.127751,0.126552,0.125021,0.12449,0.123074,0.109451,0.108542,8.537432,7.357732,7.254752,7.153214,7.053098,0.069555,6.089561,0.060267,0.060421,5.98855,5.904967,5.482401,5.117382,5.078674,5.007237,4.936807,4.867367,4.798905,4.731406,0.046841,0.047027,4.140964,4.082453,4.038134,4.083926,3.896083,3.840664,3.786034,3.732181,3.679096,3.626766,3.596725,0.028608,2.820268,2.780233,2.753741,2.094079,1.680325,1.656335,1.632689,1.60938,1.586404,0.015637,0.015608,1.560503,1.538159,1.516135,1.506607,0.01074,1.058866,0.010438,1.029138,1.014589,1.000245,9.861044,9.951639,1.006313,9.919704,9.77832,9.186752,9.333788,9.199741,9.06762,8.937397,8.809044,8.682534,8.557841,8.618284,8.698998,8.573137,8.449098,8.423441,8.599279,8.47406,8.350664,8.229066,8.109238,7.991155,7.874793,7.917113,7.969885,7.852826,7.737487,7.714442,7.789579,7.674303,7.560733,7.448843,7.33861,7.230009,7.126934,5.441094,3.574384,3.521814,3.470017,3.509319,1.046458,1.031126 +GicComplex,PR,CL,C,,2535,2529.591892,2500.971466,2430.585538,2407.863515,2388.488278,2368.366653,2339.830977,2320.140291,2273.265222,2260.159425,2238.704077,2196.317904,2183.379553,2150.583114,2081.624057,2054.038174,2029.380502,2004.867,1973.795957,1951.298307,1906.807541,1891.795768,1871.415088,1834.717693,1824.096114,1798.843011,1746.456017,1728.414842,1712.811725,1696.919127,1675.202665,1660.273625,1626.338933,1617.051755,1602.551809,1573.50648,1566.223126,1545.642015,1500.618943,1485.101264,1471.691271,1458.024238,1439.336088,1426.49893,1397.342507,1389.349718,1376.874475,1351.917587,1345.631534,1327.947885,1289.256361,1275.909196,1264.385251,1252.632234,1236.549581,1225.511406,1200.462439,1193.584031,1182.850738,1161.408247,1155.981809,1140.790031,1107.541577,1096.061618,1086.15935,1076.052965,1062.2116,1052.720985,1031.202771,1025.283378,1016.04856,997.627389,992.941506,979.891922,951.322487,941.448188,932.939999,924.249948,912.335664,904.175567,885.693476,880.598899,872.653466,856.829492,852.780943,841.573815,817.027071,808.533905,801.224309,793.752395,783.496234,776.480692,760.608477,756.223418,749.387426,735.795916,732.295962,722.67351,701.585003,694.279654,687.487246,680.310694,671.245483,665.234157,650.624971,646.397834,640.31947,628.457131,624.279582,613.950308,595.920763,589.722054,584.413043,578.971894,571.235961,566.135054,554.303845,550.929183,545.954891,536.01646,533.082302,525.872489,510.402366,505.085981,500.542004,495.878976,489.420143,485.047928,475.084784,472.137592,467.536806,459.019242,456.837145,450.500103,437.226131,432.664523,428.773768,424.77577,418.758891,415.479018,406.937395,404.160412,400.789774,393.334791,390.583535,385.733524,374.347985,370.021735,367.106731,363.680719,358.247179,355.176172,347.862729,345.225915,342.204272,335.571645,333.598321,329.333118,319.580314,315.883566,313.39974,310.356707,305.93402,303.428411,297.054395,294.688864,292.127447,286.680988,284.243411,279.403322,271.073443,267.937598,265.843591,263.369511,259.501629,257.382104,251.95089,250.074808,247.62104,242.893904,241.278094,238.096766,230.968585,228.294465,226.515106,224.40864,221.099932,218.874233,214.239531,212.3946,210.381112,206.346581,204.908511,201.969429,195.882317,193.613658,192.113106,190.330955,187.02216,185.69914,181.53645,180.261133,178.547194,174.840502,172.671425,170.305844,165.12151,163.209808,161.827249,160.272358,157.526774,156.424373,153.136609,151.828351,150.20211,147.296501,145.8847,143.987564,139.567059,137.950795,136.733595,135.31309,132.667487,131.690934,128.524939,127.489555,125.899557,123.042852,121.573681,119.597167,115.856644,114.51792,113.568523,112.442615,110.485137,109.739054,107.254266,106.355763,105.175668,103.109102,101.916002,100.383355,97.204395,96.081872,95.334515,94.391918,92.087043,91.843203,89.705346,88.926952,88.088462,86.076229,85.170848,83.91389,81.216869,80.279748,79.599023,78.850524,76.969043,76.74736,74.811335,74.09963,73.436294,71.777863,71.064435,69.729808,67.447501,66.670563,66.171247,65.55432,64.079762,64.002865,62.418998,61.860578,61.085223,59.525951,58.938565,58.147296,56.213338,55.566483,55.155117,54.520921,53.052354,52.8323,51.312151,50.641714,49.564211,48.413012,47.575887,46.603098,44.923331,44.339567,44.120779,43.637844,42.567534,42.510234,41.348922,40.937179,40.323123,39.644633,39.254046,38.61007,37.189927,36.705286,36.589741,36.228865,35.381056,35.30749,34.400439,34.088652,33.639242,32.858583,32.597263,31.814357,30.616207,30.216112,30.083814,29.659393,29.006568,28.838553,28.123609,27.82572,27.505515,26.881867,26.514412,26.016861,25.155379,24.783384,24.724873,24.375525,23.809376,23.694684,23.0923,22.814353,22.446277,21.87896,21.665012,21.052249,20.330607,20.001897,19.806058,19.270405,18.776857,18.402442,17.600043,16.98997,16.349945,15.585697,15.296223,14.332207,13.910344,13.730037,13.618621,13.315707,13.062009,13.074016,12.610448,12.450154,12.180972,11.861997,11.66443,11.472037,11.120686,10.976256,10.907613,10.656991,10.477164,10.488239,10.115394,9.989199,9.785769,9.525763,9.404736,9.245715,8.952039,8.835588,8.779592,8.564791,8.433803,8.471712,8.150164,8.074549,7.897652,7.659182,7.527585,7.370979,7.126355,7.033467,6.97567,6.812404,6.710878,6.724247,6.448918,6.383495,6.247768,6.021226,5.894113,5.830816,5.627456,5.553957,5.509868,5.370177,5.277645,5.283421,5.043569,4.992218,4.886959,4.714544,4.570135,4.467831,4.300496,4.244234,4.218879,4.09173,4.004928,4.040279,3.858655,3.781702,3.749967,3.612046,3.489492,3.438379,3.300169,3.256925,3.231102,3.144557,3.083374,3.10631,2.971356,2.900361,2.858999,2.728992,2.658252,2.605795,2.491918,2.459196,2.434088,2.360742,2.319218,2.335527,2.217669,2.162964,2.131048,2.040739,1.939135,1.927354,1.833922,1.809807,1.810205,1.750119,1.709149,1.723628,1.608383,1.54343,1.513679,1.446362,1.387593,1.363856,1.287713,1.268321,1.253607,1.224893,1.206252,1.232444,1.14952,1.114651,1.094043,1.055615,1.000988,0.966047,0.90364,0.891716,0.881553,0.861573,0.841638,0.853611,0.785267,0.759584,0.73874,0.718652,0.682821,0.676818,0.642906,0.634406,0.626018,0.613798,0.603837,0.61164,0.569702,0.556739,0.543796,0.527619,0.499177,0.476766,0.4491,0.443143,0.435551,0.42298,0.412787,0.42408,0.392718,0.381038,0.364958,0.33691,0.309739,0.305352,0.283063,0.279303,0.274289,0.26919,0.262734,0.274897,0.251743,0.246111,0.237415,0.229053,0.214244,0.206365,0.195721,0.193113,0.19054,0.186816,0.184327,0.188109,0.170697,0.161307,0.155606,0.144367,0.136746,0.127205,0.118752,0.117156,0.115582,0.113181,0.110597,0.114376,0.102565,9.707382,9.182816,8.869774,8.168963,7.884605,7.201829,7.104195,7.007888,6.912886,6.727616,7.175704,6.456904,6.369242,6.112679,5.856798,5.529753,5.257648,4.693818,4.629154,0.045653,4.432051,4.371011,4.771019,4.251425,4.133046,4.010365,3.765305,3.553587,3.252025,3.207362,3.163315,3.050608,3.008676,2.967323,0.028673,2.827956,2.789061,2.750681,2.549613,2.51453,2.368616,2.33583,2.3035,2.271619,2.240181,2.209179,2.178603,0.021119,2.082789,1.961219,1.847835,1.731422,1.615505,1.593216,1.571235,1.549559,1.528183,1.507103,1.48631,1.465801,1.414554,1.352859,1.334246,1.279065,1.183801,1.167469,1.151362,1.135478,1.119814,1.104366,1.089128,1.074097,1.059257,9.760279,9.625791,8.918206,7.073597,6.97569,6.87914,6.783928,6.690036,6.270355,6.183604,6.098022,6.0135,5.93012,5.539274,4.289967,3.9598,3.904416,3.849807,3.795962,3.742871,3.690523,3.638907,3.587987,3.266077,3.220245,3.175056,3.130471,2.825156,2.785268,2.745943,2.707174,2.668953,2.631272,2.594123,2.111307,2.081558,2.052229,2.023313,1.542083,1.323224,1.304528,1.286097,1.267927,1.250013,1.232353,1.214942,1.197747,1.180766,1.164026,1.147523,9.583019,9.447679,9.314252,9.182708,9.053023,8.925169,8.799121,8.674854,8.55194,8.430371,8.310531,8.192395,8.07572,7.960083,7.846102,7.733753,7.623013,7.513858,7.406267,7.300217,7.195393,7.091786,6.989671,6.889027,6.78962,6.691044,6.593899,6.498165,6.403821,6.310848,6.219224,6.12893,6.039656,5.951393,5.864421,5.778721,5.69399,5.609986,5.527223,5.44568,5.365341,5.286187,5.208201,4.133606,3.086537,3.041284,2.996695,2.95276,9.915302,9.770027 +GicComplex,NIC,CL,C,,33535.87259,34226.13899,35866.8437,35451.31356,35047.2134,34735.40594,34456.75704,34290.73436,34184.26867,34067.66181,33994.19262,33936.81916,33860.23049,33920.99342,34447.17073,33915.76595,33396.41408,32951.02441,32515.54295,32160.3836,31854.40643,31562.14214,31317.65217,31095.08164,30891.30473,30761.34018,30916.75429,30528.19887,30146.88478,29800.17738,29459.8904,29163.23988,28896.67459,28621.88906,28369.72013,28127.44566,27894.52205,27679.31593,27624.1548,27276.62774,26937.26122,26624.25065,26325.40601,26055.3607,25818.43841,25580.76237,25355.67277,25145.04585,24942.23209,24769.52397,24724.29188,24412.87144,24107.27116,23820.83727,23546.77522,23302.623,23091.58515,22872.75656,22675.67512,22489.47881,22302.92252,22149.52562,22106.50014,21827.77828,21554.12559,21302.92909,21055.59979,20842.8176,20659.53343,20465.65555,20279.55591,20109.01245,19941.65289,19791.90948,19753.28503,19503.97108,19259.59753,19042.15141,18826.21936,18632.40376,18457.89799,18291.10043,18136.50295,17986.12736,17841.87427,17727.47016,17690.69409,17467.10495,17247.85766,17047.24234,16851.69196,16673.37397,16523.58274,16368.79309,16228.6635,16096.61305,15965.2048,15853.77126,15813.40766,15613.25065,15418.04039,15237.28332,15067.06796,14909.10818,14768.29743,14614.78308,14479.09815,14356.39748,14217.62335,14103.06012,14021.76677,13844.26502,13670.43639,13511.50902,13356.7006,13209.84121,13087.7532,12946.23175,12826.76079,12718.33045,12586.42694,12487.13981,12415.53739,12258.22962,12104.29653,11962.02898,11826.69161,11702.41869,11591.32992,11480.98248,11364.62507,11258.96336,11162.58296,11066.01657,11020.3166,10880.47425,10743.60366,10615.7354,10494.77672,10373.85063,10272.08981,10167.1258,10075.84734,9976.617737,9873.784291,9793.452834,9738.535436,9614.811563,9493.715955,9382.712349,9274.120706,9168.392271,9074.563452,8983.408475,8890.638889,8802.914628,8712.391834,8645.726124,8604.581385,8495.071966,8388.406094,8286.821547,8189.952954,8099.64263,8017.649133,7929.116104,7845.784672,7758.150379,7673.791533,7593.141781,7510.084844,7414.380573,7320.724307,7234.631513,7148.337636,7069.788214,6992.803322,6924.043065,6852.525872,6758.490391,6683.379481,6624.230727,6579.863813,6495.901093,6413.806703,6337.205467,6264.267111,6186.39002,6100.370234,6037.623325,5964.328582,5898.777579,5833.708765,5778.623149,5728.834826,5655.631174,5584.076607,5513.152398,5445.663212,5377.151901,5314.735844,5248.599168,5179.96521,5121.775037,5058.276758,4988.743097,4918.971964,4855.969474,4794.410997,4737.409332,4675.744516,4619.399207,4558.72763,4512.149916,4448.987656,4388.083355,4342.966868,4293.099344,4252.139077,4197.590645,4144.629682,4086.409605,4031.800661,3969.929594,3911.509996,3851.614416,3806.620608,3742.262477,3684.059481,3632.872153,3592.936223,3546.782022,3501.720716,3457.274233,3412.905514,3368.660208,3324.01036,3284.486945,3231.366847,3186.241729,3149.002801,3110.773438,3074.784295,3035.213888,2996.699751,2960.901906,2918.577258,2874.197674,2829.695919,2789.890863,2752.980964,2714.702217,2670.822059,2639.805393,2597.739454,2564.243761,2531.670974,2497.48136,2468.053663,2426.584729,2391.711248,2351.881112,2313.196028,2286.160467,2253.866916,2226.436184,2184.120775,2155.907698,2128.51922,2100.795774,2073.148231,2048.385659,2025.0897,1995.021858,1966.142097,1930.739863,1893.495615,1874.22198,1853.132371,1829.1403,1805.929023,1783.971081,1757.858364,1727.577513,1703.181775,1672.825172,1639.266949,1601.521186,1571.858572,1534.683048,1505.050081,1485.623051,1466.682836,1446.644697,1427.94535,1406.641458,1380.213187,1358.234732,1335.820374,1316.060212,1300.382785,1277.871789,1254.12873,1237.883891,1222.070044,1207.890021,1192.094125,1176.797243,1158.235032,1141.262466,1124.673342,1108.547008,1089.592557,1069.433382,1046.398207,1032.81553,1019.603188,1003.756714,990.580559,975.374562,960.605272,943.730653,929.188024,916.631898,903.500041,888.276223,870.430324,859.148348,848.120185,837.186224,824.094522,812.208099,799.647175,787.628456,774.914754,757.705942,743.065376,731.779311,711.699468,702.45661,690.424631,678.580749,663.166238,648.618608,624.12076,603.565108,582.415702,559.277957,536.857092,520.484869,487.114615,480.778456,474.492534,467.261587,460.788758,452.467662,444.594102,437.455104,429.308789,421.390702,414.833113,408.435316,398.075146,392.88443,387.738115,382.52232,376.978509,369.09776,362.613226,354.1242,348.567925,343.38234,337.629242,331.182311,323.169908,318.947206,314.758993,310.803,306.10757,301.699621,297.798319,292.506665,287.051657,280.419845,274.590526,268.561197,260.363862,256.954353,253.571647,248.912245,245.972759,242.285135,237.854082,232.551795,227.333399,223.05758,217.063713,212.668939,206.22415,203.517097,200.82965,196.943179,193.159049,189.440226,185.240484,180.479086,177.397226,174.091408,170.434345,165.720877,158.087694,156.010706,153.946704,150.716587,147.17816,143.581596,141.471073,138.177806,135.060287,132.934619,129.859753,124.758217,119.040288,117.474331,115.916152,112.88817,111.446444,109.246746,106.67424,105.223314,102.406054,99.84368,96.512743,93.082381,87.401628,86.249419,85.102088,83.036783,81.908159,80.497321,78.817502,77.447286,75.581881,73.670299,71.123444,67.132175,64.043847,63.197561,62.352608,61.414085,60.151507,58.497989,56.533312,54.59964,52.108631,50.228226,48.816235,46.713061,44.472247,43.886278,43.299438,42.365887,41.664588,41.009714,40.185602,39.079098,38.209455,37.332986,36.278399,34.431733,31.318798,30.906184,30.499117,30.016918,29.413235,28.669802,27.495236,26.078926,25.109785,24.294291,23.732585,21.892021,20.914212,20.637655,20.364776,20.104216,19.730784,19.398678,18.821077,18.516932,18.272469,17.801747,17.412207,16.49007,14.133229,13.946084,13.761491,13.501017,13.048942,12.709121,12.403982,12.147019,11.744218,11.191513,10.354495,9.258459,8.690802,8.576092,8.46293,8.341174,8.162127,7.875185,7.677418,7.586228,7.439121,7.231159,7.009123,6.547528,5.653089,5.577711,5.503344,5.432088,5.274719,5.210844,5.048875,4.521423,4.149387,3.964219,3.670722,3.351165,2.692363,2.656459,2.621038,2.587918,2.533526,2.463246,2.414022,2.261357,2.095748,1.940548,1.821631,1.445258,1.186766,1.170793,1.15504,1.141303,1.127417,1.045521,1.033222,1.002319,0.991524,0.887035,0.830358,0.80995,0.680213,0.670895,0.661709,0.654246,0.628288,0.619713,0.61292,0.607171,0.588391,0.583136,0.563105,0.529856,0.479119,0.472379,0.465753,0.431571,0.425476,0.420386,0.394927,0.391603,0.388046,0.384942,0.34191,0.34595,0.325343,0.320682,0.316088,0.31156,0.307097,0.303571,0.29969,0.287254,0.284454,0.260042,0.240548,0.226147,0.209627,0.206612,0.203641,0.200713,0.197827,0.195702,0.193167,0.191584,0.180651,0.16699,0.164965,0.14469,0.135317,0.133384,0.131479,0.129602,0.127751,0.126552,0.125021,0.12449,0.123074,0.109451,0.108542,8.537432,7.357732,7.254752,7.153214,7.053098,0.069555,6.089561,0.060267,0.060421,5.98855,5.904967,5.482401,5.117382,5.078674,5.007237,4.936807,4.867367,4.798905,4.731406,0.046841,0.047027,4.140964,4.082453,4.038134,4.083926,3.896083,3.840664,3.786034,3.732181,3.679096,3.626766,3.596725,0.028608,2.820268,2.780233,2.753741,2.094079,1.680325,1.656335,1.632689,1.60938,1.586404,0.015637,0.015608,1.560503,1.538159,1.516135,1.506607,0.01074,1.058866,0.010438,1.029138,1.014589,1.000245,9.861044,9.951639,1.006313,9.919704,9.77832,9.186752,9.333788,9.199741,9.06762,8.937397,8.809044,8.682534,8.557841,8.618284,8.698998,8.573137,8.449098,8.423441,8.599279,8.47406,8.350664,8.229066,8.109238,7.991155,7.874793,7.917113,7.969885,7.852826,7.737487,7.714442,7.789579,7.674303,7.560733,7.448843,7.33861,7.230009,7.126934,5.441094,3.574384,3.521814,3.470017,3.509319,1.046458,1.031126 diff --git a/Test/Data/DataNodeParameter_Duplicate.csv b/Test/Data/DataNodeParameter_Duplicate.csv new file mode 100644 index 00000000..2c844eef --- /dev/null +++ b/Test/Data/DataNodeParameter_Duplicate.csv @@ -0,0 +1,13 @@ +@@Main +ReportingNode,Year,Month +CH,2020,12 + +@@SingleDataNodeParameter +DataNode,PremiumAllocation +DT1.1,0.9 +DT1.1,0.9 + +@@InterDataNodeParameter +DataNode,LinkedDataNode,ReinsuranceCoverage +DTR1.1,DT1.1,1 +DT1.1,DTR1.1,1 diff --git a/Test/Data/DataNodeParameter_InvalidDataNode.csv b/Test/Data/DataNodeParameter_InvalidDataNode.csv new file mode 100644 index 00000000..681a63c5 --- /dev/null +++ b/Test/Data/DataNodeParameter_InvalidDataNode.csv @@ -0,0 +1,14 @@ +@@Main +ReportingNode,Year,Month +CH,2020,12 + +@@SingleDataNodeParameter +DataNode,PremiumAllocation +DT1.1,0.9 +DataNodeInvalid0,0.85 + +@@InterDataNodeParameter +DataNode,LinkedDataNode,ReinsuranceCoverage +DTR1.1,DT1.1,1 +DataNodeInvalid1,DTR1.1,1 +DTR1.1,DataNodeInvalid2,1 diff --git a/Test/Data/DataNodeParameter_InvalidReinsCov.csv b/Test/Data/DataNodeParameter_InvalidReinsCov.csv new file mode 100644 index 00000000..802ab7b7 --- /dev/null +++ b/Test/Data/DataNodeParameter_InvalidReinsCov.csv @@ -0,0 +1,12 @@ +@@Main +ReportingNode,Year,Month +CH,2020,12 + +@@SingleDataNodeParameter +DataNode,PremiumAllocation +DT1.1,0.9 + +@@InterDataNodeParameter +DataNode,LinkedDataNode,ReinsuranceCoverage +DT1.1,DT1.1,1 + diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv new file mode 100644 index 00000000..1a81ddf9 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv @@ -0,0 +1,34 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@A +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,NIC,CF,DTR1.1,,A,C,140 +,PR,CF,DTR1.1,,A,C,-200 +2020,NIC,CF,DT2.2,,A,C,-280 +,AEA,CF,DT1.3,,A,C,-5 +,ACA,CF,DT1.3,,A,C,-10 +,NIC,CF,DT1.3,,A,C,-280 +,PR,CF,DT1.1,,A,C,400 +,NIC,CF,DT1.1,,A,C,-280 +,ACA,CF,DT1.1,,A,C,-10 +,AEA,CF,DT1.1,,A,C,-5 +2020,NIC,CF,DT1.2,,A,C,-280 +,PR,CF,DT2.1,,A,C,400 +,NIC,CF,DT2.1,,A,C,-280 +,ACA,CF,DT2.1,,A,C,-10 +,AEA,CF,DT2.1,,A,C,-5 +,PR,CF,DT1.3,,A,C,400 +2020,NIC,CF,DTR1.2,,A,C,140 +,PR,CF,DTR2.1,,A,C,-200 +,NIC,CF,DTR2.1,,A,C,140 +2020,NIC,CF,DTR2.2,,A,C,140 +,PR,CF,DT3.1,,A,C,400 +,NIC,CF,DT3.1,,A,C,-280 +,ACA,CF,DT3.1,,A,C,-10 +,AEA,CF,DT3.1,,A,C,-5 +,PR,CF,DT4.1,,A,C,400 +,NIC,CF,DT4.1,,A,C,-280 +,ACA,CF,DT4.1,,A,C,-10 +,AEA,CF,DT4.1,,A,C,-5 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv new file mode 100644 index 00000000..d0c36f7e --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv @@ -0,0 +1,8 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@AA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,BOP,DT3.1,,AA,I,-1.5 +,PR,EOP,DT3.1,,AA,C,-1.5 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv new file mode 100644 index 00000000..28224af3 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv @@ -0,0 +1,11 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@APA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,CF,DT1.3,,APA,C,400 +,PR,CF,DT1.1,,APA,C,320 +,PR,CF,DT2.1,,APA,C,320 +,PR,CF,DT3.1,,APA,C,320 +,PR,CF,DT4.1,,APA,C,320 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv new file mode 100644 index 00000000..8dbc1e48 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv @@ -0,0 +1,181 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@BE +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,BOP,DT1.1,C,BE,N,-798.536731161375 +,NIC,BOP,DT1.1,L,BE,N,598.7529445986629 +,PR,BOP,DT1.1,L,BE,N,-798.536731161375 +,NIC,BOP,DT1.1,C,BE,N,598.7529445986629 +,PR,EOP,DT1.1,L,BE,C,-399.63392949885525 +,NIC,EOP,DT1.1,L,BE,C,299.67554969423594 +,PR,EOP,DT1.1,C,BE,C,-399.63392949885525 +,NIC,EOP,DT1.1,C,BE,C,299.67554969423594 +,PR,IA,DT1.1,L,BE,N,-1.0971983374806105 +,NIC,IA,DT1.1,L,BE,N,0.9226050955731167 +,PR,IA,DT1.1,C,BE,N,-1.0971983374806105 +,NIC,IA,DT1.1,C,BE,N,0.9226050955731167 +,PR,CF,DT1.1,L,BE,N,400 +,NIC,CF,DT1.1,L,BE,N,-300 +,PR,CF,DT1.1,C,BE,N,400 +,NIC,CF,DT1.1,C,BE,N,-300 +2020,NIC,BOP,DT1.2,L,BE,N,598.7529445986629 +2020,NIC,BOP,DT1.2,C,BE,N,598.7529445986629 +2020,NIC,EOP,DT1.2,L,BE,C,299.67554969423594 +2020,NIC,EOP,DT1.2,C,BE,C,299.67554969423594 +2020,NIC,IA,DT1.2,L,BE,N,0.9226050955731167 +2020,NIC,IA,DT1.2,C,BE,N,0.9226050955731167 +2020,NIC,CF,DT1.2,L,BE,N,-300 +2020,NIC,CF,DT1.2,C,BE,N,-300 +,PR,BOP,DT1.3,L,BE,N,-798.536731161375 +,NIC,BOP,DT1.3,L,BE,N,598.7529445986629 +,PR,BOP,DT1.3,C,BE,N,-798.536731161375 +,NIC,BOP,DT1.3,C,BE,N,598.7529445986629 +,PR,EOP,DT1.3,L,BE,C,-399.63392949885525 +,NIC,EOP,DT1.3,L,BE,C,299.67554969423594 +,PR,EOP,DT1.3,C,BE,C,-399.63392949885525 +,NIC,EOP,DT1.3,C,BE,C,299.67554969423594 +,PR,IA,DT1.3,L,BE,N,-1.0971983374806105 +,NIC,IA,DT1.3,L,BE,N,0.9226050955731167 +,PR,IA,DT1.3,C,BE,N,-1.0971983374806105 +,NIC,IA,DT1.3,C,BE,N,0.9226050955731167 +,PR,CF,DT1.3,L,BE,N,400 +,NIC,CF,DT1.3,L,BE,N,-300 +,PR,CF,DT1.3,C,BE,N,400 +,NIC,CF,DT1.3,C,BE,N,-300 +,PR,BOP,DT2.1,L,BE,N,-798.536731161375 +,NIC,BOP,DT2.1,L,BE,N,598.7529445986629 +,PR,BOP,DT2.1,C,BE,N,-798.536731161375 +,NIC,BOP,DT2.1,C,BE,N,598.7529445986629 +,PR,EOP,DT2.1,L,BE,C,-399.63392949885525 +,NIC,EOP,DT2.1,L,BE,C,299.67554969423594 +,PR,EOP,DT2.1,C,BE,C,-399.63392949885525 +,NIC,EOP,DT2.1,C,BE,C,299.67554969423594 +,PR,IA,DT2.1,L,BE,N,-1.0971983374806105 +,NIC,IA,DT2.1,L,BE,N,0.9226050955731167 +,PR,IA,DT2.1,C,BE,N,-1.0971983374806105 +,NIC,IA,DT2.1,C,BE,N,0.9226050955731167 +,PR,CF,DT2.1,L,BE,N,400 +,NIC,CF,DT2.1,L,BE,N,-300 +,PR,CF,DT2.1,C,BE,N,400 +,NIC,CF,DT2.1,C,BE,N,-300 +2020,NIC,BOP,DT2.2,L,BE,N,598.7529445986629 +2020,NIC,BOP,DT2.2,C,BE,N,598.7529445986629 +2020,NIC,EOP,DT2.2,L,BE,C,299.67554969423594 +2020,NIC,EOP,DT2.2,C,BE,C,299.67554969423594 +2020,NIC,IA,DT2.2,L,BE,N,0.9226050955731167 +2020,NIC,IA,DT2.2,C,BE,N,0.9226050955731167 +2020,NIC,CF,DT2.2,L,BE,N,-300 +2020,NIC,CF,DT2.2,C,BE,N,-300 +,PR,BOP,DTR1.1,L,BE,N,399.2683655806875 +,NIC,BOP,DTR1.1,L,BE,N,-299.37647229933145 +,CDR,BOP,DTR1.1,L,BE,N,0.4811341181992343 +,PR,BOP,DTR1.1,C,BE,N,399.2683655806875 +,NIC,BOP,DTR1.1,C,BE,N,-299.37647229933145 +,CDR,BOP,DTR1.1,C,BE,N,0.4811341181992343 +,PR,EOP,DTR1.1,L,BE,C,199.81696474942763 +,NIC,EOP,DTR1.1,L,BE,C,-149.83777484711797 +,CDR,EOP,DTR1.1,L,BE,C,0.11527160395198197 +,PR,EOP,DTR1.1,C,BE,C,199.81696474942763 +,NIC,EOP,DTR1.1,C,BE,C,-149.83777484711797 +,CDR,EOP,DTR1.1,C,BE,C,0.11527160395198197 +,PR,IA,DTR1.1,L,BE,N,0.5485991687403052 +,NIC,IA,DTR1.1,L,BE,N,-0.4613025477865583 +,CDR,IA,DTR1.1,L,BE,N,0.0011701910454977593 +,PR,IA,DTR1.1,C,BE,N,0.5485991687403052 +,NIC,IA,DTR1.1,C,BE,N,-0.4613025477865583 +,CDR,IA,DTR1.1,C,BE,N,0.0011701910454977593 +,PR,CF,DTR1.1,L,BE,N,-200 +,NIC,CF,DTR1.1,L,BE,N,150 +,CDR,CF,DTR1.1,L,BE,N,-0.36703270529272203 +,PR,CF,DTR1.1,C,BE,N,-200 +,NIC,CF,DTR1.1,C,BE,N,150 +,CDR,CF,DTR1.1,C,BE,N,-0.36703270529272203 +2020,NIC,BOP,DTR1.2,L,BE,N,-299.37647229933145 +2020,CDR,BOP,DTR1.2,L,BE,N,0.4811341181992343 +2020,NIC,BOP,DTR1.2,C,BE,N,-299.37647229933145 +2020,CDR,BOP,DTR1.2,C,BE,N,0.4811341181992343 +2020,NIC,EOP,DTR1.2,L,BE,C,-149.83777484711797 +2020,CDR,EOP,DTR1.2,L,BE,C,0.11527160395198197 +2020,NIC,EOP,DTR1.2,C,BE,C,-149.83777484711797 +2020,CDR,EOP,DTR1.2,C,BE,C,0.11527160395198197 +2020,NIC,IA,DTR1.2,L,BE,N,-0.4613025477865583 +2020,CDR,IA,DTR1.2,L,BE,N,0.0011701910454977593 +2020,NIC,IA,DTR1.2,C,BE,N,-0.4613025477865583 +2020,CDR,IA,DTR1.2,C,BE,N,0.0011701910454977593 +2020,NIC,CF,DTR1.2,L,BE,N,150 +2020,CDR,CF,DTR1.2,L,BE,N,-0.36703270529272203 +2020,NIC,CF,DTR1.2,C,BE,N,150 +2020,CDR,CF,DTR1.2,C,BE,N,-0.36703270529272203 +,PR,BOP,DTR2.1,L,BE,N,399.2683655806875 +,NIC,BOP,DTR2.1,L,BE,N,-299.37647229933145 +,CDR,BOP,DTR2.1,L,BE,N,0.4811341181992343 +,PR,BOP,DTR2.1,C,BE,N,399.2683655806875 +,NIC,BOP,DTR2.1,C,BE,N,-299.37647229933145 +,CDR,BOP,DTR2.1,C,BE,N,0.4811341181992343 +,PR,EOP,DTR2.1,L,BE,C,199.81696474942763 +,NIC,EOP,DTR2.1,L,BE,C,-149.83777484711797 +,CDR,EOP,DTR2.1,L,BE,C,0.11527160395198197 +,PR,EOP,DTR2.1,C,BE,C,199.81696474942763 +,NIC,EOP,DTR2.1,C,BE,C,-149.83777484711797 +,CDR,EOP,DTR2.1,C,BE,C,0.11527160395198197 +,PR,IA,DTR2.1,L,BE,N,0.5485991687403052 +,NIC,IA,DTR2.1,L,BE,N,-0.4613025477865583 +,CDR,IA,DTR2.1,L,BE,N,0.0011701910454977593 +,PR,IA,DTR2.1,C,BE,N,0.5485991687403052 +,NIC,IA,DTR2.1,C,BE,N,-0.4613025477865583 +,CDR,IA,DTR2.1,C,BE,N,0.0011701910454977593 +,PR,CF,DTR2.1,L,BE,N,-200 +,NIC,CF,DTR2.1,L,BE,N,150 +,CDR,CF,DTR2.1,L,BE,N,-0.36703270529272203 +,PR,CF,DTR2.1,C,BE,N,-200 +,NIC,CF,DTR2.1,C,BE,N,150 +,CDR,CF,DTR2.1,C,BE,N,-0.36703270529272203 +2020,NIC,BOP,DTR2.2,L,BE,N,-299.37647229933145 +2020,CDR,BOP,DTR2.2,L,BE,N,0.4811341181992343 +2020,NIC,BOP,DTR2.2,C,BE,N,-299.37647229933145 +2020,CDR,BOP,DTR2.2,C,BE,N,0.4811341181992343 +2020,NIC,EOP,DTR2.2,L,BE,C,-149.83777484711797 +2020,CDR,EOP,DTR2.2,L,BE,C,0.11527160395198197 +2020,NIC,EOP,DTR2.2,C,BE,C,-149.83777484711797 +2020,CDR,EOP,DTR2.2,C,BE,C,0.11527160395198197 +2020,NIC,IA,DTR2.2,L,BE,N,-0.4613025477865583 +2020,CDR,IA,DTR2.2,L,BE,N,0.0011701910454977593 +2020,NIC,IA,DTR2.2,C,BE,N,-0.4613025477865583 +2020,CDR,IA,DTR2.2,C,BE,N,0.0011701910454977593 +2020,NIC,CF,DTR2.2,L,BE,N,150 +2020,CDR,CF,DTR2.2,L,BE,N,-0.36703270529272203 +2020,NIC,CF,DTR2.2,C,BE,N,150 +2020,CDR,CF,DTR2.2,C,BE,N,-0.36703270529272203 +,PR,BOP,DT3.1,L,BE,N,-798.536731161375 +,NIC,BOP,DT3.1,L,BE,N,598.7529445986629 +,PR,BOP,DT3.1,C,BE,N,-798.536731161375 +,NIC,BOP,DT3.1,C,BE,N,598.7529445986629 +,PR,EOP,DT3.1,L,BE,C,-399.63392949885525 +,NIC,EOP,DT3.1,L,BE,C,299.67554969423594 +,PR,EOP,DT3.1,C,BE,C,-399.63392949885525 +,NIC,EOP,DT3.1,C,BE,C,299.67554969423594 +,PR,IA,DT3.1,L,BE,N,-1.0971983374806105 +,NIC,IA,DT3.1,L,BE,N,0.9226050955731167 +,PR,IA,DT3.1,C,BE,N,-1.0971983374806105 +,NIC,IA,DT3.1,C,BE,N,0.9226050955731167 +,PR,CF,DT3.1,L,BE,N,400 +,NIC,CF,DT3.1,L,BE,N,-300 +,PR,CF,DT3.1,C,BE,N,400 +,NIC,CF,DT3.1,C,BE,N,-300 +,PR,BOP,DT4.1,L,BE,N,-798.536731161375 +,NIC,BOP,DT4.1,L,BE,N,598.7529445986629 +,PR,BOP,DT4.1,C,BE,N,-798.536731161375 +,NIC,BOP,DT4.1,C,BE,N,598.7529445986629 +,PR,EOP,DT4.1,L,BE,C,-399.63392949885525 +,NIC,EOP,DT4.1,L,BE,C,299.67554969423594 +,PR,EOP,DT4.1,C,BE,C,-399.63392949885525 +,NIC,EOP,DT4.1,C,BE,C,299.67554969423594 +,PR,IA,DT4.1,L,BE,N,-1.0971983374806105 +,NIC,IA,DT4.1,L,BE,N,0.9226050955731167 +,PR,IA,DT4.1,C,BE,N,-1.0971983374806105 +,NIC,IA,DT4.1,C,BE,N,0.9226050955731167 +,PR,CF,DT4.1,L,BE,N,400 +,NIC,CF,DT4.1,L,BE,N,-300 +,PR,CF,DT4.1,C,BE,N,400 +,NIC,CF,DT4.1,C,BE,N,-300 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv new file mode 100644 index 00000000..66ec38ea --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv @@ -0,0 +1,11 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@BEPA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,CF,DT1.1,L,BEPA,N,320 +,PR,CF,DT1.3,L,BEPA,N,400 +,PR,CF,DT2.1,L,BEPA,N,320 +,PR,CF,DT3.1,L,BEPA,N,320 +,PR,CF,DT4.1,L,BEPA,N,320 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv new file mode 100644 index 00000000..cf8c8f5f --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv @@ -0,0 +1,40 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@C +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,AM,DTR1.1,,C,C,24.228134693791258 +,,IA,DT1.3,,C,N,0.08233273235018213 +,,BOP,DT1.3,,C,N,139.90849210284577 +,,EOP,DT1.3,,C,C,82.02271122089925 +,,AM,DT1.3,,C,C,-42.968113614296705 +,,EA,DT1.3,,C,C,-15 +,,EA,DT1.1,,C,C,-15 +,,AM,DT1.1,,C,C,-42.968113614296705 +,,EOP,DT1.1,,C,C,82.02271122089925 +,,BOP,DT1.1,,C,N,139.90849210284577 +,,IA,DT1.1,,C,N,0.08233273235018213 +,,EA,DT2.1,,C,C,-15 +,,AM,DT2.1,,C,C,-42.968113614296705 +,,EOP,DT2.1,,C,C,82.02271122089925 +,,BOP,DT2.1,,C,N,139.90849210284577 +,,IA,DT2.1,,C,N,0.08233273235018213 +,,EOP,DTR1.1,,C,C,-46.24958203305145 +,,BOP,DTR1.1,,C,N,-70.43538016962212 +,,IA,DTR1.1,,C,N,-0.04233655722058882 +,,AM,DTR2.1,,C,C,24.228134693791258 +,,EOP,DTR2.1,,C,C,-46.24958203305145 +,,BOP,DTR2.1,,C,N,-70.43538016962212 +,,IA,DTR2.1,,C,N,-0.04233655722058882 +,,BOP,DT3.1,,C,I,72.2 +,,EA,DT3.1,,C,C,-15 +,,AM,DT3.1,,C,C,-67.83795828214956 +,,EOP,DT3.1,,C,C,129.49726655304642 +,,IA,DT3.1,,C,I,0.14440000000001615 +,,BOP,DT3.1,,C,N,139.90849210284577 +,,IA,DT3.1,,C,N,0.08233273235018213 +,,EA,DT4.1,,C,C,-15 +,,AM,DT4.1,,C,C,-42.968113614296705 +,,EOP,DT4.1,,C,C,82.02271122089925 +,,BOP,DT4.1,,C,N,139.90849210284577 +,,IA,DT4.1,,C,N,0.08233273235018213 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv new file mode 100644 index 00000000..0b2eb99d --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv @@ -0,0 +1,21 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@DA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,EOP,DT1.3,,DA,C,-9.843447868559382 +,,AM,DT1.3,,DA,C,5.156552131440618 +,,CF,DT1.3,,DA,C,-15 +,,CF,DT1.1,,DA,C,-15 +,,AM,DT1.1,,DA,C,5.156552131440618 +,,EOP,DT1.1,,DA,C,-9.843447868559382 +,,CF,DT2.1,,DA,C,-15 +,,AM,DT2.1,,DA,C,5.156552131440618 +,,EOP,DT2.1,,DA,C,-9.843447868559382 +,,CF,DT3.1,,DA,C,-15 +,,AM,DT3.1,,DA,C,5.156552131440618 +,,EOP,DT3.1,,DA,C,-9.843447868559382 +,,CF,DT4.1,,DA,C,-15 +,,AM,DT4.1,,DA,C,5.156552131440618 +,,EOP,DT4.1,,DA,C,-9.843447868559382 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv new file mode 100644 index 00000000..91b1b7f4 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv @@ -0,0 +1,17 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@F +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,AM,DT1.1,L,F,C,0.3437701420960412 +,,AM,DT1.2,L,F,C,1 +,,AM,DT1.3,L,F,C,0.3437701420960412 +,,AM,DT2.1,L,F,C,0.3437701420960412 +,,AM,DT2.2,L,F,C,1 +,,AM,DTR1.1,L,F,C,0.3437701420960412 +,,AM,DTR1.2,L,F,C,1 +,,AM,DTR2.1,L,F,C,0.3437701420960412 +,,AM,DTR2.2,L,F,C,1 +,,AM,DT3.1,L,F,C,0.3437701420960412 +,,AM,DT4.1,L,F,C,0.3437701420960412 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv new file mode 100644 index 00000000..08356dd2 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv @@ -0,0 +1,8 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@OA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,BOP,DT3.1,,OA,I,1.5 +,PR,EOP,DT3.1,,OA,C,1.5 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv new file mode 100644 index 00000000..d61cc7d7 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv @@ -0,0 +1,94 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@RA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,BOP,DT1.1,C,RA,N,59.8752944598663 +,,BOP,DT1.1,L,RA,N,59.8752944598663 +,,EOP,DT1.1,C,RA,C,29.967554969423595 +,,EOP,DT1.1,L,RA,C,29.967554969423595 +,,IA,DT1.1,C,RA,N,0.09226050955731169 +,,IA,DT1.1,L,RA,N,0.09226050955731169 +,,CF,DT1.1,C,RA,N,-30 +,,CF,DT1.1,L,RA,N,-30 +2020,,BOP,DT1.2,C,RA,N,59.8752944598663 +2020,,BOP,DT1.2,L,RA,N,59.8752944598663 +2020,,EOP,DT1.2,C,RA,C,29.967554969423595 +2020,,EOP,DT1.2,L,RA,C,29.967554969423595 +2020,,IA,DT1.2,C,RA,N,0.09226050955731169 +2020,,IA,DT1.2,L,RA,N,0.09226050955731169 +2020,,CF,DT1.2,C,RA,N,-30 +2020,,CF,DT1.2,L,RA,N,-30 +,,BOP,DT1.3,C,RA,N,59.8752944598663 +,,BOP,DT1.3,L,RA,N,59.8752944598663 +,,EOP,DT1.3,C,RA,C,29.967554969423595 +,,EOP,DT1.3,L,RA,C,29.967554969423595 +,,IA,DT1.3,C,RA,N,0.09226050955731169 +,,IA,DT1.3,L,RA,N,0.09226050955731169 +,,CF,DT1.3,C,RA,N,-30 +,,CF,DT1.3,L,RA,N,-30 +,,BOP,DT2.1,C,RA,N,59.8752944598663 +,,BOP,DT2.1,L,RA,N,59.8752944598663 +,,EOP,DT2.1,C,RA,C,29.967554969423595 +,,EOP,DT2.1,L,RA,C,29.967554969423595 +,,IA,DT2.1,C,RA,N,0.09226050955731169 +,,IA,DT2.1,L,RA,N,0.09226050955731169 +,,CF,DT2.1,C,RA,N,-30 +,,CF,DT2.1,L,RA,N,-30 +2020,,BOP,DT2.2,C,RA,N,59.8752944598663 +2020,,BOP,DT2.2,L,RA,N,59.8752944598663 +2020,,EOP,DT2.2,C,RA,C,29.967554969423595 +2020,,EOP,DT2.2,L,RA,C,29.967554969423595 +2020,,IA,DT2.2,C,RA,N,0.09226050955731169 +2020,,IA,DT2.2,L,RA,N,0.09226050955731169 +2020,,CF,DT2.2,C,RA,N,-30 +2020,,CF,DT2.2,L,RA,N,-30 +,,BOP,DTR1.1,C,RA,N,-29.93764722993315 +,,BOP,DTR1.1,L,RA,N,-29.93764722993315 +,,EOP,DTR1.1,C,RA,C,-14.983777484711798 +,,EOP,DTR1.1,L,RA,C,-14.983777484711798 +,,IA,DTR1.1,C,RA,N,-0.046130254778655844 +,,IA,DTR1.1,L,RA,N,-0.046130254778655844 +,,CF,DTR1.1,C,RA,N,15 +,,CF,DTR1.1,L,RA,N,15 +2020,,BOP,DTR1.2,C,RA,N,-29.93764722993315 +2020,,BOP,DTR1.2,L,RA,N,-29.93764722993315 +2020,,EOP,DTR1.2,C,RA,C,-14.983777484711798 +2020,,EOP,DTR1.2,L,RA,C,-14.983777484711798 +2020,,IA,DTR1.2,C,RA,N,-0.046130254778655844 +2020,,IA,DTR1.2,L,RA,N,-0.046130254778655844 +2020,,CF,DTR1.2,C,RA,N,15 +2020,,CF,DTR1.2,L,RA,N,15 +,,BOP,DTR2.1,C,RA,N,-29.93764722993315 +,,BOP,DTR2.1,L,RA,N,-29.93764722993315 +,,EOP,DTR2.1,C,RA,C,-14.983777484711798 +,,EOP,DTR2.1,L,RA,C,-14.983777484711798 +,,IA,DTR2.1,C,RA,N,-0.046130254778655844 +,,IA,DTR2.1,L,RA,N,-0.046130254778655844 +,,CF,DTR2.1,C,RA,N,15 +,,CF,DTR2.1,L,RA,N,15 +2020,,BOP,DTR2.2,C,RA,N,-29.93764722993315 +2020,,BOP,DTR2.2,L,RA,N,-29.93764722993315 +2020,,EOP,DTR2.2,C,RA,C,-14.983777484711798 +2020,,EOP,DTR2.2,L,RA,C,-14.983777484711798 +2020,,IA,DTR2.2,C,RA,N,-0.046130254778655844 +2020,,IA,DTR2.2,L,RA,N,-0.046130254778655844 +2020,,CF,DTR2.2,C,RA,N,15 +2020,,CF,DTR2.2,L,RA,N,15 +,,BOP,DT3.1,C,RA,N,59.8752944598663 +,,BOP,DT3.1,L,RA,N,59.8752944598663 +,,EOP,DT3.1,C,RA,C,29.967554969423595 +,,EOP,DT3.1,L,RA,C,29.967554969423595 +,,IA,DT3.1,C,RA,N,0.09226050955731169 +,,IA,DT3.1,L,RA,N,0.09226050955731169 +,,CF,DT3.1,C,RA,N,-30 +,,CF,DT3.1,L,RA,N,-30 +,,BOP,DT4.1,C,RA,N,59.8752944598663 +,,BOP,DT4.1,L,RA,N,59.8752944598663 +,,EOP,DT4.1,C,RA,C,29.967554969423595 +,,EOP,DT4.1,L,RA,C,29.967554969423595 +,,IA,DT4.1,C,RA,N,0.09226050955731169 +,,IA,DT4.1,L,RA,N,0.09226050955731169 +,,CF,DT4.1,C,RA,N,-30 +,,CF,DT4.1,L,RA,N,-30 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv new file mode 100644 index 00000000..4411cdfd --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv @@ -0,0 +1,39 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@A +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +2020,NIC,CF,DT2.2,,A,C,-76 +,AEA,CF,DT2.1,,A,C,-5 +,ACA,CF,DT2.1,,A,C,-10 +,NIC,CF,DT2.1,,A,C,-70 +,ICO,CF,DT2.1,,A,C,-6 +,PR,CF,DT2.1,,A,C,90 +,PR,CF,DT1.1,,A,C,90 +,ICO,CF,DT1.1,,A,C,-6 +,NIC,CF,DT1.1,,A,C,-70 +,ACA,CF,DT1.1,,A,C,-10 +,AEA,CF,DT1.1,,A,C,-5 +,PR,CF,DT1.3,,A,C,90 +,ICO,CF,DT1.3,,A,C,-6 +,NIC,CF,DT1.3,,A,C,-70 +,ACA,CF,DT1.3,,A,C,-10 +2020,NIC,CF,DT1.2,,A,C,-76 +,AEA,CF,DT1.3,,A,C,-5 +,PR,CF,DTR1.1,,A,C,-45 +,NIC,CF,DTR1.1,,A,C,35 +2020,NIC,CF,DTR1.2,,A,C,35 +,PR,CF,DTR2.1,,A,C,-45 +,NIC,CF,DTR2.1,,A,C,35 +2020,NIC,CF,DTR2.2,,A,C,35 +,PR,CF,DT3.1,,A,C,90 +,ICO,CF,DT3.1,,A,C,-6 +,NIC,CF,DT3.1,,A,C,-70 +,ACA,CF,DT3.1,,A,C,-10 +,AEA,CF,DT3.1,,A,C,-5 +,PR,CF,DT4.1,,A,C,90 +,ICO,CF,DT4.1,,A,C,-6 +,NIC,CF,DT4.1,,A,C,-70 +,ACA,CF,DT4.1,,A,C,-10 +,AEA,CF,DT4.1,,A,C,-5 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv new file mode 100644 index 00000000..4364bf3b --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv @@ -0,0 +1,26 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@AA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,EOP,DT2.1,,AA,C,-1 +,PR,CF,DT2.1,,AA,C,-5 +,PR,WO,DT2.1,,AA,C,4 +,PR,WO,DT1.1,,AA,C,4 +,PR,CF,DT1.1,,AA,C,-5 +,PR,EOP,DT1.1,,AA,C,-1 +,PR,WO,DT1.3,,AA,C,4 +,PR,CF,DT1.3,,AA,C,-5 +,PR,EOP,DT1.3,,AA,C,-1 +,PR,CF,DTR1.1,,AA,C,2 +,PR,EOP,DTR1.1,,AA,C,2 +,PR,CF,DTR2.1,,AA,C,2 +,PR,EOP,DTR2.1,,AA,C,2 +,PR,WO,DT3.1,,AA,C,4 +,PR,CF,DT3.1,,AA,C,-5 +,PR,BOP,DT3.1,,AA,I,-1.5 +,PR,EOP,DT3.1,,AA,C,-2.5 +,PR,WO,DT4.1,,AA,C,4 +,PR,CF,DT4.1,,AA,C,-5 +,PR,EOP,DT4.1,,AA,C,-1 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv new file mode 100644 index 00000000..f489cba8 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv @@ -0,0 +1,11 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@AAPA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,CF,DT2.1,,AAPA,C,-4 +,PR,CF,DT1.1,,AAPA,C,-4 +,PR,CF,DT1.3,,AAPA,C,-5 +,PR,CF,DT3.1,,AAPA,C,-4 +,PR,CF,DT4.1,,AAPA,C,-4 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv new file mode 100644 index 00000000..e25da1c5 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv @@ -0,0 +1,11 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@APA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,CF,DT2.1,,APA,C,72 +,PR,CF,DT1.1,,APA,C,72 +,PR,CF,DT1.3,,APA,C,90 +,PR,CF,DT3.1,,APA,C,72 +,PR,CF,DT4.1,,APA,C,72 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv new file mode 100644 index 00000000..e367c61e --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv @@ -0,0 +1,471 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@BE +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,MC,DT1.1,L,BE,I,-39.963392949885474 +,NIC,MC,DT1.1,L,BE,I,-59.93510993884718 +,PR,MC,DT1.1,C,BE,I,-39.963392949885474 +,NIC,MC,DT1.1,C,BE,I,-59.93510993884718 +,PR,BOP,DT1.1,L,BE,N,-39.963392949885524 +,NIC,BOP,DT1.1,L,BE,N,47.94808795107775 +,ICO,BOP,DT1.1,L,BE,N,11.987021987769438 +,PR,BOP,DT1.1,C,BE,N,-39.908704950657615 +,NIC,BOP,DT1.1,C,BE,N,47.87054820092061 +,ICO,BOP,DT1.1,C,BE,N,11.967637050230152 +,PR,EV,DT1.1,L,BE,N,14.990014559301141 +,NIC,EV,DT1.1,L,BE,N,44.96255719444398 +,PR,EV,DT1.1,C,BE,N,14.975090771307462 +,NIC,EV,DT1.1,C,BE,N,44.906606557852164 +,PR,BOP,DT1.1,L,BE,I,-399.63392949885525 +,NIC,BOP,DT1.1,L,BE,I,299.67554969423594 +,PR,BOP,DT1.1,C,BE,I,-399.63392949885525 +,NIC,BOP,DT1.1,C,BE,I,299.67554969423594 +,PR,EOP,DT1.1,L,BE,C,-344.7703348639262 +,NIC,EOP,DT1.1,L,BE,C,260.78283172777515 +,ICO,EOP,DT1.1,L,BE,C,8.992511438888796 +,PR,EOP,DT1.1,C,BE,C,-344.42708774007167 +,NIC,EOP,DT1.1,C,BE,C,260.4583180355426 +,ICO,EOP,DT1.1,C,BE,C,8.981321311570435 +,PR,IA,DT1.1,L,BE,I,-0.18299785588431194 +,NIC,IA,DT1.1,L,BE,I,0.10978902238720895 +,PR,IA,DT1.1,C,BE,I,-0.18299785588431194 +,NIC,IA,DT1.1,C,BE,I,0.10978902238720895 +,PR,CF,DT1.1,L,BE,I,110 +,NIC,CF,DT1.1,L,BE,I,-60 +,PR,CF,DT1.1,C,BE,I,110 +,NIC,CF,DT1.1,C,BE,I,-60 +,PR,YCU,DT1.1,C,BE,I,0.3283233358608868 +,NIC,YCU,DT1.1,C,BE,I,-0.22380254636726704 +,PR,IA,DT1.1,L,BE,N,-0.016636168716755634 +,NIC,IA,DT1.1,L,BE,N,0.021957804477441785 +,ICO,IA,DT1.1,L,BE,N,0.005489451119360446 +,PR,IA,DT1.1,C,BE,N,-0.04147659195731423 +,NIC,IA,DT1.1,C,BE,N,0.05473704536112062 +,ICO,IA,DT1.1,C,BE,N,0.013684261340280154 +,PR,CF,DT1.1,L,BE,N,10 +,NIC,CF,DT1.1,L,BE,N,-12 +,ICO,CF,DT1.1,L,BE,N,-3 +,PR,CF,DT1.1,C,BE,N,10 +,NIC,CF,DT1.1,C,BE,N,-12 +,ICO,CF,DT1.1,C,BE,N,-3 +2020,NIC,MC,DT1.2,L,BE,I,-59.93510993884718 +2020,NIC,MC,DT1.2,C,BE,I,-59.93510993884718 +2020,NIC,BOP,DT1.2,L,BE,N,59.93510993884719 +2020,NIC,BOP,DT1.2,C,BE,N,59.83818525115076 +2020,NIC,EV,DT1.2,L,BE,N,44.96255719444399 +2020,NIC,EV,DT1.2,C,BE,N,44.90660655785217 +2020,NIC,BOP,DT1.2,L,BE,I,299.67554969423594 +2020,NIC,BOP,DT1.2,C,BE,I,299.67554969423594 +2020,NIC,EOP,DT1.2,L,BE,C,269.7753431666639 +2020,NIC,EOP,DT1.2,C,BE,C,269.43963934711303 +2020,NIC,IA,DT1.2,L,BE,I,0.10978902238720895 +2020,NIC,IA,DT1.2,C,BE,I,0.10978902238720895 +2020,NIC,CF,DT1.2,L,BE,I,-60 +2020,NIC,CF,DT1.2,C,BE,I,-60 +2020,NIC,YCU,DT1.2,C,BE,I,-0.22380254636726704 +2020,NIC,IA,DT1.2,L,BE,N,0.027447255596802236 +2020,NIC,IA,DT1.2,C,BE,N,0.06842130670140079 +2020,NIC,CF,DT1.2,L,BE,N,-15 +2020,NIC,CF,DT1.2,C,BE,N,-15 +,PR,MC,DT1.3,L,BE,I,-39.963392949885474 +,NIC,MC,DT1.3,L,BE,I,-59.93510993884718 +,PR,MC,DT1.3,C,BE,I,-39.963392949885474 +,NIC,MC,DT1.3,C,BE,I,-59.93510993884718 +,PR,BOP,DT1.3,L,BE,N,-39.963392949885524 +,NIC,BOP,DT1.3,L,BE,N,47.94808795107775 +,ICO,BOP,DT1.3,L,BE,N,11.987021987769438 +,PR,BOP,DT1.3,C,BE,N,-39.908704950657615 +,NIC,BOP,DT1.3,C,BE,N,47.87054820092061 +,ICO,BOP,DT1.3,C,BE,N,11.967637050230152 +,PR,EV,DT1.3,L,BE,N,14.990014559301141 +,NIC,EV,DT1.3,L,BE,N,44.96255719444398 +,PR,EV,DT1.3,C,BE,N,14.975090771307462 +,NIC,EV,DT1.3,C,BE,N,44.906606557852164 +,PR,BOP,DT1.3,L,BE,I,-399.63392949885525 +,NIC,BOP,DT1.3,L,BE,I,299.67554969423594 +,PR,BOP,DT1.3,C,BE,I,-399.63392949885525 +,NIC,BOP,DT1.3,C,BE,I,299.67554969423594 +,PR,EOP,DT1.3,L,BE,C,-344.7703348639262 +,NIC,EOP,DT1.3,L,BE,C,260.78283172777515 +,ICO,EOP,DT1.3,L,BE,C,8.992511438888796 +,PR,EOP,DT1.3,C,BE,C,-344.42708774007167 +,NIC,EOP,DT1.3,C,BE,C,260.4583180355426 +,ICO,EOP,DT1.3,C,BE,C,8.981321311570435 +,PR,IA,DT1.3,L,BE,I,-0.18299785588431194 +,NIC,IA,DT1.3,L,BE,I,0.10978902238720895 +,PR,IA,DT1.3,C,BE,I,-0.18299785588431194 +,NIC,IA,DT1.3,C,BE,I,0.10978902238720895 +,PR,CF,DT1.3,L,BE,I,110 +,NIC,CF,DT1.3,L,BE,I,-60 +,PR,CF,DT1.3,C,BE,I,110 +,NIC,CF,DT1.3,C,BE,I,-60 +,PR,YCU,DT1.3,C,BE,I,0.3283233358608868 +,NIC,YCU,DT1.3,C,BE,I,-0.22380254636726704 +,PR,IA,DT1.3,L,BE,N,-0.016636168716755634 +,NIC,IA,DT1.3,L,BE,N,0.021957804477441785 +,ICO,IA,DT1.3,L,BE,N,0.005489451119360446 +,PR,IA,DT1.3,C,BE,N,-0.04147659195731423 +,NIC,IA,DT1.3,C,BE,N,0.05473704536112062 +,ICO,IA,DT1.3,C,BE,N,0.013684261340280154 +,PR,CF,DT1.3,L,BE,N,10 +,NIC,CF,DT1.3,L,BE,N,-12 +,ICO,CF,DT1.3,L,BE,N,-3 +,PR,CF,DT1.3,C,BE,N,10 +,NIC,CF,DT1.3,C,BE,N,-12 +,ICO,CF,DT1.3,C,BE,N,-3 +,PR,MC,DT2.1,L,BE,I,-39.963392949885474 +,NIC,MC,DT2.1,L,BE,I,-59.93510993884718 +,PR,MC,DT2.1,C,BE,I,-39.963392949885474 +,NIC,MC,DT2.1,C,BE,I,-59.93510993884718 +,PR,BOP,DT2.1,L,BE,N,-39.963392949885524 +,NIC,BOP,DT2.1,L,BE,N,47.94808795107775 +,ICO,BOP,DT2.1,L,BE,N,11.987021987769438 +,PR,BOP,DT2.1,C,BE,N,-39.908704950657615 +,NIC,BOP,DT2.1,C,BE,N,47.87054820092061 +,ICO,BOP,DT2.1,C,BE,N,11.967637050230152 +,PR,EV,DT2.1,L,BE,N,14.990014559301141 +,NIC,EV,DT2.1,L,BE,N,44.96255719444398 +,PR,EV,DT2.1,C,BE,N,14.975090771307462 +,NIC,EV,DT2.1,C,BE,N,44.906606557852164 +,PR,BOP,DT2.1,L,BE,I,-399.63392949885525 +,NIC,BOP,DT2.1,L,BE,I,299.67554969423594 +,PR,BOP,DT2.1,C,BE,I,-399.63392949885525 +,NIC,BOP,DT2.1,C,BE,I,299.67554969423594 +,PR,EOP,DT2.1,L,BE,C,-344.7703348639262 +,NIC,EOP,DT2.1,L,BE,C,260.78283172777515 +,ICO,EOP,DT2.1,L,BE,C,8.992511438888796 +,PR,EOP,DT2.1,C,BE,C,-344.42708774007167 +,NIC,EOP,DT2.1,C,BE,C,260.4583180355426 +,ICO,EOP,DT2.1,C,BE,C,8.981321311570435 +,PR,IA,DT2.1,L,BE,I,-0.18299785588431194 +,NIC,IA,DT2.1,L,BE,I,0.10978902238720895 +,PR,IA,DT2.1,C,BE,I,-0.18299785588431194 +,NIC,IA,DT2.1,C,BE,I,0.10978902238720895 +,PR,CF,DT2.1,L,BE,I,110 +,NIC,CF,DT2.1,L,BE,I,-60 +,PR,CF,DT2.1,C,BE,I,110 +,NIC,CF,DT2.1,C,BE,I,-60 +,PR,YCU,DT2.1,C,BE,I,0.3283233358608868 +,NIC,YCU,DT2.1,C,BE,I,-0.22380254636726704 +,PR,IA,DT2.1,L,BE,N,-0.016636168716755634 +,NIC,IA,DT2.1,L,BE,N,0.021957804477441785 +,ICO,IA,DT2.1,L,BE,N,0.005489451119360446 +,PR,IA,DT2.1,C,BE,N,-0.04147659195731423 +,NIC,IA,DT2.1,C,BE,N,0.05473704536112062 +,ICO,IA,DT2.1,C,BE,N,0.013684261340280154 +,PR,CF,DT2.1,L,BE,N,10 +,NIC,CF,DT2.1,L,BE,N,-12 +,ICO,CF,DT2.1,L,BE,N,-3 +,PR,CF,DT2.1,C,BE,N,10 +,NIC,CF,DT2.1,C,BE,N,-12 +,ICO,CF,DT2.1,C,BE,N,-3 +2020,NIC,MC,DT2.2,L,BE,I,-59.93510993884718 +2020,NIC,MC,DT2.2,C,BE,I,-59.93510993884718 +2020,NIC,BOP,DT2.2,L,BE,N,59.93510993884719 +2020,NIC,BOP,DT2.2,C,BE,N,59.83818525115076 +2020,NIC,EV,DT2.2,L,BE,N,44.96255719444399 +2020,NIC,EV,DT2.2,C,BE,N,44.90660655785217 +2020,NIC,BOP,DT2.2,L,BE,I,299.67554969423594 +2020,NIC,BOP,DT2.2,C,BE,I,299.67554969423594 +2020,NIC,EOP,DT2.2,L,BE,C,269.7753431666639 +2020,NIC,EOP,DT2.2,C,BE,C,269.43963934711303 +2020,NIC,IA,DT2.2,L,BE,I,0.10978902238720895 +2020,NIC,IA,DT2.2,C,BE,I,0.10978902238720895 +2020,NIC,CF,DT2.2,L,BE,I,-60 +2020,NIC,CF,DT2.2,C,BE,I,-60 +2020,NIC,YCU,DT2.2,C,BE,I,-0.22380254636726704 +2020,NIC,IA,DT2.2,L,BE,N,0.027447255596802236 +2020,NIC,IA,DT2.2,C,BE,N,0.06842130670140079 +2020,NIC,CF,DT2.2,L,BE,N,-15 +2020,NIC,CF,DT2.2,C,BE,N,-15 +,PR,MC,DTR1.1,L,BE,I,19.981696474942737 +,NIC,MC,DTR1.1,L,BE,I,29.96755496942359 +,CDR,MC,DTR1.1,L,BE,I,-0.023054320790396418 +,PR,MC,DTR1.1,C,BE,I,19.981696474942737 +,NIC,MC,DTR1.1,C,BE,I,29.96755496942359 +,CDR,MC,DTR1.1,C,BE,I,-0.023054320790396418 +,PR,BOP,DTR1.1,L,BE,N,19.981696474942762 +,NIC,BOP,DTR1.1,L,BE,N,-29.967554969423595 +,CDR,BOP,DTR1.1,L,BE,N,0.29437375980433944 +,PR,BOP,DTR1.1,C,BE,N,19.954352475328808 +,NIC,BOP,DTR1.1,C,BE,N,-29.91909262557538 +,CDR,BOP,DTR1.1,C,BE,N,0.29373948854293713 +,PR,EV,DTR1.1,L,BE,N,-7.4950072796505705 +,NIC,EV,DTR1.1,L,BE,N,-22.481278597221994 +,CDR,EV,DTR1.1,L,BE,N,0.16090924598518777 +,PR,EV,DTR1.1,C,BE,N,-7.487545385653731 +,NIC,EV,DTR1.1,C,BE,N,-22.453303278926086 +,CDR,EV,DTR1.1,C,BE,N,0.16064240608443553 +,PR,BOP,DTR1.1,L,BE,I,199.81696474942763 +,NIC,BOP,DTR1.1,L,BE,I,-149.83777484711797 +,CDR,BOP,DTR1.1,L,BE,I,0.11527160395198197 +,PR,BOP,DTR1.1,C,BE,I,199.81696474942763 +,NIC,BOP,DTR1.1,C,BE,I,-149.83777484711797 +,CDR,BOP,DTR1.1,C,BE,I,0.11527160395198197 +,PR,EOP,DTR1.1,L,BE,C,172.3851674319631 +,NIC,EOP,DTR1.1,L,BE,C,-134.88767158333195 +,CDR,EOP,DTR1.1,L,BE,C,0.9654554759111266 +,PR,EOP,DTR1.1,C,BE,C,172.21354387003583 +,NIC,EOP,DTR1.1,C,BE,C,-134.71981967355651 +,CDR,EOP,DTR1.1,C,BE,C,0.9638544365066131 +,PR,IA,DTR1.1,L,BE,I,0.09149892794215597 +,NIC,IA,DTR1.1,L,BE,I,-0.05489451119360447 +,CDR,IA,DTR1.1,L,BE,I,7.726288250786695E-05 +,PR,IA,DTR1.1,C,BE,I,0.09149892794215597 +,NIC,IA,DTR1.1,C,BE,I,-0.05489451119360447 +,CDR,IA,DTR1.1,C,BE,I,7.726288250786695E-05 +,PR,CF,DTR1.1,L,BE,I,-55 +,NIC,CF,DTR1.1,L,BE,I,30 +,CDR,CF,DTR1.1,L,BE,I,-0.041970417989396935 +,PR,CF,DTR1.1,C,BE,I,-55 +,NIC,CF,DTR1.1,C,BE,I,30 +,CDR,CF,DTR1.1,C,BE,I,-0.041970417989396935 +,PR,YCU,DTR1.1,C,BE,I,-0.1641616679304434 +,NIC,YCU,DTR1.1,C,BE,I,0.11190127318363352 +,CDR,YCU,DTR1.1,C,BE,I,-8.349412781047394E-05 +,CDR,CRU,DTR1.1,L,BE,I,0.5933128558860402 +,CDR,CRU,DTR1.1,C,BE,I,0.5923289904108416 +,PR,IA,DTR1.1,L,BE,N,0.008318084358377817 +,NIC,IA,DTR1.1,L,BE,N,-0.013723627798401118 +,CDR,IA,DTR1.1,L,BE,N,0.0002461342988846482 +,PR,IA,DTR1.1,C,BE,N,0.020738295978657114 +,NIC,IA,DTR1.1,C,BE,N,-0.03421065335070039 +,CDR,IA,DTR1.1,C,BE,N,0.0006135656595298578 +,PR,CF,DTR1.1,L,BE,N,-5 +,NIC,CF,DTR1.1,L,BE,N,7.5 +,CDR,CF,DTR1.1,L,BE,N,-0.1337106481180328 +,PR,CF,DTR1.1,C,BE,N,-5 +,NIC,CF,DTR1.1,C,BE,N,7.5 +,CDR,CF,DTR1.1,C,BE,N,-0.1337106481180328 +2020,NIC,MC,DTR1.2,L,BE,I,29.96755496942359 +2020,CDR,MC,DTR1.2,L,BE,I,-0.023054320790396418 +2020,NIC,MC,DTR1.2,C,BE,I,29.96755496942359 +2020,CDR,MC,DTR1.2,C,BE,I,-0.023054320790396418 +2020,NIC,BOP,DTR1.2,L,BE,N,-29.967554969423595 +2020,CDR,BOP,DTR1.2,L,BE,N,0.29437375980433944 +2020,NIC,BOP,DTR1.2,C,BE,N,-29.91909262557538 +2020,CDR,BOP,DTR1.2,C,BE,N,0.29373948854293713 +2020,NIC,EV,DTR1.2,L,BE,N,-22.481278597221994 +2020,CDR,EV,DTR1.2,L,BE,N,0.16090924598518777 +2020,NIC,EV,DTR1.2,C,BE,N,-22.453303278926086 +2020,CDR,EV,DTR1.2,C,BE,N,0.16064240608443553 +2020,NIC,BOP,DTR1.2,L,BE,I,-149.83777484711797 +2020,CDR,BOP,DTR1.2,L,BE,I,0.11527160395198197 +2020,NIC,BOP,DTR1.2,C,BE,I,-149.83777484711797 +2020,CDR,BOP,DTR1.2,C,BE,I,0.11527160395198197 +2020,NIC,EOP,DTR1.2,L,BE,C,-134.88767158333195 +2020,CDR,EOP,DTR1.2,L,BE,C,0.9654554759111266 +2020,NIC,EOP,DTR1.2,C,BE,C,-134.71981967355651 +2020,CDR,EOP,DTR1.2,C,BE,C,0.9638544365066131 +2020,NIC,IA,DTR1.2,L,BE,I,-0.05489451119360447 +2020,CDR,IA,DTR1.2,L,BE,I,7.726288250786695E-05 +2020,NIC,IA,DTR1.2,C,BE,I,-0.05489451119360447 +2020,CDR,IA,DTR1.2,C,BE,I,7.726288250786695E-05 +2020,NIC,CF,DTR1.2,L,BE,I,30 +2020,CDR,CF,DTR1.2,L,BE,I,-0.041970417989396935 +2020,NIC,CF,DTR1.2,C,BE,I,30 +2020,CDR,CF,DTR1.2,C,BE,I,-0.041970417989396935 +2020,NIC,YCU,DTR1.2,C,BE,I,0.11190127318363352 +2020,CDR,YCU,DTR1.2,C,BE,I,-8.349412781047394E-05 +2020,CDR,CRU,DTR1.2,L,BE,I,0.5933128558860402 +2020,CDR,CRU,DTR1.2,C,BE,I,0.5923289904108416 +2020,NIC,IA,DTR1.2,L,BE,N,-0.013723627798401118 +2020,CDR,IA,DTR1.2,L,BE,N,0.0002461342988846482 +2020,NIC,IA,DTR1.2,C,BE,N,-0.03421065335070039 +2020,CDR,IA,DTR1.2,C,BE,N,0.0006135656595298578 +2020,NIC,CF,DTR1.2,L,BE,N,7.5 +2020,CDR,CF,DTR1.2,L,BE,N,-0.1337106481180328 +2020,NIC,CF,DTR1.2,C,BE,N,7.5 +2020,CDR,CF,DTR1.2,C,BE,N,-0.1337106481180328 +,PR,MC,DTR2.1,L,BE,I,19.981696474942737 +,NIC,MC,DTR2.1,L,BE,I,29.96755496942359 +,CDR,MC,DTR2.1,L,BE,I,-0.023054320790396418 +,PR,MC,DTR2.1,C,BE,I,19.981696474942737 +,NIC,MC,DTR2.1,C,BE,I,29.96755496942359 +,CDR,MC,DTR2.1,C,BE,I,-0.023054320790396418 +,PR,BOP,DTR2.1,L,BE,N,19.981696474942762 +,NIC,BOP,DTR2.1,L,BE,N,-29.967554969423595 +,CDR,BOP,DTR2.1,L,BE,N,0.29437375980433944 +,PR,BOP,DTR2.1,C,BE,N,19.954352475328808 +,NIC,BOP,DTR2.1,C,BE,N,-29.91909262557538 +,CDR,BOP,DTR2.1,C,BE,N,0.29373948854293713 +,PR,EV,DTR2.1,L,BE,N,-7.4950072796505705 +,NIC,EV,DTR2.1,L,BE,N,-22.481278597221994 +,CDR,EV,DTR2.1,L,BE,N,0.16090924598518777 +,PR,EV,DTR2.1,C,BE,N,-7.487545385653731 +,NIC,EV,DTR2.1,C,BE,N,-22.453303278926086 +,CDR,EV,DTR2.1,C,BE,N,0.16064240608443553 +,PR,BOP,DTR2.1,L,BE,I,199.81696474942763 +,NIC,BOP,DTR2.1,L,BE,I,-149.83777484711797 +,CDR,BOP,DTR2.1,L,BE,I,0.11527160395198197 +,PR,BOP,DTR2.1,C,BE,I,199.81696474942763 +,NIC,BOP,DTR2.1,C,BE,I,-149.83777484711797 +,CDR,BOP,DTR2.1,C,BE,I,0.11527160395198197 +,PR,EOP,DTR2.1,L,BE,C,172.3851674319631 +,NIC,EOP,DTR2.1,L,BE,C,-134.88767158333195 +,CDR,EOP,DTR2.1,L,BE,C,0.9654554759111266 +,PR,EOP,DTR2.1,C,BE,C,172.21354387003583 +,NIC,EOP,DTR2.1,C,BE,C,-134.71981967355651 +,CDR,EOP,DTR2.1,C,BE,C,0.9638544365066131 +,PR,IA,DTR2.1,L,BE,I,0.09149892794215597 +,NIC,IA,DTR2.1,L,BE,I,-0.05489451119360447 +,CDR,IA,DTR2.1,L,BE,I,7.726288250786695E-05 +,PR,IA,DTR2.1,C,BE,I,0.09149892794215597 +,NIC,IA,DTR2.1,C,BE,I,-0.05489451119360447 +,CDR,IA,DTR2.1,C,BE,I,7.726288250786695E-05 +,PR,CF,DTR2.1,L,BE,I,-55 +,NIC,CF,DTR2.1,L,BE,I,30 +,CDR,CF,DTR2.1,L,BE,I,-0.041970417989396935 +,PR,CF,DTR2.1,C,BE,I,-55 +,NIC,CF,DTR2.1,C,BE,I,30 +,CDR,CF,DTR2.1,C,BE,I,-0.041970417989396935 +,PR,YCU,DTR2.1,C,BE,I,-0.1641616679304434 +,NIC,YCU,DTR2.1,C,BE,I,0.11190127318363352 +,CDR,YCU,DTR2.1,C,BE,I,-8.349412781047394E-05 +,CDR,CRU,DTR2.1,L,BE,I,0.5933128558860402 +,CDR,CRU,DTR2.1,C,BE,I,0.5923289904108416 +,PR,IA,DTR2.1,L,BE,N,0.008318084358377817 +,NIC,IA,DTR2.1,L,BE,N,-0.013723627798401118 +,CDR,IA,DTR2.1,L,BE,N,0.0002461342988846482 +,PR,IA,DTR2.1,C,BE,N,0.020738295978657114 +,NIC,IA,DTR2.1,C,BE,N,-0.03421065335070039 +,CDR,IA,DTR2.1,C,BE,N,0.0006135656595298578 +,PR,CF,DTR2.1,L,BE,N,-5 +,NIC,CF,DTR2.1,L,BE,N,7.5 +,CDR,CF,DTR2.1,L,BE,N,-0.1337106481180328 +,PR,CF,DTR2.1,C,BE,N,-5 +,NIC,CF,DTR2.1,C,BE,N,7.5 +,CDR,CF,DTR2.1,C,BE,N,-0.1337106481180328 +2020,NIC,MC,DTR2.2,L,BE,I,29.96755496942359 +2020,CDR,MC,DTR2.2,L,BE,I,-0.023054320790396418 +2020,NIC,MC,DTR2.2,C,BE,I,29.96755496942359 +2020,CDR,MC,DTR2.2,C,BE,I,-0.023054320790396418 +2020,NIC,BOP,DTR2.2,L,BE,N,-29.967554969423595 +2020,CDR,BOP,DTR2.2,L,BE,N,0.29437375980433944 +2020,NIC,BOP,DTR2.2,C,BE,N,-29.91909262557538 +2020,CDR,BOP,DTR2.2,C,BE,N,0.29373948854293713 +2020,NIC,EV,DTR2.2,L,BE,N,-22.481278597221994 +2020,CDR,EV,DTR2.2,L,BE,N,0.16090924598518777 +2020,NIC,EV,DTR2.2,C,BE,N,-22.453303278926086 +2020,CDR,EV,DTR2.2,C,BE,N,0.16064240608443553 +2020,NIC,BOP,DTR2.2,L,BE,I,-149.83777484711797 +2020,CDR,BOP,DTR2.2,L,BE,I,0.11527160395198197 +2020,NIC,BOP,DTR2.2,C,BE,I,-149.83777484711797 +2020,CDR,BOP,DTR2.2,C,BE,I,0.11527160395198197 +2020,NIC,EOP,DTR2.2,L,BE,C,-134.88767158333195 +2020,CDR,EOP,DTR2.2,L,BE,C,0.9654554759111266 +2020,NIC,EOP,DTR2.2,C,BE,C,-134.71981967355651 +2020,CDR,EOP,DTR2.2,C,BE,C,0.9638544365066131 +2020,NIC,IA,DTR2.2,L,BE,I,-0.05489451119360447 +2020,CDR,IA,DTR2.2,L,BE,I,7.726288250786695E-05 +2020,NIC,IA,DTR2.2,C,BE,I,-0.05489451119360447 +2020,CDR,IA,DTR2.2,C,BE,I,7.726288250786695E-05 +2020,NIC,CF,DTR2.2,L,BE,I,30 +2020,CDR,CF,DTR2.2,L,BE,I,-0.041970417989396935 +2020,NIC,CF,DTR2.2,C,BE,I,30 +2020,CDR,CF,DTR2.2,C,BE,I,-0.041970417989396935 +2020,NIC,YCU,DTR2.2,C,BE,I,0.11190127318363352 +2020,CDR,YCU,DTR2.2,C,BE,I,-8.349412781047394E-05 +2020,CDR,CRU,DTR2.2,L,BE,I,0.5933128558860402 +2020,CDR,CRU,DTR2.2,C,BE,I,0.5923289904108416 +2020,NIC,IA,DTR2.2,L,BE,N,-0.013723627798401118 +2020,CDR,IA,DTR2.2,L,BE,N,0.0002461342988846482 +2020,NIC,IA,DTR2.2,C,BE,N,-0.03421065335070039 +2020,CDR,IA,DTR2.2,C,BE,N,0.0006135656595298578 +2020,NIC,CF,DTR2.2,L,BE,N,7.5 +2020,CDR,CF,DTR2.2,L,BE,N,-0.1337106481180328 +2020,NIC,CF,DTR2.2,C,BE,N,7.5 +2020,CDR,CF,DTR2.2,C,BE,N,-0.1337106481180328 +,PR,MC,DT3.1,L,BE,I,-39.963392949885474 +,NIC,MC,DT3.1,L,BE,I,-59.93510993884718 +,PR,MC,DT3.1,C,BE,I,-39.963392949885474 +,NIC,MC,DT3.1,C,BE,I,-59.93510993884718 +,PR,BOP,DT3.1,L,BE,N,-39.963392949885524 +,NIC,BOP,DT3.1,L,BE,N,47.94808795107775 +,ICO,BOP,DT3.1,L,BE,N,11.987021987769438 +,PR,BOP,DT3.1,C,BE,N,-39.908704950657615 +,NIC,BOP,DT3.1,C,BE,N,47.87054820092061 +,ICO,BOP,DT3.1,C,BE,N,11.967637050230152 +,PR,EV,DT3.1,L,BE,N,14.990014559301141 +,NIC,EV,DT3.1,L,BE,N,44.96255719444398 +,PR,EV,DT3.1,C,BE,N,14.975090771307462 +,NIC,EV,DT3.1,C,BE,N,44.906606557852164 +,PR,CL,DT3.1,L,BE,C,344.77033486392617 +,NIC,CL,DT3.1,L,BE,C,-260.78283172777515 +,ICO,CL,DT3.1,L,BE,C,-8.992511438888796 +,PR,CL,DT3.1,C,BE,C,344.4270877400716 +,NIC,CL,DT3.1,C,BE,C,-260.45831803554256 +,ICO,CL,DT3.1,C,BE,C,-8.981321311570435 +,PR,BOP,DT3.1,L,BE,I,-399.63392949885525 +,NIC,BOP,DT3.1,L,BE,I,299.67554969423594 +,PR,BOP,DT3.1,C,BE,I,-399.63392949885525 +,NIC,BOP,DT3.1,C,BE,I,299.67554969423594 +,PR,IA,DT3.1,L,BE,I,-0.18299785588431194 +,NIC,IA,DT3.1,L,BE,I,0.10978902238720895 +,PR,IA,DT3.1,C,BE,I,-0.18299785588431194 +,NIC,IA,DT3.1,C,BE,I,0.10978902238720895 +,PR,CF,DT3.1,L,BE,I,110 +,NIC,CF,DT3.1,L,BE,I,-60 +,PR,CF,DT3.1,C,BE,I,110 +,NIC,CF,DT3.1,C,BE,I,-60 +,PR,YCU,DT3.1,C,BE,I,0.3283233358608868 +,NIC,YCU,DT3.1,C,BE,I,-0.22380254636726704 +,PR,IA,DT3.1,L,BE,N,-0.016636168716755634 +,NIC,IA,DT3.1,L,BE,N,0.021957804477441785 +,ICO,IA,DT3.1,L,BE,N,0.005489451119360446 +,PR,IA,DT3.1,C,BE,N,-0.04147659195731423 +,NIC,IA,DT3.1,C,BE,N,0.05473704536112062 +,ICO,IA,DT3.1,C,BE,N,0.013684261340280154 +,PR,CF,DT3.1,L,BE,N,10 +,NIC,CF,DT3.1,L,BE,N,-12 +,ICO,CF,DT3.1,L,BE,N,-3 +,PR,CF,DT3.1,C,BE,N,10 +,NIC,CF,DT3.1,C,BE,N,-12 +,ICO,CF,DT3.1,C,BE,N,-3 +,PR,MC,DT4.1,L,BE,I,-39.963392949885474 +,NIC,MC,DT4.1,L,BE,I,-59.93510993884718 +,PR,MC,DT4.1,C,BE,I,-39.963392949885474 +,NIC,MC,DT4.1,C,BE,I,-59.93510993884718 +,PR,BOP,DT4.1,L,BE,N,-79.92678589977105 +,NIC,BOP,DT4.1,L,BE,N,47.94808795107775 +,ICO,BOP,DT4.1,L,BE,N,11.987021987769438 +,PR,BOP,DT4.1,C,BE,N,-79.81740990131523 +,NIC,BOP,DT4.1,C,BE,N,47.87054820092061 +,ICO,BOP,DT4.1,C,BE,N,11.967637050230152 +,PR,EV,DT4.1,L,BE,N,-38.97403785418295 +,NIC,EV,DT4.1,L,BE,N,44.96255719444398 +,PR,EV,DT4.1,C,BE,N,-38.93523600539941 +,NIC,EV,DT4.1,C,BE,N,44.906606557852164 +,PR,BOP,DT4.1,L,BE,I,-399.63392949885525 +,NIC,BOP,DT4.1,L,BE,I,299.67554969423594 +,PR,BOP,DT4.1,C,BE,I,-399.63392949885525 +,NIC,BOP,DT4.1,C,BE,I,299.67554969423594 +,PR,EOP,DT4.1,L,BE,C,-428.7144163960126 +,NIC,EOP,DT4.1,L,BE,C,260.78283172777515 +,ICO,EOP,DT4.1,L,BE,C,8.992511438888796 +,PR,EOP,DT4.1,C,BE,C,-428.2875960593934 +,NIC,EOP,DT4.1,C,BE,C,260.4583180355426 +,ICO,EOP,DT4.1,C,BE,C,8.981321311570435 +,PR,IA,DT4.1,L,BE,I,-0.18299785588431194 +,NIC,IA,DT4.1,L,BE,I,0.10978902238720895 +,PR,IA,DT4.1,C,BE,I,-0.18299785588431194 +,NIC,IA,DT4.1,C,BE,I,0.10978902238720895 +,PR,CF,DT4.1,L,BE,I,110 +,NIC,CF,DT4.1,L,BE,I,-60 +,PR,CF,DT4.1,C,BE,I,110 +,NIC,CF,DT4.1,C,BE,I,-60 +,PR,YCU,DT4.1,C,BE,I,0.3283233358608868 +,NIC,YCU,DT4.1,C,BE,I,-0.22380254636726704 +,PR,IA,DT4.1,L,BE,N,-0.03327233743351127 +,NIC,IA,DT4.1,L,BE,N,0.021957804477441785 +,ICO,IA,DT4.1,L,BE,N,0.005489451119360446 +,PR,IA,DT4.1,C,BE,N,-0.08295318391462846 +,NIC,IA,DT4.1,C,BE,N,0.05473704536112062 +,ICO,IA,DT4.1,C,BE,N,0.013684261340280154 +,PR,CF,DT4.1,L,BE,N,20 +,NIC,CF,DT4.1,L,BE,N,-12 +,ICO,CF,DT4.1,L,BE,N,-3 +,PR,CF,DT4.1,C,BE,N,20 +,NIC,CF,DT4.1,C,BE,N,-12 +,ICO,CF,DT4.1,C,BE,N,-3 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv new file mode 100644 index 00000000..61c6344a --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv @@ -0,0 +1,16 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@BEPA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,CF,DT1.1,L,BEPA,I,88 +,PR,CF,DT1.1,L,BEPA,N,8 +,PR,CF,DT1.3,L,BEPA,I,110 +,PR,CF,DT1.3,L,BEPA,N,10 +,PR,CF,DT2.1,L,BEPA,I,88 +,PR,CF,DT2.1,L,BEPA,N,8 +,PR,CF,DT3.1,L,BEPA,I,88 +,PR,CF,DT3.1,L,BEPA,N,8 +,PR,CF,DT4.1,L,BEPA,I,88 +,PR,CF,DT4.1,L,BEPA,N,16 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv new file mode 100644 index 00000000..965e5e6f --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv @@ -0,0 +1,55 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@C +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,CL,DT2.1,,C,C,-87.43135554903122 +,,IA,DT2.1,,C,I,0.09388697662967685 +,,MC,DT2.1,,C,I,105.89201388261736 +,,EOP,DT2.1,,C,C,18.374757965777995 +,,AM,DT2.1,,C,C,-38.60249856533708 +,,EA,DT2.1,,C,C,-43.599999999999994 +,,BOP,DT2.1,,C,I,82.02271122089925 +,,CL,DT1.3,,C,C,-87.43135554903122 +,,BOP,DT1.1,,C,I,82.02271122089925 +,,EA,DT1.1,,C,C,-43.599999999999994 +,,AM,DT1.1,,C,C,-38.60249856533708 +,,EOP,DT1.1,,C,C,18.374757965777995 +,,MC,DT1.1,,C,I,105.89201388261736 +,,IA,DT1.1,,C,I,0.09388697662967685 +,,CL,DT1.1,,C,C,-87.43135554903122 +,,BOP,DT1.3,,C,I,82.02271122089925 +,,EA,DT1.3,,C,C,-50 +,,AM,DT1.3,,C,C,-34.26645281902704 +,,EOP,DT1.3,,C,C,16.31080371208803 +,,MC,DT1.3,,C,I,105.89201388261736 +,,IA,DT1.3,,C,I,0.09388697662967685 +,,BOP,DTR1.1,,C,I,-46.24958203305145 +,,AM,DTR1.1,,C,C,38.316584766326955 +,,EOP,DTR1.1,,C,C,-18.238663229656325 +,,MC,DTR1.1,,C,I,-52.92295262051829 +,,IA,DTR1.1,,C,I,-0.04954912095471157 +,,CRU,DTR1.1,,C,I,-0.5933128558860402 +,,CL,DTR1.1,,C,C,43.26014863442721 +,,BOP,DTR2.1,,C,I,-46.24958203305145 +,,AM,DTR2.1,,C,C,38.316584766326955 +,,EOP,DTR2.1,,C,C,-18.238663229656325 +,,MC,DTR2.1,,C,I,-52.92295262051829 +,,IA,DTR2.1,,C,I,-0.04954912095471157 +,,CRU,DTR2.1,,C,I,-0.5933128558860402 +,,CL,DTR2.1,,C,C,43.26014863442721 +,,BOP,DT3.1,,C,I,129.49726655304642 +,,EA,DT3.1,,C,C,-43.599999999999994 +,,AM,DT3.1,,C,C,-51.96181825867143 +,,MC,DT3.1,,C,I,105.89201388261736 +,,IA,DT3.1,,C,I,0.11760647207910604 +,,CL,DT3.1,,C,C,-139.94506864907146 +,,BOP,DT4.1,,C,I,82.02271122089925 +,,EA,DT4.1,,C,C,-51.599999999999994 +,,AM,DT4.1,,C,C,-96.83022811966929 +,,EOP,DT4.1,,C,C,46.091109943532146 +,,MC,DT4.1,,C,I,105.89201388261736 +,,IA,DT4.1,,C,I,0.09388697662967685 +,,BOP,DT4.1,,C,N,8.004653973154419 +,,IA,DT4.1,,C,N,0.0003356307173485902 +,,EV,DT4.1,,C,N,-1.4922636208166304 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv new file mode 100644 index 00000000..437c7cf1 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv @@ -0,0 +1,25 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@DA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,EOP,DT2.1,,DA,C,-8.011834360099684 +,,AM,DT2.1,,DA,C,16.831613508459697 +,,BOP,DT2.1,,DA,I,-9.843447868559382 +,,CF,DT2.1,,DA,C,-15 +,,CF,DT1.1,,DA,C,-15 +,,BOP,DT1.1,,DA,I,-9.843447868559382 +,,AM,DT1.1,,DA,C,16.831613508459697 +,,EOP,DT1.1,,DA,C,-8.011834360099684 +,,CF,DT1.3,,DA,C,-15 +,,BOP,DT1.3,,DA,I,-9.843447868559382 +,,AM,DT1.3,,DA,C,16.831613508459697 +,,EOP,DT1.3,,DA,C,-8.011834360099684 +,,CF,DT3.1,,DA,C,-15 +,,BOP,DT3.1,,DA,I,-9.843447868559382 +,,AM,DT3.1,,DA,C,24.84344786855938 +,,CF,DT4.1,,DA,C,-15 +,,BOP,DT4.1,,DA,I,-9.843447868559382 +,,AM,DT4.1,,DA,C,16.831613508459697 +,,EOP,DT4.1,,DA,C,-8.011834360099684 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv new file mode 100644 index 00000000..c443cf93 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv @@ -0,0 +1,17 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@F +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,AM,DT1.1,L,F,C,0.6775071478609433 +,,AM,DT1.2,L,F,C,1 +,,AM,DT1.3,L,F,C,0.6775071478609433 +,,AM,DT2.1,L,F,C,0.6775071478609433 +,,AM,DT2.2,L,F,C,1 +,,AM,DTR1.1,L,F,C,0.6775071478609433 +,,AM,DTR1.2,L,F,C,1 +,,AM,DTR2.1,L,F,C,0.6775071478609433 +,,AM,DTR2.2,L,F,C,1 +,,AM,DT3.1,L,F,C,1 +,,AM,DT4.1,L,F,C,0.6775071478609433 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv new file mode 100644 index 00000000..b4ae0c7e --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv @@ -0,0 +1,22 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@L +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,CL,DT2.1,,L,C,-87.43135554903122 +,,EV,DT2.1,,L,N,55.45631603430072 +,,IA,DT2.1,,L,N,0.016300537999407044 +,,BOP,DT2.1,,L,N,31.958738976731105 +,,CL,DT1.3,,L,C,-87.43135554903122 +,,EV,DT1.1,,L,N,55.45631603430072 +,,BOP,DT1.1,,L,N,31.958738976731105 +,,IA,DT1.1,,L,N,0.016300537999407044 +,,CL,DT1.1,,L,C,-87.43135554903122 +,,BOP,DT1.3,,L,N,31.958738976731105 +,,IA,DT1.3,,L,N,0.016300537999407044 +,,EV,DT1.3,,L,N,55.45631603430072 +,,BOP,DT3.1,,L,N,31.958738976731105 +,,IA,DT3.1,,L,N,0.016300537999407044 +,,EV,DT3.1,,L,N,55.45631603430072 +,,CL,DT3.1,,L,C,-87.43135554903122 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv new file mode 100644 index 00000000..93205b6d --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv @@ -0,0 +1,13 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@LR +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,BOP,DTR1.1,,LR,N,-15.684995728561214 +,,IA,DTR1.1,,LR,N,-0.007904134700818875 +,,EV,DTR1.1,,LR,N,-27.56724877116518 +,,CL,DTR1.1,,LR,C,43.26014863442721 +,,BOP,DTR2.1,,LR,N,-15.684995728561214 +,,IA,DTR2.1,,LR,N,-0.007904134700818875 +,,EV,DTR2.1,,LR,N,-27.56724877116518 +,,CL,DTR2.1,,LR,C,43.26014863442721 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv new file mode 100644 index 00000000..0b556852 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv @@ -0,0 +1,26 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@OA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,EOP,DT2.1,,OA,C,1 +,PR,CF,DT2.1,,OA,C,3 +,PR,WO,DT2.1,,OA,C,-2 +,PR,WO,DT1.1,,OA,C,-2 +,PR,CF,DT1.1,,OA,C,3 +,PR,EOP,DT1.1,,OA,C,1 +,PR,WO,DT1.3,,OA,C,-2 +,PR,CF,DT1.3,,OA,C,3 +,PR,EOP,DT1.3,,OA,C,1 +,PR,CF,DTR1.1,,OA,C,-1.5 +,PR,EOP,DTR1.1,,OA,C,-1.5 +,PR,CF,DTR2.1,,OA,C,-1.5 +,PR,EOP,DTR2.1,,OA,C,-1.5 +,PR,WO,DT3.1,,OA,C,-2 +,PR,CF,DT3.1,,OA,C,3 +,PR,BOP,DT3.1,,OA,I,1.5 +,PR,EOP,DT3.1,,OA,C,2.5 +,PR,WO,DT4.1,,OA,C,-2 +,PR,CF,DT4.1,,OA,C,3 +,PR,EOP,DT4.1,,OA,C,1 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv new file mode 100644 index 00000000..8e8b0328 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv @@ -0,0 +1,11 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@OAPA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,CF,DT2.1,,OAPA,C,2.4000000000000004 +,PR,CF,DT1.1,,OAPA,C,2.4000000000000004 +,PR,CF,DT1.3,,OAPA,C,3 +,PR,CF,DT3.1,,OAPA,C,2.4000000000000004 +,PR,CF,DT4.1,,OAPA,C,2.4000000000000004 \ No newline at end of file diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv new file mode 100644 index 00000000..8009c335 --- /dev/null +++ b/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv @@ -0,0 +1,215 @@ +$$Default +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@RA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,MC,DT1.1,C,RA,I,-5.993510993884719 +,,MC,DT1.1,L,RA,I,-5.993510993884719 +,,BOP,DT1.1,C,RA,N,11.967637050230152 +,,BOP,DT1.1,L,RA,N,11.987021987769438 +,,EV,DT1.1,C,RA,N,-4.490660655785217 +,,EV,DT1.1,L,RA,N,-4.496255719444398 +,,BOP,DT1.1,C,RA,I,29.967554969423595 +,,BOP,DT1.1,L,RA,I,29.967554969423595 +,,EOP,DT1.1,C,RA,C,22.453303278926086 +,,EOP,DT1.1,L,RA,C,22.481278597221994 +,,IA,DT1.1,C,RA,I,0.010978902238720892 +,,IA,DT1.1,L,RA,I,0.010978902238720892 +,,CF,DT1.1,C,RA,I,-6 +,,CF,DT1.1,L,RA,I,-6 +,,YCU,DT1.1,C,RA,I,-0.02238025463672244 +,,IA,DT1.1,C,RA,N,0.013684261340280154 +,,IA,DT1.1,L,RA,N,0.005489451119360446 +,,CF,DT1.1,C,RA,N,-3 +,,CF,DT1.1,L,RA,N,-3 +2020,,MC,DT1.2,C,RA,I,-5.993510993884719 +2020,,MC,DT1.2,L,RA,I,-5.993510993884719 +2020,,BOP,DT1.2,C,RA,N,11.967637050230152 +2020,,BOP,DT1.2,L,RA,N,11.987021987769438 +2020,,EV,DT1.2,C,RA,N,-4.490660655785217 +2020,,EV,DT1.2,L,RA,N,-4.496255719444398 +2020,,BOP,DT1.2,C,RA,I,29.967554969423595 +2020,,BOP,DT1.2,L,RA,I,29.967554969423595 +2020,,EOP,DT1.2,C,RA,C,22.453303278926086 +2020,,EOP,DT1.2,L,RA,C,22.481278597221994 +2020,,IA,DT1.2,C,RA,I,0.010978902238720892 +2020,,IA,DT1.2,L,RA,I,0.010978902238720892 +2020,,CF,DT1.2,C,RA,I,-6 +2020,,CF,DT1.2,L,RA,I,-6 +2020,,YCU,DT1.2,C,RA,I,-0.02238025463672244 +2020,,IA,DT1.2,C,RA,N,0.013684261340280154 +2020,,IA,DT1.2,L,RA,N,0.005489451119360446 +2020,,CF,DT1.2,C,RA,N,-3 +2020,,CF,DT1.2,L,RA,N,-3 +,,MC,DT1.3,C,RA,I,-5.993510993884719 +,,MC,DT1.3,L,RA,I,-5.993510993884719 +,,BOP,DT1.3,C,RA,N,11.967637050230152 +,,BOP,DT1.3,L,RA,N,11.987021987769438 +,,EV,DT1.3,C,RA,N,-4.490660655785217 +,,EV,DT1.3,L,RA,N,-4.496255719444398 +,,BOP,DT1.3,C,RA,I,29.967554969423595 +,,BOP,DT1.3,L,RA,I,29.967554969423595 +,,EOP,DT1.3,C,RA,C,22.453303278926086 +,,EOP,DT1.3,L,RA,C,22.481278597221994 +,,IA,DT1.3,C,RA,I,0.010978902238720892 +,,IA,DT1.3,L,RA,I,0.010978902238720892 +,,CF,DT1.3,C,RA,I,-6 +,,CF,DT1.3,L,RA,I,-6 +,,YCU,DT1.3,C,RA,I,-0.02238025463672244 +,,IA,DT1.3,C,RA,N,0.013684261340280154 +,,IA,DT1.3,L,RA,N,0.005489451119360446 +,,CF,DT1.3,C,RA,N,-3 +,,CF,DT1.3,L,RA,N,-3 +,,MC,DT2.1,C,RA,I,-5.993510993884719 +,,MC,DT2.1,L,RA,I,-5.993510993884719 +,,BOP,DT2.1,C,RA,N,11.967637050230152 +,,BOP,DT2.1,L,RA,N,11.987021987769438 +,,EV,DT2.1,C,RA,N,-4.490660655785217 +,,EV,DT2.1,L,RA,N,-4.496255719444398 +,,BOP,DT2.1,C,RA,I,29.967554969423595 +,,BOP,DT2.1,L,RA,I,29.967554969423595 +,,EOP,DT2.1,C,RA,C,22.453303278926086 +,,EOP,DT2.1,L,RA,C,22.481278597221994 +,,IA,DT2.1,C,RA,I,0.010978902238720892 +,,IA,DT2.1,L,RA,I,0.010978902238720892 +,,CF,DT2.1,C,RA,I,-6 +,,CF,DT2.1,L,RA,I,-6 +,,YCU,DT2.1,C,RA,I,-0.02238025463672244 +,,IA,DT2.1,C,RA,N,0.013684261340280154 +,,IA,DT2.1,L,RA,N,0.005489451119360446 +,,CF,DT2.1,C,RA,N,-3 +,,CF,DT2.1,L,RA,N,-3 +2020,,MC,DT2.2,C,RA,I,-5.993510993884719 +2020,,MC,DT2.2,L,RA,I,-5.993510993884719 +2020,,BOP,DT2.2,C,RA,N,11.967637050230152 +2020,,BOP,DT2.2,L,RA,N,11.987021987769438 +2020,,EV,DT2.2,C,RA,N,-4.490660655785217 +2020,,EV,DT2.2,L,RA,N,-4.496255719444398 +2020,,BOP,DT2.2,C,RA,I,29.967554969423595 +2020,,BOP,DT2.2,L,RA,I,29.967554969423595 +2020,,EOP,DT2.2,C,RA,C,22.453303278926086 +2020,,EOP,DT2.2,L,RA,C,22.481278597221994 +2020,,IA,DT2.2,C,RA,I,0.010978902238720892 +2020,,IA,DT2.2,L,RA,I,0.010978902238720892 +2020,,CF,DT2.2,C,RA,I,-6 +2020,,CF,DT2.2,L,RA,I,-6 +2020,,YCU,DT2.2,C,RA,I,-0.02238025463672244 +2020,,IA,DT2.2,C,RA,N,0.013684261340280154 +2020,,IA,DT2.2,L,RA,N,0.005489451119360446 +2020,,CF,DT2.2,C,RA,N,-3 +2020,,CF,DT2.2,L,RA,N,-3 +,,MC,DTR1.1,C,RA,I,2.9967554969423595 +,,MC,DTR1.1,L,RA,I,2.9967554969423595 +,,BOP,DTR1.1,C,RA,N,-5.983818525115076 +,,BOP,DTR1.1,L,RA,N,-5.993510993884719 +,,EV,DTR1.1,C,RA,N,2.2453303278926087 +,,EV,DTR1.1,L,RA,N,2.248127859722199 +,,BOP,DTR1.1,C,RA,I,-14.983777484711798 +,,BOP,DTR1.1,L,RA,I,-14.983777484711798 +,,EOP,DTR1.1,C,RA,C,-11.226651639463043 +,,EOP,DTR1.1,L,RA,C,-11.240639298610997 +,,IA,DTR1.1,C,RA,I,-0.005489451119360446 +,,IA,DTR1.1,L,RA,I,-0.005489451119360446 +,,CF,DTR1.1,C,RA,I,3 +,,CF,DTR1.1,L,RA,I,3 +,,YCU,DTR1.1,C,RA,I,0.01119012731836122 +,,IA,DTR1.1,C,RA,N,-0.006842130670140077 +,,IA,DTR1.1,L,RA,N,-0.002744725559680223 +,,CF,DTR1.1,C,RA,N,1.5 +,,CF,DTR1.1,L,RA,N,1.5 +2020,,MC,DTR1.2,C,RA,I,2.9967554969423595 +2020,,MC,DTR1.2,L,RA,I,2.9967554969423595 +2020,,BOP,DTR1.2,C,RA,N,-5.983818525115076 +2020,,BOP,DTR1.2,L,RA,N,-5.993510993884719 +2020,,EV,DTR1.2,C,RA,N,2.2453303278926087 +2020,,EV,DTR1.2,L,RA,N,2.248127859722199 +2020,,BOP,DTR1.2,C,RA,I,-14.983777484711798 +2020,,BOP,DTR1.2,L,RA,I,-14.983777484711798 +2020,,EOP,DTR1.2,C,RA,C,-11.226651639463043 +2020,,EOP,DTR1.2,L,RA,C,-11.240639298610997 +2020,,IA,DTR1.2,C,RA,I,-0.005489451119360446 +2020,,IA,DTR1.2,L,RA,I,-0.005489451119360446 +2020,,CF,DTR1.2,C,RA,I,3 +2020,,CF,DTR1.2,L,RA,I,3 +2020,,YCU,DTR1.2,C,RA,I,0.01119012731836122 +2020,,IA,DTR1.2,C,RA,N,-0.006842130670140077 +2020,,IA,DTR1.2,L,RA,N,-0.002744725559680223 +2020,,CF,DTR1.2,C,RA,N,1.5 +2020,,CF,DTR1.2,L,RA,N,1.5 +,,MC,DTR2.1,C,RA,I,2.9967554969423595 +,,MC,DTR2.1,L,RA,I,2.9967554969423595 +,,BOP,DTR2.1,C,RA,N,-5.983818525115076 +,,BOP,DTR2.1,L,RA,N,-5.993510993884719 +,,EV,DTR2.1,C,RA,N,2.2453303278926087 +,,EV,DTR2.1,L,RA,N,2.248127859722199 +,,BOP,DTR2.1,C,RA,I,-14.983777484711798 +,,BOP,DTR2.1,L,RA,I,-14.983777484711798 +,,EOP,DTR2.1,C,RA,C,-11.226651639463043 +,,EOP,DTR2.1,L,RA,C,-11.240639298610997 +,,IA,DTR2.1,C,RA,I,-0.005489451119360446 +,,IA,DTR2.1,L,RA,I,-0.005489451119360446 +,,CF,DTR2.1,C,RA,I,3 +,,CF,DTR2.1,L,RA,I,3 +,,YCU,DTR2.1,C,RA,I,0.01119012731836122 +,,IA,DTR2.1,C,RA,N,-0.006842130670140077 +,,IA,DTR2.1,L,RA,N,-0.002744725559680223 +,,CF,DTR2.1,C,RA,N,1.5 +,,CF,DTR2.1,L,RA,N,1.5 +2020,,MC,DTR2.2,C,RA,I,2.9967554969423595 +2020,,MC,DTR2.2,L,RA,I,2.9967554969423595 +2020,,BOP,DTR2.2,C,RA,N,-5.983818525115076 +2020,,BOP,DTR2.2,L,RA,N,-5.993510993884719 +2020,,EV,DTR2.2,C,RA,N,2.2453303278926087 +2020,,EV,DTR2.2,L,RA,N,2.248127859722199 +2020,,BOP,DTR2.2,C,RA,I,-14.983777484711798 +2020,,BOP,DTR2.2,L,RA,I,-14.983777484711798 +2020,,EOP,DTR2.2,C,RA,C,-11.226651639463043 +2020,,EOP,DTR2.2,L,RA,C,-11.240639298610997 +2020,,IA,DTR2.2,C,RA,I,-0.005489451119360446 +2020,,IA,DTR2.2,L,RA,I,-0.005489451119360446 +2020,,CF,DTR2.2,C,RA,I,3 +2020,,CF,DTR2.2,L,RA,I,3 +2020,,YCU,DTR2.2,C,RA,I,0.01119012731836122 +2020,,IA,DTR2.2,C,RA,N,-0.006842130670140077 +2020,,IA,DTR2.2,L,RA,N,-0.002744725559680223 +2020,,CF,DTR2.2,C,RA,N,1.5 +2020,,CF,DTR2.2,L,RA,N,1.5 +,,MC,DT3.1,C,RA,I,-5.993510993884719 +,,MC,DT3.1,L,RA,I,-5.993510993884719 +,,BOP,DT3.1,C,RA,N,11.967637050230152 +,,BOP,DT3.1,L,RA,N,11.987021987769438 +,,EV,DT3.1,C,RA,N,-4.490660655785217 +,,EV,DT3.1,L,RA,N,-4.496255719444398 +,,CL,DT3.1,C,RA,C,-22.453303278926086 +,,CL,DT3.1,L,RA,C,-22.48127859722199 +,,BOP,DT3.1,C,RA,I,29.967554969423595 +,,BOP,DT3.1,L,RA,I,29.967554969423595 +,,IA,DT3.1,C,RA,I,0.010978902238720892 +,,IA,DT3.1,L,RA,I,0.010978902238720892 +,,CF,DT3.1,C,RA,I,-6 +,,CF,DT3.1,L,RA,I,-6 +,,YCU,DT3.1,C,RA,I,-0.02238025463672244 +,,IA,DT3.1,C,RA,N,0.013684261340280154 +,,IA,DT3.1,L,RA,N,0.005489451119360446 +,,CF,DT3.1,C,RA,N,-3 +,,CF,DT3.1,L,RA,N,-3 +,,MC,DT4.1,C,RA,I,-5.993510993884719 +,,MC,DT4.1,L,RA,I,-5.993510993884719 +,,BOP,DT4.1,C,RA,N,11.967637050230152 +,,BOP,DT4.1,L,RA,N,11.987021987769438 +,,EV,DT4.1,C,RA,N,-4.490660655785217 +,,EV,DT4.1,L,RA,N,-4.496255719444398 +,,BOP,DT4.1,C,RA,I,29.967554969423595 +,,BOP,DT4.1,L,RA,I,29.967554969423595 +,,EOP,DT4.1,C,RA,C,22.453303278926086 +,,EOP,DT4.1,L,RA,C,22.481278597221994 +,,IA,DT4.1,C,RA,I,0.010978902238720892 +,,IA,DT4.1,L,RA,I,0.010978902238720892 +,,CF,DT4.1,C,RA,I,-6 +,,CF,DT4.1,L,RA,I,-6 +,,YCU,DT4.1,C,RA,I,-0.02238025463672244 +,,IA,DT4.1,C,RA,N,0.013684261340280154 +,,IA,DT4.1,L,RA,N,0.005489451119360446 +,,CF,DT4.1,C,RA,N,-3 +,,CF,DT4.1,L,RA,N,-3 \ No newline at end of file diff --git a/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv b/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv new file mode 100644 index 00000000..8b78df02 --- /dev/null +++ b/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv @@ -0,0 +1,537 @@ +@@ReportVariable +AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType +0,PR,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +0,ACA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,AEA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,,APA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-320,IR6 +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.536731161375,BOP +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63392949885554,EOP +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.0971983374806105,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.9226050955731167,IFIE1 +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.536731161375,IR5 +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529445986629,IR5 +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339294988556,OCI1 +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,OCI1 +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339294988556,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.675549694236,OCI1 +0,PR,2020,USD,L,BEPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,320,IR6 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-42.968113614296705,AM +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849210284577,BOP +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122089925,EOP +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233273235018213,IA +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233273235018213,IFIE1 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.968113614296705,IR3 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849210284577,IR5 +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447868559382,EOP +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.156552131440618,IR4 +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131440618,ISE6 +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226050955731169,IFIE1 +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.875294459866303,IR5 +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,OCI1 +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.967554969423617,OCI1 +2020,NIC,2020,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +2020,NIC,2020,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.9226050955731167,IFIE2 +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529445986629,ISE12 +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,OCI2 +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-299.675549694236,OCI2 +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226050955731169,IFIE2 +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.875294459866303,ISE12 +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,OCI2 +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.967554969423617,OCI2 +0,AEA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,ACA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,NIC,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +0,PR,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,,APA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-400,IR6 +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.0971983374806105,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.9226050955731167,IFIE1 +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.536731161375,IR5 +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529445986629,IR5 +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339294988556,OCI1 +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,OCI1 +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339294988556,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.675549694236,OCI1 +0,PR,2020,USD,L,BEPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR6 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-42.968113614296705,AM +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849210284577,BOP +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122089925,EOP +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233273235018213,IA +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233273235018213,IFIE1 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.968113614296705,IR3 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849210284577,IR5 +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447868559382,EOP +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.156552131440618,IR4 +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131440618,ISE6 +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226050955731169,IFIE1 +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.875294459866303,IR5 +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,OCI1 +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.967554969423617,OCI1 +0,PR,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,400,CF +0,NIC,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,CF +0,ACA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF +0,AEA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF +0,PR,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,,APA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-320,IR6 +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,1.0971983374806105,IFIE1 +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.9226050955731167,IFIE1 +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,398.536731161375,IR5 +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-298.7529445986629,IR5 +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,L,BEPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,320,IR6 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-42.968113614296705,AM +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,139.90849210284577,BOP +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,EA +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,82.02271122089925,EOP +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.08233273235018213,IA +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.08233273235018213,IFIE1 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,42.968113614296705,IR3 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-124.90849210284577,IR5 +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-9.843447868559382,EOP +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,5.156552131440618,IR4 +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.156552131440618,ISE6 +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.09226050955731169,IFIE1 +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-29.875294459866303,IR5 +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +2020,NIC,2020,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,CF +2020,NIC,2020,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,598.7529445986629,BOP +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,598.7529445986629,BOP +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,299.675549694236,EOP +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,299.675549694236,EOP +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.9226050955731167,IA +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.9226050955731167,IA +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.9226050955731167,IFIE2 +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-298.7529445986629,ISE12 +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,29.967554969423617,EOP +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,29.967554969423617,EOP +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226050955731169,IA +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226050955731169,IA +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.09226050955731169,IFIE2 +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-29.875294459866303,ISE12 +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 +0,PR,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,CF +0,NIC,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,CF +0,ACA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF +0,AEA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF +0,PR,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP +0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-1.5,EOP +0,PR,2020,USD,,APA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-320,IR6 +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.0971983374806105,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.9226050955731167,IFIE1 +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,398.536731161375,IR5 +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-298.7529445986629,IR5 +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339294988556,OCI1 +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.675549694236,OCI1 +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.6339294988556,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.675549694236,OCI1 +0,PR,2020,USD,L,BEPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,320,IR6 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-67.83795828214956,AM +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,72.2,BOP +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,139.90849210284577,BOP +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,EA +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,129.49726655304642,EOP +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.14440000000001615,IA +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.08233273235018213,IA +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.22673273235019828,IFIE1 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.83795828214956,IR3 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-124.90849210284577,IR5 +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.843447868559382,EOP +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,5.156552131440618,IR4 +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5.156552131440618,ISE6 +0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP +0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.5,EOP +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.09226050955731169,IFIE1 +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.875294459866303,IR5 +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.967554969423617,OCI1 +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.967554969423617,OCI1 +0,PR,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,CF +0,NIC,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,CF +0,ACA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF +0,AEA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF +0,PR,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,,APA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-320,IR6 +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1.0971983374806105,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.9226050955731167,IFIE1 +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,398.536731161375,IR5 +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-298.7529445986629,IR5 +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.6339294988556,OCI1 +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.675549694236,OCI1 +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,399.6339294988556,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-299.675549694236,OCI1 +0,PR,2020,USD,L,BEPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,320,IR6 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-42.968113614296705,AM +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,139.90849210284577,BOP +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,EA +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,82.02271122089925,EOP +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.08233273235018213,IA +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.08233273235018213,IFIE1 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,42.968113614296705,IR3 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-124.90849210284577,IR5 +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-9.843447868559382,EOP +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,5.156552131440618,IR4 +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5.156552131440618,ISE6 +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.09226050955731169,IFIE1 +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.875294459866303,IR5 +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.967554969423617,OCI1 +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.967554969423617,OCI1 +0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF +0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,ISE1 +0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.2683655806875,BOP +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647229933145,BOP +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.4811341181992343,BOP +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.2683655806875,BOP +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647229933145,BOP +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.4811341181992343,BOP +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703270529272203,CF +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703270529272203,CF +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696474942777,EOP +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,EOP +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,EOP +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696474942777,EOP +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,EOP +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,EOP +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5485991687403052,IA +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613025477865583,IA +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0011701910454977593,IA +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5485991687403052,IA +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613025477865583,IA +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0011701910454977593,IA +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.5485991687403052,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.4613025477865583,IFIE1 +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.0011701910454977593,IFIE1 +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.2683655806875,ISE10 +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.37647229933145,ISE10 +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11410141290651227,ISE10 +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.8169647494278,OCI1 +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,OCI1 +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,OCI1 +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.8169647494278,OCI1 +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.837774847118,OCI1 +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11527160395201003,OCI1 +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,24.228134693791258,AM +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-70.43538016962212,BOP +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-46.249582033051446,EOP +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04233655722058882,IA +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04233655722058882,IFIE1 +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,70.43538016962212,ISE10 +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-24.228134693791258,ISE7 +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,EOP +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,EOP +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130254778655844,IA +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130254778655844,IA +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.046130254778655844,IFIE1 +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.937647229933152,ISE10 +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,OCI1 +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.983777484711808,OCI1 +2020,NIC,2020,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF +2020,NIC,2020,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647229933145,BOP +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.4811341181992343,BOP +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647229933145,BOP +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.4811341181992343,BOP +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703270529272203,CF +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703270529272203,CF +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,EOP +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,EOP +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,EOP +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,EOP +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613025477865583,IA +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0011701910454977593,IA +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613025477865583,IA +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0011701910454977593,IA +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.4613025477865583,IFIE2 +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.0011701910454977593,IFIE2 +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.37647229933145,ISE12 +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11410141290651227,ISE12 +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,OCI2 +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,OCI2 +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.837774847118,OCI2 +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11527160395201003,OCI2 +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,EOP +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,EOP +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130254778655844,IA +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130254778655844,IA +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.046130254778655844,IFIE2 +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.937647229933152,ISE12 +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,OCI2 +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.983777484711808,OCI2 +0,PR,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,CF +0,NIC,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF +0,PR,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,ISE1 +0,NIC,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.2683655806875,BOP +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647229933145,BOP +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.4811341181992343,BOP +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.2683655806875,BOP +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647229933145,BOP +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.4811341181992343,BOP +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703270529272203,CF +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703270529272203,CF +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.81696474942777,EOP +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.837774847118,EOP +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527160395201003,EOP +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.81696474942777,EOP +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.837774847118,EOP +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527160395201003,EOP +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.5485991687403052,IA +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613025477865583,IA +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0011701910454977593,IA +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.5485991687403052,IA +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613025477865583,IA +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0011701910454977593,IA +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.5485991687403052,IFIE1 +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.4613025477865583,IFIE1 +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.0011701910454977593,IFIE1 +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-199.2683655806875,ISE10 +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.37647229933145,ISE10 +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.11410141290651227,ISE10 +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,24.228134693791258,AM +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-70.43538016962212,BOP +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-46.249582033051446,EOP +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.04233655722058882,IA +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.04233655722058882,IFIE1 +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,70.43538016962212,ISE10 +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-24.228134693791258,ISE7 +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.983777484711808,EOP +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.983777484711808,EOP +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130254778655844,IA +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130254778655844,IA +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.046130254778655844,IFIE1 +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.937647229933152,ISE10 +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +2020,NIC,2020,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF +2020,NIC,2020,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647229933145,BOP +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.4811341181992343,BOP +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647229933145,BOP +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.4811341181992343,BOP +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703270529272203,CF +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703270529272203,CF +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.837774847118,EOP +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527160395201003,EOP +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.837774847118,EOP +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527160395201003,EOP +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613025477865583,IA +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0011701910454977593,IA +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613025477865583,IA +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0011701910454977593,IA +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.4613025477865583,IFIE2 +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.0011701910454977593,IFIE2 +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.37647229933145,ISE12 +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.11410141290651227,ISE12 +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.983777484711808,EOP +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.983777484711808,EOP +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130254778655844,IA +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130254778655844,IA +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.046130254778655844,IFIE2 +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.937647229933152,ISE12 +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 \ No newline at end of file diff --git a/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv b/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv new file mode 100644 index 00000000..f9cba291 --- /dev/null +++ b/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv @@ -0,0 +1,1113 @@ +@@ReportVariable +AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType +0,PR,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF +0,ICO,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF +0,NIC,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF +0,ACA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,AEA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,,AA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,,AA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-1,EOP +0,PR,2020,USD,,AA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,,AA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,WO +0,PR,2020,USD,,AAPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,IR6 +0,PR,2020,USD,,APA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-72,IR6 +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.963392949885524,BOP +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94808795107775,BOP +0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.908704950657615,BOP +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.87054820092061,BOP +0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.77033486392617,EOP +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.78283172777515,EOP +0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.9925114388888,EOP +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.4270877400716,EOP +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.45831803554256,EOP +0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.981321311570433,EOP +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.990014559301141,EV +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719444398,EV +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.975090771307462,EV +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.906606557852164,EV +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.016636168716755634,IA +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.021957804477441785,IA +0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.04147659195731423,IA +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.05473704536112062,IA +0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.19963402460106758,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13174682686465072,IFIE1 +0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.005489451119360446,IFIE1 +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06322865953015,IR5 +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446479332545,IR5 +0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.987021987769438,IR5 +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.863594634929065,OCI1 +0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89271796646079,OCI1 +0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511438888798,OCI1 +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684175878363,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.217231658693336,OCI1 +0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.981321311570433,OCI1 +0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.3283233358608868,YCU +0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.22380254636726704,YCU +0,PR,2020,USD,L,BEPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,96,IR6 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.60249856533708,AM +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,82.02271122089925,BOP +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-43.599999999999994,EA +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,18.374757965778002,EOP +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.09388697662967685,IA +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09388697662967685,IFIE1 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,38.60249856533708,IR3 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,25.139341666413856,IR5 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201388261736,MC +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.831613508459697,AM +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.011834360099684,EOP +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.831613508459697,IR4 +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-16.831613508459697,ISE6 +0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.958738976731105,BOP +0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903124,CL +0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45631603430072,EV +0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.016300537999407044,IA +0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016300537999407044,IFIE1 +0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.016300537999413223,ISE11 +0,PR,2020,USD,,OA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,CF +0,PR,2020,USD,,OA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1,EOP +0,PR,2020,USD,,OA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,IR1 +0,PR,2020,USD,,OA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2,WO +0,PR,2020,USD,,OAPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2.4000000000000004,IR6 +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.481278597221998,EOP +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.453303278926093,EOP +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719444398,EV +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660655785217,EV +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01646835335808134,IFIE1 +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274472555968,IR5 +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372201601,OCI1 +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.5142516904975025,OCI1 +0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238025463672244,YCU +2020,NIC,2020,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,CF +2020,NIC,2020,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,ISE2 +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.93510993884719,BOP +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.83818525115076,BOP +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.77534316666396,EOP +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.43963934711303,EOP +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719444399,EV +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.90660655785217,EV +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.027447255596802236,IA +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.06842130670140079,IA +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13723627798401117,IFIE2 +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.037442805555997,ISE12 +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC +2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.900206527571996,OCI2 +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.23591034712291,OCI2 +2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.22380254636726704,YCU +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.481278597221998,EOP +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.453303278926093,EOP +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719444398,EV +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660655785217,EV +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01646835335808134,IFIE2 +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274472555968,ISE12 +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC +2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372201601,OCI2 +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.5142516904975025,OCI2 +2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238025463672244,YCU +0,PR,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF +0,ICO,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF +0,NIC,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF +0,ACA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,AEA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,,AA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,,AA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-1,EOP +0,PR,2020,USD,,AA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,,AA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,WO +0,PR,2020,USD,,AAPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5,IR6 +0,PR,2020,USD,,APA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-90,IR6 +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.963392949885524,BOP +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94808795107775,BOP +0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.908704950657615,BOP +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.87054820092061,BOP +0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.77033486392617,EOP +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.78283172777515,EOP +0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.9925114388888,EOP +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.4270877400716,EOP +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.45831803554256,EOP +0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.981321311570433,EOP +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.990014559301141,EV +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719444398,EV +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.975090771307462,EV +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.906606557852164,EV +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.016636168716755634,IA +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.021957804477441785,IA +0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.04147659195731423,IA +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.05473704536112062,IA +0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.19963402460106758,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13174682686465072,IFIE1 +0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.005489451119360446,IFIE1 +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06322865953015,IR5 +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446479332545,IR5 +0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.987021987769438,IR5 +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.863594634929065,OCI1 +0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89271796646079,OCI1 +0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511438888798,OCI1 +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684175878363,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.217231658693336,OCI1 +0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.981321311570433,OCI1 +0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.3283233358608868,YCU +0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.22380254636726704,YCU +0,PR,2020,USD,L,BEPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,120,IR6 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-34.26645281902704,AM +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,82.02271122089925,BOP +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-50,EA +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.31080371208803,EOP +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.09388697662967685,IA +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09388697662967685,IFIE1 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,34.26645281902704,IR3 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,31.53934166641386,IR5 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201388261736,MC +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.831613508459697,AM +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.011834360099684,EOP +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.831613508459697,IR4 +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-16.831613508459697,ISE6 +0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.958738976731105,BOP +0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45631603430072,EV +0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.016300537999407044,IA +0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016300537999407044,IFIE1 +0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.016300537999399012,ISE11 +0,PR,2020,USD,,OA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,CF +0,PR,2020,USD,,OA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1,EOP +0,PR,2020,USD,,OA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,IR1 +0,PR,2020,USD,,OA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2,WO +0,PR,2020,USD,,OAPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-3,IR6 +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.481278597221998,EOP +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.453303278926093,EOP +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719444398,EV +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660655785217,EV +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01646835335808134,IFIE1 +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274472555968,IR5 +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372201601,OCI1 +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.5142516904975025,OCI1 +0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238025463672244,YCU +0,AEA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF +0,ACA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF +0,NIC,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,CF +0,ICO,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,CF +0,PR,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,90,CF +0,PR,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,,AA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF +0,PR,2020,USD,,AA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-1,EOP +0,PR,2020,USD,,AA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,,AA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,4,WO +0,PR,2020,USD,,AAPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,4,IR6 +0,PR,2020,USD,,APA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-72,IR6 +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.963392949885524,BOP +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,47.94808795107775,BOP +0,ICO,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.987021987769438,BOP +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.908704950657615,BOP +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,47.87054820092061,BOP +0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.967637050230152,BOP +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF +0,ICO,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF +0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.77033486392617,EOP +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,260.78283172777515,EOP +0,ICO,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,8.9925114388888,EOP +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.4270877400716,EOP +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,260.45831803554256,EOP +0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,8.981321311570433,EOP +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,14.990014559301141,EV +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,44.96255719444398,EV +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,14.975090771307462,EV +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,44.906606557852164,EV +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.016636168716755634,IA +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.021957804477441785,IA +0,ICO,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.005489451119360446,IA +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.04147659195731423,IA +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.05473704536112062,IA +0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.013684261340280154,IA +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.10384888801926062,IFIE1 +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0.05927647861893748,IFIE1 +0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.013684261340280154,IFIE1 +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-55.102992870764375,IR5 +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,39.157955180074396,IR5 +0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-8.967637050230152,IR5 +0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.3283233358608868,YCU +0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.22380254636726704,YCU +0,PR,2020,USD,L,BEPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,96,IR6 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-38.60249856533708,AM +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,82.02271122089925,BOP +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-43.599999999999994,EA +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,18.374757965778002,EOP +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.09388697662967685,IA +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.09388697662967685,IFIE1 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,38.60249856533708,IR3 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,25.139341666413856,IR5 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,105.89201388261736,MC +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,16.831613508459697,AM +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-8.011834360099686,EOP +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,16.831613508459697,IR4 +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-16.831613508459697,ISE6 +0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,31.958738976731105,BOP +0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,EOP +0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,55.45631603430072,EV +0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.016300537999407044,IA +0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.016300537999407044,IFIE1 +0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0.016300537999399012,ISE11 +0,PR,2020,USD,,OA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,3,CF +0,PR,2020,USD,,OA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,1,EOP +0,PR,2020,USD,,OA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,3,IR1 +0,PR,2020,USD,,OA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-2,WO +0,PR,2020,USD,,OAPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-2.4000000000000004,IR6 +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.987021987769438,BOP +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.967637050230152,BOP +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,22.481278597221998,EOP +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,22.453303278926093,EOP +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.496255719444398,EV +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.490660655785217,EV +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.005489451119360446,IA +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.013684261340280154,IA +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.002282908942278606,IFIE1 +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,7.516534599439783,IR5 +0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,3.552713678800501E-15,OCI1 +0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.02238025463672244,YCU +2020,NIC,2020,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,CF +2020,NIC,2020,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,ISE2 +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,299.67554969423594,BOP +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,299.67554969423594,BOP +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.93510993884719,BOP +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.83818525115076,BOP +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,269.77534316666396,EOP +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,269.43963934711303,EOP +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,44.96255719444399,EV +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,44.90660655785217,EV +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.10978902238720895,IA +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.10978902238720895,IA +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.027447255596802236,IA +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.06842130670140079,IA +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0.04559221727865731,IFIE2 +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,30.190318129844243,ISE12 +2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93510993884718,MC +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93510993884718,MC +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-1.4210854715202004E-14,OCI2 +2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.22380254636726704,YCU +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,29.967554969423595,BOP +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,29.967554969423595,BOP +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,11.987021987769438,BOP +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,11.967637050230152,BOP +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,22.481278597221998,EOP +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,22.453303278926093,EOP +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.496255719444398,EV +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.490660655785217,EV +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.010978902238720892,IA +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.010978902238720892,IA +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.005489451119360446,IA +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.013684261340280154,IA +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.002282908942278606,IFIE2 +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,7.516534599439783,ISE12 +2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.993510993884719,MC +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.993510993884719,MC +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,3.552713678800501E-15,OCI2 +2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.02238025463672244,YCU +0,PR,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,CF +0,ICO,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,CF +0,NIC,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,CF +0,ACA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF +0,AEA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF +0,PR,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP +0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF +0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2.5,EOP +0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,4,WO +0,PR,2020,USD,,AAPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,4,IR6 +0,PR,2020,USD,,APA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-72,IR6 +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.963392949885524,BOP +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.94808795107775,BOP +0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.987021987769438,BOP +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.908704950657615,BOP +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.87054820092061,BOP +0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.967637050230152,BOP +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF +0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF +0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.77033486392617,CL +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.78283172777515,CL +0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.9925114388888,CL +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.4270877400716,CL +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.45831803554256,CL +0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.981321311570433,CL +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.990014559301141,EV +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.96255719444398,EV +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.975090771307462,EV +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.906606557852164,EV +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.016636168716755634,IA +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.021957804477441785,IA +0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.005489451119360446,IA +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.04147659195731423,IA +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.05473704536112062,IA +0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.013684261340280154,IA +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.19963402460106758,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.13174682686465072,IFIE1 +0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.005489451119360446,IFIE1 +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.8335635234563,IR5 +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.80729652110057,IR5 +0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.005489451119361277,IR5 +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.63392949885525,OCI1 +0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.67554969423594,OCI1 +0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63392949885525,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755496942359,OCI1 +0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.3283233358608868,YCU +0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.22380254636726704,YCU +0,PR,2020,USD,L,BEPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,96,IR6 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-51.96181825867143,AM +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,129.49726655304642,BOP +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-139.94506864907146,CL +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-43.599999999999994,EA +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.11760647207910604,IA +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.11760647207910604,IFIE1 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,51.96181825867143,IR3 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,77.65305476645409,IR5 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,105.89201388261736,MC +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,24.84344786855938,AM +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,24.84344786855938,IR4 +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-24.84344786855938,ISE6 +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,31.958738976731105,BOP +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,55.45631603430072,EV +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.016300537999407044,IA +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.016300537999407044,IFIE1 +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.016300537999399012,ISE11 +0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP +0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,3,CF +0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,2.5,EOP +0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,3,IR1 +0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2,WO +0,PR,2020,USD,,OAPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2.4000000000000004,IR6 +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.987021987769438,BOP +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.967637050230152,BOP +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.481278597221998,CL +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.453303278926093,CL +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.496255719444398,EV +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.490660655785217,EV +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.005489451119360446,IA +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.013684261340280154,IA +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.01646835335808134,IFIE1 +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.98402332278168,IR5 +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.967554969423603,OCI1 +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.967554969423595,OCI1 +0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.02238025463672244,YCU +0,PR,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,CF +0,ICO,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,CF +0,NIC,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,CF +0,ACA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF +0,AEA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF +0,PR,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,,AA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF +0,PR,2020,USD,,AA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-1,EOP +0,PR,2020,USD,,AA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,,AA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,4,WO +0,PR,2020,USD,,AAPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,4,IR6 +0,PR,2020,USD,,APA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-72,IR6 +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.63392949885525,BOP +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.67554969423594,BOP +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.92678589977105,BOP +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.94808795107775,BOP +0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.987021987769438,BOP +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.81740990131523,BOP +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.87054820092061,BOP +0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.967637050230152,BOP +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF +0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF +0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.7144163960125,EOP +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.78283172777515,EOP +0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.9925114388888,EOP +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.28759605939337,EOP +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.45831803554256,EOP +0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.981321311570433,EOP +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.97403785418295,EV +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.96255719444398,EV +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.93523600539941,EV +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.906606557852164,EV +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.18299785588431194,IA +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.10978902238720895,IA +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.03327233743351127,IA +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.021957804477441785,IA +0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.005489451119360446,IA +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.08295318391462846,IA +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.05473704536112062,IA +0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.013684261340280154,IA +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,0.2162701933178232,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.13174682686465072,IFIE1 +0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.005489451119360446,IFIE1 +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.864216703839475,IR5 +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.02446479332545,IR5 +0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.987021987769438,IR5 +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.963392949885474,MC +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93510993884718,MC +0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.0804868971573,OCI1 +0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-38.89271796646079,OCI1 +0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.992511438888798,OCI1 +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.65366656053817,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.217231658693336,OCI1 +0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.981321311570433,OCI1 +0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.3283233358608868,YCU +0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.22380254636726704,YCU +0,PR,2020,USD,L,BEPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,104,IR6 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-96.83022811966929,AM +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,82.02271122089925,BOP +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,8.004653973154419,BOP +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-51.599999999999994,EA +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,46.09110994353215,EOP +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.4922636208166304,EV +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.09388697662967685,IA +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.0003356307173485902,IA +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.09422260734702544,IFIE1 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,96.83022811966929,IR3 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-60.80440423495516,IR5 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,105.89201388261736,MC +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,16.831613508459697,AM +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.011834360099684,EOP +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,16.831613508459697,IR4 +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-16.831613508459697,ISE6 +0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,CF +0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1,EOP +0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,IR1 +0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-2,WO +0,PR,2020,USD,,OAPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-2.4000000000000004,IR6 +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.967554969423595,BOP +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.987021987769438,BOP +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.967637050230152,BOP +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.481278597221998,EOP +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.453303278926093,EOP +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.496255719444398,EV +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.490660655785217,EV +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.010978902238720892,IA +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.005489451119360446,IA +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.013684261340280154,IA +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.01646835335808134,IFIE1 +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.50274472555968,IR5 +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.993510993884719,MC +0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-7.486276372201601,OCI1 +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.5142516904975025,OCI1 +0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.02238025463672244,YCU +0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,CF +0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF +0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,ISE1 +0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 +0,PR,2020,USD,,AA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,CF +0,PR,2020,USD,,AA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,EOP +0,PR,2020,USD,,AA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,ISE1 +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696474942763,BOP +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777484711797,BOP +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527160395198197,BOP +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696474942763,BOP +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777484711797,BOP +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527160395198197,BOP +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.981696474942762,BOP +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.967554969423595,BOP +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437375980433944,BOP +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.954352475328808,BOP +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909262557538,BOP +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29373948854293713,BOP +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970417989396935,CF +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970417989396935,CF +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.1337106481180328,CF +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.1337106481180328,CF +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.5933128558860402,CRU +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.5923289904108416,CRU +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.38516743196308,EOP +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.88767158333198,EOP +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.9654554759111158,EOP +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.2135438700358,EOP +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.71981967355651,EOP +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.9638544365065973,EOP +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.4950072796505705,EV +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.481278597221994,EV +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16090924598518777,EV +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.487545385653731,EV +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.453303278926086,EV +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16064240608443553,EV +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.09149892794215597,IA +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489451119360447,IA +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.726288250786695E-05,IA +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.09149892794215597,IA +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489451119360447,IA +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.726288250786695E-05,IA +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.008318084358377817,IA +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.013723627798401118,IA +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0002461342988846482,IA +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.020738295978657114,IA +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.03421065335070039,IA +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0006135656595298578,IA +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.09981701230053379,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.06861813899200558,IFIE1 +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.5936362530674327,IFIE1 +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.531614329765073,ISE10 +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.018721402777999,ISE10 +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.2565476188917011,ISE10 +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.981696474942737,MC +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755496942359,MC +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054320790396418,MC +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.981696474942737,MC +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755496942359,MC +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054320790396418,MC +0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-27.431797317464532,OCI1 +0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.950103263785998,OCI1 +0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.8501838719591338,OCI1 +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.603420879391816,OCI1 +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.117955173561455,OCI1 +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.8485828325546154,OCI1 +0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.1641616679304434,YCU +0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11190127318363352,YCU +0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8.349412781047394E-05,YCU +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,38.316584766326955,AM +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-46.24958203305145,BOP +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863442721,CL +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.5933128558860402,CRU +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-18.238663229656325,EOP +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04954912095471157,IA +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.6428619768407517,IFIE1 +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,9.662803986091077,ISE10 +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-38.316584766326955,ISE7 +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-52.92295262051829,MC +0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-15.684995728561214,BOP +0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863442721,CL +0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP +0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-27.56724877116518,EV +0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.007904134700818875,IA +0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.007904134700818875,IFIE1 +0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.007904134700817522,ISE11 +0,PR,2020,USD,,OA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,CF +0,PR,2020,USD,,OA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,EOP +0,PR,2020,USD,,OA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,ISE1 +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711798,BOP +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711798,BOP +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.993510993884719,BOP +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.983818525115076,BOP +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.240639298610999,EOP +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.226651639463046,EOP +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.248127859722199,EV +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.2453303278926087,EV +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451119360446,IA +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451119360446,IA +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.002744725559680223,IA +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.006842130670140077,IA +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.00823417667904067,IFIE1 +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75137236277984,ISE10 +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.9967554969423595,MC +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.9967554969423595,MC +0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.7431381861008006,OCI1 +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.7571258452487513,OCI1 +0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.01119012731836122,YCU +2020,NIC,2020,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF +2020,NIC,2020,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777484711797,BOP +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527160395198197,BOP +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777484711797,BOP +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527160395198197,BOP +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.967554969423595,BOP +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437375980433944,BOP +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909262557538,BOP +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29373948854293713,BOP +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970417989396935,CF +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970417989396935,CF +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.1337106481180328,CF +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.1337106481180328,CF +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.5933128558860402,CRU +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.5923289904108416,CRU +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.88767158333198,EOP +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.9654554759111158,EOP +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.71981967355651,EOP +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.9638544365065973,EOP +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.481278597221994,EV +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16090924598518777,EV +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.453303278926086,EV +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16064240608443553,EV +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489451119360447,IA +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.726288250786695E-05,IA +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489451119360447,IA +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.726288250786695E-05,IA +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.013723627798401118,IA +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0002461342988846482,IA +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.03421065335070039,IA +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0006135656595298578,IA +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.06861813899200558,IFIE2 +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.5936362530674327,IFIE2 +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.018721402777999,ISE12 +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.2565476188917011,ISE12 +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755496942359,MC +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054320790396418,MC +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755496942359,MC +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054320790396418,MC +2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.950103263785998,OCI2 +2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.8501838719591338,OCI2 +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.117955173561455,OCI2 +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.8485828325546154,OCI2 +2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11190127318363352,YCU +2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8.349412781047394E-05,YCU +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711798,BOP +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711798,BOP +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.993510993884719,BOP +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.983818525115076,BOP +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.240639298610999,EOP +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.226651639463046,EOP +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.248127859722199,EV +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.2453303278926087,EV +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451119360446,IA +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451119360446,IA +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.002744725559680223,IA +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.006842130670140077,IA +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.00823417667904067,IFIE2 +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75137236277984,ISE12 +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.9967554969423595,MC +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.9967554969423595,MC +2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.7431381861008006,OCI2 +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.7571258452487513,OCI2 +2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.01119012731836122,YCU +0,PR,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,CF +0,NIC,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF +0,PR,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,ISE1 +0,NIC,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 +0,PR,2020,USD,,AA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,CF +0,PR,2020,USD,,AA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,EOP +0,PR,2020,USD,,AA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,ISE1 +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.81696474942763,BOP +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777484711797,BOP +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527160395198197,BOP +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.81696474942763,BOP +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777484711797,BOP +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527160395198197,BOP +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.981696474942762,BOP +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.967554969423595,BOP +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437375980433944,BOP +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.954352475328808,BOP +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909262557538,BOP +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29373948854293713,BOP +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970417989396935,CF +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970417989396935,CF +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.1337106481180328,CF +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.1337106481180328,CF +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.5933128558860402,CRU +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.5923289904108416,CRU +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.38516743196308,EOP +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.88767158333198,EOP +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.9654554759111158,EOP +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.2135438700358,EOP +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.71981967355651,EOP +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.9638544365065973,EOP +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.4950072796505705,EV +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.481278597221994,EV +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16090924598518777,EV +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.487545385653731,EV +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.453303278926086,EV +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16064240608443553,EV +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.09149892794215597,IA +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489451119360447,IA +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.726288250786695E-05,IA +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.09149892794215597,IA +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489451119360447,IA +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.726288250786695E-05,IA +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.008318084358377817,IA +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.013723627798401118,IA +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0002461342988846482,IA +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.020738295978657114,IA +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.03421065335070039,IA +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0006135656595298578,IA +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.05192444400963031,IFIE1 +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.022796108639328655,IFIE1 +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.5929363248250689,IFIE1 +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,27.551496435382187,ISE10 +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.095159064922122,ISE10 +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.2556465077295465,ISE10 +0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.981696474942737,MC +0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755496942359,MC +0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054320790396418,MC +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.981696474942737,MC +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755496942359,MC +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054320790396418,MC +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,7.105427357601002E-15,OCI1 +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-5.551115123125783E-17,OCI1 +0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.1641616679304434,YCU +0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11190127318363352,YCU +0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8.349412781047394E-05,YCU +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,38.316584766326955,AM +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-46.24958203305145,BOP +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863442721,CL +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.5933128558860402,CRU +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-18.238663229656325,EOP +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.04954912095471157,IA +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.6428619768407517,IFIE1 +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,9.662803986091077,ISE10 +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-38.316584766326955,ISE7 +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-52.92295262051829,MC +0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-15.684995728561214,BOP +0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863442721,CL +0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,EOP +0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-27.56724877116518,EV +0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.007904134700818875,IA +0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.007904134700818875,IFIE1 +0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.007904134700817522,ISE11 +0,PR,2020,USD,,OA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,CF +0,PR,2020,USD,,OA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,EOP +0,PR,2020,USD,,OA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,ISE1 +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.983777484711798,BOP +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.983777484711798,BOP +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.993510993884719,BOP +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.983818525115076,BOP +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.240639298610999,EOP +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.226651639463046,EOP +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.248127859722199,EV +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.2453303278926087,EV +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451119360446,IA +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451119360446,IA +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.002744725559680223,IA +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.006842130670140077,IA +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.001141454471139303,IFIE1 +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.7582672997198916,ISE10 +0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.9967554969423595,MC +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.9967554969423595,MC +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.7763568394002505E-15,OCI1 +0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.01119012731836122,YCU +2020,NIC,2020,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF +2020,NIC,2020,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777484711797,BOP +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527160395198197,BOP +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777484711797,BOP +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527160395198197,BOP +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.967554969423595,BOP +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437375980433944,BOP +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909262557538,BOP +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29373948854293713,BOP +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970417989396935,CF +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970417989396935,CF +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.1337106481180328,CF +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.1337106481180328,CF +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.5933128558860402,CRU +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.5923289904108416,CRU +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.88767158333198,EOP +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.9654554759111158,EOP +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.71981967355651,EOP +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.9638544365065973,EOP +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.481278597221994,EV +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16090924598518777,EV +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.453303278926086,EV +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16064240608443553,EV +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489451119360447,IA +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.726288250786695E-05,IA +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489451119360447,IA +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.726288250786695E-05,IA +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.013723627798401118,IA +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0002461342988846482,IA +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.03421065335070039,IA +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0006135656595298578,IA +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.022796108639328655,IFIE2 +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.5929363248250689,IFIE2 +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.095159064922122,ISE12 +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.2556465077295465,ISE12 +2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755496942359,MC +2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054320790396418,MC +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755496942359,MC +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054320790396418,MC +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,7.105427357601002E-15,OCI2 +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-5.551115123125783E-17,OCI2 +2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11190127318363352,YCU +2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8.349412781047394E-05,YCU +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.983777484711798,BOP +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.983777484711798,BOP +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.993510993884719,BOP +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.983818525115076,BOP +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.240639298610999,EOP +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.226651639463046,EOP +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.248127859722199,EV +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.2453303278926087,EV +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451119360446,IA +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451119360446,IA +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.002744725559680223,IA +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.006842130670140077,IA +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.001141454471139303,IFIE2 +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.7582672997198916,ISE12 +2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.9967554969423595,MC +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.9967554969423595,MC +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.7763568394002505E-15,OCI2 +2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.01119012731836122,YCU \ No newline at end of file diff --git a/Test/ExportIfrsVariable.ipynb b/Test/ExportIfrsVariable.ipynb new file mode 100644 index 00000000..21cad454 --- /dev/null +++ b/Test/ExportIfrsVariable.ipynb @@ -0,0 +1,124 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "1fnxMsytI0SV8h59pqZxDQ", + "cell_type": "markdown", + "source": [ + "

Test Reports

" + ], + "metadata": {} + }, + { + "id": "sY2AQGDoZUaMYR5JiSxcjQ", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-xiQumLe30mD77Pvhijxtw", + "cell_type": "markdown", + "source": [ + "# BenchMarks" + ], + "metadata": {} + }, + { + "id": "jOHCgtzBxke3Wk8c8QC1Ug", + "cell_type": "code", + "source": [ + "var pathToBm = \"./Data/ReportBenchmarks/\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LvvPQ9tBmU-4pDW_tCG-1g", + "cell_type": "code", + "source": [ + "var argsArray = new ImportArgs[]{", + "\n new ImportArgs (\"CH\", 2020, 12, Periodicity.Quarterly, null, null),", + "\n new ImportArgs (\"CH\", 2021, 3, Periodicity.Quarterly, null, null)", + "\n };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CnPCEWt_aUe8ts0COdm3ZA", + "cell_type": "code", + "source": [ + "public async Task ExportBenchmarks(ImportArgs args)", + "\n{", + "\n await DataSource.Partition.SetAsync(new {ReportingNode = args.ReportingNode, Year= args.Year, Month = args.Month, Scenario = args.Scenario});", + "\n var computedVariables = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());", + "\n", + "\n foreach (var estimateType in computedVariables.Keys)", + "\n {", + "\n await Export.ToCsv(pathToBm+\"BM_\"+args.ReportingNode+\"_\"+args.Year.ToString()+\"_\"+args.Month.ToString()+\"_\"+estimateType)", + "\n .WithTable(tableConfig => tableConfig", + "\n .AtBeginning()", + "\n .WithName(Main)", + "\n .WithSource(source => args.RepeatOnce().AsQueryable())", + "\n .WithColumn(x => x.Periodicity, x => x.Delete())", + "\n .WithColumn(x => x.ImportFormat, x => x.Delete())", + "\n )", + "\n .WithTable(tableConfig => tableConfig", + "\n .WithSource(source => computedVariables[estimateType].AsQueryable())", + "\n .WithName(estimateType)", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n )", + "\n .ExecuteAsync();", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "aa_A6kszrU67Ghv0nf-m_g", + "cell_type": "code", + "source": [ + "foreach (var args in argsArray)", + "\n await ExportBenchmarks(args);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "snRElFsmF0OjFLQvRzQNhA", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/ExportReportVariables.ipynb b/Test/ExportReportVariables.ipynb new file mode 100644 index 00000000..a8002ecb --- /dev/null +++ b/Test/ExportReportVariables.ipynb @@ -0,0 +1,186 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "TG_x9dWCM0usAoORaJW0wA", + "cell_type": "markdown", + "source": [ + "

Report Variable Exporter

" + ], + "metadata": {} + }, + { + "id": "Y25XYadyL0aU_Fzz5elNMQ", + "cell_type": "markdown", + "source": [ + "# Infrastructure and Configuration" + ], + "metadata": {} + }, + { + "id": "cfjgktx4p0-NVKhru0UtHg", + "cell_type": "markdown", + "source": [ + "## Initialize Workspace" + ], + "metadata": {} + }, + { + "id": "LsMvspLNjUSjzwV8dPfvYA", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1HOdfKtqgEyoCXzmZfFBXw", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_REnUbsBBkCMFwqQyGWg5Q", + "cell_type": "markdown", + "source": [ + "## Imports and Configurations" + ], + "metadata": {} + }, + { + "id": "txVLamtljU-DLHzCcz9PnQ", + "cell_type": "code", + "source": [ + "#!import \"ReportVariablesTestBase\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zzDardBj_kKdArEdeDsDNQ", + "cell_type": "markdown", + "source": [ + "## Storage" + ], + "metadata": {} + }, + { + "id": "37AwAO8feEOU3Vi9qBbP4Q", + "cell_type": "code", + "source": [ + "var reportStorage = new ReportStorage(Workspace, Report);", + "\nawait reportStorage.InitializeReportIndependentCacheAsync();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "iFTfudfp-EetHuW8yU6YCg", + "cell_type": "markdown", + "source": [ + "## Configurations" + ], + "metadata": {} + }, + { + "id": "2qOI8dJxZ0WPMJf28ue31g", + "cell_type": "code", + "source": [ + "var path = \"./Data/ReportVariableBenchmarks/\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kXndb4zG_UO9VKIhnleT1A", + "cell_type": "markdown", + "source": [ + "# Defining Scope for the Reports and Tests" + ], + "metadata": {} + }, + { + "id": "ZC_lDkxtFEeOujJtQdnaUg", + "cell_type": "markdown", + "source": [ + "### Defining the Period and Reporting Node (...) for the Reports" + ], + "metadata": {} + }, + { + "id": "JIbgXj_2n0K5dfj-X2RJ5A", + "cell_type": "code", + "source": [ + "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType)[] exportScope = {", + "\n ((2020, 12), \"CH\", null, CurrencyType.Contractual),", + "\n// ((2020, 12), \"CH\", null, CurrencyType.Functional),", + "\n// ((2020, 12), \"CH\", null, CurrencyType.Group),", + "\n ", + "\n ((2021, 3), \"CH\", null, CurrencyType.Contractual),", + "\n// ((2021, 3), \"CH\", null, CurrencyType.Functional),", + "\n// ((2021, 3), \"CH\", null, CurrencyType.Group),", + "\n};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "OJE_pdhJBEKChAxri8wv9A", + "cell_type": "markdown", + "source": [ + "# Export" + ], + "metadata": {} + }, + { + "id": "hYzcfGQt4kGKYbKgl9vmqw", + "cell_type": "code", + "source": [ + "foreach(var args in exportScope){", + "\n var scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", + "\n var bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";", + "\n await Export.ToCsv(path + bmFileName).WithTable(tableConfig => tableConfig.WithSource(source => scopesData.AsQueryable())).ExecuteAsync(); ", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "plmvGTRjsU60fGgbLWHM3g", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/IfrsVariablesTest.ipynb b/Test/IfrsVariablesTest.ipynb new file mode 100644 index 00000000..7046979f --- /dev/null +++ b/Test/IfrsVariablesTest.ipynb @@ -0,0 +1,327 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "kqZuH1dEnke7hR4QHKoNog", + "cell_type": "markdown", + "source": [ + "

Ifrs Variable

" + ], + "metadata": {} + }, + { + "id": "LjWUwb9UEkuNT2p5nWP59g", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3aLFpM2sG0yzvGW-O9CBrA", + "cell_type": "markdown", + "source": [ + "# BenchMarks" + ], + "metadata": {} + }, + { + "id": "wHzw3mkXwUaee_GWJCqXKA", + "cell_type": "code", + "source": [ + "var pathToBm = \"./Data/IfrsVariableBenchmarks/\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "A-1s2TjE8U2lTB5-1UldnA", + "cell_type": "code", + "source": [ + "public record BenchmarkMetadata(string FileName, string ReportingNode, int Year, int Month){} " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "efhvDjD2pU6uboXYUAfYxw", + "cell_type": "code", + "source": [ + "var bmFiles = new BenchmarkMetadata[]{", + "\n //2020 Q4", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_A.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_AA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_APA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_BE.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_BEPA.csv\", \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_C.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_DA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_F.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_OA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_RA.csv\" , \"CH\", 2020, 12),", + "\n //2021 Q1", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_A.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AAPA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_APA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_BE.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_BEPA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_C.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_DA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_F.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_L.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_LR.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OAPA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_RA.csv\" , \"CH\", 2021, 3),", + "\n};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Q7pARj6RR0K30yyk_I3omg", + "cell_type": "markdown", + "source": [ + "# Functions" + ], + "metadata": {} + }, + { + "id": "iHhg-4yNYEGh4h62o8W5zA", + "cell_type": "code", + "source": [ + "public static NumberStyles AllowedNumberStyles = NumberStyles.Float | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowLeadingSign | NumberStyles.AllowTrailingSign | NumberStyles.AllowDecimalPoint;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jMFEw9p2r0iOR_Ru9wkGmg", + "cell_type": "code", + "source": [ + "public IfrsVariable CreateVariable (IDataRow row, Guid partition)", + "\n{", + "\n if (!double.TryParse(row[nameof(IfrsVariable.Value)]?.ToString(), AllowedNumberStyles, CultureInfo.InvariantCulture, out var doubleValue))", + "\n throw new Exception(\"Value cannot be parsed.\");", + "\n ", + "\n return new IfrsVariable(){AocType = row.Field(nameof(IfrsVariable.AocType)),", + "\n Partition = partition,", + "\n Novelty = row.Field(nameof(IfrsVariable.Novelty)),", + "\n DataNode = row.Field(nameof(IfrsVariable.DataNode)),", + "\n EstimateType = row.Field(nameof(IfrsVariable.EstimateType)),", + "\n AmountType = row.Field(nameof(IfrsVariable.AmountType)),", + "\n AccidentYear = Int32.TryParse((row.Field(nameof(IfrsVariable.AccidentYear))), out var accidentYear) ? accidentYear : (int?)null,", + "\n EconomicBasis = row.Field(nameof(IfrsVariable.EconomicBasis)),", + "\n Value = (-1.0) * doubleValue,", + "\n };", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nLcASZMlEEmL_nI0yYamvw", + "cell_type": "code", + "source": [ + "public class BenchmarkTestResult", + "\n{", + "\n public string ErrorMessage {get; set;}", + "\n public double ExpectedValue {get; set;}", + "\n public double ComputedValue {get; set;}", + "\n public BenchmarkTestResult (string message)", + "\n {", + "\n ErrorMessage = message;", + "\n }", + "\n public BenchmarkTestResult (string message, double expValue, double compValue)", + "\n {", + "\n ErrorMessage = message;", + "\n ExpectedValue = expValue;", + "\n ComputedValue = compValue; ", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LEHT1hqQo0W96ERHvf4L3A", + "cell_type": "code", + "source": [ + "public List CompareAgainstBm (List errors, IEnumerable expected, IEnumerable computed)", + "\n{", + "\n var expectedNotComputed = expected.Where(x => Math.Abs(x.Value) > BenchmarkPrecision).Select(x => x.ToIdentityString()).Except(computed.Select(x => x.ToIdentityString()));", + "\n var computedNotExpected = computed.Where(x => Math.Abs(x.Value) > BenchmarkPrecision).Select(x => x.ToIdentityString()).Except(expected.Select(x => x.ToIdentityString()));", + "\n if (expectedNotComputed.Any())", + "\n {", + "\n foreach (var error in expectedNotComputed)", + "\n {", + "\n var message = error.ToIdentityString();", + "\n errors.Add(new BenchmarkTestResult(\"Extra expected variable for: \"+ message));", + "\n }", + "\n }", + "\n if (computedNotExpected.Any())", + "\n {", + "\n foreach (var error in computedNotExpected)", + "\n {", + "\n var message = error.ToIdentityString();", + "\n errors.Add(new BenchmarkTestResult(\"Extra computed variable for: \"+ message));", + "\n }", + "\n }", + "\n ", + "\n var misMatchedVariables = expected.Concat(computed).AggregateOver().Where(x => Math.Abs(x.Value) > BenchmarkPrecision);", + "\n if (misMatchedVariables.Any())", + "\n {", + "\n foreach (var variable in misMatchedVariables)", + "\n {", + "\n var message = variable.ToIdentityString();", + "\n var bmValue = expected.FirstOrDefault(x => x.AocType == variable.AocType && ", + "\n x.Novelty == variable.Novelty &&", + "\n x.DataNode == variable.DataNode && ", + "\n x.EstimateType == variable.EstimateType && ", + "\n x.AmountType == variable.AmountType && ", + "\n x.EconomicBasis == variable.EconomicBasis && ", + "\n x.AccidentYear == variable.AccidentYear", + "\n )?.Value ?? 0.0d;", + "\n var computedValue = computed.FirstOrDefault(x => x.AocType == variable.AocType && ", + "\n x.Novelty == variable.Novelty &&", + "\n x.DataNode == variable.DataNode && ", + "\n x.EstimateType == variable.EstimateType && ", + "\n x.AmountType == variable.AmountType && ", + "\n x.EconomicBasis == variable.EconomicBasis && ", + "\n x.AccidentYear == variable.AccidentYear", + "\n )?.Value ?? 0.0d;", + "\n errors.Add(new BenchmarkTestResult(\"Value does not match for Variable: \" + message, -bmValue, computedValue));", + "\n }", + "\n }", + "\n return errors;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_OGAdCYiJ0WN7EbtgA4faQ", + "cell_type": "markdown", + "source": [ + "# Test Runner" + ], + "metadata": {} + }, + { + "id": "a5OzvwT_d0Gm2H4gGqcvEA", + "cell_type": "code", + "source": [ + "public bool ValidateMainTab(IDataRow mainRow, string reportingNode, int year, int month)", + "\n{", + "\n if (!int.TryParse(mainRow[nameof(PartitionByReportingNodeAndPeriod.Year)]?.ToString(), NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite , CultureInfo.InvariantCulture, out var mainYear))", + "\n throw new Exception(\"Value Year cannot be parsed.\"); ", + "\n if (!int.TryParse(mainRow[nameof(PartitionByReportingNodeAndPeriod.Month)]?.ToString(), NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite , CultureInfo.InvariantCulture, out var mainMonth))", + "\n throw new Exception(\"Value Month cannot be parsed.\"); ", + "\n var mainReportingNode = mainRow[nameof(PartitionByReportingNodeAndPeriod.ReportingNode)].ToString();", + "\n ", + "\n return reportingNode == mainReportingNode && year == mainYear && month == mainMonth;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HeqY0awSAUWsxllqn3M_AQ", + "cell_type": "code", + "source": [ + "var errorList = new List();", + "\n", + "\nforeach (var g in bmFiles.GroupBy(x => (ReportingNode: x.ReportingNode, Year: x.Year, Month: x.Month)))", + "\n{", + "\n var reportingNode = g.Key.ReportingNode;", + "\n var year = g.Key.Year;", + "\n var month = g.Key.Month;", + "\n string scenario = null;", + "\n ", + "\n //Set up Args and storage", + "\n await DataSource.Partition.SetAsync(new {ReportingNode = reportingNode, ", + "\n Year= year, ", + "\n Month = month, ", + "\n Scenario = scenario});", + "\n var partition = (await DataSource.Query().ToArrayAsync())", + "\n .SingleOrDefault(x => x.ReportingNode == reportingNode && x.Year== year && x.Month == month && x.Scenario == scenario)?.Id ?? new Guid();", + "\n ", + "\n var computedVariablesByEstimateType = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());", + "\n", + "\n foreach (var bmfile in g)", + "\n {", + "\n var extension = System.IO.Path.GetExtension(bmfile.FileName);", + "\n var stream = await Project.FileStorage.ReadAsync(bmfile.FileName);", + "\n //Read Bm csv", + "\n var bmDataTable = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync());", + "\n", + "\n var mainTab = bmDataTable.Tables[Main].Rows.First();", + "\n if(!ValidateMainTab(mainTab, reportingNode, year, month))", + "\n throw new Exception(\"Metadata and main tab of the Benchmark are different.\");", + "\n ", + "\n var bmTableName = bmDataTable.Tables.Single(x => x.TableName != Main).TableName;", + "\n var bmVariables = bmDataTable.Tables[bmTableName].Rows.Select(x => CreateVariable(x, partition));", + "\n ", + "\n //Get the computed Data", + "\n var computedVariables = computedVariablesByEstimateType.TryGetValue(bmTableName, out var ret) ? ret : Enumerable.Empty();", + "\n ", + "\n //CompareAgainstBm", + "\n if (bmVariables.Any() || computedVariables.Any()) //TODO we are adding duplicates here", + "\n errorList = errorList.Concat(CompareAgainstBm(errorList, bmVariables, computedVariables)).ToList();", + "\n }", + "\n}", + "\nerrorList = errorList.Distinct().ToList();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9p0HZCWtX0SPrElo9W915Q", + "cell_type": "code", + "source": [ + "errorList.Count().Should().Be(0)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "EBnAVHo3qEK4kPd1D8kPOw", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/ImportStorageTest.ipynb b/Test/ImportStorageTest.ipynb new file mode 100644 index 00000000..93d24cd9 --- /dev/null +++ b/Test/ImportStorageTest.ipynb @@ -0,0 +1,707 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "hKqEq5tZqUm8XFAYsSBT8A", + "cell_type": "markdown", + "source": [ + "

Import Storage Test

" + ], + "metadata": {} + }, + { + "id": "a__Hz48NY0-0cWKJL87Vzg", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hLZ53C2rWEanpIfkyRA2Rg", + "cell_type": "markdown", + "source": [ + "# Workspace Initialization " + ], + "metadata": {} + }, + { + "id": "8-W8hpcYnEm17E9gRTCLnQ", + "cell_type": "code", + "source": [ + "Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Dpy4U4VA5U-HxqmmZfHkmw", + "cell_type": "markdown", + "source": [ + "# Test IfrsVariables Query" + ], + "metadata": {} + }, + { + "id": "irUVLmmRJEyCsUkl3sPquQ", + "cell_type": "code", + "source": [ + "var gic = \"DT1.1\";", + "\nvar gric = \"DTR1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dihIAZaujUK6GuXDUo7Y_A", + "cell_type": "code", + "source": [ + "//Define partition", + "\nvar args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Actual);", + "\nvar partition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", + "\n x.Month == args.Month && x.Scenario == args.Scenario);", + "\nif(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);", + "\n", + "\nvar previousPeriodPartition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year - 1 && ", + "\n x.Month == MonthInAYear && x.Scenario == args.Scenario);", + "\nif(previousPeriodPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "N8Yf6JjnRU6Q4jUFGmqn3Q", + "cell_type": "code", + "source": [ + "public async Task CheckIfrsVariablesFromImportStorageAsync(string importFormat, IEnumerable inputDataSetForWorkspace, IEnumerable inputDataSetForDataSource, IEnumerable ivsBenchmark)", + "\n{", + "\n //Prepare Workspace and DataSource", + "\n await Workspace.UpdateAsync(inputDataSetForWorkspace);", + "\n await DataSource.UpdateAsync(inputDataSetForDataSource);", + "\n ", + "\n //Set up import storage and test universe", + "\n var testStorage = new ImportStorage(args with {ImportFormat = importFormat}, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n ", + "\n var ivs = testStorage.IfrsVariablesByImportIdentity.SelectMany(x => x.Value);", + "\n ", + "\n //Clean up Workspace", + "\n //Workspace.Reset(); ", + "\n await Workspace.DeleteAsync(inputDataSetForWorkspace); ", + "\n await DataSource.DeleteAsync(inputDataSetForDataSource); ", + "\n ", + "\n var errors = new List();", + "\n ", + "\n var extraVariablesInStorage = ivs.Except(ivsBenchmark).Select(x => x.ToIdentityString()).ToArray();", + "\n if(extraVariablesInStorage.Any()) errors.Add( $\"IfrsVariables in the storage contain the following items that are not present in the benchmark:\\n{string.Join(\"\\n\",extraVariablesInStorage)}.\" );", + "\n ", + "\n var extraVariablesInBenchmark = ivsBenchmark.Except(ivs).Select(x => x.ToIdentityString()).ToArray();", + "\n if(extraVariablesInBenchmark.Count() > 0) errors.Add( $\"IfrsVariables in the benchmark contain the following items that are not present in the storage:\\n{string.Join(\"\\n\",extraVariablesInBenchmark)}.\" );", + "\n ", + "\n //find duplicates in storage", + "\n var ivsByIdentityString = ivs.GroupBy(x => x.ToIdentityString()).Where(x => x.Count() > 1).Select(x => x.Key);", + "\n if(ivsByIdentityString.Any()) errors.Add($\"IfrsVariables in the storage have duplicated items for:\\n{string.Join(\"\\n\",ivsByIdentityString)}.\");", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bcPOId_540aVhl-n5wKQCA", + "cell_type": "code", + "source": [ + "//There is a previous year, and it's the first time Actuals are imported for the current year", + "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BqLp5tAfAUO_fcHJmxq2_A", + "cell_type": "code", + "source": [ + "//There is a previous year, and it's the second time Actuals are imported for the current year (reimport)", + "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = 150.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 200.0},", + "\n basicIfrsVariable with {AocType = AocTypes.EOP, Value = 450.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1RKRtwQOPkKisKG03fEbnQ", + "cell_type": "code", + "source": [ + "//There is a previous year, Cashflows were already imported and Actuals are imported for the first time", + "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.I, EstimateType = EstimateTypes.BE};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = 100.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", + "\n basicIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.CF, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -15.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -20.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", + "\n basicIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.AA, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -15.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -20.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jxo0gCLAhUWGDdD50PTpxA", + "cell_type": "code", + "source": [ + "//There is a previous year, Cashflows and Actuals were already imported and Actuals are imported again", + "\nvar basicAdvanceActualIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", + "\nvar basicBeIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.I, EstimateType = EstimateTypes.BE};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n basicBeIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 1000.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", + "\n basicAdvanceActualIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", + "\n basicAdvanceActualIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.CF, Value = 150.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.WO, Value = 200.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.EOP, Value = 450.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n basicBeIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0BeFF1dpdEmZVGTCvBJgaw", + "cell_type": "code", + "source": [ + "//There is a previous year for Primary Scope (GRIC10) ", + "\n//There is a previous and current year for Secondary Scope (GIC10), ", + "\n//It's the first time Actuals are imported for the current year", + "\n", + "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gric, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n //Year", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, DataNode = gic, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.C, Value = 1000.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.CL, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.C, Value = 666.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 1000.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.CL, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 666.0},", + "\n //Year -1", + "\n basicIfrsVariable with {AocType = AocTypes.IA, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n //From previous Period", + "\n //Actuals", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n //Cashflow", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.C, Value = 1000.0},", + "\n ", + "\n //From current Period", + "\n //from DB", + "\n basicIfrsVariable with {AocType = AocTypes.IA, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", + "\n ", + "\n //from workspace", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XRCB3ZClf0-ZJpfkzljWUg", + "cell_type": "markdown", + "source": [ + "# Data Node Parameter related logic" + ], + "metadata": {} + }, + { + "id": "JbLy2z9stkeeonRZwUG3yQ", + "cell_type": "markdown", + "source": [ + "## Data Preparation" + ], + "metadata": {} + }, + { + "id": "RjbciW5_FECXbQhnQZ4DwQ", + "cell_type": "code", + "source": [ + "//Define partition", + "\nvar args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Cashflow);", + "\n", + "\nvar reportingNodePartition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Scenario == args.Scenario);", + "\nif(reportingNodePartition == null) ApplicationMessage.Log(Error.PartitionNotFound);", + "\n", + "\n", + "\nvar currentPartition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", + "\n x.Month == args.Month && x.Scenario == args.Scenario);", + "\nif(currentPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);", + "\n", + "\n", + "\nvar previousPeriodPartition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year - 1 && ", + "\n x.Month == MonthInAYear && x.Scenario == args.Scenario);", + "\nif(previousPeriodPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "E09b-uWxcUa8abPa94ONVA", + "cell_type": "code", + "source": [ + "var sampleGic = new GroupOfInsuranceContract(){Portfolio = \"P1\"};", + "\nvar inputDataGic = new GroupOfInsuranceContract[]{ sampleGic with {SystemName = \"Gross1\", LiabilityType = LiabilityTypes.LRC},", + "\n sampleGic with {SystemName = \"Gross2\", LiabilityType = LiabilityTypes.LRC},", + "\n sampleGic with {SystemName = \"Gross3\", LiabilityType = LiabilityTypes.LRC},", + "\n };", + "\n", + "\nvar sampleGric = new GroupOfReinsuranceContract(){Portfolio = \"ReP1\"};", + "\nvar inputDataGric = new GroupOfReinsuranceContract[]{ sampleGric with {SystemName = \"Reins1\", LiabilityType = LiabilityTypes.LRC},", + "\n sampleGric with {SystemName = \"Reins2\", LiabilityType = LiabilityTypes.LRC},", + "\n sampleGric with {SystemName = \"Reins3\", LiabilityType = LiabilityTypes.LRC},", + "\n };", + "\nvar sampleDnState = new DataNodeState {Partition = reportingNodePartition.Id, Year = args.Year, Month = args.Month, State = State.Active};", + "\nvar inputDataState = new DataNodeState[]{ sampleDnState with {DataNode = \"Gross1\"} ,", + "\n sampleDnState with {DataNode = \"Gross2\"} ,", + "\n sampleDnState with {DataNode = \"Gross3\"} ,", + "\n sampleDnState with {DataNode = \"Reins1\"} ,", + "\n sampleDnState with {DataNode = \"Reins2\"} ,", + "\n sampleDnState with {DataNode = \"Reins3\"} ,", + "\n };", + "\n", + "\nvar samplePreviousDnParam = new InterDataNodeParameter {Partition = reportingNodePartition.Id, ReinsuranceCoverage = 1, Year = args.Year -1, Month = args.Month};", + "\nvar sampleCurrentDnParam = new InterDataNodeParameter {Partition = reportingNodePartition.Id, ReinsuranceCoverage = 1, Year = args.Year, Month = args.Month};", + "\nvar inputDataParameter = new InterDataNodeParameter[]{", + "\n samplePreviousDnParam with {DataNode = \"Gross3\", LinkedDataNode = \"Reins3\", ReinsuranceCoverage = 1},", + "\n samplePreviousDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins1\", ReinsuranceCoverage = 0.1},", + "\n samplePreviousDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.2},", + "\n samplePreviousDnParam with {DataNode = \"Gross2\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.3},", + "\n sampleCurrentDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins1\", ReinsuranceCoverage = 0.5},", + "\n sampleCurrentDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.6},", + "\n sampleCurrentDnParam with {DataNode = \"Gross2\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.7},", + "\n sampleCurrentDnParam with {DataNode = \"Gross3\", LinkedDataNode = \"Reins3\", ReinsuranceCoverage = 1.0},", + "\n };", + "\n", + "\nvar sampleRawVar = new RawVariable{AmountType = AmountTypes.PR, AocType = AocTypes.CL, Novelty = Novelties.C, Partition = currentPartition.Id};" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "o8JTuDpfTkGmD7Wt0jogsQ", + "cell_type": "code", + "source": [ + "public async Task PrepareWorkspaceDataNodes()", + "\n{", + "\n await Workspace.UpdateAsync(inputDataGic);", + "\n await Workspace.UpdateAsync(inputDataGric);", + "\n await Workspace.UpdateAsync(inputDataState);", + "\n await Workspace.UpdateAsync(inputDataParameter);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Ozbv22ctukacRUyws-K7bw", + "cell_type": "code", + "source": [ + "public async Task CleanWorkspaceDataNodes()", + "\n{", + "\n await Workspace.DeleteAsync(inputDataGic);", + "\n await Workspace.DeleteAsync(inputDataGric);", + "\n await Workspace.DeleteAsync(inputDataState);", + "\n await Workspace.DeleteAsync(inputDataParameter);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZYnBpUzNEkWsk0zRWkUu-g", + "cell_type": "markdown", + "source": [ + "## Get Underlying Gic" + ], + "metadata": {} + }, + { + "id": "P-7XAjZPD0i7yEALKAwsnA", + "cell_type": "code", + "source": [ + "public async Task CheckGetUnderlyingGicsAsync(RawVariable[] inputDataVariable, Dictionary> underlyingGicBm)", + "\n{", + "\n var errors = new List();", + "\n ", + "\n await PrepareWorkspaceDataNodes();", + "\n await Workspace.UpdateAsync(inputDataVariable);", + "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n ", + "\n var primaryScopeDn = testStorage.DataNodesByImportScope[ImportScope.Primary];", + "\n ", + "\n foreach (var dn in primaryScopeDn)", + "\n {", + "\n var id = new ImportIdentity(){DataNode = dn};", + "\n if ( underlyingGicBm[dn].Except(testStorage.GetUnderlyingGic(id)).Count() != 0 )", + "\n errors.Add( $\"Underlying Gics for DataNode {dn} not matching with BM. Computed: \\n{string.Join(\"\\n\",testStorage.GetUnderlyingGic(id))} \\n Expected : \\n{string.Join(\"\\n\",underlyingGicBm[dn])}\" );", + "\n }", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query());", + "\n await CleanWorkspaceDataNodes();", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gr9n4fPaC0-7JF_Wv00Nzw", + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n sampleRawVar with {DataNode = \"Reins2\"},", + "\n };", + "\nvar underlyingGicBm = new Dictionary>(){", + "\n {\"Reins1\",new string[]{\"Gross1\"}},", + "\n {\"Reins2\",new string[]{\"Gross1\",\"Gross2\"}},", + "\n};", + "\n", + "\nawait CheckGetUnderlyingGicsAsync(inputDataVariable, underlyingGicBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "z4P2iM4Dwk2p49Y6p3nVKw", + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins2\"},", + "\n };", + "\nvar underlyingGicBm = new Dictionary>(){", + "\n {\"Reins2\",new string[]{\"Gross1\",\"Gross2\"}},", + "\n};", + "\n", + "\nawait CheckGetUnderlyingGicsAsync(inputDataVariable, underlyingGicBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-L7jFDaEmkyVlAyPPIHFHQ", + "cell_type": "markdown", + "source": [ + "## Get Reinsurance Coverage" + ], + "metadata": {} + }, + { + "id": "YwMf2AGd8kWzNmNK5TaXeA", + "cell_type": "code", + "source": [ + "public async Task CheckGetReinsuranceCoverageAsync(RawVariable[] inputDataVariable, ", + "\n Dictionary<(string, string),double> reinsCovBoPBm, ", + "\n Dictionary<(string, string),double> reinsCovEoPBm)", + "\n{", + "\n var errors = new List();", + "\n", + "\n await PrepareWorkspaceDataNodes();", + "\n await Workspace.UpdateAsync(inputDataVariable);", + "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n ", + "\n var primaryScopeDn = testStorage.DataNodesByImportScope[ImportScope.Primary];", + "\n ", + "\n foreach (var dn in primaryScopeDn)", + "\n {", + "\n var aocTypes = new AocStep[]{ new AocStep(AocTypes.BOP, Novelties.I), new AocStep(AocTypes.RCU, Novelties.I) };", + "\n foreach (var aoc in aocTypes)", + "\n {", + "\n var bm = aoc.AocType == AocTypes.BOP ? reinsCovBoPBm : reinsCovEoPBm;", + "\n var id = new ImportIdentity(){DataNode = dn, AocType = aoc.AocType, Novelty = aoc.Novelty};", + "\n ", + "\n var computedReinsCov = testStorage.GetUnderlyingGic(id)", + "\n .Select(gic => (g: gic, value: testStorage.GetReinsuranceCoverage(id, gic)))", + "\n .ToDictionary(x => (dn,x.g), x => x.value);", + "\n ", + "\n if( bm.Keys.Where(x => x.Item1 == dn).Except(computedReinsCov.Keys).Count() != 0)", + "\n errors.Add( $\"Gric-Gic links not matching with BM for DataNode {dn} and AocType {aoc.AocType}. \\n Computed: \\n{string.Join(\"\\n\",computedReinsCov.Keys)} \\n Expected: \\n{string.Join(\"\\n\",bm.Keys)}\" );", + "\n ", + "\n foreach (var reinsCov in computedReinsCov)", + "\n {", + "\n var bmKvp = bm.Single(x => x.Key.Item1 == reinsCov.Key.Item1 && x.Key.Item2 == reinsCov.Key.Item2); ", + "\n if( Math.Abs(bmKvp.Value - reinsCov.Value) > Precision )", + "\n errors.Add( $\"{dn}-{reinsCov.Key.Item2} Reinsurance Coverage not matching with BM for AocType {aoc.AocType}: \\n Computed: {reinsCov.Value} \\n Expected: {bmKvp.Value}\");", + "\n }", + "\n }", + "\n }", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query());", + "\n await CleanWorkspaceDataNodes();", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bVG2ah0oSUimPFlFmvkYwg", + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n sampleRawVar with {DataNode = \"Reins2\"},", + "\n };", + "\nvar reinsCovBoPBm = new Dictionary<(string, string),double>(){", + "\n {(\"Reins1\",\"Gross1\"),0.1},", + "\n {(\"Reins2\",\"Gross1\"),0.2},", + "\n {(\"Reins2\",\"Gross2\"),0.3},", + "\n};", + "\n", + "\nvar reinsCovEoPBm = new Dictionary<(string, string),double>(){", + "\n {(\"Reins1\",\"Gross1\"),0.5},", + "\n {(\"Reins2\",\"Gross1\"),0.6},", + "\n {(\"Reins2\",\"Gross2\"),0.7},", + "\n};", + "\n", + "\nawait CheckGetReinsuranceCoverageAsync(inputDataVariable, reinsCovBoPBm, reinsCovEoPBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2DHkaQC6A0eHln9BqSBrLA", + "cell_type": "markdown", + "source": [ + "## Primary and Secondary Scope" + ], + "metadata": {} + }, + { + "id": "QxMSzO5gJU2IlukS0y4uIg", + "cell_type": "code", + "source": [ + "public async Task CheckSecondaryScopeAsync(RawVariable[] inputDataVariable, string[] primaryScopeBm, string[] secondaryScopeBm)", + "\n{", + "\n var errors = new List();", + "\n ", + "\n await PrepareWorkspaceDataNodes();", + "\n await Workspace.UpdateAsync(inputDataVariable);", + "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n ", + "\n var activeDn = (await Workspace.Query().ToArrayAsync()).Select(x => x.DataNode);", + "\n ", + "\n var primaryScopeDn = testStorage.DataNodesByImportScope[ImportScope.Primary];", + "\n ", + "\n foreach (var dn in activeDn)", + "\n {", + "\n //PrimaryScope", + "\n if ( primaryScopeBm.Contains(dn) && !primaryScopeDn.Contains(dn))", + "\n errors.Add( $\"DataNode {dn} is not added to the primary scope.\" );", + "\n if( !primaryScopeBm.Contains(dn) && primaryScopeDn.Contains(dn))", + "\n errors.Add( $\"DataNode {dn} is added to the primary scope but should have not.\" );", + "\n ", + "\n //SecondaryScope", + "\n if ( secondaryScopeBm.Contains(dn) && !testStorage.IsSecondaryScope(dn))", + "\n errors.Add( $\"DataNode {dn} is not added to the secondary scope.\" );", + "\n if( !secondaryScopeBm.Contains(dn) && testStorage.IsSecondaryScope(dn))", + "\n errors.Add( $\"DataNode {dn} is added to the secondary scope but should have not.\" );", + "\n }", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query());", + "\n await CleanWorkspaceDataNodes();", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ky7k1tjYZkuJI5AN4f01_g", + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n sampleRawVar with {DataNode = \"Reins2\"},", + "\n };", + "\nvar primaryScopeBm = new string[]{\"Reins1\", \"Reins2\"};", + "\nvar secondaryScopeBm = new string[]{\"Gross1\", \"Gross2\"};", + "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Q7y5fkIm8Em2WkXn5-f3XA", + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n };", + "\nvar primaryScopeBm = new string[]{\"Reins1\"};", + "\nvar secondaryScopeBm = new string[]{\"Gross1\"};", + "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kwq8FSvW2EOvmcWpP4NtmA", + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n sampleRawVar with {DataNode = \"Gross1\"},", + "\n };", + "\nvar primaryScopeBm = new string[]{\"Reins1\",\"Gross1\",\"Reins2\"};", + "\nvar secondaryScopeBm = new string[]{\"Gross2\"};", + "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "DXx87fO500-tCJcptCKJTw", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/MapTemplateAndImportTest.ipynb b/Test/MapTemplateAndImportTest.ipynb new file mode 100644 index 00000000..faec8763 --- /dev/null +++ b/Test/MapTemplateAndImportTest.ipynb @@ -0,0 +1,564 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "wmh8VD39zE-Ey7EfKLRdmQ", + "cell_type": "markdown", + "source": [ + "

Test Map Template Export and Import

" + ], + "metadata": {} + }, + { + "id": "Eo2BObmmzkiC0vc1-cdonA", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Utils/UtilityMethods\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vtn0keYdmU6rEcmTON0UwQ", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CQ_YlVaPK0qoXE3iHNGsUg", + "cell_type": "markdown", + "source": [ + "# Test Empty Database" + ], + "metadata": {} + }, + { + "id": "DGQyghJ1AEyT_RB_hXzB1Q", + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "7R24zOJDXk2KI7i6-FH_2g", + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "q9WzUZfKq06UWRvmoF38IA", + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "U3QNuXi7wECZryFP8aqCyw", + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LBo4BnS_u02vMgAJhq45-Q", + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1eQBRJgPu0ei17Q9Re_f5g", + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4uAB9H_tcEq0wQ9u2feWZw", + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_I6QcbDYvEW7cP4LqHyMDQ", + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3o3EdNofI0Sb7P0VjQv3TA", + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6EGAGpWhukuN5vjCcTs51Q", + "cell_type": "markdown", + "source": [ + "# Test Map Template" + ], + "metadata": {} + }, + { + "id": "9s3hXWWbyU-1iykcDAJ-XA", + "cell_type": "markdown", + "source": [ + "## Data Node" + ], + "metadata": {} + }, + { + "id": "m6tebAPzHkaRzelYIbeZOg", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);", + "\n", + "\nstatic var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };", + "\nstatic var filename = \"TestMapTemplateDataNode\";", + "\n", + "\nWorkspace.InitializeFrom(DataSource);", + "\nawait Workspace.Partition.SetAsync( partition );", + "\n", + "\nvar ips = Workspace.Query().ToArray();", + "\nvar rps = Workspace.Query().ToArray();", + "\nvar gics = Workspace.Query().ToArray();", + "\nvar grics = Workspace.Query().ToArray();", + "\n", + "\nvar exportResult = await Export.ToExcel(filename)", + "\n .WithSource(Workspace)", + "\n .PortfolioConfiguration()", + "\n .PortfolioConfiguration()", + "\n .GroupofContractConfiguration(typeof(ReinsurancePortfolio))", + "\n .GroupofContractConfiguration(typeof(InsurancePortfolio))", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync();", + "\n", + "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", + "\n", + "\n// check that exporter generates only the desired columns ", + "\nvar extension = \".xlsx\";", + "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", + "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", + "\nvar mainCols = new[]{nameof(PartitionByReportingNode.ReportingNode)};", + "\nvar portfolioCols = new[]{nameof(Portfolio.SystemName),nameof(Portfolio.DisplayName),nameof(Portfolio.ContractualCurrency),", + "\n nameof(Portfolio.LineOfBusiness),nameof(Portfolio.OciType),nameof(Portfolio.ValuationApproach)};", + "\nvar gicCols = new[]{nameof(GroupOfContract.SystemName),nameof(GroupOfContract.DisplayName),nameof(GroupOfContract.AnnualCohort),", + "\n nameof(GroupOfContract.LiabilityType),nameof(InsurancePortfolio),nameof(GroupOfContract.Profitability)};", + "\nvar gricCols = new[]{nameof(GroupOfContract.SystemName),nameof(GroupOfContract.DisplayName),nameof(GroupOfContract.AnnualCohort),", + "\n nameof(GroupOfContract.LiabilityType),nameof(ReinsurancePortfolio),nameof(GroupOfContract.Profitability),nameof(GroupOfContract.Partner)};", + "\n", + "\nmainCols.Intersect(tables.Tables[Main].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(mainCols.Length);", + "\nportfolioCols.Intersect(tables.Tables[nameof(InsurancePortfolio)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(portfolioCols.Length); ", + "\nportfolioCols.Intersect(tables.Tables[nameof(ReinsurancePortfolio)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(portfolioCols.Length); ", + "\ngicCols.Intersect(tables.Tables[nameof(GroupOfInsuranceContract)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(gicCols.Length); ", + "\ngricCols.Intersect(tables.Tables[nameof(GroupOfReinsuranceContract)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(gricCols.Length); ", + "\n", + "\n// check that imported data matches the exported data", + "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", + "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", + "\nawait storage.InitializeAsync();", + "\n", + "\nawait UploadDataNodesToWorkspaceAsync(filename+\".xlsx\");", + "\nUtils.EqualityComparer(ips, Workspace.Query().ToArray());", + "\nUtils.EqualityComparer(rps, Workspace.Query().ToArray());", + "\nUtils.EqualityComparer(gics, Workspace.Query().ToArray());", + "\nUtils.EqualityComparer(grics, Workspace.Query().ToArray());", + "\n", + "\n" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zOGhxg1IhESG_D1THv63sA", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nRI-ZaELKE6ClMkV4BLEUg", + "cell_type": "markdown", + "source": [ + "## Data Node State" + ], + "metadata": {} + }, + { + "id": "CrT3UgfIWEucISLJOkDARA", + "cell_type": "code", + "source": [ + "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2021, Month = 3 };", + "\nstatic var filename = \"TestMapTemplateDataNodeState\";", + "\n", + "\nWorkspace.InitializeFrom(DataSource);", + "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );", + "\nawait Workspace.Partition.SetAsync( partition );", + "\n", + "\nvar dataNodeStates = await Workspace.Query()", + "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year)", + "\n .GroupBy(x => x.DataNode)", + "\n .Select(x => x.OrderByDescending(y => y.Year).ThenByDescending(y => y.Month))", + "\n .Select(x => x.Last())", + "\n .ToArrayAsync();", + "\n", + "\nvar exportResult = await Export.ToExcel(filename)", + "\n .WithSource(Workspace)", + "\n .StateEnumConfiguration() ", + "\n .DataNodeStateConfiguration(dataNodeStates)", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync();", + "\n", + "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", + "\n", + "\n// check that exporter generates only the desired columns ", + "\nvar extension = \".xlsx\";", + "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", + "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", + "\nvar mainCols = new[]{nameof(PartitionByReportingNodeAndPeriod.ReportingNode),", + "\n nameof(PartitionByReportingNodeAndPeriod.Year),", + "\n nameof(PartitionByReportingNodeAndPeriod.Month)};", + "\nvar dataNodeStateCols = new[]{nameof(DataNodeState.DataNode),nameof(DataNodeState.State)};", + "\nmainCols.Intersect(tables.Tables[Main].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(mainCols.Length);", + "\ndataNodeStateCols.Intersect(tables.Tables[\"DataNodeState\"].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(dataNodeStateCols.Length);", + "\n", + "\n// check that imported data matches the exported data ", + "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", + "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", + "\nawait storage.InitializeAsync();", + "\n", + "\nawait UploadDataNodeStateToWorkspaceAsync(filename+\".xlsx\");", + "\n", + "\n// Workspace is empty because ValidateDataNodeStatesAsync removes the entry, since this is already present in the DataSource.", + "\nWorkspace.Query().ToArray().Should().BeEmpty();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QNDCIM7e2UWjQM13S1JZ8A", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WVvsogjgCkGlxke3IAGi_g", + "cell_type": "markdown", + "source": [ + "## DataNodeParameter" + ], + "metadata": {} + }, + { + "id": "4U2oeNzYEEKxoH98EmjOxg", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);", + "\nstatic var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", + "\nvar partitionByReportingNode = (await DataSource.Query().Where(x => x.ReportingNode == partition.ReportingNode).ToArrayAsync()).Single();", + "\nstatic var filename = \"TestMapTemplateDataNodeParameter\";", + "\nvar singleDataNodeParamBm = await DataSource.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month && x.Partition == partitionByReportingNode.Id ).ToArrayAsync();", + "\nvar interDataNodeParamBm = await DataSource.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month && x.Partition == partitionByReportingNode.Id ).ToArrayAsync();", + "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );", + "\nawait Workspace.Partition.SetAsync( partition );", + "\n//--------------------Export Map Template--------------------------", + "\n//--------------------From MapTemplate NB--------------------------", + "\nvar dataNodeParameters = (await Workspace.Query()", + "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year).ToArrayAsync())", + "\n .GroupBy(x => x.GetType().Name)", + "\n .ToDictionary(x => x.Key, ", + "\n x => x.GroupBy(y => y.DataNode)", + "\n .Select(y => y.OrderByDescending(z => z.Year).ThenByDescending(z => z.Month))", + "\n .Select(y => y.First())", + "\n .ToArray() );", + "\nvar exportResult = await Export.ToExcel(filename)", + "\n .WithSource(Workspace)", + "\n .DataNodeParameterConfiguration(dataNodeParameters)", + "\n .MainTabConfiguration(partition)", + "\n.ExecuteAsync();", + "\n", + "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", + "\n//-----------------------------------------------------------------", + "\n// check that exporter generates only the desired columns ", + "\nvar extension = \".xlsx\";", + "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", + "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", + "\nvar mainCols = new[]{nameof(PartitionByReportingNodeAndPeriod.ReportingNode),", + "\n nameof(PartitionByReportingNodeAndPeriod.Year),", + "\n nameof(PartitionByReportingNodeAndPeriod.Month),", + "\n nameof(PartitionByReportingNodeAndPeriod.Scenario)};", + "\nvar singleDataNodeParamCols = new[]{nameof(DataNode),", + "\n nameof(SingleDataNodeParameter.PremiumAllocation)};", + "\nvar interDataNodeParamCols = new[]{nameof(DataNodeParameter.DataNode),", + "\n nameof(InterDataNodeParameter.LinkedDataNode),", + "\n nameof(InterDataNodeParameter.ReinsuranceCoverage)};", + "\nmainCols.Intersect(tables.Tables[Main].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(mainCols.Length);", + "\nsingleDataNodeParamCols.Intersect(tables.Tables[nameof(SingleDataNodeParameter)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(singleDataNodeParamCols.Length);", + "\ninterDataNodeParamCols.Intersect(tables.Tables[nameof(InterDataNodeParameter)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(interDataNodeParamCols.Length);", + "\n// check that imported data matches the exported data ", + "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", + "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", + "\nvar targetPartitionByReportingNodeId = new Guid();", + "\nawait storage.InitializeAsync();", + "\nawait UploadDataNodeParameterToWorkspaceAsync(filename+\".xlsx\", targetPartitionByReportingNodeId);", + "\nvar expectedSingleDataNodeParamBm = Workspace.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month).ToArray();", + "\nvar expectedInterDataNodeParamBm = Workspace.Query().ToArray();", + "\nUtils.EqualityComparer(singleDataNodeParamBm, expectedSingleDataNodeParamBm);", + "\nUtils.EqualityComparer(interDataNodeParamBm, expectedInterDataNodeParamBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "va-MijisUkepqmVMOLJj1Q", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "x-al4I6dSk6STwc4oylwCg", + "cell_type": "markdown", + "source": [ + "# Test Import Validation" + ], + "metadata": {} + }, + { + "id": "LG8H5pXCv0iU38uHNCvxEA", + "cell_type": "markdown", + "source": [ + "## Data Node State: entries cannot be imported which change status from Inactive to Active" + ], + "metadata": {} + }, + { + "id": "nmuP0vEnLEqamwIsJpCSfQ", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);", + "\nvar partition = Workspace.Query().Where(x => x.ReportingNode == \"CH\").ToArray().FirstOrDefault();", + "\nawait Workspace.Partition.SetAsync(partition);", + "\n", + "\nvar itemInactive = new DataNodeState { Year = 2022, Month = 9, DataNode = \"GIC1\", State = State.Inactive, Partition = partition.Id };", + "\nvar itemActive = new DataNodeState { Year = 2022, Month = 9, DataNode = \"GIC1\", State = State.Active, Partition = partition.Id };", + "\n", + "\n// Define GIC1 State as Inactive", + "\nvar persistentDataNodeDataByDataNode = new Dictionary ", + "\n{", + "\n [\"GIC1\"] = new DataNodeData() {DataNode = \"GIC1\", State = itemInactive.State, Year = itemInactive.Year, Month = itemInactive.Month},", + "\n};", + "\n", + "\n// Set GIC1 from Inactive into Active", + "\nawait Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\nawait Workspace.UpdateAsync(itemActive);", + "\n", + "\n// Test Validation", + "\nActivity.Start();", + "\nawait ValidateDataNodeStatesAsync(persistentDataNodeDataByDataNode);", + "\nActivity.HasErrors().Should().Be(true);", + "\nvar log = Activity.Finish().Errors.First().ToString().Substring(40);", + "\n(log.Substring(0,log.Length-2) == Get(Error.ChangeDataNodeState, \"GIC1\")).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "i9-3PyG3uEW-g1CBte_ePA", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "19OZTLJqEkywyseKKCm4Uw", + "cell_type": "markdown", + "source": [ + "## Data Node State: Validation removes the entry when the DataSource already contains a previous version " + ], + "metadata": {} + }, + { + "id": "_ezSKNws4E-nHzlCVI0fIg", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);", + "\nvar partition = Workspace.Query().Where(x => x.ReportingNode == \"CH\").ToArray().FirstOrDefault();", + "\nawait Workspace.Partition.SetAsync(partition);", + "\n", + "\nvar itemPrevious = new DataNodeState { Year = 2022, Month = 3, DataNode = \"GIC1\", State = State.Active, Partition = partition.Id };", + "\nvar itemImport = new DataNodeState { Year = 2022, Month = 9, DataNode = \"GIC1\", State = State.Active, Partition = partition.Id };", + "\n", + "\n// Define persisted Data Node State", + "\nvar persistentDataNodeDataByDataNode = new Dictionary", + "\n{", + "\n [\"GIC1\"] = new DataNodeData() {DataNode = itemPrevious.DataNode, State = itemPrevious.State, Year = itemPrevious.Year, Month = itemPrevious.Month},", + "\n};", + "\n", + "\n// Reimport Data Node State for GIC1 with State unchanged", + "\nawait Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\nawait Workspace.UpdateAsync(itemImport);", + "\n", + "\nawait ValidateDataNodeStatesAsync(persistentDataNodeDataByDataNode);", + "\n", + "\n// Check that the new redundant State is removed from the Workspace", + "\nWorkspace.Query().ToArray().Should().BeEmpty();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Pou7Chyva0qd3qanB75kiQ", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KyDTS_jfUkOIkYt3INVPtA", + "cell_type": "markdown", + "source": [ + "## Data Node Parameters : Validations" + ], + "metadata": {} + }, + { + "id": "vkBb3hOe3UuG2RuMIIoUfg", + "cell_type": "code", + "source": [ + "public async Task CheckErrors(string inputFileName, List errorBms)", + "\n{", + "\n var partitionId = new Guid();", + "\n var log = await UploadDataNodeParameterToWorkspaceAsync(inputFileName, partitionId);", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n errorBms.Intersect(log.Errors.Select(x => x.ToString().Substring(0,x.ToString().Length-2).Substring(40)).ToArray()).Count().Should().Be(errorBms.Count());", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZSI2-sVTMkuZTg61UVXucg", + "cell_type": "code", + "source": [ + "var inputFileName = \"Data/DataNodeParameter_InvalidDataNode.csv\";", + "\nvar errorsBm = new List(){Get(Error.InvalidDataNode, \"DataNodeInvalid0\"),", + "\n Get(Error.InvalidDataNode, \"DataNodeInvalid1\"),", + "\n Get(Error.InvalidDataNode, \"DataNodeInvalid2\")};", + "\nawait CheckErrors(inputFileName, errorsBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2unWYjVwA0mJbyzeVCVg8A", + "cell_type": "code", + "source": [ + "var inputFileName = \"Data/DataNodeParameter_Duplicate.csv\";", + "\nvar errorsBm = new List(){Get(Error.DuplicateSingleDataNode, \"DT1.1\"),", + "\n Get(Error.DuplicateInterDataNode, \"DT1.1\",\"DTR1.1\"),};", + "\nawait CheckErrors(inputFileName, errorsBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uH8Fn9T2-EGO0hSWBk1Yxg", + "cell_type": "code", + "source": [ + "var inputFileName = \"Data/DataNodeParameter_InvalidReinsCov.csv\";", + "\nvar errorsBm = new List(){Get(Error.ReinsuranceCoverageDataNode, \"DT1.1\",\"DT1.1\")};", + "\nawait CheckErrors(inputFileName, errorsBm);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "lkXchyRo9U6x7lnhcliuTg", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/QueriesTest.ipynb b/Test/QueriesTest.ipynb new file mode 100644 index 00000000..c91c0f6b --- /dev/null +++ b/Test/QueriesTest.ipynb @@ -0,0 +1,535 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "_IqpJ1KMUEGYZFSIeqTQfg", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Utils/UtilityMethods\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6-FaBdsHfk2QsR8mnBirig", + "cell_type": "code", + "source": [ + "var gic = \"DT1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "lpSLXRR8SUWTReUAPXdCGw", + "cell_type": "markdown", + "source": [ + "# Test Load Current and Previous Parameter for Yield Curve" + ], + "metadata": {} + }, + { + "id": "MSTglT9520GqkMaeJVIboA", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vuGCdF-iCU6ZaQX6iiwCaA", + "cell_type": "code", + "source": [ + "public async Task CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(Args args, IEnumerable testData, ", + "\n (int Year, int Month) expectedCurrentPeriod, ", + "\n (int Year, int Month) expectedPreviousPeriod)", + "\n{", + "\n await Workspace.UpdateAsync(testData);", + "\n var eurCurrentAndPreviousYieldCurve = (await Workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Currency))[\"EUR\"];", + "\n ", + "\n //Check Current Period", + "\n eurCurrentAndPreviousYieldCurve[CurrentPeriod].Year.Should().Be(expectedCurrentPeriod.Year);", + "\n eurCurrentAndPreviousYieldCurve[CurrentPeriod].Month.Should().Be(expectedCurrentPeriod.Month);", + "\n ", + "\n //Check Previous Period", + "\n eurCurrentAndPreviousYieldCurve[PreviousPeriod].Year.Should().Be(expectedPreviousPeriod.Year);", + "\n eurCurrentAndPreviousYieldCurve[PreviousPeriod].Month.Should().Be(expectedPreviousPeriod.Month);", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RUfdhTU15EaPkO5FVp6qdw", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2020, 9),(2020, 9));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5lBUg6REDUqpF8AFQaSVMw", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2019, 12), (2019, 12));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yvs_kK9a6U-p4_zPj-yeTA", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2020, 6));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9KEHlyMSzEaR6u7TcXWcnQ", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9), (2020, 9));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TbyTWCzxOEKJ84ZrZjk0ug", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9), (2019, 9));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "B0cbAHylv0aRbz8NpHnX7w", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12), (2019, 12));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "mGbDxghxXkqBy6nh62h5wg", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2018, Month = 9}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12), (2019, 12));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-aimZbUkbE69ujpiBCQHeg", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 6}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 9},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 6}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 6), (2019, 6));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "z7N6H3nrE0ib9q25l-HOLw", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2015, Month = 9},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2016, 3));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "G1sMs6vn7UCUx9PcNnX0Zg", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2021, Month = 9},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3}};", + "\n", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2016, 3));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bTtGvgxoRUuqc2eYUgyavQ", + "cell_type": "markdown", + "source": [ + "# Test Data Node State Query" + ], + "metadata": {} + }, + { + "id": "m6puoprjyUGBYqt7aPTc4A", + "cell_type": "code", + "source": [ + "public async Task CheckLoadDataNodeStateAsync(Args args, IEnumerable testData, bool isExpectedToBeActive)", + "\n{", + "\n await Workspace.UpdateAsync(testData);", + "\n var isActive = (await Workspace.LoadDataNodeStateAsync(args)).Keys.Contains(gic);", + "\n ", + "\n isActive.Should().Be(isExpectedToBeActive);", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1rUvJm2L4k-qth-62yWJcA", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", + "\nvar testData = new DataNodeState[] {new DataNodeState{ DataNode = gic, Year = 2019, Month = 12, State = State.Active },", + "\n new DataNodeState{ DataNode = gic, Year = 2020, Month = 6, State = State.Inactive }};", + "\nawait CheckLoadDataNodeStateAsync(args, testData, false);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "n8zP0mcxgUiGDxpciWfdUQ", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", + "\nvar testData = new DataNodeState[] {new DataNodeState{ DataNode = gic, Year = 2020, Month = 3, State = State.Active },", + "\n new DataNodeState{ DataNode = gic, Year = 2020, Month = 9, State = State.Inactive }};", + "\nawait CheckLoadDataNodeStateAsync(args, testData, false);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Bm1_QjQMz0GO56QnUrVqwg", + "cell_type": "markdown", + "source": [ + "# Test Load Yield Curve" + ], + "metadata": {} + }, + { + "id": "wAmKPPOo7kGNh3r-uijhJg", + "cell_type": "code", + "source": [ + "public async Task CheckLoadYieldCurveAsync(Args args, IEnumerable testData, ", + "\n (int year , int month) dataNodeYearAndMonth, ", + "\n double expectedCurrentPreviousFirstYcValue,", + "\n double expectedCurrentFirstYcValue,", + "\n double expectedLockedFirstYcValue)", + "\n{", + "\n await Workspace.UpdateAsync(testData);", + "\n await Workspace.UpdateAsync(new ReportingNode[]{new ReportingNode{Currency=\"EUR\",SystemName=\"CH\"}});", + "\n ", + "\n var dataNodes = new DataNodeData[]{new DataNodeData{ValuationApproach=\"BBA\", Year = dataNodeYearAndMonth.year, Month = dataNodeYearAndMonth.month, DataNode = gic, ContractualCurrency = \"EUR\"}};", + "\n var eurLockedYieldCurve = (await LoadLockedInYieldCurveAsync(Workspace, args, dataNodes));", + "\n var eurCurrentYieldCurve = (await LoadCurrentYieldCurveAsync(Workspace, args, dataNodes));", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n ", + "\n var errors = new List();", + "\n var currentPrevPeriod = eurCurrentYieldCurve[\"EUR\"][PreviousPeriod].Values.First();", + "\n if(Math.Abs(currentPrevPeriod - expectedCurrentPreviousFirstYcValue) > 1E-8)", + "\n errors.Add( $\"Current YieldCurve for Previous Period not matching:\\n Expected {expectedCurrentPreviousFirstYcValue} \\n Computed {currentPrevPeriod}.\" );", + "\n ", + "\n var currentCurrPeriod = eurCurrentYieldCurve[\"EUR\"][CurrentPeriod].Values.First();", + "\n if(Math.Abs(currentCurrPeriod - expectedCurrentFirstYcValue) > 1E-8)", + "\n errors.Add( $\"Current YieldCurve for Current Period not matching:\\n Expected {expectedCurrentFirstYcValue} \\n Computed {currentCurrPeriod}.\" );", + "\n ", + "\n var lockedYc = eurLockedYieldCurve[gic].Values.First();", + "\n if(Math.Abs(lockedYc - expectedLockedFirstYcValue) > 1E-8)", + "\n errors.Add( $\"LockedIn YieldCurve not matching:\\n Expected {expectedLockedFirstYcValue} \\n Computed {lockedYc}.\" );", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors)); ", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vRCMvk2zpk6YeQlQuLXkRQ", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Values = new double[]{0.1,0.2,0.3,0.4,0.5,0.6} }, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3, Values = new double[]{2.1,2.2,2.3,2.4,2.5,2.6} }, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2021, Month = 9, Values = new double[]{4.1,4.2,4.3,4.4,4.5,4.6} },", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3, Values = new double[]{6.1,6.2,6.3,6.4,6.5,6.6} }};", + "\n", + "\nawait CheckLoadYieldCurveAsync(args, testData, (2016, 6), 6.1, 0.1, 6.1);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZL_HAd63MUGyojndKeoyPA", + "cell_type": "markdown", + "source": [ + "# Test Load Data Node Parameter" + ], + "metadata": {} + }, + { + "id": "HHu8-DR7E0Gl3YlOdR0eWA", + "cell_type": "code", + "source": [ + "var gic2 = \"gic2\";", + "\nvar xgic = \"xgic\";", + "\nvar gric1 = \"gric1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VArCCnA-XEWWYph2oPfxmQ", + "cell_type": "code", + "source": [ + "public async Task CheckLoadInterDataNodeParameterAsync(Args args, IEnumerable testData, ", + "\n int previousYear,", + "\n int? currentYear = null)", + "\n{", + "\n currentYear = currentYear ?? previousYear;", + "\n await Workspace.UpdateAsync(testData);", + "\n ", + "\n var interDataNodeParameters = await LoadInterDataNodeParametersAsync(Workspace, args);", + "\n ", + "\n //Check Keys", + "\n var uniqueLinks = testData.Select(x => x.DataNode).Concat(testData.Select(x => x.LinkedDataNode)).ToHashSet();", + "\n uniqueLinks.Intersect(interDataNodeParameters.Keys).Count().Should().Be(uniqueLinks.Count());", + "\n ", + "\n //CheckInnerDictionaries", + "\n var currentYearData = testData.Where(x => x.Year == currentYear);", + "\n var previousYearData = testData.Where(x => x.Year == previousYear);", + "\n ", + "\n var errors = new List();", + "\n foreach(var dn in uniqueLinks)", + "\n {", + "\n //Set up BM counts", + "\n var currentLinks = currentYearData.Select(x => x.DataNode).Concat(currentYearData.Select(x => x.LinkedDataNode));", + "\n var currentLinksCount = currentLinks.Where(x => x == dn).Count();", + "\n var prevlinks = previousYearData.Select(x => x.DataNode).Concat(previousYearData.Select(x => x.LinkedDataNode));", + "\n var previousLinksCount = prevlinks.Where(x => x == dn).Count();", + "\n ", + "\n //Current Period", + "\n var computedCount = interDataNodeParameters[dn][CurrentPeriod].Count();", + "\n", + "\n if (currentYearData.Any())", + "\n {", + "\n if(computedCount != currentLinksCount)", + "\n errors.Add( $\"Current DataNode parameter count for {dn} not matching:\\n Expected {currentLinksCount} \\n Computed {computedCount}.\" );", + "\n }", + "\n else if(computedCount != previousLinksCount)", + "\n errors.Add( $\"Current DataNode parameter count for {dn} not matching:\\n Expected {previousLinksCount} \\n Computed {computedCount}.\" );", + "\n ", + "\n foreach (var param in interDataNodeParameters[dn][CurrentPeriod])", + "\n {", + "\n var linkedDn = param.DataNode == dn ? param.LinkedDataNode : param.DataNode;", + "\n var isLinkInPrevPeriod = previousYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn);", + "\n var isLinkInCurrPeriod = currentYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn); ", + "\n ", + "\n if(isLinkInPrevPeriod && !isLinkInCurrPeriod)", + "\n { ", + "\n if (param.ReinsuranceCoverage != ((double)previousYear)/1000)", + "\n errors.Add( $\"Current Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)previousYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", + "\n }", + "\n else if( param.ReinsuranceCoverage != ((double)currentYear)/1000)", + "\n errors.Add( $\"Current Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)currentYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", + "\n }", + "\n", + "\n //Previous Period", + "\n computedCount = interDataNodeParameters[dn][PreviousPeriod].Count();", + "\n ", + "\n if (currentYearData.Any())", + "\n {", + "\n if(computedCount != currentLinksCount)", + "\n errors.Add( $\"Previous DataNode parameter count for {dn} not matching:\\n Expected {currentLinksCount} \\n Computed {computedCount}.\" );", + "\n }", + "\n else if(computedCount != previousLinksCount)", + "\n errors.Add( $\"Previous DataNode parameter count for {dn} not matching:\\n Expected {previousLinksCount} \\n Computed {computedCount}.\" );", + "\n ", + "\n foreach (var param in interDataNodeParameters[dn][PreviousPeriod])", + "\n {", + "\n var linkedDn = param.DataNode == dn ? param.LinkedDataNode : param.DataNode;", + "\n var isLinkInPrevPeriod = previousYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn);", + "\n var isLinkInCurrPeriod = currentYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn); ", + "\n ", + "\n if(!isLinkInPrevPeriod && isLinkInCurrPeriod)", + "\n { ", + "\n if (param.ReinsuranceCoverage != ((double)currentYear)/1000)", + "\n errors.Add( $\"Previous Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)currentYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", + "\n }", + "\n else if( param.ReinsuranceCoverage != ((double)previousYear)/1000)", + "\n errors.Add( $\"Previous Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)previousYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", + "\n }", + "\n }", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "aOH89OGU5Eqn4PeSnUbJrw", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nint previousYear = 2019;", + "\nvar testData = new InterDataNodeParameter[] ", + "\n {new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gic2, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n };", + "\n", + "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "cT_97C9oW0KF2qH_aG7Scw", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nint previousYear = 2019;", + "\nint currentYear = 2020;", + "\nvar testData = new InterDataNodeParameter[] ", + "\n {", + "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 9},", + "\n new InterDataNodeParameter{ DataNode = gic2, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 9}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 9}, ", + "\n };", + "\n", + "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kJbew987pkum2Ge25tpsHQ", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nint previousYear = 2019;", + "\nint currentYear = 2020;", + "\nvar testData = new InterDataNodeParameter[] ", + "\n {", + "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n };", + "\n", + "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "IWMBAFYZpUaB-vgsMrm8dg", + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nint previousYear = 2019;", + "\nint currentYear = 2020;", + "\nvar testData = new InterDataNodeParameter[] ", + "\n {", + "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 3}, ", + "\n };", + "\n", + "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jtX2WSn4c02WOwMQ-oKUqQ", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/ReportStorageTest.ipynb b/Test/ReportStorageTest.ipynb new file mode 100644 index 00000000..58850654 --- /dev/null +++ b/Test/ReportStorageTest.ipynb @@ -0,0 +1,127 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "-CZo3x5cFEuDFZgs0uV9Bg", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Report/ReportStorage\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uXciD3hgUUqyPIiuAEQo3g", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tdRjnVvg9UaWMh368aBZ3g", + "cell_type": "markdown", + "source": [ + "# Test Exchange Rate Query" + ], + "metadata": {} + }, + { + "id": "j4bt5YUenkeFF2iakkxvgg", + "cell_type": "code", + "source": [ + "Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bd3JNWC5Nk2uaw14n6g2xQ", + "cell_type": "code", + "source": [ + "public async Task CheckGetFx(string currentCurrency, string targetCurrency, int year, int month, IEnumerable testData, double fxBOPBenchmark, double fxAVGBenchmark, double fxEOPBenchmark)", + "\n{", + "\n await Workspace.UpdateAsync(testData);", + "\n ", + "\n //Create report storage", + "\n var period = (year, month);", + "\n var reportStorage = new ReportStorage(Workspace, Report);", + "\n await reportStorage.InitializeReportIndependentCacheAsync();", + "\n await reportStorage.InitializeAsync(period, \"G\", null, CurrencyType.Contractual);", + "\n ", + "\n var fxBOP = reportStorage.GetFx(period, currentCurrency, targetCurrency, FxPeriod.BeginningOfPeriod);", + "\n var fxAVG = reportStorage.GetFx(period, currentCurrency, targetCurrency, FxPeriod.Average);", + "\n var fxEOP = reportStorage.GetFx(period, currentCurrency, targetCurrency, FxPeriod.EndOfPeriod);", + "\n ", + "\n //Check FX rates", + "\n fxBOP.Should().Be(fxBOPBenchmark);", + "\n fxAVG.Should().Be(fxAVGBenchmark);", + "\n fxEOP.Should().Be(fxEOPBenchmark);", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "P6Lb3Bg1-ECmcI2_hG1fyQ", + "cell_type": "code", + "source": [ + "var testData = new ExchangeRate[] {new ExchangeRate{ Currency = \"EUR\", Year = 2020, Month = 12, FxType = FxType.Spot, FxToGroupCurrency = 10 }, ", + "\n new ExchangeRate{ Currency = \"EUR\", Year = 2021, Month = 3, FxType = FxType.Spot, FxToGroupCurrency = 15 },", + "\n new ExchangeRate{ Currency = \"EUR\", Year = 2021, Month = 6, FxType = FxType.Average, FxToGroupCurrency = 20 },", + "\n new ExchangeRate{ Currency = \"EUR\", Year = 2021, Month = 6, FxType = FxType.Spot, FxToGroupCurrency = 30 },", + "\n new ExchangeRate{ Currency = \"USD\", Year = 2020, Month = 12, FxType = FxType.Spot, FxToGroupCurrency = 5 },", + "\n new ExchangeRate{ Currency = \"USD\", Year = 2021, Month = 6, FxType = FxType.Average, FxToGroupCurrency = 2 },", + "\n new ExchangeRate{ Currency = \"USD\", Year = 2021, Month = 6, FxType = FxType.Spot, FxToGroupCurrency = 0.5 }};", + "\nawait CheckGetFx(\"EUR\", \"USD\", 2021, 6, testData, 2, 10, 60);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "OncbMvm_E0OazTHlWRs1yQ", + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "h7lqAB05-0eTTOzD9xJS2g", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/ReportVariablesTest.ipynb b/Test/ReportVariablesTest.ipynb new file mode 100644 index 00000000..343f3835 --- /dev/null +++ b/Test/ReportVariablesTest.ipynb @@ -0,0 +1,256 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "LQUN8dM-FUOLRRCNCCfefg", + "cell_type": "markdown", + "source": [ + "

Test Reports

" + ], + "metadata": {} + }, + { + "id": "FeOU5sOWxUCzzbh-gAXjpQ", + "cell_type": "markdown", + "source": [ + "# Infrastructure and Configuration" + ], + "metadata": {} + }, + { + "id": "eULpl26ryUODapYZKqPsAg", + "cell_type": "markdown", + "source": [ + "## Imports and Configurations" + ], + "metadata": {} + }, + { + "id": "v68OhAZHnkmBFLc4VS_Wsg", + "cell_type": "code", + "source": [ + "#r \"nuget:FluentAssertions\" " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "S5Jab8aqL0q_0yz2NvANCg", + "cell_type": "code", + "source": [ + "#!import \"ReportVariablesTestBase\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "T5-epYkxdESEdRkeQzPZ-Q", + "cell_type": "markdown", + "source": [ + "## Initialize Workspace" + ], + "metadata": {} + }, + { + "id": "MjO2BvvAS0e4HFtBefzQiQ", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WYaoK2llRES_PV3X7rt7dw", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LPEQPX6GkU6oZRTDNeu9gg", + "cell_type": "markdown", + "source": [ + "## Storage" + ], + "metadata": {} + }, + { + "id": "iyzfnUDQkE-IFlJDJhToWg", + "cell_type": "code", + "source": [ + "var reportStorage = new ReportStorage(Workspace, Report);", + "\nawait reportStorage.InitializeReportIndependentCacheAsync();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "PFEVTLIKUE6H0KLbPCp60w", + "cell_type": "markdown", + "source": [ + "## Configurations" + ], + "metadata": {} + }, + { + "id": "0JhPAc6LX0Wa6M-BQfsrPw", + "cell_type": "code", + "source": [ + "var path = \"./Data/ReportVariableBenchmarks/\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XutzHhUA00KlM1bajdW_IQ", + "cell_type": "code", + "source": [ + "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args;", + "\nICollection scopesData;", + "\nICollection benchmarkData;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WTg65cXwoUC2csjHSFzPfw", + "cell_type": "markdown", + "source": [ + "# Test Cases" + ], + "metadata": {} + }, + { + "id": "7rnaJC3nVkGkge79ibM8KA", + "cell_type": "markdown", + "source": [ + "## ((2020, 12), \"CH\", null, CurrencyType.Contractual)" + ], + "metadata": {} + }, + { + "id": "E34nYeT2ckKrYWP3mxgc2g", + "cell_type": "code", + "source": [ + "args = ((2020, 12), \"CH\", null, CurrencyType.Contractual);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uBf_ViTSUUe1CC5J5UfWHA", + "cell_type": "code", + "source": [ + "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", + "\nbenchmarkData = await GetBenchmarkDataAsync(args, path, Workspace, Import);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZB0QEVnuHUWzFbp6xXyVdg", + "cell_type": "code", + "source": [ + "scopesData.Should().BeEquivalentTo(benchmarkData,", + "\n options => options", + "\n //.ComparingRecordsByValue()", + "\n .ComparingRecordsByMembers() ", + "\n //.ComparingByMembers()", + "\n //.ComparingByValue()", + "\n //.Excluding(o => o.Value)", + "\n .Using(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, BenchmarkPrecision))", + "\n .WhenTypeIs()", + "\n );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "g026nTeHy0a1vC2J5XM87g", + "cell_type": "markdown", + "source": [ + "## ((2021, 3), \"CH\", null, CurrencyType.Contractual)" + ], + "metadata": {} + }, + { + "id": "D7qV0NdVHE2Kdk6uavXIKw", + "cell_type": "code", + "source": [ + "args = ((2021, 3), \"CH\", null, CurrencyType.Contractual);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZYBQRO7yZ02UzX2eYt7Vnw", + "cell_type": "code", + "source": [ + "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", + "\nbenchmarkData = await GetBenchmarkDataAsync(args, path, Workspace, Import);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "age1izMU1EmhYYO6S_LhWw", + "cell_type": "code", + "source": [ + "scopesData.Should().BeEquivalentTo(benchmarkData,", + "\n options => options", + "\n //.ComparingRecordsByValue()", + "\n .ComparingRecordsByMembers() ", + "\n //.ComparingByMembers()", + "\n //.ComparingByValue()", + "\n //.Excluding(o => o.Value)", + "\n .Using(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, Precision))", + "\n .WhenTypeIs()", + "\n );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dl7B6Z5qnEWoD8LTXhUAYw", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/ReportVariablesTestBase.ipynb b/Test/ReportVariablesTestBase.ipynb new file mode 100644 index 00000000..e031e8d0 --- /dev/null +++ b/Test/ReportVariablesTestBase.ipynb @@ -0,0 +1,161 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "FYwy37yMNEeDl1kHPRFpKg", + "cell_type": "markdown", + "source": [ + "

Report Variable Test Base

" + ], + "metadata": {} + }, + { + "id": "3ZyHFOIosEyHCIUotySSVQ", + "cell_type": "code", + "source": [ + "#!import \"../Report/ReportScopes\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "injwhNjFM0Gd0wGXOWk0iw", + "cell_type": "markdown", + "source": [ + "# Helpers" + ], + "metadata": {} + }, + { + "id": "16zJY8-HwUWXMwwH0PDnKA", + "cell_type": "code", + "source": [ + "const string benchmarkFileNamePrefix = \"ReportVariableBenchmarks_\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "w93TGY8caEWby3AEWexMfw", + "cell_type": "code", + "source": [ + "static string GetBenchmarkFileName(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args) => args.ToString().Replace(\"(\", \"\").Replace(\")\", \"\").Replace(\" \", \"\").Replace(\",\", \"_\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "FN-2epLYEEi0XlPqNMZBmQ", + "cell_type": "markdown", + "source": [ + "# Calculated" + ], + "metadata": {} + }, + { + "id": "lpbvuOTZvkeSAcnrEI9kXQ", + "cell_type": "code", + "source": [ + "static ICollection GetScopesData(Systemorph.Vertex.Scopes.IScopeWithStorage universe, ICollection<(ReportIdentity, CurrencyType)> identities) {", + "\n ", + "\n var lockedBePvs = universe.GetScopes(identities).Aggregate().LockedBestEstimate;", + "\n var currentBePvs = universe.GetScopes(identities).Aggregate().CurrentBestEstimate; ", + "\n", + "\n var lockedRaPvs = universe.GetScopes(identities).Aggregate().LockedRiskAdjustment;", + "\n var currentRaPvs = universe.GetScopes(identities).Aggregate().CurrentRiskAdjustment;", + "\n", + "\n var writtenActuals = universe.GetScopes(identities).Aggregate().Written;", + "\n var advanceActuals = universe.GetScopes(identities).Aggregate().Advance;", + "\n var overdueActuals = universe.GetScopes(identities).Aggregate().Overdue;", + "\n", + "\n var deferrableActuals = universe.GetScopes(identities).Aggregate().Deferrals;", + "\n", + "\n var csm = universe.GetScopes(identities).Aggregate().Csm;", + "\n var lc = universe.GetScopes(identities).Aggregate().Lc;", + "\n var loreco = universe.GetScopes(identities).Aggregate().Loreco;", + "\n", + "\n var fp = universe.GetScopes(identities).Aggregate().FinancialPerformance;", + "\n ", + "\n return Enumerable.Empty()", + "\n .Concat(lockedBePvs) ", + "\n .Concat(currentBePvs)", + "\n .Concat(lockedRaPvs)", + "\n .Concat(currentRaPvs)", + "\n .Concat(writtenActuals)", + "\n .Concat(advanceActuals)", + "\n .Concat(overdueActuals)", + "\n .Concat(deferrableActuals)", + "\n .Concat(csm)", + "\n .Concat(lc)", + "\n .Concat(loreco)", + "\n .Concat(fp)", + "\n .OrderBy(v => v.GroupOfContract).ThenBy(v => v.Scenario).ThenBy(v => v.Projection).ThenBy(v => v.AccidentYear).ThenBy(v => v.EstimateType).ThenBy(v => (v.VariableType, v.Novelty))", + "\n .ToArray();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "GBx1EE3IREu7RPWu8iZFbg", + "cell_type": "code", + "source": [ + "static async Task> GetScopesDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, ReportStorage reportStorage, Systemorph.Vertex.Scopes.Proxy.IScopeFactory scopes ) {", + "\n await reportStorage.InitializeAsync(args.Period, args.ReportingNode, args.Scenario, args.CurrencyType);", + "\n var identities = reportStorage.GetIdentities(args.Period, args.ReportingNode, args.Scenario, args.CurrencyType);", + "\n var universe = scopes.ForSingleton().WithStorage(reportStorage).ToScope();", + "\n return GetScopesData(universe, identities);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "fkOXnPgChECva8WmF0hbaQ", + "cell_type": "markdown", + "source": [ + "# Benchmarks" + ], + "metadata": {} + }, + { + "id": "BJVbgmFieEGNehAotQ38Eg", + "cell_type": "code", + "source": [ + "static async Task> GetBenchmarkDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, string path, IWorkspace workspace, IImportVariable importVariable) {", + "\n var bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";", + "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario });", + "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario, Year = args.Period.Year, Month = args.Period.Month });", + "\n await importVariable.FromFile(path + bmFileName).WithType(x => x.SnapshotMode()).WithTarget(workspace).ExecuteAsync();", + "\n var ret = await workspace.Query().ToArrayAsync();", + "\n workspace.Reset(x => x.ResetCurrentPartitions().ResetType());", + "\n return ret;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/SpecificationsFinancialPerformance.ipynb b/Test/SpecificationsFinancialPerformance.ipynb new file mode 100644 index 00000000..70570b54 --- /dev/null +++ b/Test/SpecificationsFinancialPerformance.ipynb @@ -0,0 +1,1692 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "5nO38HYGpkascixiTUO0gw", + "cell_type": "markdown", + "source": [ + "

Financial Performance Specifications

" + ], + "metadata": {} + }, + { + "id": "YiqIuEZ5Ika8lHG2QytiBg", + "cell_type": "markdown", + "source": [ + "The aim of this notebook is to document the Financial Performance reporting system. The process is pictorially explained in the following flowchart. ", + "\n", + "\n", + "\n
", + "\n", + "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." + ], + "metadata": {} + }, + { + "id": "I_4NcYOLg0-FT87qtmCw5g", + "cell_type": "markdown", + "source": [ + "In the following the Dimensions, Parameters, Nominal Cashflows, and Actuals are imported from the corresponding csv files in Initialization/Systemorph/" + ], + "metadata": {} + }, + { + "id": "G0Y5GVas3k6z7nhLhKYi2A", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "SZwhFp3mkUKWwRMH8wcnKw", + "cell_type": "markdown", + "source": [ + "---" + ], + "metadata": {} + }, + { + "id": "FCPPVD5qb0edgdnX8gE5TA", + "cell_type": "markdown", + "source": [ + "# Process Data" + ], + "metadata": {} + }, + { + "id": "8kQa9wme2E2KwZMXm_jkRQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Current Period, Reporting Node and Currency Type" + ], + "metadata": {} + }, + { + "id": "9Mil10I7XUKS9qwodcQnJQ", + "cell_type": "markdown", + "source": [ + "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" + ], + "metadata": {} + }, + { + "id": "jycgHCLPSU6SsnQh_NqdXQ", + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Q1ptu1Ih6UqNipHCM9wrFw", + "cell_type": "markdown", + "source": [ + "and the type of Currency among Contractual, Functional, and Group" + ], + "metadata": {} + }, + { + "id": "W_q-kxke4kSXENWTI_sTDg", + "cell_type": "code", + "source": [ + "var currencyType = CurrencyType.Contractual ;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Z5gPrgd79kaIdxevViMb5Q", + "cell_type": "markdown", + "source": [ + "Import the Report definitions, initialize the Workspace and the Test Suite:" + ], + "metadata": {} + }, + { + "id": "jZs86CqBw0S_Ms4QvU6Yhg", + "cell_type": "code", + "source": [ + "#!import \"../Report/ReportScopes\"", + "\n#!import \"../Report/ReportConfigurationAndUtils\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "fsDoELzhOEKHVk0LvwG8lg", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "FwJCyVQlg0iyVa9GIObOVA", + "cell_type": "code", + "source": [ + "var period = (year, month) ;", + "\nvar reportStorage = new ReportStorage(Workspace, Report) ;", + "\nvar Test = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0H5JBXBojEmJX2J4YxoSKQ", + "cell_type": "code", + "source": [ + "await reportStorage.InitializeReportIndependentCacheAsync();", + "\nawait reportStorage.InitializeAsync(period, reportingNode, null, currencyType);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ljauWn5bzkePv8oz0hmmcw", + "cell_type": "markdown", + "source": [ + "## View list of Identities" + ], + "metadata": {} + }, + { + "id": "ROlx1yHrOkOcN8NoaWg_kQ", + "cell_type": "markdown", + "source": [ + "Based on the Cashflows imported, the list of all possible identities, i.e. combinations of valid Contractual and Functional Currencies, Liability Types, (Re)Insurance and Oci, is contructed and reported here below:" + ], + "metadata": {} + }, + { + "id": "FWlyPQurk0e7MxUr1_Vh4Q", + "cell_type": "code", + "source": [ + "var identities = reportStorage.GetIdentities(period, reportingNode, null, currencyType);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dQr4xO85AkW_XOGwRhp3Wg", + "cell_type": "code", + "source": [ + "identities" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8WK3-WqoVkKWxMmrunWCPw", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Report" + ], + "metadata": {} + }, + { + "id": "6SapvCdFR0Wa-5iw2O7bmA", + "cell_type": "markdown", + "source": [ + "Please select here below the target Data Node for executing the tests below:" + ], + "metadata": {} + }, + { + "id": "tnnSkBvTP0OcTweKBHRVwA", + "cell_type": "code", + "source": [ + "var dataNode = \"DT1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MaxaD_pix0qUJSHQFYw_Yg", + "cell_type": "markdown", + "source": [ + "The Group of Contract selected is:" + ], + "metadata": {} + }, + { + "id": "ojOHd0ltR0ysyqjaXBV7fA", + "cell_type": "code", + "source": [ + "var groupOfContract = (await Workspace.Query().Where(x => x.SystemName == dataNode).ToArrayAsync()).FirstOrDefault();", + "\ngroupOfContract" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2wrq4ud_nUywAVYp0c16ng", + "cell_type": "markdown", + "source": [ + "where ", + "\n- the **OciType** can be Default for contracts with non-zero OCI, and null otherwise, ", + "\n- the **Liability Type** can be LRC for Liability for Remaining Coverage, and LIC for Liability of Incurred Claims,", + "\n- the **Partner** can be null for Insurance contracts, or equal to the Partner System Name for Reinsurance contracts." + ], + "metadata": {} + }, + { + "id": "FLplPZmhH0uHoByRc9jzyw", + "cell_type": "markdown", + "source": [ + "The summary of the Financial Performance report is shown below" + ], + "metadata": {} + }, + { + "id": "PPVlpKTvE0utqi7d_6hsOA", + "cell_type": "code", + "source": [ + "Report.ForDataCube( Test.GetScopes(identities).Aggregate().FinancialPerformance.Filter((\"GroupOfContract\", dataNode)) )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", + "\n .SliceColumnsBy(CurrencyGrouper(currencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", + "\n .ToReport() with { Height = 600 }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Y6ExKbo35kizVyUzucL8tg", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Inspection" + ], + "metadata": {} + }, + { + "id": "mljPLFn_Vk699EW8NxaqFQ", + "cell_type": "markdown", + "source": [ + "## Fulfillment Cashflows" + ], + "metadata": {} + }, + { + "id": "fXAJiiBobE-8cIFXnwQW_g", + "cell_type": "markdown", + "source": [ + "The Fulfillment Cashflow (FCF) corresponds to the sum of the Best Estimate [Present Value](../Import/ImportScopeCalculation#current-and-locked) (PV) and the [Risk Adjustment](../Import/ImportScopeCalculation#risk-adjustment) (RA), both summed over Amounty Types, and both discounted with the Locked-In curve in the BBA valuation approach:", + "\n", + "\n$$", + "\n\\text{FCF}(\\text{AoC}) = \\text{PV Locked}(\\text{AoC})", + "\n\\bigg|_{\\substack{\\text{Non Attributable} \\\\ \\text{Amount Types} \\\\ \\text{excluded}}} ", + "\n+ \\text{RA Locked}(\\text{AoC}) ~.", + "\n$$" + ], + "metadata": {} + }, + { + "id": "EIByt77nt02vKJ6M7fbYPA", + "cell_type": "markdown", + "source": [ + "### Non Financial" + ], + "metadata": {} + }, + { + "id": "BeRPnXRcr0KgXSe9gOqr0w", + "cell_type": "markdown", + "source": [ + "The computed value for the non financial contribution to the FCF is" + ], + "metadata": {} + }, + { + "id": "Tpu5SaZ9GEGA3y-zQW_yHw", + "cell_type": "code", + "source": [ + "var computedDeltaFCF_nonFinancial = Test.GetScopes(identities).Aggregate()", + "\n .FpNonFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1lQULEdowk-gnCueOrvJrg", + "cell_type": "code", + "source": [ + "computedDeltaFCF_nonFinancial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "i4QyAGfVmEGE_5Igb2Z-LQ", + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the full list of FCFs" + ], + "metadata": {} + }, + { + "id": "qqBotvtEjE22aC7q0898qw", + "cell_type": "code", + "source": [ + "var FCFs = Test.GetScopes(identities).Aggregate().Fcf.Filter((\"GroupOfContract\", dataNode));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VzFxq-PplkGMBBeSgTqoVg", + "cell_type": "code", + "source": [ + "var deltaFCF = FCFs.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n FCFs.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "iNXYCe0l-U2neY7wtMwZ0Q", + "cell_type": "code", + "source": [ + "deltaFCF.Aggregate().Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yI_ySCVJT06znmYYyfM3zQ", + "cell_type": "code", + "source": [ + "var expectedDeltaFCF_nonFinancial = deltaFCF.Filter((\"VariableType\", \"!IA\"), ", + "\n (\"VariableType\", \"!YCU\"), ", + "\n (\"VariableType\", \"!CRU\") ).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kYVlMOqOrEeCvRN9BdzD5Q", + "cell_type": "code", + "source": [ + "expectedDeltaFCF_nonFinancial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vLdRwY5WPEeVSdEZ6mq5eg", + "cell_type": "markdown", + "source": [ + "For consistency, this term is taken with the minus sign" + ], + "metadata": {} + }, + { + "id": "1z_-jBHxPECdPV59L1zu3w", + "cell_type": "code", + "source": [ + "expectedDeltaFCF_nonFinancial.CheckEquality( -computedDeltaFCF_nonFinancial ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zLC_x5tXRkqCJb8ko1k1pw", + "cell_type": "markdown", + "source": [ + "### Financial" + ], + "metadata": {} + }, + { + "id": "8q-L68QoyUWnE_1p9I8GrQ", + "cell_type": "markdown", + "source": [ + "Conversely, the computed value for the financial contribution to the Fulfillment Cashflows (FCF) is" + ], + "metadata": {} + }, + { + "id": "unbfg7yEZkajmEbeDpLGbw", + "cell_type": "code", + "source": [ + "var computedDeltaFCF_Financial = Test.GetScopes(identities).Aggregate()", + "\n .FpFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1Z9AZCSrsUqNaYXcDtgG9g", + "cell_type": "code", + "source": [ + "computedDeltaFCF_Financial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QUKtT16YKECBrRssqHJ7iA", + "cell_type": "markdown", + "source": [ + "The independent recalculation of this value reads" + ], + "metadata": {} + }, + { + "id": "DBD46hb6jkmOuS8fF8AzNg", + "cell_type": "code", + "source": [ + "var expectedDeltaFCF_Financial = (deltaFCF.Filter((\"VariableType\", \"IA\")) +", + "\n deltaFCF.Filter((\"VariableType\", \"YCU\")) +", + "\n deltaFCF.Filter((\"VariableType\", \"CRU\")) ).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3Pml-0__90GYfwqGIkh8hA", + "cell_type": "code", + "source": [ + "expectedDeltaFCF_Financial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WeeGHMbfv0yDqvE0uspuwA", + "cell_type": "markdown", + "source": [ + "taking the minus sign into account" + ], + "metadata": {} + }, + { + "id": "Jy8LN1Jl9UW7ZFn61_0E7g", + "cell_type": "code", + "source": [ + "expectedDeltaFCF_Financial.CheckEquality( -computedDeltaFCF_Financial ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KdafoHd6V0WcBY3w-7FCNg", + "cell_type": "markdown", + "source": [ + "### Other Comprehensive Income" + ], + "metadata": {} + }, + { + "id": "WTWsM2t8ske9c6Qp4Sw6tw", + "cell_type": "markdown", + "source": [ + "The Other Comprehensive Income (OCI) term is by definition the sum of the financial contributions not related to the insurance sector.", + "\n", + "\nThe Default method to compute the OCI term is by subtracting the FCF computed with the *Locked-In* rates and the FCF computed with the *Current* rates. In this way the non insurance financial volatiliy of the economic input is relegated to the OCI. " + ], + "metadata": {} + }, + { + "id": "HFvK3TQALEyxtaqOa072RA", + "cell_type": "code", + "source": [ + "var computedDeltaFCF_OCI = Test.GetScopes(identities).Aggregate()", + "\n .OciFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KlV-XHswLUm60jAtrKXRxw", + "cell_type": "code", + "source": [ + "computedDeltaFCF_OCI" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "wLYM_5_Cw0agX8ngdpiJNw", + "cell_type": "markdown", + "source": [ + "The OCI contribution is zero when the OCI option is disabled for the [target Group of Contract](#report).", + "\n", + "\nHere below we follow the steps to calculate independently the OCI contribution " + ], + "metadata": {} + }, + { + "id": "jExIPgxaoEKHbQ0n1CCDlg", + "cell_type": "code", + "source": [ + "var DeltaFCF_Locked = deltaFCF.Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Fi1WFLVNokSI8kGpGrtSgg", + "cell_type": "code", + "source": [ + "var FCFs_current = Test.GetScopes(identities).Aggregate().CurrentFcf.Filter((\"GroupOfContract\", dataNode));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "08PqnzK1VkqrjayuXu29Gw", + "cell_type": "code", + "source": [ + "var DeltaFCF_Current = FCFs_current.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n FCFs_current.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2H7J_REURECEUakkHg3uZQ", + "cell_type": "code", + "source": [ + "var expectedDeltaFCF_OCI = DeltaFCF_Locked - DeltaFCF_Current.Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0bDk7FRhN0C2sRCzbkIzrQ", + "cell_type": "code", + "source": [ + "DeltaFCF_Locked" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "FG-gv68W_E2X5Duxt7tKlw", + "cell_type": "code", + "source": [ + "DeltaFCF_Current.Aggregate().Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HOaaRyAoI0CC6BerqeJ41Q", + "cell_type": "code", + "source": [ + "expectedDeltaFCF_OCI" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uTbfa8NPIUqm-o4eZSU8fw", + "cell_type": "code", + "source": [ + "expectedDeltaFCF_OCI.CheckEquality( computedDeltaFCF_OCI ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1IZSRJ3t_0CNXpp4ywd9VQ", + "cell_type": "markdown", + "source": [ + "## Contractual Service Margin" + ], + "metadata": {} + }, + { + "id": "5bsUEITa6kuGaTRVkZ084A", + "cell_type": "markdown", + "source": [ + "### Non Financial" + ], + "metadata": {} + }, + { + "id": "JTfLDJSJQEOWT2i89grUSQ", + "cell_type": "markdown", + "source": [ + "The computed value for the non financial change of the CSM is" + ], + "metadata": {} + }, + { + "id": "8ILRJFbhBUC62g15t754iQ", + "cell_type": "code", + "source": [ + "var computedDeltaCSM_nonFinancial = Test.GetScopes(identities).Aggregate()", + "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WKz0gPwLNU-dpX_9pel6qQ", + "cell_type": "code", + "source": [ + "computedDeltaCSM_nonFinancial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "M-zez2dNKEqoEuSnVmQOAQ", + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the full CSM data from which the delta can be computed:" + ], + "metadata": {} + }, + { + "id": "u3qO33HX2EWTdU-FsXV1DQ", + "cell_type": "code", + "source": [ + "var CSM = Test.GetScopes(identities).Aggregate().Csm.Filter((\"GroupOfContract\", dataNode));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "sUzTJENNQE2vyUAMH18-Fg", + "cell_type": "code", + "source": [ + "var deltaCSM = CSM.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n CSM.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YE8SeJsLGkigzdsg2lrthg", + "cell_type": "code", + "source": [ + "deltaCSM.Aggregate().Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "APgQnfCAvUGZOS1alGD76A", + "cell_type": "markdown", + "source": [ + "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" + ], + "metadata": {} + }, + { + "id": "RtFAIsTtqkKptF872l2QOA", + "cell_type": "code", + "source": [ + "var expectedDeltaCSM_nonFinancial = deltaCSM.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QIAfXjMAUkKl824oTIpkxg", + "cell_type": "code", + "source": [ + "expectedDeltaCSM_nonFinancial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ROYdG5qKq0WskXY9TubsCw", + "cell_type": "code", + "source": [ + "expectedDeltaCSM_nonFinancial.CheckEquality( -computedDeltaCSM_nonFinancial ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "B3v_a4ACR0aaHYEIZ5Efmw", + "cell_type": "markdown", + "source": [ + "### Financial" + ], + "metadata": {} + }, + { + "id": "XUhfK022zUq-fhkyjtdiRA", + "cell_type": "markdown", + "source": [ + "Conversely, the computed value for the financial change of the CSM is" + ], + "metadata": {} + }, + { + "id": "ni56W_02FkyqpCsEn8POig", + "cell_type": "code", + "source": [ + "var computedDeltaCSM_Financial = Test.GetScopes(identities).Aggregate()", + "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "UBEJvfmS9UOcouMKcyVlSA", + "cell_type": "code", + "source": [ + "computedDeltaCSM_Financial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TqRsmZIHlUqsIwggU5ok1w", + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" + ], + "metadata": {} + }, + { + "id": "60OowsZamEOXwPfjqtKINg", + "cell_type": "code", + "source": [ + "var expectedDeltaCSM_Financial = ( deltaCSM.Filter((\"VariableType\", \"IA\")) +", + "\n deltaCSM.Filter((\"VariableType\", \"YCU\")) +", + "\n deltaCSM.Filter((\"VariableType\", \"CRU\")) )", + "\n .Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "d89jwj04Ak-rvKD6GrFThw", + "cell_type": "code", + "source": [ + "expectedDeltaCSM_Financial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HZ5FzlG01U-9aaQvlx_cCQ", + "cell_type": "code", + "source": [ + "expectedDeltaCSM_Financial.CheckEquality( -computedDeltaCSM_Financial ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "q-EaVofzPkeq9BLkL6Pk2w", + "cell_type": "markdown", + "source": [ + "## Loss Component" + ], + "metadata": {} + }, + { + "id": "LE5bZlbq_UWJBvszrykzuA", + "cell_type": "markdown", + "source": [ + "### Non Financial" + ], + "metadata": {} + }, + { + "id": "lFKLvci1FUOz6Q0a40u2-A", + "cell_type": "markdown", + "source": [ + "The computed value for the non financial change of the LC is" + ], + "metadata": {} + }, + { + "id": "NA8SeqEo5EiJhDQHBuTtjg", + "cell_type": "code", + "source": [ + "var computedDeltaLC_nonFinancial = Test.GetScopes(identities).Aggregate()", + "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yoNwfY6O-EGOYvwfX9CXKw", + "cell_type": "code", + "source": [ + "computedDeltaLC_nonFinancial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "wQpKhvuttU2S-2T2XqWz9g", + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the full CSM data from which the delta can be computed:" + ], + "metadata": {} + }, + { + "id": "ZnNiktkIsEmVeTAPp4eq0Q", + "cell_type": "code", + "source": [ + "var LC = Test.GetScopes(identities).Aggregate().Lc.Filter((\"GroupOfContract\", dataNode));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XRtrMck4ak-bF1LUNbR-bw", + "cell_type": "code", + "source": [ + "var deltaLC = LC.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n LC.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "rUaX0OrwkUuo2_xNMVz34g", + "cell_type": "code", + "source": [ + "deltaLC.Aggregate().Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Xv4auAOkAE6oXxsy4JGUBw", + "cell_type": "markdown", + "source": [ + "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" + ], + "metadata": {} + }, + { + "id": "c95lLlyhYU2YCY4HE8ZVIg", + "cell_type": "code", + "source": [ + "var expectedDeltaLC_nonFinancial = deltaLC.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qmlrXNV4n0iOMmSFHVe7wA", + "cell_type": "code", + "source": [ + "expectedDeltaLC_nonFinancial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "k_hU6dAGrEmzN3vI30De0A", + "cell_type": "code", + "source": [ + "expectedDeltaLC_nonFinancial.CheckEquality( -computedDeltaLC_nonFinancial ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "q0Cm5RmXxUa4oQVQ1fuHjw", + "cell_type": "markdown", + "source": [ + "### Financial" + ], + "metadata": {} + }, + { + "id": "cAJ4Q4Rx60aaCC-Nt-gdpQ", + "cell_type": "markdown", + "source": [ + "Conversely, the computed value for the financial change of the LC is" + ], + "metadata": {} + }, + { + "id": "MtdwhbqZiU-TOLVfW0DFDg", + "cell_type": "code", + "source": [ + "var computedDeltaLC_Financial = Test.GetScopes(identities).Aggregate()", + "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "cWArdm8iMESr118b9tDMkQ", + "cell_type": "code", + "source": [ + "computedDeltaLC_Financial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "q2pAhq-A_0aROq8zEDtVCA", + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" + ], + "metadata": {} + }, + { + "id": "fxZPPdSMCkG-mV0CjyLK4g", + "cell_type": "code", + "source": [ + "var expectedDeltaLC_Financial = ( deltaLC.Filter((\"VariableType\", \"IA\")) +", + "\n deltaLC.Filter((\"VariableType\", \"YCU\")) +", + "\n deltaLC.Filter((\"VariableType\", \"CRU\")) )", + "\n .Aggregate().Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WYqhArIhB0aUgSAq2pl4Ag", + "cell_type": "code", + "source": [ + "expectedDeltaLC_Financial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "IzddiJL3oUewH76M1wgr1w", + "cell_type": "code", + "source": [ + "expectedDeltaLC_Financial.CheckEquality( -computedDeltaLC_Financial ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ktY-cyI15E-U1ahdw6cDuA", + "cell_type": "markdown", + "source": [ + "## Loss Recovery Component" + ], + "metadata": {} + }, + { + "id": "Jj5QAJYtR0mPDZsLbwt82w", + "cell_type": "markdown", + "source": [ + "### Non Financial" + ], + "metadata": {} + }, + { + "id": "MNr136KdUEWkl6QE99H-tQ", + "cell_type": "markdown", + "source": [ + "If the [target Group of Contract](#report) is not of type Re-Insurance, the result of the following will return null.", + "\n", + "\nThe computed value for the non financial change of the LoReCo is" + ], + "metadata": {} + }, + { + "id": "vheo4pqpoUC636g-YZNg7w", + "cell_type": "code", + "source": [ + "var computedDeltaLORECO_nonFinancial = Test.GetScopes(identities).Aggregate()", + "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gcye9gWqLUSp2DBeuZK5JA", + "cell_type": "code", + "source": [ + "computedDeltaLORECO_nonFinancial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1h9DSjP030GvgF_-V2wXEQ", + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the full LoReCo data from which the delta can be computed:" + ], + "metadata": {} + }, + { + "id": "toras9Yo70eeiatIr1j9fw", + "cell_type": "code", + "source": [ + "var LORECO = Test.GetScopes(identities).Aggregate().Loreco.Filter((\"GroupOfContract\", dataNode));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uT9D_Ku9WkS7lCo1nrxs0Q", + "cell_type": "code", + "source": [ + "var deltaLORECO = LORECO.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n LORECO.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Qhxfbqq4OEaXyYoe5rfTUg", + "cell_type": "code", + "source": [ + "deltaLORECO.Aggregate()?.Value?? 0" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_uTlE0FJFEOI34sBONg8Mw", + "cell_type": "markdown", + "source": [ + "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" + ], + "metadata": {} + }, + { + "id": "qmBrKRZP8U-13Lup_I2e5Q", + "cell_type": "code", + "source": [ + "var expectedDeltaLORECO_nonFinancial = deltaLORECO.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tMMjF_m4D0aRpukRYlpdLA", + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_nonFinancial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "in3E9cuYDEymJ4n3r_iWPA", + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_nonFinancial.CheckEquality( -computedDeltaLORECO_nonFinancial ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "OaAYtHkPf0CohNZ6dPoGGA", + "cell_type": "markdown", + "source": [ + "### Financial" + ], + "metadata": {} + }, + { + "id": "gHC-7-HgtEWWHf6ZCY6dDQ", + "cell_type": "markdown", + "source": [ + "Conversely, the computed value for the financial change of the LoReCo is" + ], + "metadata": {} + }, + { + "id": "Y9twZB0o6ESo6PY18cZj9g", + "cell_type": "code", + "source": [ + "var computedDeltaLORECO_Financial = Test.GetScopes(identities).Aggregate()", + "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3wLUoygmE0CXCU5UFkL41Q", + "cell_type": "code", + "source": [ + "computedDeltaLORECO_Financial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "j5qJfGmdMkGwoFc1yb_X3Q", + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" + ], + "metadata": {} + }, + { + "id": "3UGSj5-MYUSI-mW2tMJXVg", + "cell_type": "code", + "source": [ + "var expectedDeltaLORECO_Financial = ( deltaLORECO.Filter((\"VariableType\", \"IA\")) +", + "\n deltaLORECO.Filter((\"VariableType\", \"YCU\")) +", + "\n deltaLORECO.Filter((\"VariableType\", \"CRU\")) )", + "\n .Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_Yk_rP1ZHEqRB6g3yMCUMg", + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_Financial" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dDZLX-mHFEyX5X2GNKLW7Q", + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_Financial.CheckEquality( -computedDeltaLORECO_Financial ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "S8TFuLo4eUeNTC-d5f9GjA", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Reconciliation" + ], + "metadata": {} + }, + { + "id": "GEzn2LZBRkSr7oqQsmzPDA", + "cell_type": "markdown", + "source": [ + "Based on the results calculated in Section 3, we check here the consistency of the [Financial Performance Report](#report). ", + "\n", + "\nFiner granular reconciliations can be performed by following the datails of how each report contributes to the Financial Performance Report. Please, refer to the [Report documentation](../Report/ReportScopes#financial-performance) for all the details. " + ], + "metadata": {} + }, + { + "id": "a6N6B4TD8kuk12aZT40KVg", + "cell_type": "markdown", + "source": [ + "## Insurance Revenue" + ], + "metadata": {} + }, + { + "id": "6MZPkbR47EmeDYqsSV4urQ", + "cell_type": "markdown", + "source": [ + "The Insurance Revenue (IR) contributions vary from Insurance to Re-Insurance and depend on the Liability Type of the [target Group of Contract](#report). This can be summarized by the formulas below", + "\n", + "\n$$", + "\n\\text{IR} = \\left\\{ ", + "\n\\begin{array}{ll}", + "\n\\Delta\\text{FCF Gross Non Financial} + \\Delta\\text{CSM Non Financial} + \\Delta\\text{CSM Release} \\\\", + "\n+ \\text{Incurred Incoming Cashflows} + \\text{Claims ICO} + \\text{Incurred Deferrals} \\\\", + "\n+ \\text{Exc. Experience Adjustment on Premiums} ~~,", + "\n& \\text{for LRC Insurance contracts} \\\\[0.2cm]", + "\n\\Delta\\text{CSM Non Financial} + \\Delta\\text{CSM Release} \\\\", + "\n+ \\text{Incurred Incoming Cashflows} + \\text{Claims ICO} + \\text{Incurred Deferrals} ~~,", + "\n& \\text{for LIC Insurance contracts} \\\\[0.2cm]", + "\n\\text{Claims ICO} + \\text{Incurred Deferrals} ~~,", + "\n& \\text{for Re-Insurance contracts}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nHere below we recompute the IR term:" + ], + "metadata": {} + }, + { + "id": "dFWCtF0eBkqXubXgarv3IA", + "cell_type": "code", + "source": [ + "var expectedDeltaCSM_release = deltaCSM.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "cnXGdn9kHkaAPsUUjaffrg", + "cell_type": "code", + "source": [ + "var expectedIncurredIncomingCashflows = Test.GetScopes(identities).Aggregate().Premiums", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "d5AwPz1_ZUiGBL5xhIKZ4g", + "cell_type": "code", + "source": [ + "var expectedIncurredDeferralsIr = Test.GetScopes(identities).Aggregate().AmortizationToIr", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YsUQO-5qx0mI-Ze0xAxR2g", + "cell_type": "code", + "source": [ + "var expectedClaimsICO = Test.GetScopes(identities).Aggregate().ClaimsIcoToIr", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uEta4W7kvEGPG1QyEoMh7w", + "cell_type": "code", + "source": [ + "var expectedExcExperienceAdjPremiums = Test.GetScopes(identities).Aggregate().ExperienceAdjustmentOnPremium", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zOT5DeoAmUCB4VCKdUJ2lw", + "cell_type": "code", + "source": [ + "double IR = 0;", + "\nif(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LRC\")", + "\n IR = - expectedDeltaFCF_nonFinancial ", + "\n - expectedDeltaCSM_nonFinancial ", + "\n - expectedDeltaCSM_release ", + "\n + expectedIncurredIncomingCashflows", + "\n + expectedClaimsICO", + "\n + expectedIncurredDeferralsIr", + "\n + expectedExcExperienceAdjPremiums;", + "\nelse if(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LIC\")", + "\n IR = - expectedDeltaCSM_nonFinancial", + "\n - expectedDeltaCSM_release", + "\n + expectedIncurredIncomingCashflows", + "\n + expectedClaimsICO", + "\n + expectedIncurredDeferralsIr ", + "\n + expectedExcExperienceAdjPremiums;", + "\nelse if(groupOfContract.Partner != null)", + "\n IR = + expectedClaimsICO", + "\n + expectedIncurredDeferralsIr", + "\n + expectedExcExperienceAdjPremiums;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gPU-YBlmbU-CuZWTrFnM-Q", + "cell_type": "code", + "source": [ + "IR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yE-6MD2uiE6ttfKjHLsQlg", + "cell_type": "markdown", + "source": [ + "## Insurance Service Expenses" + ], + "metadata": {} + }, + { + "id": "Obp_9f3AZkCH8Lap4aYmFg", + "cell_type": "markdown", + "source": [ + "Analogously, the Insurance Service Expenses (ISE) read", + "\n", + "\n$$", + "\n\\text{ISE} = \\left\\{ ", + "\n\\begin{array}{ll}", + "\n\\Delta\\text{LC Non Financial}", + "\n+ \\Delta\\text{LC Release}", + "\n+ \\text{Incurred ClaimsNIC} \\\\", + "\n+ \\text{Incurred Expenses}", + "\n+ \\text{Incurred Commissions}", + "\n+ \\text{Incurred Deferrals}", + "\n& \\text{for LRC Insurance contracts} \\\\[0.2cm]", + "\n\\Delta\\text{FCF Reinsurance Non Financial}", + "\n+ \\Delta\\text{LC Non Financial}", + "\n+ \\Delta\\text{LC Release}", + "\n+ \\text{Incurred ClaimsNIC} \\\\", + "\n+ \\text{Incurred Expenses} ", + "\n+ \\text{Incurred Commissions}", + "\n+ \\text{Incurred Deferrals}", + "\n& \\text{for LIC Insurance contracts} \\\\[0.2cm]", + "\n\\Delta\\text{FCF Reinsurance Non Financial} ", + "\n+ \\Delta\\text{CSM Non Financial} ", + "\n+ \\Delta\\text{CSM Release} \\\\", + "\n+ \\Delta\\text{LC Non Financial} ", + "\n+ \\Delta\\text{LC Release} ", + "\n+ \\Delta\\text{LoReCo Non Financial} \\\\", + "\n+ \\text{Incurred Incoming Cashflows} ", + "\n+ \\text{Incurred ClaimsNIC} ", + "\n+ \\text{Incurred Expenses} \\\\", + "\n+ \\text{Incurred Commissions}", + "\n+ \\text{Incurred Deferrals}", + "\n& \\text{for Re-Insurance contracts}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nHere below we recompute the ISE term:" + ], + "metadata": {} + }, + { + "id": "JL2Q7lsrlEucGEc4EjA_oA", + "cell_type": "code", + "source": [ + "var expectedDeltaLC_release = deltaLC.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "O9r-rlZ5hky9sOj-zExurg", + "cell_type": "code", + "source": [ + "var expectedDeltaLoReCo_release = deltaLORECO.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bL0MmHokbUmpt_-xEliEwg", + "cell_type": "code", + "source": [ + "var expectedIncurredClaimsNIC = Test.GetScopes(identities).Aggregate().ClaimsNic", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "pV3DTg_19k2Hvp6dPqucww", + "cell_type": "code", + "source": [ + "var expectedIncurredExpenses = Test.GetScopes(identities).Aggregate().Expenses", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KKkpsRFmHUiTPE7WDhV5LQ", + "cell_type": "code", + "source": [ + "var expectedIncurredCommissions = Test.GetScopes(identities).Aggregate().Commissions", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZoXGr9AuiUiZ9G1X4jUa8Q", + "cell_type": "code", + "source": [ + "var expectedIncurredClaimsICO = Test.GetScopes(identities).Aggregate().ClaimsIcoToIse", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "80_7zlUU90-JspeAvDJ9lQ", + "cell_type": "code", + "source": [ + "var expectedIncurredDeferralsIse = Test.GetScopes(identities).Aggregate().AmortizationToIse", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Cekx0MB6YkyVgxkvslykvQ", + "cell_type": "code", + "source": [ + "double ISE = 0;", + "\nif(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LRC\")", + "\n ISE = - expectedDeltaLC_nonFinancial ", + "\n - expectedDeltaLC_release", + "\n + expectedIncurredClaimsNIC ", + "\n + expectedIncurredExpenses ", + "\n + expectedIncurredClaimsICO", + "\n + expectedIncurredCommissions", + "\n + expectedIncurredDeferralsIse;", + "\nelse if(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LIC\")", + "\n ISE = - expectedDeltaFCF_nonFinancial", + "\n - expectedDeltaLC_nonFinancial ", + "\n - expectedDeltaLC_release", + "\n + expectedIncurredClaimsNIC ", + "\n + expectedIncurredExpenses ", + "\n + expectedIncurredClaimsICO", + "\n + expectedIncurredCommissions", + "\n + expectedIncurredDeferralsIse;", + "\nelse if(groupOfContract.Partner != null)", + "\n ISE = - expectedDeltaFCF_nonFinancial", + "\n - expectedDeltaCSM_nonFinancial", + "\n - expectedDeltaCSM_release", + "\n - expectedDeltaLC_nonFinancial ", + "\n - expectedDeltaLC_release", + "\n - expectedDeltaLoReCo_release", + "\n + expectedIncurredIncomingCashflows", + "\n + expectedIncurredClaimsNIC ", + "\n + expectedIncurredExpenses ", + "\n + expectedIncurredClaimsICO", + "\n + expectedIncurredCommissions", + "\n + expectedIncurredDeferralsIse;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "081ToSk3WESb6183HlFQlA", + "cell_type": "code", + "source": [ + "ISE" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "83VrYmGYX0uHykId27aWOQ", + "cell_type": "markdown", + "source": [ + "## Insurance Finance Income/Expenses" + ], + "metadata": {} + }, + { + "id": "NAkWvaF6NUG6tYDPqEbVNA", + "cell_type": "markdown", + "source": [ + "The Financial part associated to the Insurance business encompassing both the Income and Expenses is denoted IFIE from the initials marked in capital letters. The ", + "\n", + "\n$$", + "\n\\text{IFIE} = \\left\\{", + "\n\\begin{array}{ll}", + "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} ~~,", + "\n& \\text{for Insurance contracts} \\\\[0.2cm]", + "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} ", + "\n+ \\Delta\\text{LoReCo Financial} ~~, ", + "\n& \\text{for Re-Insurance contracts}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nHere below we recompute the IFIE term:" + ], + "metadata": {} + }, + { + "id": "JkwONyKiakC4XpVgxusdRg", + "cell_type": "code", + "source": [ + "double IFIE = 0;", + "\nif(groupOfContract.Partner == null) ", + "\n IFIE = - expectedDeltaFCF_Financial ", + "\n - expectedDeltaCSM_Financial", + "\n - expectedDeltaLC_Financial;", + "\nelse", + "\n IFIE = - expectedDeltaFCF_Financial ", + "\n - expectedDeltaCSM_Financial", + "\n - expectedDeltaLC_Financial", + "\n - expectedDeltaLORECO_Financial;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "grefaMt7BEaTJ7dsa0AUQA", + "cell_type": "code", + "source": [ + "IFIE" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6_E3dWyyF0COz4xLh1e-xA", + "cell_type": "markdown", + "source": [ + "## Other Comprehensive Income" + ], + "metadata": {} + }, + { + "id": "jK3nTYcm30KoVUioi71r4g", + "cell_type": "markdown", + "source": [ + "The Other Comprehensive Income (OCI) can be non-zero only when the OCI is enabled for [target Group of Contract](#report), that is, Oci Type = Default.", + "\n", + "\n$$", + "\n\\text{OCI} = \\Delta\\text{FCF} \\big|_{\\text{Locked-in}} - \\Delta\\text{FCF} \\big|_{\\text{Current}} ~~.", + "\n$$", + "\n", + "\nHere below we recompute the OCI term:" + ], + "metadata": {} + }, + { + "id": "j2wpd2OAuUmjvKWQoew9jQ", + "cell_type": "code", + "source": [ + "var OCI = expectedDeltaFCF_OCI;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "7R8qKIIsGU6fcW8M2M2M5g", + "cell_type": "code", + "source": [ + "OCI" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_BPpLy2cnUKTaE-9tgr-UQ", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/SpecificationsImportActuals.ipynb b/Test/SpecificationsImportActuals.ipynb new file mode 100644 index 00000000..b803db6b --- /dev/null +++ b/Test/SpecificationsImportActuals.ipynb @@ -0,0 +1,705 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "1O9abtyGKUeDiX_VyaeaAQ", + "cell_type": "markdown", + "source": [ + "

Import Actuals Specifications

" + ], + "metadata": {} + }, + { + "id": "mgxNtYdjh027T2LccTaWsA", + "cell_type": "markdown", + "source": [ + "The aim of this notebook is to document the calculations taking place when importing the Actuals. For this documentation notebook the Data is imported from the corresponding csv files located in the following path Initialization/Systemorph/. The process is pictorially explained in the following flowchart. ", + "\n", + "\n", + "\n
", + "\n", + "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." + ], + "metadata": {} + }, + { + "id": "9sXMifQXi0yuys7dMnvmmA", + "cell_type": "markdown", + "source": [ + "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + ], + "metadata": {} + }, + { + "id": "TYI7B_9JxEm9gBQSiHP7Tw", + "cell_type": "code", + "source": [ + "#!import \"SpecificationsSetup\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "sQZ9EDWrRUCqjDaDiUaslg", + "cell_type": "markdown", + "source": [ + "---" + ], + "metadata": {} + }, + { + "id": "9VuASxTZcE64BWvOvV6Y0A", + "cell_type": "markdown", + "source": [ + "# Import Data" + ], + "metadata": {} + }, + { + "id": "cb5PqhqcY0eWhhsN18hk8Q", + "cell_type": "markdown", + "source": [ + "", + "\n## Current Period" + ], + "metadata": {} + }, + { + "id": "AYwuUnm7D0OvGFWfuLCS0g", + "cell_type": "markdown", + "source": [ + "Please select the target period (i.e. year and month), Reporting Node, Economic Basis, and Data Node based on the imported data:" + ], + "metadata": {} + }, + { + "id": "e0LWvI9K1U-qRdDpHJWU3Q", + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;", + "\nvar economicBasis = \"L\" ;", + "\nvar dataNode = \"DT1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MfXiwU7pSkeiWLcmqQJytA", + "cell_type": "markdown", + "source": [ + "Import the Dimensions, Yield Curves and Nominal Cashflows from the corresponding csv files in Initialization/Systemorph/" + ], + "metadata": {} + }, + { + "id": "VckQZIZagUGxLJK_kIkJzA", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Epv9604EmEmVeKtkGt_iqA", + "cell_type": "markdown", + "source": [ + "Initialization of the Test Suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" + ], + "metadata": {} + }, + { + "id": "UWRWl2pRz0eA8IvYfBeXbQ", + "cell_type": "code", + "source": [ + "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Actual);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Ball02llF0KmddCeo9vhsw", + "cell_type": "markdown", + "source": [ + "", + "\n## View imported Actuals" + ], + "metadata": {} + }, + { + "id": "XiBDlMNVEk-oEido9aLDsA", + "cell_type": "markdown", + "source": [ + "Here the imported Actuals from csv are visualized " + ], + "metadata": {} + }, + { + "id": "CaVs88CPvEuA-lj1QXbU4A", + "cell_type": "code", + "source": [ + "Test.GetStorage().GetIfrsVariables(dataNode)", + "\n .Where(x => new string[] {EstimateTypes.A, EstimateTypes.AA, EstimateTypes.OA}.Contains(x.EstimateType))", + "\n .Where(x => x.AocType != \"EOP\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "J2FGEyUHWk-y2N3yq7bQGQ", + "cell_type": "markdown", + "source": [ + "where the filter is selecting only those *estimate types* associated to the imported Actuals, hence excluding the IFRS variables calculated when [importing the cashflows](SpecificationsImportCashflows)." + ], + "metadata": {} + }, + { + "id": "ZFf-ptMOJUaVX3hg-LJRPA", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Base Actuals" + ], + "metadata": {} + }, + { + "id": "q2ZSjwzGV0iSYC2rHoNKBQ", + "cell_type": "markdown", + "source": [ + "The following simplified AoC Chain applies for Advance and Overdue Actuals:", + "\n1. Beginning of Period (BOP)", + "\n2. Cash flow (CF)", + "\n3. Amortization (AM) ", + "\n4. End of Period (EOP) ", + "\n", + "\nWe consider 4 types of Actual values, which are distinguished through their [Estimate Type](../DataModel/DataStructure#estimate-type):", + "\n- Actuals (A)", + "\n- Advance Actuals (AA)", + "\n- Overdue Actuals (OA)", + "\n- Deferrable Actuals (DA)", + "\n", + "\nwith the Estimate Type's system name shown between parenthesis above.", + "\nThey are computed by the so-called Actual Base **Scope**", + "\n", + "\n$$", + "\n\\text{Actual Base} (\\text{AoC}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n0 & \\text{if AoC step is AM,} \\\\", + "\n\\text{Actual Base}(\\rm{BOP}) + \\text{Actual Base}(\\rm{CF}) + \\text{Actual Base}(\\rm{WO}) & \\text{if AoC step is EOP and Estimate Type is not A,} \\\\", + "\n\\text{Imported Actual} & \\text{otherwise.}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nWe start by selecting one of the [imported Actual](#view-imported-actuals) and we pick up an available data node, novelty, and amount type. Then, we can retrieve the corresponding actual (if any) with AoC type BOP, R, and WO. ", + "\n", + "\nNote that the **Identity** for Actual Base contains information about the target data node, AoC type, novelty, amount type and estimate type." + ], + "metadata": {} + }, + { + "id": "3mz_ogsNkUOQiwgPjhzFSw", + "cell_type": "markdown", + "source": [ + "## End of Period" + ], + "metadata": {} + }, + { + "id": "1gmNQIcnYkWzuw3POkhHTg", + "cell_type": "markdown", + "source": [ + "The imported actuals for the AoC steps BOP, CF, and WO are:" + ], + "metadata": {} + }, + { + "id": "m0tpSB8gxUyDD338Zgkb2Q", + "cell_type": "code", + "source": [ + "var actualBaseBOP = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" }, \"PR\", \"AA\", (int?)null) ); ", + "\nactualBaseBOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dJten8gq_kyMKh4S8U_dzw", + "cell_type": "code", + "source": [ + "var actualBaseCF = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) );", + "\nactualBaseCF" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YmaBzLIDzU-jXeSLLeah2Q", + "cell_type": "code", + "source": [ + "var actualBaseWO = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"WO\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) ); ", + "\nactualBaseWO" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kkzVuYU0TUq_BrtrZbS2Cg", + "cell_type": "markdown", + "source": [ + "Based on the imported actuals and according to the [formula above](#base-actual), the computed actual for AoC step EOP reads" + ], + "metadata": {} + }, + { + "id": "rJlipm8F8UqWjrerzqNxHw", + "cell_type": "code", + "source": [ + "var computedActualBaseEOP = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"EOP\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) ); ", + "\ncomputedActualBaseEOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "agUQcE0dMkGmHLSL3ckUNA", + "cell_type": "markdown", + "source": [ + "The computed value can be compared with the expected value" + ], + "metadata": {} + }, + { + "id": "iNuhJJEj4UukayFi6gCk5Q", + "cell_type": "code", + "source": [ + "computedActualBaseEOP.Value == actualBaseBOP.Value + actualBaseCF.Value + actualBaseWO.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LoHEbpUBtUKZRzu41Eyo1g", + "cell_type": "code", + "source": [ + "computedActualBaseEOP.Value.Should().Be( actualBaseBOP.Value + actualBaseCF.Value + actualBaseWO.Value );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "g-rX5A35Bk67CAhSb5UMBw", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Deferrable Actuals" + ], + "metadata": {} + }, + { + "id": "Yb0BdsMIdEmyenFYmcNP0g", + "cell_type": "markdown", + "source": [ + "The Deferrable Actuals (DA) are computed as follows", + "\n", + "\n$$", + "\n\\text{Deferrable Actual} (\\text{AoC}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{Actual Base}_{\\substack{\\text{Estimate Type}=\\text{A} \\\\ \\text{Amount Type}=\\text{ACA}}} (\\text{CF})", + "\n +\\text{Actual Base}_{\\substack{\\text{Estimate Type}=\\text{A} \\\\ \\text{Amount Type}=\\text{AEA}}} (\\text{CF}) & \\text{if AoC step is CF } \\\\", + "\n-\\text{AMF} \\cdot \\big( \\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) \\big) & \\text{if AoC step is AM } \\\\", + "\n\\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) + \\text{Deferrable Actual}(\\rm{AM}) & \\text{if AoC step is EOP } \\\\", + "\n\\text{Input Actual}_{\\text{Estimate Type}=\\text{DA}} (\\text{BOP}) & \\text{if AoC step is BOP } \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere ACA and AEA are *Aquisition* Amount Types from *Attributable Commission* and *Attributable Expenses*, respectively.", + "\n", + "\nNote that the **Identity** of Deferrable Actual is encompassing solely data node, Aoc type, and novelty." + ], + "metadata": {} + }, + { + "id": "dIh2Kt3mwEOjtIdYsSQLpw", + "cell_type": "markdown", + "source": [ + "## Beginning of Period" + ], + "metadata": {} + }, + { + "id": "ZwwOl_GoSEyoQi2486bksw", + "cell_type": "code", + "source": [ + "var computedDeferrableActualBOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" } );", + "\ncomputedDeferrableActualBOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "rwIPbApkqk20YefMttJaBQ", + "cell_type": "markdown", + "source": [ + "The deferrable Actual for the AoC step being BOP is simply the EOP Actual of the previous period. In fact, if the latter exists among the [imported Actuals](#view-imported-actuals), it is reported here below as the BOP of the current period:" + ], + "metadata": {} + }, + { + "id": "ECOpAU6G40ecEEPHz210UQ", + "cell_type": "code", + "source": [ + "var expectedDeferrableActualBOP = Test.GetStorage().GetValue(new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" }, (string)null, EstimateTypes.DA, (int?)null);", + "\nexpectedDeferrableActualBOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "F_RpeDiSsk2xnjvgkmQyfA", + "cell_type": "markdown", + "source": [ + "The expected value is compared with the computed result: " + ], + "metadata": {} + }, + { + "id": "RAI7Dd_j4kaqQJENtCDH2Q", + "cell_type": "code", + "source": [ + "computedDeferrableActualBOP.Value == expectedDeferrableActualBOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Xj5YWVMuskWq5g578_rF3g", + "cell_type": "code", + "source": [ + "computedDeferrableActualBOP.Value.Should().Be(expectedDeferrableActualBOP);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VE3a5lAE40OUqsCPrC8OkQ", + "cell_type": "markdown", + "source": [ + "## Cash flow" + ], + "metadata": {} + }, + { + "id": "KCDTqi_VaEeLnsXIQtuFfw", + "cell_type": "code", + "source": [ + "var computedDeferrableActualCF = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" } );", + "\ncomputedDeferrableActualCF" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-npyFyfnKU2HKSBOkmaWqw", + "cell_type": "markdown", + "source": [ + "The deferrable Actual for the AoC step being CF is the sum of the base Actuals with Amount Type ACA and AEA:" + ], + "metadata": {} + }, + { + "id": "DMXlh_BdV0m-gGATOlCmXw", + "cell_type": "code", + "source": [ + "var actualBaseAEA = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"AEA\", \"A\", (int?)null) );", + "\nactualBaseAEA" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0bhhirWn60Sa22kkJBKxPA", + "cell_type": "code", + "source": [ + "var actualBaseACA = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"ACA\", \"A\", (int?)null) );", + "\nactualBaseACA" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "s5th00fR9km5T_Jn7WG_Tw", + "cell_type": "code", + "source": [ + "var expectedDeferrableActualCF = actualBaseAEA.Value + actualBaseACA.Value;", + "\nexpectedDeferrableActualCF" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nTo3qqybYkKSKmR3F1ElOA", + "cell_type": "markdown", + "source": [ + "The expected value is compared with the computed result: " + ], + "metadata": {} + }, + { + "id": "focF1ZcZDUOXSSNLlZkfFg", + "cell_type": "code", + "source": [ + "computedDeferrableActualCF.Value == expectedDeferrableActualCF" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zj2ipSnC_UqYHMXCw093xg", + "cell_type": "code", + "source": [ + "computedDeferrableActualCF.Value.Should().Be(expectedDeferrableActualCF);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RQuw7gToOkS4hInnv9Kzww", + "cell_type": "markdown", + "source": [ + "## Amortization" + ], + "metadata": {} + }, + { + "id": "_MvSo7kpmEO8Lx_8g70chg", + "cell_type": "code", + "source": [ + "var computedDeferrableActualAM = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", + "\ncomputedDeferrableActualAM" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "GxyMep7IRUuKq-XPTZaSoA", + "cell_type": "markdown", + "source": [ + "The deferrable Actual for the AoC step being AM is the sum of the deferrable Actuals for AoC step BOP and CF multiplied by the current period amortization factor:" + ], + "metadata": {} + }, + { + "id": "YxvqYPNNPkGTrfpko0P9tg", + "cell_type": "code", + "source": [ + "var currentPeriodAmortizationFactor = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", + "\ncurrentPeriodAmortizationFactor" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CcAeUSZHEUy_ZLSZOjwWNQ", + "cell_type": "code", + "source": [ + "Test.GetStorage().GetValue(new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" }, (string)null, \"F\", \"L\", (int?)null)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "R7RYD25pIkyzpVtr4bTYZQ", + "cell_type": "code", + "source": [ + "var expectedDeferrableActualAM = -currentPeriodAmortizationFactor.Value * (expectedDeferrableActualBOP + expectedDeferrableActualCF);", + "\nexpectedDeferrableActualAM" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "57FkYeaQNEGS22T303mszw", + "cell_type": "markdown", + "source": [ + "The expected value is compared with the computed result: " + ], + "metadata": {} + }, + { + "id": "vj4ilsvlW0Kd_W6yb9M_LA", + "cell_type": "code", + "source": [ + "computedDeferrableActualAM.Value == expectedDeferrableActualAM" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-ZnJyECl70mF5zHLrrMwJA", + "cell_type": "code", + "source": [ + "computedDeferrableActualAM.Value.Should().Be( expectedDeferrableActualAM );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xc8raQB2aECcY5vJIlfnXw", + "cell_type": "markdown", + "source": [ + "## End of Period" + ], + "metadata": {} + }, + { + "id": "LVj_SAEOeEy1V78xmool1w", + "cell_type": "code", + "source": [ + "var computedDeferrableActualEOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"EOP\", Novelty = \"C\" } );", + "\ncomputedDeferrableActualEOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4thR0prSO0KUITk7bFfW2g", + "cell_type": "markdown", + "source": [ + "The deferrable Actual for the AoC step being EOP is the sum of the deferrable Actuals for AoC step BOP, CF, and AM:" + ], + "metadata": {} + }, + { + "id": "KCOAQSqabUmBYKvz1FRHWQ", + "cell_type": "code", + "source": [ + "var deferrableActualBOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" } );", + "\ndeferrableActualBOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-goqiLAXmEa7aVplCpRGjQ", + "cell_type": "code", + "source": [ + "var deferrableActualCF = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" } );", + "\ndeferrableActualCF" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "IW3UXfNFZ0CCML8Omp0uKQ", + "cell_type": "code", + "source": [ + "var deferrableActualAM = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", + "\ndeferrableActualAM" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LbrMeCRVTEGd8XazzJK4UQ", + "cell_type": "code", + "source": [ + "var expectedDeferrableActualEOP = deferrableActualBOP.Value + deferrableActualCF.Value + deferrableActualAM.Value;", + "\nexpectedDeferrableActualEOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bq4Rfl5WFEejDIWSCzYAgA", + "cell_type": "markdown", + "source": [ + "The expected value is compared with the computed result: " + ], + "metadata": {} + }, + { + "id": "hKN5tE4QmkuzwXxOyxc9xQ", + "cell_type": "code", + "source": [ + "computedDeferrableActualEOP.Value == expectedDeferrableActualEOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BrWWx3tS2UK7lsbEDU4TOg", + "cell_type": "code", + "source": [ + "computedDeferrableActualEOP.Value.Should().Be(expectedDeferrableActualEOP);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Rn9tO4dA3kGJWgSdp5k-hA", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/SpecificationsImportCashflows.ipynb b/Test/SpecificationsImportCashflows.ipynb new file mode 100644 index 00000000..ad03bfe5 --- /dev/null +++ b/Test/SpecificationsImportCashflows.ipynb @@ -0,0 +1,2906 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showtags": "False", + "toc-showmarkdowntxt": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "lI4yThFtAkGBL2c6iGY6NA", + "cell_type": "markdown", + "source": [ + "

Import Cashflows Specifications

" + ], + "metadata": {} + }, + { + "id": "XPSBZvgeJUWm3KfISi0_kw", + "cell_type": "markdown", + "source": [ + "The aim of this notebook is to document the calculation of the Present Values and Amortization Factors starting from the nominal Cashflows and the Yearly Yield Curve. These starting data is imported from the corresponding csv files located in the following path Initialization/Systemorph/. The process is pictorially explained in the following flowchart. ", + "\n", + "\n", + "\n
", + "\n", + "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." + ], + "metadata": {} + }, + { + "id": "KuBokOZnNEKyeai5pecD_A", + "cell_type": "markdown", + "source": [ + "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + ], + "metadata": {} + }, + { + "id": "ymRDCUIfokuZuGhcIgRC2Q", + "cell_type": "code", + "source": [ + "#!import \"SpecificationsSetup\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "K2nnKAzJ1kWqqKCw6hgCpg", + "cell_type": "markdown", + "source": [ + "---" + ], + "metadata": {} + }, + { + "id": "vDUrjRR4W0Cab2XwoLh66g", + "cell_type": "markdown", + "source": [ + "# Import Data" + ], + "metadata": {} + }, + { + "id": "25t6_azELkmmpL2KrlobIg", + "cell_type": "markdown", + "source": [ + "", + "\n## Current Period" + ], + "metadata": {} + }, + { + "id": "p89NHTl7QUan7LJZcHQ7CA", + "cell_type": "markdown", + "source": [ + "Please select the target period (i.e. year and month), Reporting Node, Economic Basis, and Data Node based on the imported data:" + ], + "metadata": {} + }, + { + "id": "1AQXjlCH5UqQtZhHE_ToWA", + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;", + "\nvar economicBasis = \"C\" ;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "C7KE2ugMTEeeZXpow5IctQ", + "cell_type": "markdown", + "source": [ + "Import the Dimensions, Yield Curves and Nominal Cashflows from the corresponding csv files in Initialization/Systemorph/" + ], + "metadata": {} + }, + { + "id": "o-K6Iedo20-WGrgowVvxNA", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Kd4etWIfVECgbQOUwpJjng", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "wRwk6MvytEO_Ynh6H4re9g", + "cell_type": "markdown", + "source": [ + "At this point reference data are loaded. Import now a cashfow file with a 720 elements." + ], + "metadata": {} + }, + { + "id": "u4C4qyNFokyVYXTnBsqhGw", + "cell_type": "code", + "source": [ + "var groupOfContract = \"GricComplex\";", + "\nawait UploadCashflowsAsync(\"Data/CashflowComplex.csv\")" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5qP7HJWjK0K-tb_-qAYFaw", + "cell_type": "markdown", + "source": [ + "Initialization of the Test suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" + ], + "metadata": {} + }, + { + "id": "_NJvnl5PKE6FQXhN5Pr_tw", + "cell_type": "code", + "source": [ + "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "raVSJGuqL0i16HubdvKRSQ", + "cell_type": "markdown", + "source": [ + "", + "\n## View loaded Data Nodes" + ], + "metadata": {} + }, + { + "id": "C-jrvc1_akme8Lq4zXXNnA", + "cell_type": "markdown", + "source": [ + "The imported active Data Nodes from Initialization/Systemorph/DataNodes.csv are " + ], + "metadata": {} + }, + { + "id": "ayPI03mGFEuJqDditI5Zcg", + "cell_type": "code", + "source": [ + "Test.GetStorage().DataNodeDataBySystemName" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "PNkJZPN3D0OTE4K9m7yhtw", + "cell_type": "markdown", + "source": [ + "", + "\n## View loaded Yearly Yield Curve" + ], + "metadata": {} + }, + { + "id": "449EmK-s0EC-qvpkUic0Ng", + "cell_type": "markdown", + "source": [ + "Here the correct Yield Curve is chosen among those imported from Initialization/Systemorph/Data.csv according to the [current period](#year-and-period) and the Aoc Step according the [Aoc Configuration](../DataModel/DataStructure#aoc-configuration). In the following we retrieve the desired identity." + ], + "metadata": {} + }, + { + "id": "GFBbfoECXkyIOhUvzUj1YA", + "cell_type": "code", + "source": [ + "var aocType = \"CL\";", + "\nvar novelty = \"C\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Xh9Ph958zUaWPoHyXTfa7g", + "cell_type": "code", + "source": [ + "var id = Test.GetIdentity(groupOfContract, aocType, novelty);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LSypuaGSnkmcuusalSOIMw", + "cell_type": "code", + "source": [ + "var yearlyYieldCurve = Test.GetStorage().GetYearlyYieldCurve(id, economicBasis);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZVGOGlL470Cv6pGp5K4TQA", + "cell_type": "code", + "source": [ + "yearlyYieldCurve" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YHtOWxQvJUygOp9bM9DnOg", + "cell_type": "markdown", + "source": [ + "", + "\n## View loaded Nominal Cashflows" + ], + "metadata": {} + }, + { + "id": "nuWozOR2zUqFJgmjZjSpSw", + "cell_type": "markdown", + "source": [ + "The nominal Cashflows for the current period are loaded together with last period Cashflows for Group of Contract that were already existent. ", + "\n", + "\nThe relative files are located in: Files/.", + "\n", + "\nThe result is showed in the following list to be compared with the entries of the csv files" + ], + "metadata": {} + }, + { + "id": "5XHFiMOI_k6ZLxFuzYGObA", + "cell_type": "code", + "source": [ + "Test.GetStorage().GetRawVariables(groupOfContract)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "i5XQoNnkHkCwFkZK-wvzeg", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Interest and Discount Rates" + ], + "metadata": {} + }, + { + "id": "QvPW08NJs0mc35ufVdJITA", + "cell_type": "markdown", + "source": [ + "The Yield Curve ${\\text{YC}_i}$ associated to the the [selected period](#year-and-period) and target currency of the Group of Contract Reporting Node is [displayed above](#view-loaded-yearly-yield-curve) and used in this section to calculate the Interest and Discount factors", + "\n", + "\n$$", + "\n\\text{Interest}_i = \\big( 1 + \\text{YC}_i \\big) ^{\\frac{1}{12}} ~,", + "\n$$", + "\n", + "\nand", + "\n", + "\n\\begin{align}", + "\n\\text{Discount}_i = \\big( 1 + \\text{YC}_i \\big) ^{-\\frac{1}{12}} ~.", + "\n\\end{align}" + ], + "metadata": {} + }, + { + "id": "Tx3o3lO8s0m5gv72S8Okfw", + "cell_type": "markdown", + "source": [ + "In the Scope named *MonthlyRate* the Interest and Discount factors are computed" + ], + "metadata": {} + }, + { + "id": "WjCiyKVx3UKysYDWgLig9w", + "cell_type": "code", + "source": [ + "var computedMonthlyRates = Test.GetScope( id );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Q4y_soImlkyK0gLglSALsQ", + "cell_type": "code", + "source": [ + "computedMonthlyRates" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "fl25D0dZKk6SeRoszzGp6Q", + "cell_type": "markdown", + "source": [ + "## Interest" + ], + "metadata": {} + }, + { + "id": "Z9R5ky64QUmw-BnZLN2Jug", + "cell_type": "markdown", + "source": [ + "In the following, the Interest factors computed by the application are recalculated independently according to the formula above in two different ways" + ], + "metadata": {} + }, + { + "id": "JAjIqFrQ-UizVR9ENdEB5Q", + "cell_type": "code", + "source": [ + "var expectedInterest = yearlyYieldCurve.Select( yc => (1 + yc)^( 1.0 / 12.0) );", + "\nexpectedInterest" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KHb-pVU5lkKoPw1Yx6IOLw", + "cell_type": "code", + "source": [ + "from yc in yearlyYieldCurve select (1 + yc)^( 1.0 / 12.0 ) " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "eWIhGYRQQUSp9YT53BxCgw", + "cell_type": "code", + "source": [ + "computedMonthlyRates.Interest.CheckEquality( expectedInterest ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Pt64D8ANL06gXx9he1WVzw", + "cell_type": "markdown", + "source": [ + "## Discount" + ], + "metadata": {} + }, + { + "id": "TPUopwWBTUG3gPPmb2B5Nw", + "cell_type": "markdown", + "source": [ + "The following recalculates the Discount factors to be compared with the computed values" + ], + "metadata": {} + }, + { + "id": "YtUiQ2xnzE2FfAa6LlAcfw", + "cell_type": "code", + "source": [ + "var expectedDiscount = yearlyYieldCurve.Select( yc => (1 + yc)^( -1.0 / 12.0) );", + "\nexpectedDiscount" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZGVBiwBOUk-I3JmXZnK4JA", + "cell_type": "code", + "source": [ + "computedMonthlyRates.Discount.CheckEquality( expectedDiscount ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "lMyTCC6GPUW45Cvx6U3JRw", + "cell_type": "markdown", + "source": [ + "## Test method: Get Valid Element" + ], + "metadata": {} + }, + { + "id": "FZ9_fdXlIECy7PDdcDlH1Q", + "cell_type": "markdown", + "source": [ + "Given the present Yield Curve array has finite *length*, the extrapolation implemented is taking the last element for all successive years. This behavior is given by the function *GetValidElement*. The test in this section assures that constant extrapolation is taken for *index* > *length*" + ], + "metadata": {} + }, + { + "id": "IfoqWI9zGkGc-Po9tnOcoQ", + "cell_type": "code", + "source": [ + "expectedDiscount.GetValidElement( 120 )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Z5ZpUs9wmUWbGWk6GcxNeA", + "cell_type": "code", + "source": [ + "expectedDiscount.GetValidElement( 120 ).Should().Be( expectedDiscount.Last() );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-KgziQbrF0mQYRsvkSkeGw", + "cell_type": "markdown", + "source": [ + "

", + "\n# Cashflows" + ], + "metadata": {} + }, + { + "id": "ITDv12Ph90ObEuoxNIr45w", + "cell_type": "markdown", + "source": [ + "This section deals with the calculation of the *Cumulated Discounted Cashflows* (CDC) starting from the nominal Cashflows. " + ], + "metadata": {} + }, + { + "id": "Isggf5h2S0unL3O7pgAirQ", + "cell_type": "markdown", + "source": [ + "## Choose identity" + ], + "metadata": {} + }, + { + "id": "pwQ4TMUvhUK-StHJEDFlCg", + "cell_type": "markdown", + "source": [ + "Each loaded nominal Cashflows is assigned to a so-called *Identity* which uniquely identifies it based on the *Data Node*, *Aoc Type*, and *Novelty*. In the following cells we retrieve the desired Identity:" + ], + "metadata": {} + }, + { + "id": "3MHGdD0V1k6cXBNxvaUgHA", + "cell_type": "code", + "source": [ + "var aocType = \"CL\";", + "\nvar novelty = \"C\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gPX1Ygo_DECIrwFPBvRXSQ", + "cell_type": "code", + "source": [ + "var id = Test.GetIdentity(groupOfContract, aocType, novelty);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KOWB-LuZSE6jCwSkVWLqLQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Nominal Cashflow" + ], + "metadata": {} + }, + { + "id": "7wA9Mo5SWkGRA9UpDIfDug", + "cell_type": "markdown", + "source": [ + "Consider the two Amount Type *PR* and *NIC*, with Transaction Period being *Beginning of Period* (BOP) and *End of Period* (EOP), respectively. The corresponding nominal Cashflows are deposited in the Scopes named *NominalCashflow* with the Identity provided above, Calculation Type *BE*, and the aforementioned Amount Types. These nominal Cashflows correspond with those [loaded from the csv files](#view-loaded-nominal-cashflows). " + ], + "metadata": {} + }, + { + "id": "mlWZ7mpOFkSD2Ru1TCl59g", + "cell_type": "code", + "source": [ + "var amountTypePR = \"PR\";", + "\nvar amountTypeNIC = \"NIC\";", + "\nvar calculationType = \"BE\";", + "\nvar accidentYear = (int?)null;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9TXHMp0XEEKq8LfUzqH9CA", + "cell_type": "code", + "source": [ + "var nominalPR = Test.GetScope((id, amountTypePR, calculationType, accidentYear));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WlEihYtxbECHWuuKVgue_w", + "cell_type": "code", + "source": [ + "nominalPR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "NERNBoD-OkiRREaV55ijeA", + "cell_type": "code", + "source": [ + "var nominalNIC = Test.GetScope((id, amountTypeNIC, calculationType, accidentYear));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hFfWM0bKxkW3mOhIZgZ5AQ", + "cell_type": "code", + "source": [ + "nominalNIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "765s5aL5Z0K0t5ZLuyCojg", + "cell_type": "markdown", + "source": [ + "", + "\n## Cumulated Discounted Cashflow" + ], + "metadata": {} + }, + { + "id": "JT4SSHYyVkK6kvw6pm1RYQ", + "cell_type": "markdown", + "source": [ + "The CDC is defined by the following recursive formulas", + "\n", + "\n$$", + "\n\\text{CDC}_t = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{Nominal}_t + \\text{CDC}_{t+1} \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} ~, & \\text{if Transaction Period is Beginning of Period} \\\\", + "\n\\big( \\text{Nominal}_t + \\text{CDC}_{t+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} ~, & \\text{if Transaction Period is End of Period}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere the Transaction Period depends on the given cashflow Amount Type. " + ], + "metadata": {} + }, + { + "id": "d_iKZefoME6wTrnz9UAv5A", + "cell_type": "markdown", + "source": [ + "### Beginning of Period" + ], + "metadata": {} + }, + { + "id": "espKPj1dtUuJz8XXQUAKzg", + "cell_type": "markdown", + "source": [ + "The Amount Type **Premiums** (PR) has Transaction Period **Beginning of Period** (BOP). The corresponding CDC calculated by the application is" + ], + "metadata": {} + }, + { + "id": "T7aVgGRgDEakkG-s3lfN0g", + "cell_type": "code", + "source": [ + "var computedDiscountedPR = Test.GetScope((id, amountTypePR, calculationType, accidentYear));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3FU71v2QJkyxs_bZfP4Uow", + "cell_type": "code", + "source": [ + "computedDiscountedPR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4YMOoutvQU-8pkN7n6TASQ", + "cell_type": "markdown", + "source": [ + "In the following cell we independently evaluate the expected discounted cashflow according to the formula above:" + ], + "metadata": {} + }, + { + "id": "ybObocoOVUKh6wl-2THKMA", + "cell_type": "code", + "source": [ + "var expectedDiscountedPR = new double[nominalPR.Values.Length];", + "\n", + "\nEnumerable.Range(0, nominalPR.Values.Length).Reverse()", + "\n .ForEach( i => expectedDiscountedPR[i] = nominalPR.Values[i] + expectedDiscountedPR.GetValidElement(i+1) * expectedDiscount.GetValidElement(i/12) );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "z256hRI3W0-dt-SPwhspvA", + "cell_type": "code", + "source": [ + "expectedDiscountedPR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kS81thpvcUK8_BDbmIGAew", + "cell_type": "code", + "source": [ + "(nominalPR.Values, nominalPR.Values.Length)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BVho0r3vFECpLdRKqXPiJQ", + "cell_type": "markdown", + "source": [ + "The expected cumulated discount is compared with the computed values" + ], + "metadata": {} + }, + { + "id": "rFrYAjOqPU6GlakOLi6Whg", + "cell_type": "code", + "source": [ + "computedDiscountedPR.Values.CheckEquality( expectedDiscountedPR )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CNA426Ac4ESI3ob66JKdfg", + "cell_type": "code", + "source": [ + "computedDiscountedPR.Values.CheckEquality( expectedDiscountedPR ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qGuikH-yU0uOYPbqe-xgiA", + "cell_type": "markdown", + "source": [ + "### End Of Period" + ], + "metadata": {} + }, + { + "id": "PxdI661DkEOx8fXIEikCeg", + "cell_type": "markdown", + "source": [ + "The Amount Type **Non Investment Component** (NIC) has Transaction Period **End of Period** (EOP). The corresponding CDC calculated by the application is" + ], + "metadata": {} + }, + { + "id": "glGfJSBB_UyhR3a-IkrEyw", + "cell_type": "code", + "source": [ + "var computedDiscountedNIC = Test.GetScope((id, amountTypeNIC, calculationType, accidentYear));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RYBSPN2Cvk-wIGFAo24vXA", + "cell_type": "code", + "source": [ + "computedDiscountedNIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qHM_Iqz93Ee9T-BENSbB6Q", + "cell_type": "markdown", + "source": [ + "In the following cell we independently evaluate the expected discounted cashflow according to the formula above:" + ], + "metadata": {} + }, + { + "id": "MROITxwMj0ujWWt4L-Up3w", + "cell_type": "code", + "source": [ + "var expectedDiscountedNIC = new double[nominalNIC.Values.Length];", + "\n", + "\nEnumerable.Range(0, nominalNIC.Values.Length).Reverse()", + "\n .ForEach( i => expectedDiscountedNIC[i] = ( nominalNIC.Values[i] + expectedDiscountedNIC.GetValidElement(i+1) ) * expectedDiscount.GetValidElement(i/12) );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "oHNnWbOAC02remoQuB3xeQ", + "cell_type": "code", + "source": [ + "expectedDiscountedNIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "pxhcnJV1UUuGT40Y5o79JA", + "cell_type": "markdown", + "source": [ + "The expected cumulated discount is compared with the computed values" + ], + "metadata": {} + }, + { + "id": "fB_CWCbH30qYOnXykKpInQ", + "cell_type": "code", + "source": [ + "computedDiscountedNIC.Values.CheckEquality( expectedDiscountedNIC )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "s2gR76itBESoEBFxheTs2g", + "cell_type": "code", + "source": [ + "computedDiscountedNIC.Values.CheckEquality( expectedDiscountedNIC ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WdMso-NBKku_uV1NVbeBoQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Non Performance Risk Adjustment" + ], + "metadata": {} + }, + { + "id": "x6qIuyV8iUmHNpSrP7kT_Q", + "cell_type": "markdown", + "source": [ + "In this section we treat the determination of the non-performance risk adjustment, an element offsetting partially future", + "\nclaims according to the risk that the reinsurance company cannot fulfil the full extent of its obligations.", + "\n", + "\nFirstly, the discounting recursive relation can be written explicitly as", + "\n", + "\n$$", + "\n\\begin{array}{l}", + "\n\\text{CDC}_t = \\big( \\text{Nominal}_t + \\text{CDC}_{t+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} \\\\", + "\n\\Rightarrow \\text{CDC}_t = \\sum_{\\tau=t} \\big( \\text{Valid Discount}_{\\frac{t}{12}} \\big)^{\\tau-t+1} \\cdot \\text{Nominal}_\\tau ", + "\n\\end{array}", + "\n$$", + "\n", + "\nFor nominal Cashflows with Amount Type being *Claims*, the risk-adjusted Cumulated Discounted Cashflow ", + "\nis assigned the Amount Type **Credit Default Risk** (CDR), ", + "\nand is obtained by multiplying the right hand side of the latter formula by the corresponding risk factor", + "\n", + "\n$$", + "\n\\text{CDC}_t^{\\text{Amount Type}=\\text{CDR}} = \\sum_{\\tau=t} \\big( \\text{Valid Discount}_{\\frac{t}{12}} \\big)^{\\tau-t+1} \\cdot \\text{Nominal}_\\tau^{\\text{Claim}} \\cdot \\big( e^{-\\gamma(\\tau-t)} -1 \\big)", + "\n$$", + "\n", + "\nwhere $\\gamma$ is the assumed non-performance probability of the reinsurer to be provided as an [input parameter](../DataModel/DataStructure#credit-default-rate).", + "\n", + "\nThis rate is constant for the whole projection period, that is, $\\gamma$ is not a function of $t$. ", + "\nIt effectively amounts to a constant increase in the continuous discount rate by $\\gamma$. " + ], + "metadata": {} + }, + { + "id": "a0Ap0lOGJE21INUHWmjGoQ", + "cell_type": "markdown", + "source": [ + "### Explicit vs recursive formula" + ], + "metadata": {} + }, + { + "id": "pbGuRNJm70SkHeIktIoBDQ", + "cell_type": "markdown", + "source": [ + "The explicit formula is tested versus the expected result obtained with the recursive formula" + ], + "metadata": {} + }, + { + "id": "e6e-jV9vnE6RTUlNhgK1Vw", + "cell_type": "code", + "source": [ + "var expectedDiscountedNICbis = new double[nominalNIC.Values.Length];", + "\n", + "\n//for(int t = 0; t < 12; t++)", + "\n// for(int tau = t; tau < 12; tau++)", + "\n// expectedDiscountedNICbis[t] += nominalNIC.Values[tau] * Math.Pow(expectedDiscount.GetValidElement(t/12), tau-t+1);", + "\n", + "\nEnumerable.Range(0, nominalNIC.Values.Length)", + "\n .ForEach( i => expectedDiscountedNICbis[i] = ", + "\n Enumerable.Range(i, nominalNIC.Values.Length-i).Select( tau => nominalNIC.Values[tau] * Math.Pow(expectedDiscount.GetValidElement(i/12), tau-i+1) ).Sum() );", + "\n ", + "\nexpectedDiscountedNIC.CheckEquality( expectedDiscountedNICbis )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "7VKY58rmN0i4hNUObTx5Lg", + "cell_type": "markdown", + "source": [ + "### Risk Adjusted Claims " + ], + "metadata": {} + }, + { + "id": "CDMXGMuNGUWSY2-VFbiSkQ", + "cell_type": "markdown", + "source": [ + "The computed CDC with Amount Type being CDR reads" + ], + "metadata": {} + }, + { + "id": "XnvESgljxkSWyht7EqW7NA", + "cell_type": "code", + "source": [ + "var computedDiscountedCRD = Test.GetScope((id, \"CDR\", calculationType, accidentYear));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "reDXOTbUxEGUchxSzysJog", + "cell_type": "code", + "source": [ + "computedDiscountedCRD" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nv4x6ysZxEmmtipcaDJy9g", + "cell_type": "markdown", + "source": [ + "The starting point for the non performance risk adjustment is the computation of the sum of nominal Cashflows with Amount Type **Claims** listed below" + ], + "metadata": {} + }, + { + "id": "bOQ1CXDjbUOygxJaPI-XYQ", + "cell_type": "code", + "source": [ + "Test.GetStorage().GetClaims()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0pTAfl977UK_SmRREnPF6Q", + "cell_type": "markdown", + "source": [ + "with the corresponding nominal Cashflows being" + ], + "metadata": {} + }, + { + "id": "syJWhInzsEObE2ykdoGLew", + "cell_type": "code", + "source": [ + "var nominalNIC = Test.GetScope((id, \"NIC\", calculationType, accidentYear));", + "\nnominalNIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "C7ko6wgyUkSyCQS2-Q8GuQ", + "cell_type": "code", + "source": [ + "var nominalICO = Test.GetScope((id, \"ICO\", calculationType, accidentYear));", + "\nnominalICO" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "GrTtn99Pc0KsTrYaIj7vhg", + "cell_type": "code", + "source": [ + "var nominalALE = Test.GetScope((id, \"ALE\", calculationType, accidentYear));", + "\nnominalNIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gAGXa9ftTUODRVbLikWr2A", + "cell_type": "code", + "source": [ + "var nominalULE = Test.GetScope((id, \"ULE\", calculationType, accidentYear));", + "\nnominalNIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ybob0Y2K00ysBNz_vpid2w", + "cell_type": "code", + "source": [ + "var nominalClaims = nominalICO.Values + nominalNIC.Values + nominalALE.Values + nominalULE.Values;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "7UXMUmrFwEKfhXV-EPyNOQ", + "cell_type": "markdown", + "source": [ + "Secondly, the correct credit risk rate (parameter $\\gamma$ in the [formula above](#non-performance-risk-adjustment)) is retrieved from the list of imported [Partner Rating](../DataModel/DataStructure) and [Credit Default Rates](../DataModel/DataStructure) relative to the target [Data Node](#year-and-period)'s Partner" + ], + "metadata": {} + }, + { + "id": "to_RSXazSEKtePbtjP11bA", + "cell_type": "code", + "source": [ + "groupOfContract" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qblrNkgGZkibWZqeduwsJg", + "cell_type": "code", + "source": [ + "var creditDefaultRate = Test.GetStorage().GetNonPerformanceRiskRate( id );", + "\ncreditDefaultRate" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "OAZT23-9Uk2Bs3qRbvUOKw", + "cell_type": "markdown", + "source": [ + "Lastly, using the [formula above](#non-performance-risk-adjustment), the expected CDR discounted Cashflow can be computed" + ], + "metadata": {} + }, + { + "id": "rUJBZVBNdU-8u5dSP4bv8w", + "cell_type": "code", + "source": [ + "var expectedDiscountedCDR = new double[nominalNIC.Values.Length];", + "\n", + "\nEnumerable.Range(0, nominalClaims.Length).ForEach( t => ", + "\n expectedDiscountedCDR[t] = Enumerable.Range(t, nominalClaims.Length-t).Select( tau => ", + "\n nominalClaims[tau] * Math.Pow(expectedDiscount.GetValidElement(t/12), tau-t+1) * (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", + "\n ).Sum() );", + "\n", + "\nexpectedDiscountedCDR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kKmpjPuP70GAVkBoNBqNrA", + "cell_type": "markdown", + "source": [ + "Finally, the expected cumulated discount is compared with the computed values" + ], + "metadata": {} + }, + { + "id": "m_bSBl61DE26IDp7VpY6dg", + "cell_type": "code", + "source": [ + "computedDiscountedCRD.Values.CheckEquality( expectedDiscountedCDR )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "DqkJo2YgcE65RX7db90WKQ", + "cell_type": "code", + "source": [ + "computedDiscountedCRD.Values.CheckEquality( expectedDiscountedCDR ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "mvwCM2Umf0OZHCcpOt9V5Q", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Present Values" + ], + "metadata": {} + }, + { + "id": "jzTF3NdnHkqzQ4KSajU3ig", + "cell_type": "markdown", + "source": [ + "For an implementation of these formulas refer to the [ImportScopeCalculation notebook](../Import/ImportScopeCalculation). " + ], + "metadata": {} + }, + { + "id": "g03stTrBDk-qgVynbAHR8w", + "cell_type": "markdown", + "source": [ + "The company portfolio value in one period is given by the following Analysis of Change AoC steps:", + "\n1. Beginning of Period (BoP): starting value of the portfolio as of December last year (in the Year to Date view), ", + "\n2. Model Corrections (MC): change of the portfolio value based on the model change,", + "\n3. Cash Flow (CF):", + "\n4. Interest Accretion (IA): ", + "\n5. Assumption Update (AU): ", + "\n6. Yield Curve Update (YCU): impact of yield curve update occured during the reporting period,", + "\n7. Credit Risk Update (CRU): impact of credit default rate update occured during the reporting period,", + "\n8. Experience Variance (EV): value adjustments following insurance related events which took place (e.g. mortality),", + "\n9. Combined Liabilities (CL):", + "\n10. End of Period (EOP): portfolio value at the end of the current period.", + "\n", + "\nNote: the AoC steps WO, EA and AM are not included in the Present Value calculation, hence their values if inquired is zero." + ], + "metadata": {} + }, + { + "id": "YcUNq4BqbUuS6xpbevFZDw", + "cell_type": "markdown", + "source": [ + "The Present Value Base (PVB) values are valid for all [Economic Basis](../DataModel/DataStructure#economic-basis) and depends on the corresponding [AoCType](../DataModel/DataStructure#aoc-type):", + "\n", + "\n$$", + "\n\\text{PVB}_t \\big(\\text{AoC}\\big) = ", + "\n\\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{CDC}_t & \\text{if AoC is Beginning of Period (BOP) } \\\\", + "\n-\\text{Nominal}_t(\\text{Parent AoC}) & \\text{if AoC is Expected Cashflow (CF) } \\\\", + "\n\\text{InterestAccretion}_t & \\text{if AoC is Interest Accretion (IA) } \\\\", + "\n\\text{CDC}_t(\\text{Parent AoC}) & \\text{if AoC is End of Period (EOP) } \\\\", + "\n\\text{CDC}_{t}(\\text{current AoC}) - \\text{CDC}_{t}(\\text{parent AoC}) & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nand the Projected Present Value (PPV) reads", + "\n", + "\n$$", + "\n\\text{PPV} \\big(\\text{AoC},\\text{TS},\\text{S}\\big) = \\left\\{", + "\n\\begin{array}{cll}", + "\n\\text{PVB}_{S} & \\text{if AoC Valuation Period is Beginning of Period } & \\text{ (e.g. BOP, MC) } \\\\", + "\n\\text{PVB}_{S+TS/2 -1} & \\text{if AoC Valuation Period is Mid of Period } & \\text{ (no examples in current data model) } \\\\", + "\n\\sum_{i=S}^{S + TS -1}\\text{PVB}_{i} & \\text{if AoC Valuation Period is Delta } & \\text{ (e.g. CF, IA) } \\\\", + "\n\\text{PVB}_{S + TS} & \\text{if AoC Valuation Period is End of Period } & \\text{ (e.g. YCU, CRU, EV, CL, EOP) } \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere the Shift (S) and Time Step (TS) are derived from the current [Year and Period](#year-and-period)" + ], + "metadata": {} + }, + { + "id": "96OPjQu30EWs42-nfLhp4A", + "cell_type": "code", + "source": [ + "var projectionPeriod = 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4ZzZwXo6T0-e0QLjP8y4hg", + "cell_type": "code", + "source": [ + "Test.GetStorage().GetShift(projectionPeriod)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "netwTLrv3EmUheR4K9fkww", + "cell_type": "code", + "source": [ + "Test.GetStorage().GetTimeStep(projectionPeriod)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HMUKlLJN6kCSVDgFWS5NUw", + "cell_type": "markdown", + "source": [ + "## Load Cashflow Data" + ], + "metadata": {} + }, + { + "id": "HZbqZPP1wUiVXHajP55O6w", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZWm_0QT1NEy3vrI1pssFEg", + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ERPDxPrxRE2F80hUf91cqQ", + "cell_type": "markdown", + "source": [ + "At this point standard Cashflows are loaded." + ], + "metadata": {} + }, + { + "id": "5qSxlX_u-0a1kyOkKpWkrw", + "cell_type": "markdown", + "source": [ + "Initialization of the Test suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" + ], + "metadata": {} + }, + { + "id": "yQhC05DCzEGeOGNpEf3mbg", + "cell_type": "code", + "source": [ + "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "R-gHWFQh4USaSbZeSX4nRA", + "cell_type": "markdown", + "source": [ + "## Select Group of Contract", + "\n", + "\nHere, it is possible to select the Group of Contract used to run the next section of this Notebook." + ], + "metadata": {} + }, + { + "id": "S6Fw2Fa0UUOkuS8wyQfBtg", + "cell_type": "code", + "source": [ + "groupOfContract = \"DTR1.1\" ;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hT5J5i-Tk0evmsGzFslKZA", + "cell_type": "markdown", + "source": [ + "## Beginning of Period" + ], + "metadata": {} + }, + { + "id": "nvqfr4Ux3kWlzwsCW0_USg", + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Beginning of Period is:" + ], + "metadata": {} + }, + { + "id": "fC63Uw1ey0OYVorrzegYrA", + "cell_type": "code", + "source": [ + "var idBoP = Test.GetIdentity(groupOfContract, \"BOP\", \"I\");", + "\nidBoP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-_jk2YKNT0u7l9uCTrc18w", + "cell_type": "code", + "source": [ + "var computedPvBaseBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", + "\ncomputedPvBaseBoP_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ddqVdgtt20KgvWxmw6d8tQ", + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, the expected BOP AoCType for PVB is defined to be equal to the discounted cashflows with the same Identity, Amount Type, and Calculation Type, whereas the PPV is the S-th element of the PVB." + ], + "metadata": {} + }, + { + "id": "UCd_zlXg7UKAz7Ak8etIKQ", + "cell_type": "code", + "source": [ + "var discountedBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", + "\ndiscountedBoP_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "he2CNq7s20a2kIAEI1Ew5A", + "cell_type": "code", + "source": [ + "var expectedPvBaseBoP_PR = discountedBoP_PR.Values;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "k8y7lMCUU0ahMIV2XNly5w", + "cell_type": "markdown", + "source": [ + "In the following cell we check whether the expected values match the computed values" + ], + "metadata": {} + }, + { + "id": "E_a4AaUiYU-qVqiFMH4Ffg", + "cell_type": "code", + "source": [ + "computedPvBaseBoP_PR.Values.CheckEquality( expectedPvBaseBoP_PR )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "USXwqdZpmEOlDJdxqDBZaA", + "cell_type": "code", + "source": [ + "computedPvBaseBoP_PR.Values.CheckEquality( expectedPvBaseBoP_PR ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-zbiX1EOvUaXOZIuba9Jbw", + "cell_type": "markdown", + "source": [ + "", + "\n## Model Corrections" + ], + "metadata": {} + }, + { + "id": "8tg7sZov10aMykVfqjUstg", + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Model Corrections is:" + ], + "metadata": {} + }, + { + "id": "CxmloqNXXkaE5PpJU1ydAQ", + "cell_type": "code", + "source": [ + "var idMC = Test.GetIdentity(groupOfContract, \"MC\", \"I\");", + "\nidMC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nvbs4pu8Sk-fnfw1MqBJEQ", + "cell_type": "code", + "source": [ + "var computedPvBaseMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", + "\ncomputedPvBaseMC_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8I2WEVons0iuf2UA4TyGtQ", + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, for MC AoCType, the PVB is equal to the difference between the CDC of the current AoCType and the CDC of its parent. Additionally, the PPV is the S-th element of the PVB." + ], + "metadata": {} + }, + { + "id": "XX3McWqdQECPv33I70zR8w", + "cell_type": "code", + "source": [ + "Test.GetScope((idMC, \"PR\")).Values" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dnlMbprPGEefEvBLpE3SVA", + "cell_type": "code", + "source": [ + "var discountedMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", + "\ndiscountedMC_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "pqOSCzCTJEyNauxM07RTvg", + "cell_type": "code", + "source": [ + "var expectedPvBaseMC_PR = discountedMC_PR.Values - discountedBoP_PR.Values;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gjdYsN-ftE-HlOKgEwvQLg", + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ], + "metadata": {} + }, + { + "id": "WOMu6tnVOEWiRZqaziMRcg", + "cell_type": "code", + "source": [ + "computedPvBaseMC_PR.Values.CheckEquality( expectedPvBaseMC_PR )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TvZ78p6vLkCL-xejOqvUcw", + "cell_type": "code", + "source": [ + "computedPvBaseMC_PR.Value == expectedPvBaseMC_PR[0]" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "w9D4tVGk5UmDB-tTCeS5Rw", + "cell_type": "code", + "source": [ + "computedPvBaseMC_PR.Values.CheckEquality( expectedPvBaseMC_PR ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nnvwi_zKy0ebrac1nrqanQ", + "cell_type": "code", + "source": [ + "computedPvBaseMC_PR.Value.Should().Be( expectedPvBaseMC_PR[0] );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jiKZ8kbywUK4oPhyLtuzFg", + "cell_type": "markdown", + "source": [ + "## Cashflow" + ], + "metadata": {} + }, + { + "id": "LG4pdtcxt0K_GSnJ0CDHLA", + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Cashflow is:" + ], + "metadata": {} + }, + { + "id": "CIshbPDh_0OC_HeMFEe2Rw", + "cell_type": "code", + "source": [ + "var idCF = Test.GetIdentity(groupOfContract, \"CF\", \"I\");", + "\nidCF" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5sLKCaklikuTAXBf9hAoGQ", + "cell_type": "code", + "source": [ + "var computedPvBaseCF_PR = Test.GetScope((idCF, \"PR\", \"BE\", (int?)null));", + "\ncomputedPvBaseCF_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VNaRi132eUy9m4SnHizakQ", + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, for CF AoCType, the PVB is equal to the nominal cashflow of its parent AoC step with opposite sign. The PPV is given by the sum of the first 3 elements." + ], + "metadata": {} + }, + { + "id": "pad5L8Zv40a1HYc508KwvA", + "cell_type": "code", + "source": [ + "var cfReferenceAocStep = Test.GetScope(idCF).Value;", + "\ncfReferenceAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "d_4naEye_0ez9ceQFlUsHg", + "cell_type": "code", + "source": [ + "var cfNominalReference_PR = Test.GetScope((idCF with {AocType = cfReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", + "\ncfNominalReference_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YSGvWpZAgk676PWkouVFvg", + "cell_type": "code", + "source": [ + "var expectedPvBaseCF_PR = -1.0 * cfNominalReference_PR.Values;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "T8i5WyGKH0eb6JTHWt3k3w", + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ], + "metadata": {} + }, + { + "id": "mlrKZMMExkOXb_z-QA-nzQ", + "cell_type": "code", + "source": [ + "computedPvBaseCF_PR.Values.CheckEquality( expectedPvBaseCF_PR )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_iXoBI2Ra06t95Lv-UKmdQ", + "cell_type": "code", + "source": [ + "computedPvBaseCF_PR.Values[0] + computedPvBaseCF_PR.Values[1] + computedPvBaseCF_PR.Values[2] == computedPvBaseCF_PR.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QWPx_7NUmEyE5Xu_kEeyjg", + "cell_type": "code", + "source": [ + "computedPvBaseCF_PR.Values.CheckEquality( expectedPvBaseCF_PR ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MSbSF0-9w0-iu_c3cNINjA", + "cell_type": "code", + "source": [ + "computedPvBaseCF_PR.Value.Should().Be( computedPvBaseCF_PR.Values[0] + computedPvBaseCF_PR.Values[1] + computedPvBaseCF_PR.Values[2] );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "iO7keKMcaE2t2gXC_7kqsA", + "cell_type": "markdown", + "source": [ + "", + "\n## Interest Accretion" + ], + "metadata": {} + }, + { + "id": "m6ZEzxBBsUyJ_QAcvMD6dA", + "cell_type": "markdown", + "source": [ + "For IA AoCType, the PVB is given by the following relation ", + "\n", + "\n$$", + "\n\\text{InterestAccretion}_i = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\big(\\text{CDC}_i(\\text{Parent AoC}) - \\text{Nominal}_i(\\text{parent AoC}) \\big) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, ", + "\n & \\text{if AmountType Transaction Period is Beginning of Period} \\\\", + "\n\\text{CDC}_i(\\text{parent AoC}) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, ", + "\n & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhile the PPV is given by the sum of the first S elements.", + "\n", + "\nWhen selecting the Identity, note that the Novelty *C* is not contemplated for Interest Accretion." + ], + "metadata": {} + }, + { + "id": "NMCk4gASMU62Bn6JnDxQmQ", + "cell_type": "code", + "source": [ + "var idIA = Test.GetIdentity(groupOfContract, \"IA\", \"I\");", + "\nidIA" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "fGjntj5jp0KxtiO6hKj29A", + "cell_type": "markdown", + "source": [ + "### Amount Type BOP" + ], + "metadata": {} + }, + { + "id": "byoRIpg2MkegjRvCvI9Ung", + "cell_type": "markdown", + "source": [ + "The computed Present Value for Amount Type **Premiums** (PR) with Transaction Period **Beginning of Period** (BOP) is" + ], + "metadata": {} + }, + { + "id": "ZiyHW9AJqEqeFgbYLv9FQA", + "cell_type": "code", + "source": [ + "var computedPvBaseIA_PR = Test.GetScope((idIA, \"PR\", \"BE\", (int?)null));", + "\ncomputedPvBaseIA_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XsDT4dnWfEqsJ28QKuHueg", + "cell_type": "markdown", + "source": [ + "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the interest factors, the nominal and discounted Cashflow of the parent Aoc Step" + ], + "metadata": {} + }, + { + "id": "yFVC3VGv4E2tNAJb0CRucw", + "cell_type": "code", + "source": [ + "var iaComputedMonthlyRates = Test.GetScope( idIA );", + "\niaComputedMonthlyRates" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kNS1BMQgXUCkSOuUK_IS7g", + "cell_type": "code", + "source": [ + "var iaReferenceAocStep = Test.GetScope(idIA).Value;", + "\niaReferenceAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "m6gpvEMNwEqFRImTGZBmTQ", + "cell_type": "code", + "source": [ + "var nominalIaReference_PR = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", + "\nnominalIaReference_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kEFdXGJHjkK39Ed9UMwNQA", + "cell_type": "code", + "source": [ + "var discountedIaReference_PR = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", + "\ndiscountedIaReference_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "b-s6yRRvEUeLF_z6-rD7lw", + "cell_type": "code", + "source": [ + "var expectedPvBaseIA_PR = discountedIaReference_PR.Values.Select((val, index) => ( val - nominalIaReference_PR.Values[index]) * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kpN29rNO-Uu2al_yAtJQVg", + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ], + "metadata": {} + }, + { + "id": "2R1QDTLoAkSYgN3VL0pXxg", + "cell_type": "code", + "source": [ + "computedPvBaseIA_PR.Values.CheckEquality( expectedPvBaseIA_PR )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ioWKmAEOBk6ly7qdPm8UcQ", + "cell_type": "code", + "source": [ + "computedPvBaseIA_PR.Values[0] + computedPvBaseIA_PR.Values[1] + computedPvBaseIA_PR.Values[2] == computedPvBaseIA_PR.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "lLcVd6QU_E-CV-zx6UKKyw", + "cell_type": "code", + "source": [ + "computedPvBaseIA_PR.Values.CheckEquality( expectedPvBaseIA_PR ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nksstSVXV0KMKV3s1Qzbjw", + "cell_type": "code", + "source": [ + "computedPvBaseIA_PR.Value.Should().Be( computedPvBaseIA_PR.Values[0] + computedPvBaseIA_PR.Values[1] + computedPvBaseIA_PR.Values[2] );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-DoJ5d5hPkGgyuUIARfcpw", + "cell_type": "markdown", + "source": [ + "### Amount Type EOP" + ], + "metadata": {} + }, + { + "id": "AIiYNFEf4EC9W5W55HyRuw", + "cell_type": "markdown", + "source": [ + "The computed Present Value for Amount Type **Non Investment Component** (NIC) with Transaction Period **End of Period** (EOP) is" + ], + "metadata": {} + }, + { + "id": "1sPIRjZ290ekFi_RcQIo0g", + "cell_type": "code", + "source": [ + "var computedPvBaseIA_NIC = Test.GetScope((idIA, \"NIC\", \"BE\", (int?)null));", + "\ncomputedPvBaseIA_NIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8nDAQ54uqUOqhCa5ArK8Ig", + "cell_type": "markdown", + "source": [ + "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the interest monthly rates, the discounted Cashflow of the parent Aoc Step" + ], + "metadata": {} + }, + { + "id": "HMwmW4WN50q8XsSBrLA9mw", + "cell_type": "code", + "source": [ + "var iaReferenceAocStep = Test.GetScope(idIA).Value;", + "\niaReferenceAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "harsyLraKU-NCaV-qs_10A", + "cell_type": "code", + "source": [ + "var discountedIaReference_NIC = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"NIC\", \"BE\", (int?)null));", + "\ndiscountedIaReference_NIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CeJcWORR1USjRX0vRrD9uw", + "cell_type": "code", + "source": [ + "var expectedPvBaseIA_NIC = discountedIaReference_NIC.Values.Select((val, index) => val * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Bg1hcEUU9UarAJ7j6K3Cgg", + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ], + "metadata": {} + }, + { + "id": "hiB4BkoAvUWvG3yaH-lUgg", + "cell_type": "code", + "source": [ + "computedPvBaseIA_NIC.Values.CheckEquality( expectedPvBaseIA_NIC )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "FAOKIDlrpEiY95BXbRJ9Lg", + "cell_type": "code", + "source": [ + "computedPvBaseIA_NIC.Values[0] + computedPvBaseIA_NIC.Values[1] + computedPvBaseIA_NIC.Values[2] == computedPvBaseIA_NIC.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3XieKhmULE2hpsAGvEz6Jw", + "cell_type": "code", + "source": [ + "computedPvBaseIA_NIC.Values.CheckEquality( expectedPvBaseIA_NIC ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "7eg7INUm50qXDWFveCVSJA", + "cell_type": "code", + "source": [ + "computedPvBaseIA_NIC.Value.Should().Be( computedPvBaseIA_NIC.Values[0] + computedPvBaseIA_NIC.Values[1] + computedPvBaseIA_NIC.Values[2] );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6PbcOZfV3Ua46NCV9bNvnw", + "cell_type": "markdown", + "source": [ + "## Yield Curve Update" + ], + "metadata": {} + }, + { + "id": "AJCuWf4c_kG-MTka3KHH9A", + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Yield Curve Update is:" + ], + "metadata": {} + }, + { + "id": "xECM9ubIAUWuJJQrVhS96Q", + "cell_type": "code", + "source": [ + "var idYcu = Test.GetIdentity(groupOfContract, \"YCU\", \"I\");", + "\nidYcu" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZtcMBnMzIkCuhjXxj25VQA", + "cell_type": "code", + "source": [ + "var computedPvBaseYCU_PR = Test.GetScope((idYcu, \"PR\", \"BE\", (int?)null));", + "\ncomputedPvBaseYCU_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "i_nXQ_NxtkanS4_VPwpXAA", + "cell_type": "markdown", + "source": [ + "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the discount factors for beginning of period and for end of period applied to the reference Aoc step, followed by the difference between the CDC obtained with end of period discount factor and the CDC obtained with beginning of period discount factor. " + ], + "metadata": {} + }, + { + "id": "qPgsLajbvEek7uwPNGMznw", + "cell_type": "code", + "source": [ + "var ycReferenceAocStep = Test.GetScope(idYcu).Value;", + "\nycReferenceAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "s8uI23FdzE6M9phEhZvlpg", + "cell_type": "code", + "source": [ + "var ycParentAocStep = Test.GetScope((idYcu, \"PR\")).Values.Single();", + "\nycParentAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "utP-1N2gHk2noyPx1Bz_Xw", + "cell_type": "code", + "source": [ + "var ycParentId = idYcu with {AocType = ycParentAocStep.AocType, Novelty = ycParentAocStep.Novelty};", + "\nycParentId" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "mtfbhW8_Fkar_ZID9fIKvw", + "cell_type": "markdown", + "source": [ + "Here is the parent AocStep discounted with the beginning of period discount factor." + ], + "metadata": {} + }, + { + "id": "m-hTC4iApEK8Ex_Oq8nqYQ", + "cell_type": "code", + "source": [ + "var discountedYcParent = Test.GetScope((ycParentId, \"PR\", \"BE\", (int?)null));", + "\ndiscountedYcParent" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "y1gdrxvTuE6sNtropNbIvg", + "cell_type": "markdown", + "source": [ + "Here we independently compute the CDC of the parent AocStep discounted with end of period discount factor." + ], + "metadata": {} + }, + { + "id": "v2NdunV9lUCmDXNy3tWk5g", + "cell_type": "code", + "source": [ + "var nominalYcParent = Test.GetScope((ycParentId, \"PR\", \"BE\", (int?)null));", + "\nnominalYcParent" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Y5RkFcGlxUWUCsWbNDtAbg", + "cell_type": "code", + "source": [ + "var ycComputedMonthlyRates = Test.GetScope( idYcu );", + "\nycComputedMonthlyRates" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Yko2CYybLEGJHMKwCDW3-g", + "cell_type": "code", + "source": [ + "var ycReferenceDiscountedEop = new double[nominalYcParent.Values.Length];", + "\n", + "\nEnumerable.Range(0, nominalYcParent.Values.Length).Reverse()", + "\n .ForEach( i => ycReferenceDiscountedEop[i] = nominalYcParent.Values[i] + ycReferenceDiscountedEop.GetValidElement(i+1) * ycComputedMonthlyRates.Discount.GetValidElement(i/12) );", + "\nycReferenceDiscountedEop" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-nB_BwXaFUSg1RGG9OtRWQ", + "cell_type": "code", + "source": [ + "var expectedPvBaseYCU_PR = ycReferenceDiscountedEop - discountedYcParent.Values;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "oqAvk5VK906PkRkAT2OaRg", + "cell_type": "code", + "source": [ + "computedPvBaseYCU_PR.Values.CheckEquality( expectedPvBaseYCU_PR )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tUv9lq_VLEqCkXFKJJuQig", + "cell_type": "code", + "source": [ + "computedPvBaseYCU_PR.Value == expectedPvBaseYCU_PR[3]" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "m4ee2o2DZ0aKf2FH92STsw", + "cell_type": "code", + "source": [ + "computedPvBaseYCU_PR.Values.CheckEquality( expectedPvBaseYCU_PR ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kA0wrkGJaUG-mcZFz8IYPw", + "cell_type": "code", + "source": [ + "computedPvBaseYCU_PR.Value.Should().Be( expectedPvBaseYCU_PR[3] );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "USKTbJfkSE607v_NwHKjvA", + "cell_type": "markdown", + "source": [ + "## Credit Risk Update" + ], + "metadata": {} + }, + { + "id": "QxohiF0860mtmiIoW8C26A", + "cell_type": "markdown", + "source": [ + "This Aoc Step is relevant only in the case of a Group of Reinsurance Contract." + ], + "metadata": {} + }, + { + "id": "aN_4K8LWFU-JoAvOSlRyvw", + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Credit Risk Update is:" + ], + "metadata": {} + }, + { + "id": "JuGimhzAIEKT0SIZKqog0w", + "cell_type": "code", + "source": [ + "var idCru = Test.GetIdentity(groupOfContract, \"CRU\", \"I\");", + "\nidCru" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "77exgwl5wUefPwQGSvv_nA", + "cell_type": "code", + "source": [ + "var computedPvBaseCRU = Test.GetScope((idCru, \"CDR\", \"BE\", (int?)null));", + "\ncomputedPvBaseCRU" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ltjSbNI1_k-mVdX0EBv-xA", + "cell_type": "markdown", + "source": [ + "The Present Value can be recomputed independently starting as the difference between the CDC obtained with end of period credit default risk rate and the CDC obtained with beginning of period credit default risk rate, both computed using the Nominal cashflow of the reference Aoc Step and the End Of Period discounting factors. " + ], + "metadata": {} + }, + { + "id": "5Mi2lhLj9kivaiTjvv2G1Q", + "cell_type": "code", + "source": [ + "var cruReferenceAocStep = Test.GetScope(idCru).Value;", + "\ncruReferenceAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "px7VkUXT10yK8uLGIu7UEw", + "cell_type": "code", + "source": [ + "var cruReferenceId = idCru with {AocType = cruReferenceAocStep.AocType, Novelty = cruReferenceAocStep.Novelty};", + "\ncruReferenceId" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0EZECyt5MEWdc8mjDVvhuA", + "cell_type": "code", + "source": [ + "var cruParentAocStep = Test.GetScope((idCru, \"CDR\")).Values.Single();", + "\ncruParentAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "osW4gCnv2EKUPFxXxAMqJA", + "cell_type": "code", + "source": [ + "var cruParentId = idCru with {AocType = cruParentAocStep.AocType, Novelty = cruParentAocStep.Novelty};", + "\ncruParentId" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LpyKsQ8EekaZw0sPwhs2Vw", + "cell_type": "markdown", + "source": [ + "Here is the parent AocStep discounted with beginning of period credit default risk rate." + ], + "metadata": {} + }, + { + "id": "72C7qsrN9Ui9B_XYbrIpsQ", + "cell_type": "code", + "source": [ + "var discountedCruParent = Test.GetScope((cruParentId, \"CDR\", \"BE\", (int?)null));", + "\ndiscountedCruParent" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vRLrx8ecq02PiEdHXn3hBg", + "cell_type": "code", + "source": [ + "var nominalCruReference = Test.GetScope((cruReferenceId, \"CDR\", \"BE\", (int?)null)).Values;", + "\nnominalCruReference" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jLV_5_vMx0OrVHD_Yu5mVA", + "cell_type": "code", + "source": [ + "var creditDefaultRate = Test.GetStorage().GetNonPerformanceRiskRate( idCru );", + "\ncreditDefaultRate" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VEgXXlyhrEawDMht-nAV9A", + "cell_type": "code", + "source": [ + "var cruComputedMonthlyRates = Test.GetScope( idCru );", + "\ncruComputedMonthlyRates" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "owmqecMemE-q5q164EhXnw", + "cell_type": "markdown", + "source": [ + "Lastly, using the [formula above](#non-performance-risk-adjustment), the expected CDR discounted Cashflow can be computed" + ], + "metadata": {} + }, + { + "id": "LYbZBgKavEO7IynuEAXGcA", + "cell_type": "code", + "source": [ + "var cruExpectedDiscountedCDR = new double[nominalCruReference.Length];", + "\n", + "\nEnumerable.Range(0, nominalCruReference.Length).ForEach( t => ", + "\n cruExpectedDiscountedCDR[t] = Enumerable.Range(t, nominalCruReference.Length-t).Select( tau => ", + "\n nominalCruReference[tau] * ", + "\n Math.Pow(cruComputedMonthlyRates.Discount.GetValidElement(t/12), tau-t+1) * ", + "\n (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", + "\n ).Sum() );", + "\n", + "\ncruExpectedDiscountedCDR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "f8a9p87_WUCugmBsw0E4sA", + "cell_type": "code", + "source": [ + "var expectedPvBaseCRU = cruExpectedDiscountedCDR - discountedCruParent.Values;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "7odSeJ5RTUmTR32M-5tlAA", + "cell_type": "code", + "source": [ + "computedPvBaseCRU.Values.CheckEquality( expectedPvBaseCRU )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ojtYz8I9xkaTA1AcV3U1Cw", + "cell_type": "code", + "source": [ + "computedPvBaseCRU.Value == expectedPvBaseCRU[3]" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WH8Cl5EMp0ewbK4iQ7-W3A", + "cell_type": "code", + "source": [ + "computedPvBaseCRU.Values.CheckEquality( expectedPvBaseCRU ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-4irtBVO70uLS-mVjr-3jQ", + "cell_type": "code", + "source": [ + "computedPvBaseCRU.Value.Should().Be( expectedPvBaseCRU[3] );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QLzUGR2eJk-J02bHAg78sg", + "cell_type": "markdown", + "source": [ + "## Combined Liabilities" + ], + "metadata": {} + }, + { + "id": "bxMjiXdzt0a-HXTolLPSig", + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Combined Liabilities and Amount Type PR is:" + ], + "metadata": {} + }, + { + "id": "iWOEJ3tfb02n5-nhXKNWPg", + "cell_type": "code", + "source": [ + "var idCL = Test.GetIdentity(groupOfContract, \"CL\", \"C\");", + "\nidCL" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RxytwcSRIEOh4gnpLjM-6A", + "cell_type": "code", + "source": [ + "var computedPvBaseCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null));", + "\ncomputedPvBaseCL_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "L0VyPzCrw02LlbNwi8lo6Q", + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, for CL AoCType, the PVB is equal to the difference between the CDC of the current AoCType and the CDC of its parent(s). Additionally, the PPV is the $(\\text{S}+\\text{TS})$-th element of the PVB." + ], + "metadata": {} + }, + { + "id": "eWjL6y9C3k-py-95Mi0SJg", + "cell_type": "code", + "source": [ + "var clParents = Test.GetScope((idCL,\"PR\")).Values;", + "\nclParents" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "o7Xu2o42K0SylUpXrn5bIw", + "cell_type": "code", + "source": [ + "var expectedPvBaseCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null)).Values -", + "\n clParents.Select(aocStep => Test.GetScope((idCL with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, \"PR\", \"BE\", (int?)null)).Values).Aggregate();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "2Pzjvmq7BEGnPjDo-Jvo3g", + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ], + "metadata": {} + }, + { + "id": "mJ3zeyh3YUSL7myhsdowKg", + "cell_type": "code", + "source": [ + "computedPvBaseCL_PR.Values.CheckEquality( expectedPvBaseCL_PR )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "t8dZLcMcYEiQaGohNjbhbw", + "cell_type": "code", + "source": [ + "computedPvBaseCL_PR.Value == expectedPvBaseCL_PR[3]" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CG2NuOh-OUWD0O9KjUlTKg", + "cell_type": "code", + "source": [ + "computedPvBaseCL_PR.Values.CheckEquality( expectedPvBaseCL_PR ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "FNsLWW7W6UmZwW_agz-FbQ", + "cell_type": "code", + "source": [ + "computedPvBaseCL_PR.Value.Should().Be( expectedPvBaseCL_PR[3] );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YAUW6hLjTkSDSB8hvqc-Ow", + "cell_type": "markdown", + "source": [ + "## End of Period" + ], + "metadata": {} + }, + { + "id": "ED73CBkcQkyvPg6_7eDFSg", + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type End of Period is:" + ], + "metadata": {} + }, + { + "id": "k3jsi34sxkSGoxKA1Btb1g", + "cell_type": "code", + "source": [ + "var idEOP = Test.GetIdentity(groupOfContract, \"EOP\", \"C\");", + "\nidEOP" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "s86AHJ-4Pk6Va461mh5gBQ", + "cell_type": "code", + "source": [ + "var computedPvBaseEOP_NIC = Test.GetScope((idEOP, \"NIC\", \"BE\", (int?)null));", + "\ncomputedPvBaseEOP_NIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QVXK0fUvN0-yuvBbKXPPrw", + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, for EOP AoCType, the PVB is equal to the CDC of the parent AoC step, while the PPV is the $(\\text{S}+\\text{TS})$-th element of the PVB." + ], + "metadata": {} + }, + { + "id": "22vabLHnN0uty9-9BNNPNg", + "cell_type": "code", + "source": [ + "var eopReferenceAocStep = Test.GetScope(idEOP).Value;", + "\neopReferenceAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ECiuOq0oL0eK5tMnQpoHtg", + "cell_type": "code", + "source": [ + "var discountedCL_NIC = Test.GetScope((idEOP with {AocType = eopReferenceAocStep.AocType, Novelty = eopReferenceAocStep.Novelty}, \"NIC\", \"BE\", (int?)null));", + "\ndiscountedCL_NIC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TgfGcomxyEu_Bi31dr0a8Q", + "cell_type": "code", + "source": [ + "var expectedPvBaseEOP_NIC = discountedCL_NIC.Values;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "COrZzNoVR0uPcoTvusJl9A", + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ], + "metadata": {} + }, + { + "id": "uHz3FD5pz0KtlPWvehPSTw", + "cell_type": "code", + "source": [ + "computedPvBaseEOP_NIC.Values.CheckEquality( expectedPvBaseEOP_NIC )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "NgccZKROIUGyHphm6Pt3mA", + "cell_type": "code", + "source": [ + "computedPvBaseEOP_NIC.Value == expectedPvBaseEOP_NIC[3]" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9jo2Z3ljfkyeYFEYk8YevQ", + "cell_type": "code", + "source": [ + "computedPvBaseEOP_NIC.Values.CheckEquality( expectedPvBaseEOP_NIC ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "wQEKDnBmiEiCcxaQ5z8n_Q", + "cell_type": "code", + "source": [ + "computedPvBaseEOP_NIC.Value.Should().Be( expectedPvBaseEOP_NIC[3] );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TYv8HCkwJ0-eIPL5UgmkSg", + "cell_type": "markdown", + "source": [ + "## Check for zero PVB values" + ], + "metadata": {} + }, + { + "id": "ypVkZQiC50KtLKlrkxwfWA", + "cell_type": "markdown", + "source": [ + "### Amortization" + ], + "metadata": {} + }, + { + "id": "f6LQtXZHZE60NfgYXKiAmg", + "cell_type": "markdown", + "source": [ + "For AM AoCType, the PVB values are zero, i.e. Amortization is not part of the Present Value computation. In this subsection we check whether the corresponding values are zero accordingly. " + ], + "metadata": {} + }, + { + "id": "YmNDcj0tDEObggNuOxfFVg", + "cell_type": "code", + "source": [ + "var idAM = Test.GetIdentity(groupOfContract, \"AM\", \"C\");", + "\nidAM" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Hbvbc_-ghkCPuBcY4CaNSw", + "cell_type": "code", + "source": [ + "var computedPvBaseAM_PR = Test.GetScope((idAM, \"PR\", \"BE\", (int?)null));", + "\ncomputedPvBaseAM_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vtA_SwM1FkWUvn7cz_gsEg", + "cell_type": "code", + "source": [ + "var computedPvBaseAM_PR = Test.GetScope((idAM, \"NIC\", \"BE\", (int?)null));", + "\ncomputedPvBaseAM_PR" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Hm9t12cEPEq0qfPXqqQKDA", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Amortization Factors" + ], + "metadata": {} + }, + { + "id": "HIn4-XNBlUC_ryCdXqFJXw", + "cell_type": "markdown", + "source": [ + "The amortization factors (AMF) are calculated from the corresponding Nominal and Discounted Cashflows with Calculation Type being *Coverage Units* (CU). ", + "\nThe monthly AMF is", + "\n", + "\n$$", + "\n\\text{AMF}^{\\text{Monthly}}_t = 1 - \\frac{ \\text{Nominal}^{\\text{Coverage Units}}_t } { \\text{CDC}^{\\text{Coverage Units}}_t } ~,", + "\n$$", + "\n", + "\nwhile the AMF related to the current period is", + "\n", + "\n$$", + "\n\\text{AMF} = \\prod _{t = \\text{S}}^{\\text{S}+\\text{TS}} \\text{AMF}^{\\text{Monthly}}_t ~.", + "\n$$", + "\n", + "\nwhere the shift S and Time Step TS for the [current period](#year-and-period) are" + ], + "metadata": {} + }, + { + "id": "GMNrVzKXH0ymV23dJDvYKQ", + "cell_type": "code", + "source": [ + "var projectionPeriod = 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YPFhl76CQkyB4G8ObloZRg", + "cell_type": "code", + "source": [ + "var shift = Test.GetStorage().GetShift(projectionPeriod);", + "\nshift" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-kXqVC_kq0CICZBKBb1HlQ", + "cell_type": "code", + "source": [ + "var timeStep = Test.GetStorage().GetTimeStep(projectionPeriod);", + "\ntimeStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "t4HaEWnCNk6mQabiDiws1w", + "cell_type": "markdown", + "source": [ + "## Monthly Amortization" + ], + "metadata": {} + }, + { + "id": "xeALkGs7xUeu3Y4WpeNO1Q", + "cell_type": "markdown", + "source": [ + "The computed monthly and current period Amortization Factors derived from a non-zero [imported](#year-and-period) nominal cashflows and its corresponding discounted are shown in the following" + ], + "metadata": {} + }, + { + "id": "L1ZjEB2bYkqJCYEQcSaCLA", + "cell_type": "code", + "source": [ + "var idAM = Test.GetIdentity(groupOfContract, \"CL\", \"C\");", + "\nidAM" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "P_fB5G8CbkOe7_gqmr8nQA", + "cell_type": "code", + "source": [ + "var nominalCashflowAmortizationFactorTest = Test.GetScope( (idAM, default(string), \"CU\", (int?)null) );", + "\nnominalCashflowAmortizationFactorTest" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nwNr460Q5kO_3WOTIbp0qQ", + "cell_type": "code", + "source": [ + "var discountedCashflowAmortizationFactorTest = Test.GetScope(idAM);", + "\ndiscountedCashflowAmortizationFactorTest" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "uCI4iAP0DUGsPQOWdrwDuA", + "cell_type": "code", + "source": [ + "var computedMonthlyAmortizationFactor = Test.GetScope(idAM with {AocType = \"AM\"});", + "\ncomputedMonthlyAmortizationFactor" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gHcGaR3jfEWKUAK4D2kCVw", + "cell_type": "markdown", + "source": [ + "In the following cell we independently evaluate the expected monthly amortization factor according to the [formula above](#amortization-factor) and we check whether expected vs computed match" + ], + "metadata": {} + }, + { + "id": "I8F4XooarU6ejB9dIO3ByA", + "cell_type": "code", + "source": [ + "var expectedMonthlyAmortizationFactor = nominalCashflowAmortizationFactorTest.Values.Zip(discountedCashflowAmortizationFactorTest.Values, ", + "\n (nominal, discountedCumulated) => 1 - nominal / discountedCumulated ).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QwB0UIilbkK-CRTF-jWgEA", + "cell_type": "code", + "source": [ + "expectedMonthlyAmortizationFactor.RepeatOnce()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_66rpQUzrU-3wQQMLfLqTw", + "cell_type": "code", + "source": [ + "computedMonthlyAmortizationFactor.MonthlyAmortizationFactors.CheckEquality( expectedMonthlyAmortizationFactor )" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ibllj4WfMkCzKaaYRuhfmA", + "cell_type": "code", + "source": [ + "computedMonthlyAmortizationFactor.MonthlyAmortizationFactors.CheckEquality( expectedMonthlyAmortizationFactor ).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Jk9YlP6QCkqRxZo-o68MsA", + "cell_type": "markdown", + "source": [ + "## Current Period" + ], + "metadata": {} + }, + { + "id": "DTl5o5jz_0erzyZWFTpUHQ", + "cell_type": "markdown", + "source": [ + "The computed current period amortization factor is" + ], + "metadata": {} + }, + { + "id": "PCy8Dakbh0mPaY2sEWzjGg", + "cell_type": "code", + "source": [ + "var computedCurrentPeriodAmortizationFactor = Test.GetScope(idAM with {AocType = \"AM\"});", + "\ncomputedCurrentPeriodAmortizationFactor" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "FdbZR9Yuy0-UNKH3vCixGw", + "cell_type": "markdown", + "source": [ + "Conversely, the current period Amortization factor can be independently computed using the [formula above](#amortization-factor) as" + ], + "metadata": {} + }, + { + "id": "w8ypGjX1wUGEjtCySuAp3w", + "cell_type": "code", + "source": [ + "var expectedCurrentPeriodAmortizationFactor = expectedMonthlyAmortizationFactor.Skip(shift).Take(timeStep).Aggregate(1d, (x, y) => x * y);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YwRfJmVI3UmwsjBL1JE48Q", + "cell_type": "code", + "source": [ + "expectedCurrentPeriodAmortizationFactor" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "33_7tRKRmUu9inImy1G2VQ", + "cell_type": "code", + "source": [ + "computedCurrentPeriodAmortizationFactor.Value == expectedCurrentPeriodAmortizationFactor" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "rM6pE_9pL0SCB56yFBmlUA", + "cell_type": "code", + "source": [ + "computedCurrentPeriodAmortizationFactor.Value.Should().Be( expectedCurrentPeriodAmortizationFactor );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zJ4a8KsYUEWmMuBSKeJn0g", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Results persisted" + ], + "metadata": {} + }, + { + "id": "c4kFsHdrzEut20I1sKx5wQ", + "cell_type": "markdown", + "source": [ + "The last step during the Cashflow import is to save, namely *persist* the Present Values computed with *locked* (L) and *current* (C) economic basis, and calculation type being *Best Estimate* (BE). ", + "\n", + "\nThese data is the starting point of the [Contractual Service Margin calculation](\"SpecificationsCSM\")." + ], + "metadata": {} + }, + { + "id": "zco2828uiUeNWEkjLJSbmA", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/SpecificationsSetup.ipynb b/Test/SpecificationsSetup.ipynb new file mode 100644 index 00000000..8fdfb7ae --- /dev/null +++ b/Test/SpecificationsSetup.ipynb @@ -0,0 +1,137 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "fE38qOjHW0a08mH8kJrwSg", + "cell_type": "code", + "source": [ + "#!import \"../Import/ImportScopeCalculation\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9xNRIpaJukO9dK_x-P6MAg", + "cell_type": "code", + "source": [ + "public interface Universe : IMutableScopeWithStorage{}", + "\n", + "\npublic async Task StartCalculatorAsync(string reportingNode, int year, int month, string economicBasis, Periodicity period, string format) ", + "\n{", + "\n ", + "\n var importArgs = new ImportArgs(reportingNode, year, month, period, null, format);", + "\n Workspace.Reset();", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n", + "\n var partition = (await DataSource.Query().Where(p => p.ReportingNode == importArgs.ReportingNode &&", + "\n p.Year == importArgs.Year &&", + "\n p.Month == importArgs.Month &&", + "\n p.Scenario == importArgs.Scenario", + "\n ).ToArrayAsync()).Single().Id;", + "\n await DataSource.Partition.SetAsync(partition);", + "\n", + "\n //Set Workspace as when the parsing is completed.", + "\n if(importArgs.ImportFormat == ImportFormats.Actual)", + "\n { ", + "\n await Workspace.UpdateAsync(await DataSource.Query()", + "\n .Where(x => x.Partition == partition && ", + "\n new string[]{EstimateTypes.A, EstimateTypes.AA, EstimateTypes.OA}.Contains(x.EstimateType) && ", + "\n new string[]{AocTypes.CF, AocTypes.WO}.Contains(x.AocType))", + "\n .ToArrayAsync());", + "\n }", + "\n else if(importArgs.ImportFormat == ImportFormats.Opening)", + "\n { ", + "\n await Workspace.UpdateAsync(await DataSource.Query()", + "\n .Where(x => x.Partition == partition && ", + "\n new string[]{ EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.DA}.Contains(x.EstimateType) && ", + "\n x.AocType == AocTypes.BOP && x.Novelty == Novelties.I)", + "\n .ToArrayAsync());", + "\n }", + "\n else", + "\n {", + "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => x.Partition == partition).ToArrayAsync());", + "\n }", + "\n var storage = new ImportStorage(importArgs, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n return Scopes.ForStorage(storage).WithContext(economicBasis).ToScope();", + "\n}", + "\n", + "\npublic static ImportIdentity GetIdentity (this Universe universe, string dataNode, string aocType, string novelty) ", + "\n => universe.GetScope(dataNode).Identities.Single( x => x.AocType == aocType && x.Novelty == novelty );", + "\n", + "\nstatic T GetValidElement(this IList array, int index) => GetElementOrDefault(array, index);", + "\n", + "\nstatic T GetValidElement(this IEnumerable array, int index) => GetElementOrDefault(array.ToArray(), index);", + "\n", + "\nstatic void ForEach(this IEnumerable self, Action action) => self.ToList().ForEach(action);", + "\n", + "\npublic static IfrsVariable FromPvToIfrsVariable(this PvBase scope)", + "\n => new IfrsVariable{ EconomicBasis = scope.EconomicBasis, ", + "\n EstimateType = scope.Identity.CalculationType, ", + "\n DataNode = scope.Identity.Id.DataNode, ", + "\n AocType = scope.Identity.Id.AocType, ", + "\n Novelty = scope.Identity.Id.Novelty, ", + "\n AccidentYear = scope.Identity.AccidentYear,", + "\n AmountType = scope.Identity.AmountType,", + "\n Value = scope.Value,", + "\n Partition = scope.GetStorage().TargetPartition };", + "\n", + "\npublic static IfrsVariable FromCsmToIfrsVariable(this Csm scope)", + "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", + "\n DataNode = scope.Identity.DataNode, ", + "\n AocType = scope.Identity.AocType, ", + "\n Novelty = scope.Identity.Novelty, ", + "\n Value = scope.Value,", + "\n Partition = scope.GetStorage().TargetPartition };", + "\n", + "\npublic static IfrsVariable FromLcToIfrsVariable(this Lc scope)", + "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", + "\n DataNode = scope.Identity.DataNode, ", + "\n AocType = scope.Identity.AocType, ", + "\n Novelty = scope.Identity.Novelty, ", + "\n Value = scope.Value,", + "\n Partition = scope.GetStorage().TargetPartition };", + "\n", + "\npublic static IfrsVariable FromLoReCoToIfrsVariable(this LoReCo scope)", + "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", + "\n DataNode = scope.Identity.DataNode, ", + "\n AocType = scope.Identity.AocType, ", + "\n Novelty = scope.Identity.Novelty, ", + "\n Value = scope.Value,", + "\n Partition = scope.GetStorage().TargetPartition };" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nbL-Fjewnk-tw5Vk1IJ2rg", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/SpecificationsTechnicalMargin.ipynb b/Test/SpecificationsTechnicalMargin.ipynb new file mode 100644 index 00000000..7368b76c --- /dev/null +++ b/Test/SpecificationsTechnicalMargin.ipynb @@ -0,0 +1,2576 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "g8tjy1GbI0uoEDhZW9OubA", + "cell_type": "markdown", + "source": [ + "

Technical Margin Specifications

" + ], + "metadata": {} + }, + { + "id": "x6HTq-dyx0CT0axGCN5uCw", + "cell_type": "markdown", + "source": [ + "The aim of this notebook is to document the Technical Margin (TM) and its allocation to the Contractual Service Margin (CSM), Loss Component (LC), or Loss Recovery Component (LoReCo). The process is pictorially explained in the following flowchart. ", + "\n", + "\n", + "\n
", + "\n", + "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." + ], + "metadata": {} + }, + { + "id": "LhxZv_5tLEW3BCU74MttbA", + "cell_type": "markdown", + "source": [ + "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + ], + "metadata": {} + }, + { + "id": "yPpeVsREbUy--NQi9jbNpw", + "cell_type": "code", + "source": [ + "#!import \"SpecificationsSetup\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "U3AjnYiM5kuSmp75cguUSA", + "cell_type": "markdown", + "source": [ + "---" + ], + "metadata": {} + }, + { + "id": "ECkaAKQIMEu5hqUdpeBq8Q", + "cell_type": "markdown", + "source": [ + "# Import Data" + ], + "metadata": {} + }, + { + "id": "SEMqfkxNU0e_-5mrR4lZTw", + "cell_type": "markdown", + "source": [ + "", + "\n## Current Period" + ], + "metadata": {} + }, + { + "id": "IvTb1XGZ1kuJ-VvXkuWNJw", + "cell_type": "markdown", + "source": [ + "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" + ], + "metadata": {} + }, + { + "id": "KdFdFW3OhUy3KzhPTiarkg", + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;", + "\nvar economicBasis = \"L\" ;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "UnwIzmJO6EeRXQWBbmoK1g", + "cell_type": "markdown", + "source": [ + "Import the Dimensions, Parameters, Nominal Cashflows, and Actuals from the corresponding csv files in Initialization/Systemorph/" + ], + "metadata": {} + }, + { + "id": "xPBxX-MYjEirprXfdCjqHw", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8lAk_SdyNEmrDVylgM3ueg", + "cell_type": "markdown", + "source": [ + "Initialization of the Test Suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" + ], + "metadata": {} + }, + { + "id": "LZ2n8pzel0OnpsJ86gHLDw", + "cell_type": "code", + "source": [ + "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YRjwR8fuJkK9bvH84fq8dA", + "cell_type": "markdown", + "source": [ + "", + "\n## View loaded Data Nodes" + ], + "metadata": {} + }, + { + "id": "YEMgdgKuwEe_bIe-xkd09g", + "cell_type": "markdown", + "source": [ + "The imported active Data Nodes from Initialization/Systemorph/DataNodes.csv are " + ], + "metadata": {} + }, + { + "id": "uS9vfK-rBUiZsfCYiJzIpA", + "cell_type": "code", + "source": [ + "Test.GetStorage().DataNodeDataBySystemName" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LvO_qjZPmEOI6YxzgwM4vg", + "cell_type": "markdown", + "source": [ + "whereas the Data Nodes of your imported Cashflows are" + ], + "metadata": {} + }, + { + "id": "jpqlfwEBkU20upkPfktIQA", + "cell_type": "code", + "source": [ + "Test.GetStorage().DataNodesByImportScope[ImportScope.Primary]" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Km-AMREk2ECK0lggstN9yA", + "cell_type": "markdown", + "source": [ + "Please select here below the target Data Node for executing the tests below:" + ], + "metadata": {} + }, + { + "id": "KeB4MbA30U-GTokbWzsbNw", + "cell_type": "code", + "source": [ + "var dataNode = \"DT1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "yjMtNI_UpEOFhOhlYPIjdg", + "cell_type": "markdown", + "source": [ + "## View list of Identities" + ], + "metadata": {} + }, + { + "id": "2suX-6pDYUu9ZRoKpbzwtg", + "cell_type": "markdown", + "source": [ + "Based on the Cashflows imported, the list of all possible identities, i.e. combinations of valid Data Nodes, Aoc steps, and Novelties, is contructed and reported here below:" + ], + "metadata": {} + }, + { + "id": "uXw2nYCpZ0i16yt57O-hZw", + "cell_type": "code", + "source": [ + "var allIdentities = Test.GetScopes(Test.GetStorage().DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "PpgNb9iz3kaMC2BeZoDKXQ", + "cell_type": "code", + "source": [ + "allIdentities" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "FX3f8E0cn0iRfjDMfGMWMw", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Present Value" + ], + "metadata": {} + }, + { + "id": "bjt2kV7OaU-pgEwV4_f7cw", + "cell_type": "markdown", + "source": [ + "Projected Present Values (PPVs) are calculated for each Amount Type (AT) either with the *locked-in* (L) and with the *current* (C) Yield Curves. While the former is the latest available as per end of the DataNode's inception year, the latter is the latest available as per the current period. ", + "\nPPVs for both Economic Basis L and C have been defined [here](../Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", + "\n", + "\nAccording to the BBA methodology, the CSM calculation uses the PV with locked-in Yield Curve simply defined as", + "\n", + "\n$$", + "\n\\text{PV Locked}(\\text{AoC}, \\text{AT}) = \\text{PPV}(\\text{AoC}, \\text{AT}) \\big|_{\\substack{ \\text{Calculation Type = BE} \\\\ \\text{Economic Base = L} } }", + "\n$$" + ], + "metadata": {} + }, + { + "id": "z3MoqQ9eQUS09tb1mXkFyA", + "cell_type": "code", + "source": [ + "var pvsLocked = allIdentities.SelectMany(id => Test.GetScope(id).PresentValues", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromPvToIfrsVariable())).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "t7tRCeCG10KKMVZzfO_pPg", + "cell_type": "markdown", + "source": [ + "Below a view of the computed locked-in PV " + ], + "metadata": {} + }, + { + "id": "OIen-nXHD0SiauOT9N-_Bg", + "cell_type": "code", + "source": [ + "Report.ForObjects(pvsLocked)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.EconomicBasis)", + "\n .GroupColumnsBy(x => x.AmountType)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "muPGuU2J_0C0ajt9hkta5A", + "cell_type": "markdown", + "source": [ + "Aggregated values are also available as the sum over all [Amount Types](../DataModel/DataStructure#amount-type):", + "\n", + "\n$$", + "\n\\text{PV Locked Value}(\\text{AoC}) = \\sum_{\\text{AT}} \\text{PV Locked}(\\text{AoC}, \\text{AT})", + "\n$$" + ], + "metadata": {} + }, + { + "id": "kvGGn3Q4rUex05dzYM9qdg", + "cell_type": "markdown", + "source": [ + "Here below an example" + ], + "metadata": {} + }, + { + "id": "9_XxzJoITE-6372AHPhE3g", + "cell_type": "code", + "source": [ + "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "R9nUtmCCQECPK-w_Mp_yVw", + "cell_type": "code", + "source": [ + "id_BoP_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "du2mo7J8002QJbtRt584Mw", + "cell_type": "code", + "source": [ + "Test.GetScope( id_BoP_I ).Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_OxvDZWrPka_CFvaMAisxg", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Risk Adjustment" + ], + "metadata": {} + }, + { + "id": "376Njyw59EGhWrieNRi8jQ", + "cell_type": "markdown", + "source": [ + "The CSM calculation also uses locked-in Risk Adjustment (RA Locked) which is retrieved from the corresponding Present Value with [Calculation Type](../DataModel/DataStructure#calculation-type) being RA defined [here](../Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", + "\n", + "\nRisk Adjustment values can be written as", + "\n", + "\n$$", + "\n\\text{RA Locked Value}(\\text{AoC}) = \\text{PV}(\\text{AoC})|_{\\substack{ \\text{Calculation Type = RA} \\\\ \\text{Economic Base = L} }}", + "\n$$", + "\n", + "\nwhere the imported Cashflows for the RA Calculation Type are already aggregated over all [Amount Types](../DataModel/DataStructure#amount-type)." + ], + "metadata": {} + }, + { + "id": "3siM-DZsEEiBkk5Y3FRKFg", + "cell_type": "markdown", + "source": [ + "Here below an example" + ], + "metadata": {} + }, + { + "id": "Xl2yuS6a60C9Quny8zQ-5A", + "cell_type": "code", + "source": [ + "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LSaHrUxyq0i4azSGh961Jg", + "cell_type": "code", + "source": [ + "id_BoP_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RuOYh7rjz0G8Mc61JSv5Yg", + "cell_type": "code", + "source": [ + "Test.GetScope( id_BoP_I ).Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qAzxMRN-SkuuSQuz6UYYYQ", + "cell_type": "markdown", + "source": [ + "The RA Locked per Data Node imported are" + ], + "metadata": {} + }, + { + "id": "I6YzC1vPqUKXP9iGgM9VCw", + "cell_type": "code", + "source": [ + "var rasLocked = allIdentities.SelectMany(id => Test.GetScope(id).PresentValues", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromPvToIfrsVariable())).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "iYZeYBNeU0C41iCvscI1CA", + "cell_type": "code", + "source": [ + "Report.ForObjects(rasLocked)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.EconomicBasis)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "fuyUZe63NEiB09VJA2Na4A", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Technical Margin" + ], + "metadata": {} + }, + { + "id": "2VStZINSF0KMaeav25AQSQ", + "cell_type": "markdown", + "source": [ + "For the computation of the CSM or LC components for each AoC step, it is convenient to introduce the notion of technical margin (TM).", + "\n", + "\nFirstly, it is useful to define the so-called Aggregated Technical Margin (ATM)", + "\n", + "\n$$", + "\n\\text{ATM} (\\text{AoC}) = \\sum_{s\\in\\text{previous AoC steps}} \\text{TM}(s) ~,", + "\n$$", + "\n", + "\nand the Interest Accretion Factor (IAF) ", + "\n", + "\n$$", + "\n\\text{IAF} = \\prod_{i=1}^{\\text{TS}} (1 + \\text{YC}_i) - 1 ~.", + "\n$$", + "\n", + "\nThe TM is defined as", + "\n", + "\n$$", + "\n\\text{TM}(\\text{AoC}) = \\left\\{", + "\n\\begin{array}{rl}", + "\n\\text{TM}(\\rm{EOP}) \\text{ of the previous period} ~ & \\text{if }s = \\text{BOP and Novelty is In-Force}. \\\\", + "\n0 ~ & \\text{if }s = \\text{CF}. \\\\", + "\n\\text{IAF} \\cdot ~ \\text{ATM}(\\text{AoC}) ~ & \\text{if }s = \\text{IA}. \\\\", + "\n\\rm{Premiums} + \\text{Attributable Expense and Commissions} + \\text{Investment Claims} ~ & \\text{if }s = \\text{EA}. \\\\", + "\n-\\text{AMF} \\cdot ~ \\text{ATM}(\\text{AoC}) ~ & \\text{if }s = \\text{AM}. \\\\", + "\n\\text{PV Locked Value}(\\text{AoC}) ", + "\n\\bigg|_{\\substack{\\text{Non Attributable} \\\\ ", + "\n \\text{Amount Types} \\\\ ", + "\n \\text{excluded}}} ", + "\n+ \\text{RA Locked Value}(\\text{AoC}) ~ & \\text{otherwise} ", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere AMF is the Amortization Factor that is defined [here](../Import/ImportScopeCalculation#amortization-factor) and tested [here](SpecificationsImportCashflows#amortization-factor), with YC being the [Yield Curve](#yield-curves) and TS is the Time-Step, ", + "\nand the Premiums, Attributable Expense and Commissions and Investment Claims terms are given by:", + "\n", + "\n$$", + "\n\\begin{array}{lcl}", + "\n\\rm{Premiums} &=& \\text{Premium Allocation Factor} \\cdot \\sum_{\\text{Amount Type}\\in\\{\\text{PR and its children}\\}}", + "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - ", + "\n \\big(\\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}} + \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~, \\\\", + "\n\\text{Attributable Expense and Commissions} &=& \\sum_{\\text{Amount Type}\\in\\{\\rm{ACA}, \\rm{AEA}\\}}", + "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - \\text{Actual}_{\\text{Novelty=C}} ~, \\\\", + "\n\\text{Investment Claims } &=& \\sum_{\\text{Amount Type}\\in\\{\\text{ICO and its children}\\}}", + "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - ", + "\n \\big( \\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}} + \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~.", + "\n\\end{array}", + "\n$$", + "\n", + "\nThe AoC Type **CF** is implicit for all formulas, PV is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **OA** and **AA** (see details [here](../Import/ImportScopeCalculation#actual-base))." + ], + "metadata": {} + }, + { + "id": "dHH8INfYdk6Y3NzMtPgJbA", + "cell_type": "markdown", + "source": [ + "## Beginning of Period" + ], + "metadata": {} + }, + { + "id": "X49_KQk8ek2l9u2XuCXQPw", + "cell_type": "code", + "source": [ + "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-MSegalanEGCyd9Lmbhk2g", + "cell_type": "code", + "source": [ + "id_BoP_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "GauKnHaTZk2qPtNwgM0kgQ", + "cell_type": "code", + "source": [ + "var computedTM_BoP_I = Test.GetScope(id_BoP_I);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "sDV3uzZnZE-xy3w3XNF0xA", + "cell_type": "code", + "source": [ + "computedTM_BoP_I.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3rv0eEV93Euw7OXSDpqR0w", + "cell_type": "markdown", + "source": [ + "The TM for BOP is equal to the TM for EOP of the previous period, that is, the sum of Csm, Loss Component and LoReCo as of at the end of last period (see the corresponding [formula](#technical-margins)). ", + "\n", + "\nThe corresponding **IFRS Variables** can be loaded directly from the *Storage*" + ], + "metadata": {} + }, + { + "id": "AOE-Piw6OUGsQ3Bl1AuGbw", + "cell_type": "code", + "source": [ + "var valueCsm = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.C, null);", + "\nvalueCsm" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YdYcIzhRG0CLSLEWQblsEA", + "cell_type": "code", + "source": [ + "var valueLc = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.L, null);", + "\nvalueLc" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0Onxmh3pPU6pxWFOSJt6DA", + "cell_type": "code", + "source": [ + "var valueLr = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.LR, null);", + "\nvalueLr" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0x0FA_cjZEWhsLSbrQq40g", + "cell_type": "code", + "source": [ + "var expectedTM_BoP_I = -valueCsm + valueLc + valueLr;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "SJSNzLoPJUiPGHBvEduNeQ", + "cell_type": "code", + "source": [ + "expectedTM_BoP_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8VnVUHSzbE-KpM6n4ONuQg", + "cell_type": "code", + "source": [ + "computedTM_BoP_I.Value.Should().BeApproximately( expectedTM_BoP_I, Precision );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xIQdOuzLvESRKcPIgcUsPQ", + "cell_type": "markdown", + "source": [ + "", + "\n## Model Corrections" + ], + "metadata": {} + }, + { + "id": "fNltK5PaA0Kw7wchmSNY_w", + "cell_type": "code", + "source": [ + "var id_MC_I = Test.GetIdentity(dataNode, \"MC\", \"I\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RRBZvtJHhUikmA_j6oodwg", + "cell_type": "code", + "source": [ + "id_MC_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "AOGe1hxqB0auL-m48n4LEQ", + "cell_type": "code", + "source": [ + "var computedTM_MC_I = Test.GetScope(id_MC_I);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "glwYLenix0mbVAzz2QauDg", + "cell_type": "code", + "source": [ + "computedTM_MC_I.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "NmTxRKBaJUSBln-u_LqjRA", + "cell_type": "markdown", + "source": [ + "The TM for MC is given by the default [formula](#technical-margins), i.e. it is equal to the sum of PV and RA Locked, where the former does not encompass the *NonAttributable* Amount Types" + ], + "metadata": {} + }, + { + "id": "cZmPuuHgGEiu5xbMXe88xQ", + "cell_type": "code", + "source": [ + "var expectedTM_MC_I = Test.GetScope(id_MC_I).Value + Test.GetScope( id_MC_I ).Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4L9o1tHqWki3eAAa7xkajA", + "cell_type": "code", + "source": [ + "expectedTM_MC_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "98q4ZQeegkuz71N9nfEHJg", + "cell_type": "code", + "source": [ + "computedTM_MC_I.Value.Should().BeApproximately( expectedTM_MC_I, Precision );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "B5PYDN0vMkqQxtE9Hyw25A", + "cell_type": "markdown", + "source": [ + "## Cash Flow" + ], + "metadata": {} + }, + { + "id": "499xH8CoX0GNNMn3D9roXg", + "cell_type": "code", + "source": [ + "var id_CF_I = Test.GetIdentity(dataNode, \"CF\", \"I\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "D0CbUxy5UUKrMhBCxYOZgg", + "cell_type": "code", + "source": [ + "id_CF_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5Wp3bWCQyUGxZdn4_VfQ6Q", + "cell_type": "code", + "source": [ + "var computedTM_CF_I = Test.GetScope(id_CF_I);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nd6a0CNEH0S7s7gB7otViA", + "cell_type": "code", + "source": [ + "computedTM_CF_I.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3n9f5rJGHUulpGouIZZY-w", + "cell_type": "markdown", + "source": [ + "According to the [formula](#technical-margins) above, the tecnical margin is 0 for the Cash Flow AoC step " + ], + "metadata": {} + }, + { + "id": "rKHBn4AQB0-Xf3R7XoqAaQ", + "cell_type": "code", + "source": [ + "computedTM_CF_I.Value.Should().BeApproximately( 0, Precision );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "AVeLuFLOC0C5EG_ODOOKgg", + "cell_type": "markdown", + "source": [ + "", + "\n## Interest Accretion" + ], + "metadata": {} + }, + { + "id": "fb9GTLqZ10S_IGiMHnsjtA", + "cell_type": "code", + "source": [ + "var id_IA_I = Test.GetIdentity(dataNode, \"IA\", \"I\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qTqnPKarN0W0KXR3GY0C2Q", + "cell_type": "code", + "source": [ + "id_IA_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-A6XSrwceEml_t5TZg447g", + "cell_type": "code", + "source": [ + "var computedTM_IA_I = Test.GetScope(id_IA_I);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "grxq6Y2xxkeWfYaEXojn4w", + "cell_type": "code", + "source": [ + "computedTM_IA_I.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "S4WYAmNv9kOPoeM8Utgblg", + "cell_type": "markdown", + "source": [ + "According to the [formula](#technical-margins) above, for the AoC step IA, the TM is equal to sum of the TMs of its previous AoC step multiplied by the IAF. " + ], + "metadata": {} + }, + { + "id": "4WhIgYaOr0aGNomU8C5-uA", + "cell_type": "markdown", + "source": [ + "The IAF associated to the current period (i.e. shift and time step) can be calculated from the shift, the time Step, and the Interest Rates" + ], + "metadata": {} + }, + { + "id": "4xfyE1DlUEqKdYMjYcygRw", + "cell_type": "code", + "source": [ + "var projectionPeriod = 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "RjAsyz82BECP1W48K-a7rA", + "cell_type": "code", + "source": [ + "var shift = Test.GetStorage().GetShift(projectionPeriod);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "wsHHDSkq-0-huGE1nvj3wQ", + "cell_type": "code", + "source": [ + "var timeStep = Test.GetStorage().GetTimeStep(projectionPeriod);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_gEJdoVPuUyxvU1oEF2Clw", + "cell_type": "code", + "source": [ + "(shift, timeStep)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "lNmbEvWOU0KMR_ZMy4DQpQ", + "cell_type": "code", + "source": [ + "var monthlyRates = Test.GetScope(id_IA_I);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "p4EWaRtorkCe5b4KbM6kFA", + "cell_type": "code", + "source": [ + "monthlyRates" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WhnDXZb69ES2SSJKZBdqPA", + "cell_type": "code", + "source": [ + "var IAF = Enumerable.Range(shift,timeStep).Select(i => monthlyRates.Interest.GetValidElement(i/12)).Aggregate(1.0d, (x, y) => x * y ) - 1.0d;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "A4PMm2aaGEejwDCTGWNc2w", + "cell_type": "code", + "source": [ + "IAF" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bJTIxBr6wUSGCYZKPko5RA", + "cell_type": "markdown", + "source": [ + "Since the previous AoC steps are" + ], + "metadata": {} + }, + { + "id": "fJq-TMlCuE-9Xsfek5KWug", + "cell_type": "code", + "source": [ + "var previousAocStep = Test.GetScope((id_IA_I, InputSource.Cashflow)).Values;", + "\npreviousAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "__ftTIzmrUS_DQUcSg34vg", + "cell_type": "markdown", + "source": [ + "the expected TM for the Amortization step reads" + ], + "metadata": {} + }, + { + "id": "FMyRgLCS30mHjSbBaZ6LgA", + "cell_type": "code", + "source": [ + "var expectedTM_IA_I = IAF * previousAocStep.Sum(aoc => Test.GetScope(id_IA_I with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "UBacH9pFIkG_rxoWOux8Rg", + "cell_type": "code", + "source": [ + "expectedTM_IA_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1-tr5DyvAEyE3oMQwJnJyA", + "cell_type": "code", + "source": [ + "computedTM_IA_I.Value.Should().BeApproximately( expectedTM_IA_I, Precision );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TAmMb4uGQ0CGG-bwB1k0bg", + "cell_type": "markdown", + "source": [ + "## Combined Liabilities" + ], + "metadata": {} + }, + { + "id": "RH193aFtkEq65MfZGDWFgQ", + "cell_type": "code", + "source": [ + "var id_CL_C = Test.GetIdentity(dataNode, \"CL\", \"C\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8Ug4OQB9lEWCTqQm6mWYdA", + "cell_type": "code", + "source": [ + "id_CL_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YDa8Beon7Umu1aUF0ONGJQ", + "cell_type": "code", + "source": [ + "var computedTM_CL_C = Test.GetScope(id_CL_C);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "eyyv-oaJE0KWTDaGRKqDpw", + "cell_type": "code", + "source": [ + "computedTM_CL_C.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VWU-qT5aV0GrakHpIsqPgQ", + "cell_type": "markdown", + "source": [ + "According to the default TM [formula](#technical-margins), for the CL step the TM is equal to the sum of PV and RA Locked, where the former does not encompass the *NonAttributable* Amount Types" + ], + "metadata": {} + }, + { + "id": "6EyiiEVRzkuI6YRXJQ1MTQ", + "cell_type": "code", + "source": [ + "var expectedTM_CL_C = Test.GetScope(id_CL_C).Value + Test.GetScope( id_CL_C ).Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0dDkPEAfeE-XhvLA7DH1Wg", + "cell_type": "code", + "source": [ + "expectedTM_CL_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MKmlpGv4-E64crKcv0Zlig", + "cell_type": "code", + "source": [ + "computedTM_CL_C.Value.Should().BeApproximately( expectedTM_CL_C, Precision );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WDBCcZKCLUeobaNw-juV1g", + "cell_type": "markdown", + "source": [ + "## Experience Adjustment" + ], + "metadata": {} + }, + { + "id": "2dBJGbhnzk6wE_QuqLi-RQ", + "cell_type": "code", + "source": [ + "var id_EA_C = Test.GetIdentity(dataNode, \"EA\", \"C\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hyawxe-JhUqkLHKOWPTdQw", + "cell_type": "code", + "source": [ + "id_EA_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "goQMZoAJfkSEn4o50YRUew", + "cell_type": "code", + "source": [ + "var computedTM_EA_C = Test.GetScope(id_EA_C);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8dX7PfDfwEWf7hkrubnBxw", + "cell_type": "code", + "source": [ + "computedTM_EA_C.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-WJt_6_ZIkGH0yWrnqftrQ", + "cell_type": "markdown", + "source": [ + "According to the [formula](#technical-margins) above, for the AoC step EA, the TM is equal to sum of the Premiums, Attributable Expense and Commissions, and Investment Claims. Here below we calculate these terms individually." + ], + "metadata": {} + }, + { + "id": "DB62V_OoakmF-fa0ir-6vg", + "cell_type": "markdown", + "source": [ + "The Premiums, Attributable Expense and Commissions and Investment Claims Present Values and Actuals are calculated using the CF AoC step. Therefore, as first step we define the relevant AoC step and Novelties:" + ], + "metadata": {} + }, + { + "id": "tGqV5u76l0-NIz-zJDKesQ", + "cell_type": "code", + "source": [ + "var referenceAoCType = Test.GetScope(id_EA_C).Value.AocType;", + "\nvar referenceAoC = Test.GetStorage().GetNovelties().Select(n => new AocStep(referenceAoCType, n));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tFXCsZ7yPkaUO_sP6Rf4dw", + "cell_type": "code", + "source": [ + "referenceAoC" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Zn9OSvz3M02EYNKavRdHWA", + "cell_type": "markdown", + "source": [ + "**Premiums**" + ], + "metadata": {} + }, + { + "id": "hD28G9xlTki7-KNMU73QQQ", + "cell_type": "markdown", + "source": [ + "The list of Premiums Amount Type defined in the imported dimensions and the Premium Allocation Factor can be retrieved" + ], + "metadata": {} + }, + { + "id": "WPVewiJ-ZUKbnl0snAuRBA", + "cell_type": "code", + "source": [ + "Test.GetStorage().GetPremiums()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "N6sWBi5BvkKF2O4N78nT_Q", + "cell_type": "code", + "source": [ + "var premiumAllocationFactor = Test.GetStorage().GetPremiumAllocationFactor(id_EA_C);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Fmxi3kQshEaXnPNNsbhPNg", + "cell_type": "code", + "source": [ + "premiumAllocationFactor" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "GY7vCaRdK0GOmI8q5PX9_Q", + "cell_type": "markdown", + "source": [ + "Lastly, the Premiums term is" + ], + "metadata": {} + }, + { + "id": "5-HIYLo-bk2YFsABuEJCsQ", + "cell_type": "code", + "source": [ + "var premiums = premiumAllocationFactor * Test.GetStorage().GetPremiums()", + "\n .Sum(p => referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.A, (int?)null)).Value)", + "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.AA, (int?)null)).Value)", + "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.OA, (int?)null)).Value)", + "\n );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "fg0ynhRLfEiTL68jnBFYPg", + "cell_type": "code", + "source": [ + "premiums" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "GpYhgIs7bkijYtGnn_rmug", + "cell_type": "markdown", + "source": [ + "**Attributable Expense and Commissions**" + ], + "metadata": {} + }, + { + "id": "HLALKVc8NE233oTSH12a-Q", + "cell_type": "markdown", + "source": [ + "Analogously, the Attributable Expense and Commissions term can be computed" + ], + "metadata": {} + }, + { + "id": "tPhUn5VaikiP2WaFNmIoiA", + "cell_type": "code", + "source": [ + "var attributableExpenseAndCommissions = new string[] {AmountTypes.ACA, AmountTypes.AEA}", + "\n .Sum(d => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, EstimateTypes.A, (int?)null)).Value));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CBelGvY28Uef9-9DjuaJSA", + "cell_type": "code", + "source": [ + "attributableExpenseAndCommissions" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "endWZOKckEWp2c6BLELK1w", + "cell_type": "markdown", + "source": [ + "**Investment Claims**" + ], + "metadata": {} + }, + { + "id": "AHIdM5P7nUyMySdWDQN-kA", + "cell_type": "markdown", + "source": [ + "Finally the Investment Claims term reads" + ], + "metadata": {} + }, + { + "id": "bETNZXjO2EuzRVFBP4Nykw", + "cell_type": "code", + "source": [ + "var investmentClaims = Test.GetStorage().GetInvestmentClaims()", + "\n .Sum(ic => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.A, (int?)null)).Value)", + "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.AA, (int?)null)).Value)", + "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.OA, (int?)null)).Value)", + "\n );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hKxm4Ea8-kCpGkmuQ8-P1g", + "cell_type": "code", + "source": [ + "investmentClaims" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tHqLLnVgKE6pcPnvAv06Tg", + "cell_type": "markdown", + "source": [ + "**Expected TM**" + ], + "metadata": {} + }, + { + "id": "ffxLkcddWUifhMB2Ybvzzw", + "cell_type": "code", + "source": [ + "var expectedTM_EA_C = premiums + attributableExpenseAndCommissions + investmentClaims;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "SUkya34JlUm2dEmvnV6bTQ", + "cell_type": "code", + "source": [ + "expectedTM_EA_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KL-ACiIWbkaCFXsaDZoW-g", + "cell_type": "code", + "source": [ + "computedTM_EA_C.Value.Should().BeApproximately( expectedTM_EA_C, Precision );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "aly806PPsk6nb1bq-n7-Sg", + "cell_type": "markdown", + "source": [ + "## Amortization" + ], + "metadata": {} + }, + { + "id": "bsMWbnZzwkiwXgJ8qAvFvw", + "cell_type": "code", + "source": [ + "var id_AM_C = Test.GetIdentity(dataNode, \"AM\", \"C\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "f4APi5_3CUmHUbP4cXLdcg", + "cell_type": "code", + "source": [ + "id_AM_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Rh7epJw7NUaRJ1RMc2rMQg", + "cell_type": "code", + "source": [ + "var computedTM_AM_C = Test.GetScope(id_AM_C);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8zkFkhgH00CXbsv5T8h-Hg", + "cell_type": "code", + "source": [ + "computedTM_AM_C.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "exXE3mAyIEi-kS4auuzrKQ", + "cell_type": "code", + "source": [ + "computedTM_AM_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "EpoM-9UMx0qwL68EXUoiiA", + "cell_type": "markdown", + "source": [ + "According to the [formula](#technical-margins) above, for the AoC step AM, the TM is equal to sum of the TMs of its previous AoC step multiplied by the amortization factor with opposite sign. ", + "\n", + "\nThe AoC step previous to Amortization are" + ], + "metadata": {} + }, + { + "id": "RWUkvmQU9kqvjgKafKtMGg", + "cell_type": "code", + "source": [ + "var previousAocStep = Test.GetScope((id_AM_C, InputSource.Cashflow)).Values;", + "\npreviousAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WvdwUX-cX0SvELfpTOrxHA", + "cell_type": "markdown", + "source": [ + "while the Amortization Factor can be retrieved in the following" + ], + "metadata": {} + }, + { + "id": "HTgPDX8Zw0agihg2o3LoWQ", + "cell_type": "code", + "source": [ + "Test.GetScope(id_AM_C)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "r74wo-n4PEiaFDs1bW_41w", + "cell_type": "markdown", + "source": [ + "Therefore, the expected TM for the Amortization step reads" + ], + "metadata": {} + }, + { + "id": "SznuOL-o1Uy5mmuI-jmWPw", + "cell_type": "code", + "source": [ + "var expectedTM_AM_C = -Test.GetScope(id_AM_C).Value * ", + "\n previousAocStep.Sum(aoc => Test.GetScope(id_AM_C with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "rEbKtIir70eeIiyYnSAFiA", + "cell_type": "code", + "source": [ + "expectedTM_AM_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5Boj82BZcUanZERZtQH1mA", + "cell_type": "code", + "source": [ + "computedTM_AM_C.Value.Should().BeApproximately( expectedTM_AM_C, Precision );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "IoyFPh2DekK36wAQkduuFw", + "cell_type": "markdown", + "source": [ + "## End of Period" + ], + "metadata": {} + }, + { + "id": "e7GBWeapNUCJFEwl3Hdlfw", + "cell_type": "code", + "source": [ + "var id_EoP_C = Test.GetIdentity(dataNode, \"EOP\", \"C\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bFFAsDW4HU21gY0oQl4w-g", + "cell_type": "code", + "source": [ + "id_EoP_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-NF7JtObB0el7f59d8rHzw", + "cell_type": "code", + "source": [ + "var computedTM_EoP_C = Test.GetScope(id_EoP_C);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "J6OQYmtTy0O6Pa4dqCaYEQ", + "cell_type": "code", + "source": [ + "computedTM_EoP_C.Value" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ar4enZGkDkahHzmCKHvxBA", + "cell_type": "code", + "source": [ + "var expectedTM_EoP_C = Test.GetScope( id_EoP_C ).Value + Test.GetScope( id_EoP_C ).Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Q-Rv4WF-uEOJenziP5Ko6w", + "cell_type": "code", + "source": [ + "expectedTM_EoP_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "GE0JdvladkOqE6BxVNRMcA", + "cell_type": "code", + "source": [ + "computedTM_EoP_C.Value.Should().BeApproximately( expectedTM_EoP_C, Precision );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XDuHL9hx2E6DU5ayGYHutQ", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Switch Logic " + ], + "metadata": {} + }, + { + "id": "NHk1HPZ3y0K-uGfMOBF1gQ", + "cell_type": "markdown", + "source": [ + "The CSM and LC figures are allocated for each AoC step based on the sign of the ATM. Specifically, for positive (negative) ATM, the TM of the current step is allocated to the LC (CSM), unless the TM flips the sign of the ATM. This special circumstance is named **switch**. It can happen at any AoC step with the only exception of Amortization where there is no switch from the previous step.", + "\nWhen a switch occurs the total contribution to the CSM (LC) prior the switching step is brought to 0 and the remaing amount is allocated to LC (CSM).", + "\n", + "\nIn the following the AoC chain is investigated." + ], + "metadata": {} + }, + { + "id": "qkwHpG9GrUmO52LhVW0gMw", + "cell_type": "markdown", + "source": [ + "## Beginning of Period", + "\n", + "\nFor the BOP, the last period is considered, which dictates that the corresponding EOP figures considered have necessarily Novelty of type *In-Force*.", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{BOP}) &=& \\text{CSM}(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force} \\\\", + "\n\\text{LC}(\\text{BOP}) &=& \\text{LC}(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", + "\n\\end{array}", + "\n$$" + ], + "metadata": {} + }, + { + "id": "x2DkfQwGp0q67zTOEqWSDg", + "cell_type": "code", + "source": [ + "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "U1ZDbeNAYUSlPIqSHFql-A", + "cell_type": "code", + "source": [ + "id_BoP_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "OeYWN1P_DEOPTJgMbEYdwg", + "cell_type": "code", + "source": [ + "var computedCSM_BoP_I = Test.GetScope(id_BoP_I).Value;", + "\nvar computedLC_BoP_I = Test.GetScope(id_BoP_I).Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ihEr80PWCkGZdhvb1ggfKw", + "cell_type": "code", + "source": [ + "(computedCSM_BoP_I, computedLC_BoP_I)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "gGKUWa-n40u9Xu3VNw4n7A", + "cell_type": "markdown", + "source": [ + "To understand where the BOP is allocated, we retrieve the corresponding TM and, based on its sign, we expect the CSM or the LC to be non-zero according to the [formula](#switch-logic) above" + ], + "metadata": {} + }, + { + "id": "GbsT5_IX40yquehB3bXzWg", + "cell_type": "code", + "source": [ + "var TM_BOP_I = Test.GetScope(id_BoP_I).Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VzVSQA_NVE2D__qk77LRuQ", + "cell_type": "code", + "source": [ + "TM_BOP_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VyqxO7jhD06tjnlyZWgklA", + "cell_type": "code", + "source": [ + "var expectedCSM_BoP_I = TM_BOP_I < 0 ? -TM_BOP_I : 0;", + "\nvar expectedLC_BoP_I = TM_BOP_I > 0 ? +TM_BOP_I : 0;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "I9Ou_OG9n0-4enuli2WR8w", + "cell_type": "code", + "source": [ + "(expectedCSM_BoP_I, expectedLC_BoP_I)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZGzRu0gOjEuAs_AaPiyaAA", + "cell_type": "code", + "source": [ + "computedCSM_BoP_I.CheckEquality(computedCSM_BoP_I).Should().Be(true);", + "\nexpectedLC_BoP_I.CheckEquality(computedLC_BoP_I).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Dmr2QZObzkCiSqWNVstsqA", + "cell_type": "markdown", + "source": [ + "## Following AoC steps" + ], + "metadata": {} + }, + { + "id": "QhyguKxmFkur5akQ_kuU4w", + "cell_type": "markdown", + "source": [ + "From the BOP up to the CL step, the switch logic is applied separately to the In-Force and New Business novelties." + ], + "metadata": {} + }, + { + "id": "j2v9TGxKBEi9vyAXzjnYRQ", + "cell_type": "code", + "source": [ + "var id_MC_I = Test.GetIdentity(dataNode, \"MC\", \"I\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "oURGBY049UO_6rpp5Yvd8w", + "cell_type": "code", + "source": [ + "id_MC_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Zz6IYfaXW0eEwAt1CFXLqQ", + "cell_type": "code", + "source": [ + "var computedCSM_MC_I = Test.GetScope(id_MC_I).Value;", + "\nvar computedLC_MC_I = Test.GetScope(id_MC_I).Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "anLo2TEZn0a-c-b58-NptA", + "cell_type": "code", + "source": [ + "(computedCSM_MC_I, computedLC_MC_I)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "_3ECx3xw6kaAPhipr_o3IQ", + "cell_type": "markdown", + "source": [ + "According to the [formula](#switch-logic) above this AoC step is allocated either to CSM or to LC based on the sign of ATM + TM. Both these two terms can be retrieved from the **TechnicalMargin** Scope." + ], + "metadata": {} + }, + { + "id": "vDlb6A-66UaV1dj-A7BpwA", + "cell_type": "code", + "source": [ + "var TM_MC_I = Test.GetScope(id_MC_I);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "tWklX6ndd0eQuh10WyJwow", + "cell_type": "code", + "source": [ + "TM_MC_I" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VShlk81fLE6vcS4-zPChpA", + "cell_type": "markdown", + "source": [ + "The correctness of the ATM can be checked by firstly withdrawing the previous AoC steps" + ], + "metadata": {} + }, + { + "id": "ZeVVDyOg8kiQOSI9_cx7Sg", + "cell_type": "code", + "source": [ + "var previousAocStep = Test.GetScope((id_MC_I, InputSource.Cashflow)).Values;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TGc_r6IcEUWsmmbS1dH8gA", + "cell_type": "code", + "source": [ + "previousAocStep" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "4LVnT3VEWkyKk021jdSe1g", + "cell_type": "markdown", + "source": [ + "and then evaluating the sum of the corresponding TMs" + ], + "metadata": {} + }, + { + "id": "C4MRuXZBHEWOoGmxdDMPNQ", + "cell_type": "code", + "source": [ + "var expectedATM = previousAocStep.Sum(aoc => Test.GetScope(id_MC_I with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "AjUcTq64mUiQGuUK9WLhpQ", + "cell_type": "code", + "source": [ + "expectedATM" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qG0nHl69Y0qX9agYsei91g", + "cell_type": "markdown", + "source": [ + "Therefore, the following condition for ATM calculated by the **TechnicalMargin** Scope needs to be fullfilled" + ], + "metadata": {} + }, + { + "id": "-2a6HsG0-U6ss9qGHoExYw", + "cell_type": "code", + "source": [ + "TM_MC_I.AggregatedValue.Should().BeApproximately( expectedATM, Precision );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "z3e8UQynb02Bjtq0B_KbcA", + "cell_type": "markdown", + "source": [ + "The CSM and LC can be allocated according to the [Switch Logic](#switch-logic)." + ], + "metadata": {} + }, + { + "id": "SpZykQISGUS5t5LfteXTqg", + "cell_type": "code", + "source": [ + "double expectedCSM_MC_I; ", + "\ndouble expectedLC_MC_I; " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8I15mZw2KUKeZMDPsOvYfg", + "cell_type": "code", + "source": [ + "var aggregated = TM_MC_I.Value + TM_MC_I.AggregatedValue;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Qw1GlZ5Edkaz3I-5i96u9A", + "cell_type": "markdown", + "source": [ + "If there is no switch from LC, i.e. $\\text{ATM} (\\text{AoC}) > 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\ge 0 $, then:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& 0 ~, \\\\", + "\n\\text{LC}(\\text{AoC}) &=& \\text{TM}(\\text{AoC}) ~.", + "\n\\end{array}", + "\n$$" + ], + "metadata": {} + }, + { + "id": "7da5XEhrhEu35M4vNuKJ7Q", + "cell_type": "code", + "source": [ + "if(TM_MC_I.AggregatedValue > 0 && aggregated >= 0) {", + "\n expectedCSM_MC_I = 0 ;", + "\n expectedLC_MC_I = TM_MC_I.Value ;", + "\n} " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "KbFNOw70mEePHWniU_e5Gw", + "cell_type": "markdown", + "source": [ + "If there is no switch from CSM, i.e. $\\text{ATM} (\\text{AoC}) \\le 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\le 0 $, then:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) ~, \\\\", + "\n\\text{LC}(\\text{AoC}) &=& 0 ~.", + "\n\\end{array}", + "\n$$" + ], + "metadata": {} + }, + { + "id": "fgaGOnieo0qKvh_7zYB2Iw", + "cell_type": "code", + "source": [ + "if(TM_MC_I.AggregatedValue < 0 && aggregated <= 0) {", + "\n expectedCSM_MC_I = -TM_MC_I.Value ;", + "\n expectedLC_MC_I = 0 ;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "wI01nxemTE6PWDDgvWjtww", + "cell_type": "markdown", + "source": [ + "If $\\text{ATM} (\\text{AoC}) > 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\le 0$, then there is a switch to CSM:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) -\\text{ATM} (\\text{AoC}) ~, \\\\", + "\n\\text{LC}(\\text{AoC}) &=& -\\text{ATM} (\\text{AoC}) ~.", + "\n\\end{array}", + "\n$$" + ], + "metadata": {} + }, + { + "id": "r_Z-PV3jnEe61s5dxqqeAQ", + "cell_type": "code", + "source": [ + "if(TM_MC_I.AggregatedValue > 0 && aggregated <= 0) {", + "\n expectedCSM_MC_I = -aggregated;", + "\n expectedLC_MC_I = -TM_MC_I.AggregatedValue ;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "UGTIjdFCpUOf3okJiq05Xw", + "cell_type": "markdown", + "source": [ + "On the other hand, if $\\text{ATM} (\\text{AoC}) \\le 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) > 0$, ", + "\nthen the switch is to LC:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& \\text{ATM} (\\text{AoC}) ~, \\\\", + "\n\\text{LC}(\\text{AoC}) &=& \\text{TM}(\\text{AoC}) + \\text{ATM} (\\text{AoC}) ~.", + "\n\\end{array}", + "\n$$" + ], + "metadata": {} + }, + { + "id": "b4tllqavSUaAPPPQ9-2xNw", + "cell_type": "code", + "source": [ + "if(TM_MC_I.AggregatedValue <= 0 && aggregated > 0) {", + "\n expectedCSM_MC_I = TM_MC_I.AggregatedValue ;", + "\n expectedLC_MC_I = aggregated ;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "7DcRpZcCLEurfCz1WhmBsA", + "cell_type": "markdown", + "source": [ + "Therefore, the expected CSM and LC for this step are" + ], + "metadata": {} + }, + { + "id": "Cynr0d0AokyhPo5thwHxng", + "cell_type": "code", + "source": [ + "(expectedCSM_MC_I, expectedLC_MC_I)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "jt1m57jeUUOnClnAWUh4GQ", + "cell_type": "code", + "source": [ + "expectedCSM_MC_I.CheckEquality(computedCSM_MC_I).Should().Be(true);", + "\nexpectedLC_MC_I.CheckEquality(computedLC_MC_I).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0CzQml-85UuZbrhJFsKLDw", + "cell_type": "markdown", + "source": [ + "", + "\n## Combined Liabilities" + ], + "metadata": {} + }, + { + "id": "l3-1ZxlOU06br5k6_VWJgw", + "cell_type": "markdown", + "source": [ + "The CL Aoc Step brings both contributions to CSM and LC together as the novelities are summed.", + "\n", + "\nFor the CL step, the logic is similar to the one above, except that a switch from LC to CSM can happen **because of New Business and despite of In-Force**, in which case we have:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) - \\text{ATM}(\\text{Last In-Force AoC step}) - \\text{TM}(\\text{Last In-Force AoC step}) \\\\", + "\n\\text{LC}(\\text{AoC}) &=& -\\text{ATM}(\\text{Last In-Force AoC step}) - \\text{TM}(\\text{Last In-Force AoC step})", + "\n\\end{array}", + "\n$$", + "\n", + "\nIf, on the other hand, the switch from LC to CSM happens **because of In-Force and despite of New Business**, then we have:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& - \\text{TM}(\\text{AoC}) - \\text{ATM}(\\text{Last NB AoC step}) - \\text{TM}(\\text{Last NB AoC step}) \\\\", + "\n\\text{LC}(\\text{AoC}) &=& - \\text{ATM}(\\text{Last NB AoC step}) - \\text{TM}(\\text{Last NB AoC step})", + "\n\\end{array}", + "\n$$", + "\n", + "\nFor the switch in the other direction, i.e. from CSM to LC the formulas are similar except that LC and CSM are swapped." + ], + "metadata": {} + }, + { + "id": "LbA7zjeoTUmzsL20pTogpg", + "cell_type": "code", + "source": [ + "var id_CL_C = Test.GetIdentity(dataNode, \"CL\", \"C\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "BQ0_Jmo4GUCeoSwaNpzSEQ", + "cell_type": "code", + "source": [ + "id_CL_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "b1ZovjyK206ocT3in7tJJg", + "cell_type": "code", + "source": [ + "var computedCSM_CL_C = Test.GetScope(id_CL_C).Value;", + "\nvar computedLC_CL_C = Test.GetScope(id_CL_C).Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "di_k8t-Q8k6S_g2qUV6UKA", + "cell_type": "code", + "source": [ + "(computedCSM_CL_C, computedLC_CL_C)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HNbDZeZA-0q7FhEWN2i1AA", + "cell_type": "markdown", + "source": [ + "The CL step considers the last step of both the New Business and the In Force Novelties to decide what to allocate to CSM or LC. " + ], + "metadata": {} + }, + { + "id": "gFyHo7Xd80Kx9qUhOBfakQ", + "cell_type": "code", + "source": [ + "var lastAocSteps = Test.GetScope((id_CL_C, InputSource.Cashflow)).Values.GroupBy(x => x.Novelty).Select(g => g.Last());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Z0o-1_Kj7kqDfc6VHr5cxQ", + "cell_type": "code", + "source": [ + "lastAocSteps" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "OJYdM2hIAk-hyqf4zANz0A", + "cell_type": "markdown", + "source": [ + "Selecting the corresponding AocTypes:" + ], + "metadata": {} + }, + { + "id": "W0LNije6AESOhExOn3cEIQ", + "cell_type": "code", + "source": [ + "var lastAocTypeNb = lastAocSteps.Single(x => x.Novelty == Novelties.N).AocType;", + "\nvar lastAocTypeI = lastAocSteps.Single(x => x.Novelty == Novelties.I).AocType;", + "\n(lastAocTypeI, lastAocTypeNb)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LQ6g6NwhGkaAn6cNDgnwLw", + "cell_type": "code", + "source": [ + "var lastTM_NewBusiness = Test.GetScope(id_CL_C with {AocType = lastAocTypeNb, Novelty = Novelties.N});" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "h_-vLUO1a0CaiTlvHdl-Qw", + "cell_type": "code", + "source": [ + "lastTM_NewBusiness" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "vx-ERfMXoEmPlM7YjfSpVg", + "cell_type": "code", + "source": [ + "var lastTM_InForce = Test.GetScope(id_CL_C with {AocType = lastAocTypeI, Novelty = Novelties.I});" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nEAfJcJBfU6e8ESe_G-HGQ", + "cell_type": "code", + "source": [ + "lastTM_InForce" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "IsysT0dxB02V9LtXUi4WKw", + "cell_type": "markdown", + "source": [ + "Conversely the TM and ATM for the CL step is" + ], + "metadata": {} + }, + { + "id": "0nCrk056Kki5-Lj4k_DNUA", + "cell_type": "code", + "source": [ + "var TM_Combined = Test.GetScope(id_CL_C);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HYP4Ehlpz06WTCeicsf-TA", + "cell_type": "code", + "source": [ + "TM_Combined" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VizwJ9n3JUWNn8VHtyyZRg", + "cell_type": "markdown", + "source": [ + "where the ATM of CL is given by the sum of the ATMs of the New Business and In Force Novelties" + ], + "metadata": {} + }, + { + "id": "_6wJKgMbikuQcgsNrkRUKA", + "cell_type": "code", + "source": [ + "var aggregatedNewBusiness = lastTM_NewBusiness.Value + lastTM_NewBusiness.AggregatedValue;", + "\nvar aggregatedInForce = lastTM_InForce.Value + lastTM_InForce.AggregatedValue;", + "\nvar sum = aggregatedNewBusiness + aggregatedInForce;", + "\nsum" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VmDd0wzbzEW0oE885Kyqww", + "cell_type": "code", + "source": [ + "( (sum - TM_Combined.AggregatedValue)/sum < 1.0e-12).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "19uVR0w7F02xd9KaJ2yVIQ", + "cell_type": "markdown", + "source": [ + "In order to decide where the TM of the CL step is allocated, one has to check the sign of the ATM + TM for both the New Business and the In Force" + ], + "metadata": {} + }, + { + "id": "QeZXbaKXGk2Vyp4P4dxgJg", + "cell_type": "code", + "source": [ + "var aggregatedCombined = TM_Combined.Value + TM_Combined.AggregatedValue;", + "\naggregatedCombined" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Njb3qejxeU6T_QL3ocb23g", + "cell_type": "markdown", + "source": [ + "According to the [formulas above](#combined-liabilities), for a positive (negative) aggregated CL value, the CL TM has to be allocated to LC (CSM). ", + "\n
In case the one of last Aoc step of the novelties (I, NB) has the sign of the CL ATM opposite to the CL ATM, the CL AocStep is used to introduce a balancing item to bring the ATM of the novelty with opposite sign to 0. ", + "\n
This is equivalent to execute the switch logic with a balancing item = ATM of the last AocStep having opposite sign to CL ATM. ", + "\n
Note that if CL TM is zero this results in allocating the same amount with opposite sign to CSM(note that the sign of the CSM componet is flipped) and LC." + ], + "metadata": {} + }, + { + "id": "PKCnye7OH0qMHL6PW1vWMw", + "cell_type": "code", + "source": [ + "double expectedCSM_CL_C; ", + "\ndouble expectedLC_CL_C; " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "mR_PzvyP50CGygsS3pFx9g", + "cell_type": "code", + "source": [ + "var balancingItem = aggregatedCombined < 0 ? aggregatedNewBusiness : aggregatedInForce;", + "\nbalancingItem" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hhE70xjs-EGuXjI4ztfscQ", + "cell_type": "code", + "source": [ + "", + "\nif(aggregatedCombined > 0) {", + "\n expectedCSM_CL_C = balancingItem ;", + "\n expectedLC_CL_C = TM_Combined.Value + balancingItem;", + "\n} else {", + "\n expectedLC_CL_C = - balancingItem ;", + "\n expectedCSM_CL_C = TM_Combined.Value - balancingItem ;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "474WEtEUPEqOIsiRVbHO0g", + "cell_type": "code", + "source": [ + "(expectedCSM_CL_C, expectedLC_CL_C)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-gNe5T_ZLEeVHsBfCLPhWA", + "cell_type": "code", + "source": [ + "expectedCSM_CL_C.CheckEquality(computedCSM_CL_C).Should().Be(true);", + "\nexpectedLC_CL_C.CheckEquality(computedLC_CL_C).Should().Be(true);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "DyvDoHzrBEq3_wVcCchkEw", + "cell_type": "markdown", + "source": [ + "## End Of Period", + "\n", + "\nFor the last AoC step, the EOP is the sum of all previous steps", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{EOP}) &=& \\sum_{s~\\in~\\text{previous AoC steps}} \\text{CSM}(s) ~, \\\\", + "\n\\text{LC}(\\text{EOP}) &=& \\sum_{s~\\in~\\text{previous AoC steps}} \\text{LC}(s) ~.", + "\n\\end{array}", + "\n$$" + ], + "metadata": {} + }, + { + "id": "_ESoopqaZU-By3wLhIBkgw", + "cell_type": "code", + "source": [ + "var id_EoP_C = Test.GetIdentity(dataNode, \"EOP\", \"C\");" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZqMiKYtLj0mrhg2Bk0SKbQ", + "cell_type": "code", + "source": [ + "id_EoP_C" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qHO12xBFj0OKhZj66J3uxQ", + "cell_type": "code", + "source": [ + "var computedCSM_EoP_C = Test.GetScope(id_EoP_C).Value;", + "\nvar computedLC_EoP_C = Test.GetScope(id_EoP_C).Value;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "C54gDBF8B0iE8erZtf9PDA", + "cell_type": "code", + "source": [ + "(computedCSM_EoP_C, computedLC_EoP_C)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MoN2gU7CgkmSAoAH8E3P4g", + "cell_type": "markdown", + "source": [ + "

", + "\n
", + "\nFor the reinsurance case, the switch logic is identical to the one described above, except that it uses the corresponding gross case TM to allocate the figure either to CSM or to LoReCo. The reinsurance gross TM multiplied by the weights coming from the Reinsurance Coverage Parameter (Data Node Parameters). In case a GRIC has multiple GICs, then these weighted TMs are aggregated.", + "\n
" + ], + "metadata": {} + }, + { + "id": "-17yUzUfYU-46uPh5jCLzQ", + "cell_type": "markdown", + "source": [ + "" + ], + "metadata": {} + }, + { + "id": "LHXDcjueYUy1IKvyMPuZyQ", + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Contractual Service Margin and Loss Component" + ], + "metadata": {} + }, + { + "id": "O7oZvk5RIk-EplmELWCLLw", + "cell_type": "markdown", + "source": [ + "Here below a view of the CSM and Loss Component results are shown. ", + "\n", + "\nNote: the Data Nodes with LiabilityType being *LIC* are excluded." + ], + "metadata": {} + }, + { + "id": "WQsEnHxeUkWa24cVa17ASw", + "cell_type": "code", + "source": [ + "var allIdentitiesWoLic = allIdentities.Where(id => Test.GetStorage().DataNodeDataBySystemName[id.DataNode].LiabilityType != \"LIC\").ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "ZClqTg9_EEKdli2o4Blwqw", + "cell_type": "code", + "source": [ + "var csm = allIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromCsmToIfrsVariable())).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VYCT72rdHE6fE0HDC7ygOQ", + "cell_type": "markdown", + "source": [ + "## Gross case" + ], + "metadata": {} + }, + { + "id": "UsRkibKobkCtFXhm5l__xQ", + "cell_type": "code", + "source": [ + "var allInsuranceIdentitiesWoLic = allIdentitiesWoLic.Where(id => !id.IsReinsurance).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "PirmpNw8w0yTsQZmMWqgKw", + "cell_type": "code", + "source": [ + "var lc = allInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromLcToIfrsVariable())).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "rqcC8OgZSEWmclwqnva9LQ", + "cell_type": "markdown", + "source": [ + "## Re-Insurance case (LoReCo)" + ], + "metadata": {} + }, + { + "id": "9FlZC2iKzkimZWgYZNcsRw", + "cell_type": "code", + "source": [ + "var allReInsuranceIdentitiesWoLic = allIdentitiesWoLic.Where(id => id.IsReinsurance).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "NZ39ut9ark6eMKtKoBbyOg", + "cell_type": "code", + "source": [ + "var loreco = allReInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromLoReCoToIfrsVariable())).ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "x-kOOIetOka_mQDABgu3oQ", + "cell_type": "markdown", + "source": [ + "## Summary" + ], + "metadata": {} + }, + { + "id": "mF7UvAY_-EKAlqSsnrQcNQ", + "cell_type": "code", + "source": [ + "Report.ForObjects( csm.Concat(lc).Concat(loreco) )", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupColumnsBy(x => x.EstimateType)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "WMr4L1n4PUOCiZT5gKh9ug", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/TechnicalMarginTest.ipynb b/Test/TechnicalMarginTest.ipynb new file mode 100644 index 00000000..d42316d9 --- /dev/null +++ b/Test/TechnicalMarginTest.ipynb @@ -0,0 +1,305 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "jaNl5tr4gEGSSk1KTK2HpA", + "cell_type": "markdown", + "source": [ + "

Technical Margin Allocation

" + ], + "metadata": {} + }, + { + "id": "E5WE0di2k0aFigu3aInmKw", + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "YndlmtSQOkuhu3OKAyNj0g", + "cell_type": "markdown", + "source": [ + "# Workspace Initialization " + ], + "metadata": {} + }, + { + "id": "7vwzSP8vUkSmgw1mvnWC1Q", + "cell_type": "code", + "source": [ + "Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TP-eEY5maEC5c7pVOpolxQ", + "cell_type": "markdown", + "source": [ + "# Test switch logic" + ], + "metadata": {} + }, + { + "id": "nhjoP-0CWUadpg116YgH6Q", + "cell_type": "code", + "source": [ + "//define group of contract", + "\nvar groupOfContract = \"DT1.1\";" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "nvCLj-DBhk211_Y_UDi0uQ", + "cell_type": "code", + "source": [ + "//Define partition", + "\n var args = new ImportArgs(\"CH\", 2020, 12, Periodicity.Quarterly, null, ImportFormats.Actual);", + "\n var partition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", + "\n x.Month == args.Month && x.Scenario == args.Scenario);", + "\n if(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "UmXmnz87HUKCgw066Gsx5A", + "cell_type": "code", + "source": [ + "public async Task CheckSwitchLogicAsync(IEnumerable inputDataSet, Dictionary csmLcSwitchBenchmark)", + "\n{", + "\n //Save test input data", + "\n await Workspace.UpdateAsync(inputDataSet);", + "\n ", + "\n //Set up import storage and test universe", + "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n var testUniverse = Scopes.ForStorage(testStorage).ToScope();", + "\n ", + "\n var identities = testUniverse.GetScopes(testStorage.DataNodesByImportScope[ImportScope.Primary].Where(dn => dn == groupOfContract)).SelectMany(s => s.Identities);", + "\n var csm = testUniverse.GetScopes(identities, o => o.WithContext(\"C\")).Where(x => Math.Abs(x.Value) > Precision);", + "\n var lc = testUniverse.GetScopes(identities, o => o.WithContext(\"L\")).Where(x => Math.Abs(x.Value) > Precision);", + "\n //Clean up Workspace", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", + "\n ", + "\n var csmBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueCsm) > Precision).ToDictionary(x => x.Key, x => x.Value);", + "\n var lcBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueLc) > Precision).ToDictionary(x => x.Key, x => x.Value);", + "\n ", + "\n ", + "\n var errors = new List();", + "\n if(csm.Count() > csmBenchmark.Count()) ", + "\n {", + "\n var extraVariables = csm.Where(x => !csmBenchmark.Keys.Contains(new AocStep(x.Identity.AocType, x.Identity.Novelty)))", + "\n .Select(x => $\"AocType:{x.Identity.AocType}, Novelty:{x.Identity.Novelty}, EstimateType:{x.EstimateType}, Value:{x.Value}.\");", + "\n errors.Add( $\"{nameof(AllocateTechnicalMargin)} scope for CSM has more non zero items than benchmark. Extra computed variables : \\n {string.Join(\"\\n\", extraVariables)}.\" );", + "\n }", + "\n if(lc.Count() > lcBenchmark.Count()) ", + "\n {", + "\n var extraVariables = lc.Where(x => !lcBenchmark.Keys.Contains(new AocStep(x.Identity.AocType, x.Identity.Novelty)))", + "\n .Select(x => $\"AocType:{x.Identity.AocType}, Novelty:{x.Identity.Novelty}, EstimateType:{x.EstimateType}, Value:{x.Value}, \");", + "\n errors.Add( $\"{nameof(AllocateTechnicalMargin)} scope for LC has more non zero items compared to benchmark: \\n {string.Join(\"\\n\", extraVariables)}.\" );", + "\n }", + "\n ", + "\n //Check ValueCsm", + "\n foreach(var kvp in csmBenchmark)", + "\n {", + "\n var scopeSwitch = csm.SingleOrDefault(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", + "\n ", + "\n if(scopeSwitch == null)", + "\n {", + "\n errors.Add( $\"Missing calculated scope for AocType and Novelty: {kvp.Key.AocType}, {kvp.Key.Novelty}.\" );", + "\n continue;", + "\n }", + "\n ", + "\n if(Math.Abs(-1.0 * scopeSwitch.Value - kvp.Value.valueCsm) > Precision) ", + "\n errors.Add( $\"Values not matching for AocType {kvp.Key.AocType} and Novelty {kvp.Key.Novelty}. Scope: Csm {-1 * scopeSwitch.Value}; Benchmark: Csm {kvp.Value.valueCsm}.\" );", + "\n }", + "\n //Check ValueLc", + "\n foreach(var kvp in lcBenchmark)", + "\n {", + "\n var scopeSwitch = lc.SingleOrDefault(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", + "\n ", + "\n if(scopeSwitch == null)", + "\n {", + "\n errors.Add( $\"Missing calculated scope for AocType and Novelty: {kvp.Key.AocType}, {kvp.Key.Novelty}.\" );", + "\n continue;", + "\n }", + "\n ", + "\n if(Math.Abs(scopeSwitch.Value - kvp.Value.valueLc) > Precision) ", + "\n errors.Add( $\"Values not matching for AocType {kvp.Key.AocType} and Novelty {kvp.Key.Novelty}. Scope: Lc {scopeSwitch.Value}; Benchmark: Lc {kvp.Value.valueLc}.\" );", + "\n }", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "qKbQQyYPQU-Iye0tiP7x5A", + "cell_type": "code", + "source": [ + "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", + "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = 15.0},", + "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\nvar csmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"),(0d, 100d)},", + "\n {new AocStep(\"IA\",\"N\"), (0d, 15d)},", + "\n {new AocStep(\"EV\",\"N\"), (0d, 100d)},", + "\n {new AocStep(\"CL\",\"C\"), (0d, 100d)},", + "\n {new AocStep(\"EA\",\"C\"), (0d, -8.0)},", + "\n {new AocStep(\"AM\",\"C\"), (0d, -153.5)},", + "\n {new AocStep(\"EOP\",\"C\"),(0d, 153.5)},", + "\n };", + "\n", + "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "TK8_VLRvbkOFHfCgScgBGg", + "cell_type": "code", + "source": [ + "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", + "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = 15.0},", + "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -500.0},", + "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\nvar csmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"),(0d, 100d)},", + "\n {new AocStep(\"IA\",\"N\"), (0d, 15d)},", + "\n {new AocStep(\"EV\",\"N\"), (0d, 100d)},", + "\n {new AocStep(\"CL\",\"C\"), (285d, -215d)},", + "\n {new AocStep(\"EA\",\"C\"), (8d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), (-146.5d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(146.5d, 0d)},", + "\n };", + "\n", + "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zFF7F81APUmclfr-m3jMcw", + "cell_type": "code", + "source": [ + "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", + "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -150.0},", + "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\nvar csmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"), (0d, 100d)},", + "\n {new AocStep(\"IA\",\"N\"), (50d, -100d)},", + "\n {new AocStep(\"EA\",\"C\"), (8d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), (-29d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(29d, 0d)},", + "\n };", + "\n", + "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HBM6I7rP8UeMjn0PNDOkvg", + "cell_type": "code", + "source": [ + "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"I\", Value = 5010.0, EstimateType = \"L\", AmountType = null},", + "\n basicIfrsVariable with {AocType = \"MC\", Novelty = \"I\", Value = -10.0},", + "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"I\", Value = -5015.0},", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = -100.0},", + "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = 10.0},", + "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = 150.0},", + "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = -45.0},", + "\n basicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -30.0},", + "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\nvar csmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"I\"),( 0d, 5010.0)},", + "\n {new AocStep(\"MC\",\"I\"), ( 0d, -10d)},", + "\n {new AocStep(\"IA\",\"I\"), ( 0d, 10d)},", + "\n {new AocStep(\"EV\",\"I\"), ( 5d,-5010d)},", + "\n ", + "\n {new AocStep(\"BOP\",\"N\"),(100d, 0d)},", + "\n {new AocStep(\"IA\",\"N\"), (-100d, 50d)},", + "\n {new AocStep(\"EV\",\"N\"), ( 0d, -45d)},", + "\n ", + "\n {new AocStep(\"CL\",\"C\"), ( 25d, -5d)},", + "\n {new AocStep(\"EA\",\"C\"), ( -8d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), ( -11d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),( 11d, 0d)},", + "\n };", + "\n", + "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0mf1wwWN00-8_xIdPwv8aA", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Test/Tests.ipynb b/Test/Tests.ipynb new file mode 100644 index 00000000..1cd4f874 --- /dev/null +++ b/Test/Tests.ipynb @@ -0,0 +1,183 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "TZgppEey_UevldeIhLk-Zg", + "cell_type": "markdown", + "source": [ + "

Tests

" + ], + "metadata": {} + }, + { + "id": "SyI_QtXCw0yCEOXRPFFsww", + "cell_type": "code", + "source": [ + "#!eval-notebook \"IfrsVariablesTest\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-uMg4UaFbECZuIbtwJCvJw", + "cell_type": "code", + "source": [ + "#!eval-notebook \"ImportStorageTest\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "x_X1-9LqmkCGI9R1UOQo6A", + "cell_type": "code", + "source": [ + "#!eval-notebook \"ReportStorageTest\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "fTEQQtLuT0uQ01JBhmVGzw", + "cell_type": "code", + "source": [ + "#!eval-notebook \"QueriesTest\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "iRWR94CbKU-eP1eVu7LpbA", + "cell_type": "code", + "source": [ + "#!eval-notebook \"AocStructureTest\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Omg1EkcRJ0miK9epGdB5Fg", + "cell_type": "code", + "source": [ + "#!eval-notebook \"TechnicalMarginTest\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "EMHkr07qoEyWT3n-TUrE_A", + "cell_type": "markdown", + "source": [ + "---" + ], + "metadata": {} + }, + { + "id": "XYHMD6zOzUS3CLOcyaAq_g", + "cell_type": "code", + "source": [ + "#!eval-notebook \"SpecificationsImportCashflows\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HfcLmG39kE2VFzt18WLEKA", + "cell_type": "code", + "source": [ + "#!eval-notebook \"SpecificationsImportActuals\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XgjC6ZJsvkGNTDeP374MXw", + "cell_type": "code", + "source": [ + "#!eval-notebook \"SpecificationsTechnicalMargin\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-zjdp-ODe0qnHVp1-wr02A", + "cell_type": "code", + "source": [ + "#!eval-notebook \"SpecificationsFinancialPerformance\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "QtahA_wtJUmc5mWycmnjzA", + "cell_type": "markdown", + "source": [ + "---" + ], + "metadata": {} + }, + { + "id": "xfKpAnti3UaiKrOBQeD8gw", + "cell_type": "code", + "source": [ + "//#!eval-notebook \"MapTemplateAndImportTest\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "5jyZtMUGUU6YhrXXY2mMqQ", + "cell_type": "markdown", + "source": [ + "---" + ], + "metadata": {} + }, + { + "id": "hvH198RRBUGXwPc-HsgU0A", + "cell_type": "code", + "source": [ + "#!eval-notebook \"ReportVariablesTest\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Q8h-6uY0TkCHeLq1bFnNhQ", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Utils/ApplicationMessage.ipynb b/Utils/ApplicationMessage.ipynb new file mode 100644 index 00000000..80df11f5 --- /dev/null +++ b/Utils/ApplicationMessage.ipynb @@ -0,0 +1,149 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "broxX4LAHEyOyWz2MhegDg", + "cell_type": "markdown", + "source": [ + "

Application Message

" + ], + "metadata": {} + }, + { + "id": "h1R2W32vMUu5tJyRO8rd4A", + "cell_type": "code", + "source": [ + "#r \"nuget:Systemorph.Activities,1.2.3\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "84ytRYskFU-7SEmFS1wFiA", + "cell_type": "code", + "source": [ + "#!import \"../Constants/Validations\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zdCOoGGKDUad4bauxbDx8A", + "cell_type": "code", + "source": [ + "using Microsoft.Extensions.Logging;", + "\n", + "\npublic class ApplicationMessage {", + "\n private static ILogger log;", + "\n ", + "\n private static IActivityVariable activity;", + "\n ", + "\n public static void Configure (ILogger log, IActivityVariable activity) ", + "\n {", + "\n ApplicationMessage.log = log;", + "\n ApplicationMessage.activity = activity;", + "\n }", + "\n ", + "\n public static Object Log (Error e, params string[] s) { log.LogError(Get(e,s)); return null; }", + "\n ", + "\n public static Object Log (Warning w, params string[] s) { log.LogWarning(Get(w,s)); return null; }", + "\n ", + "\n public static bool HasErrors () => activity.HasErrors();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "rmXkyteAs0qIkylMj_uzoA", + "cell_type": "code", + "source": [ + "ApplicationMessage.Configure(Log, Activity)" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "C5Sz9dotT0ye5OfZ9kKzZg", + "cell_type": "markdown", + "source": [ + "# Utils" + ], + "metadata": {} + }, + { + "id": "PI-rD5MuDkm1oNDAzAlxdQ", + "cell_type": "code", + "source": [ + "public static bool HasErrors (this ActivityLog[] logs) {", + "\n foreach (var log in logs)", + "\n if(log.Errors.Any())", + "\n return true;", + "\n return false;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zP4DHMB7v0iJBQU0evmyJQ", + "cell_type": "code", + "source": [ + "public static ActivityLog Merge (this ActivityLog a, ActivityLog b) {", + "\n return a with { ", + "\n StartDateTime = a.StartDateTime < b.StartDateTime ? a.StartDateTime : b.StartDateTime,", + "\n FinishDateTime = a.FinishDateTime > b.FinishDateTime ? a.FinishDateTime : b.FinishDateTime,", + "\n Errors = a.Errors.Concat(b.Errors).ToList(),", + "\n Warnings = a.Warnings.Concat(b.Warnings).ToList(),", + "\n Infos = a.Infos.Concat(b.Infos).ToList(),", + "\n Status = a.Status == ActivityLogStatus.Failed || b.Status == ActivityLogStatus.Failed ? ActivityLogStatus.Failed : ActivityLogStatus.Succeeded", + "\n };", + "\n}", + "\n", + "\npublic static ActivityLog Merge (this ActivityLog[] logs) ", + "\n{", + "\n if(logs == null || logs.Length == 0) return null;", + "\n return logs.Aggregate((x, y) => x.Merge(y));", + "\n}", + "\n", + "\npublic static ActivityLog Merge (this ActivityLog[] logs, ActivityLog log) => logs.Merge().Merge(log);", + "\npublic static ActivityLog Merge (this ActivityLog log, ActivityLog[] logs) => log.Merge(logs.Merge());" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CdUfdMGymkqjIXT66mL65g", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/Utils/UtilityMethods.ipynb b/Utils/UtilityMethods.ipynb new file mode 100644 index 00000000..8390e86f --- /dev/null +++ b/Utils/UtilityMethods.ipynb @@ -0,0 +1,1155 @@ +{ + "metadata": { + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "authors": [], + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "id": "72RJn3yBk0-cdIRCo3QO6A", + "cell_type": "code", + "source": [ + "#!import \"../DataModel/DataStructure\"", + "\n#!import \"./ApplicationMessage\"" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "bTXVV8ziO0GApQeS_y9z3Q", + "cell_type": "code", + "source": [ + "using System.Linq.Expressions;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "0rrQ118FOkCCJosdbGYr_Q", + "cell_type": "markdown", + "source": [ + "# Math Functions" + ], + "metadata": {} + }, + { + "id": "JSuwpYPWEE-_BxSyEyzsbQ", + "cell_type": "code", + "source": [ + "static double DivideOrDefault(double numerator, double denominator, double defaultValue = default) => Math.Abs(denominator) > double.Epsilon ? numerator / denominator : defaultValue;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9dxEM2ggXU-zTLNvvCHsOQ", + "cell_type": "code", + "source": [ + "// because the default(T) is something else than the first/last element. What about \"static T GetValidElement(this IList array, int index)\"? ", + "\nstatic T GetElementOrDefault(this ICollection array, int index)", + "\n{ ", + "\n var count = array.Count;", + "\n if (array == null || count == 0)", + "\n return default(T);", + "\n", + "\n return index < 0", + "\n ? array.ElementAt(0) // should this case be removed?", + "\n : index < count", + "\n ? array.ElementAt(index)", + "\n : array.ElementAt(count -1);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "A-gLq4O2eE6IW3jx-1tDCw", + "cell_type": "markdown", + "source": [ + "# Enumerable Extensions" + ], + "metadata": {} + }, + { + "id": "QhtXvQfGpkOPqpRxznrgcg", + "cell_type": "code", + "source": [ + "public static Dictionary ToDictionaryGrouped(this IEnumerable source, Func keySelector, Func, TResult> elementSelector) => source.GroupBy(keySelector).ToDictionary(g => g.Key, elementSelector);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Brh1Yk0MoEO5H52znFTqUQ", + "cell_type": "code", + "source": [ + "public static IDataCube SelectToDataCube(this IEnumerable source, Func whereClause, Func selector) => source.Where(whereClause).Select(selector).ToDataCube();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "3hPGQtfhI0ic1_w5PyiBgw", + "cell_type": "code", + "source": [ + "public static IDataCube SelectToDataCube(this IEnumerable source, Func selector) => source.SelectToDataCube(x => true, selector);" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "-Y6HUEHIgEidj23uHIcscQ", + "cell_type": "code", + "source": [ + "public static double[] Prune (this IEnumerable source, double precision = Precision) => source.Reverse().SkipWhile(x => Math.Abs(x) < precision).Reverse().ToArray();" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xZnDqW6rXEagl6N5IPFBHg", + "cell_type": "markdown", + "source": [ + "# String Extensions" + ], + "metadata": {} + }, + { + "id": "3TZ5QaWLL0eXsicw9mEhrA", + "cell_type": "code", + "source": [ + "using System.Globalization;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "DLkjFfpXp0ODlwc_imkUwA", + "cell_type": "code", + "source": [ + "public static double CheckStringForExponentialAndConvertToDouble (this string s)", + "\n{ ", + "\n if (s == null) return default;", + "\n if (double.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out var doubleValue)) return doubleValue;", + "\n else { ApplicationMessage.Log(Error.ParsingScientificNotation, s); return 1; }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "740WQ9Xg6ESwS7mzcd_UDQ", + "cell_type": "markdown", + "source": [ + "# Enum Extentions" + ], + "metadata": {} + }, + { + "id": "WNoxcMPslUm-66pmOH5a8g", + "cell_type": "code", + "source": [ + "public static bool Contains(this T value, T lookingForFlag) ", + "\n where T : struct", + "\n{", + "\n int intValue = (int) (object) value;", + "\n int intLookingForFlag = (int) (object) lookingForFlag;", + "\n return ((intValue & intLookingForFlag) == intLookingForFlag);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "NgzAK-3L_kW3JQNLVUSQoQ", + "cell_type": "markdown", + "source": [ + "# Queries" + ], + "metadata": {} + }, + { + "id": "ekflioBoz0ukcAPWv4xRtQ", + "cell_type": "markdown", + "source": [ + "## FX" + ], + "metadata": {} + }, + { + "id": "B24vyYMc9kOlNnSUAfEHGQ", + "cell_type": "code", + "source": [ + "public static async Task>> GetExchangeRatesDictionaryAsync(this IQuerySource querySource, int year, int month)", + "\n => (await querySource.Query()", + "\n .Where(x => x.Year == year - 1 && x.Month == MonthInAYear && x.FxType == FxType.Spot ||", + "\n x.Year == year && x.Month == month)", + "\n .ToArrayAsync())", + "\n .ToDictionaryGrouped(x => x.Currency,", + "\n x => x.ToDictionary(y => (y.Year, y.Month, y.FxType) switch", + "\n {", + "\n (_, _, _) when y.Year == year - 1 && y.Month == MonthInAYear && y.FxType == FxType.Spot => FxPeriod.BeginningOfPeriod,", + "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Average => FxPeriod.Average,", + "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Spot => FxPeriod.EndOfPeriod", + "\n },", + "\n y => y.FxToGroupCurrency));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hSaegw7GtEWvUosF-y231g", + "cell_type": "code", + "source": [ + "public static double GetCurrencyToGroupFx(Dictionary> exchangeRates, string currency, FxPeriod fxPeriod, string groupCurrency)", + "\n{", + "\n if(currency == groupCurrency)", + "\n return 1;", + "\n", + "\n if(!exchangeRates.TryGetValue(currency, out var currencyToGroup))", + "\n ApplicationMessage.Log(Error.ExchangeRateCurrency, currency);", + "\n", + "\n if(!currencyToGroup.TryGetValue(fxPeriod, out var currencyToGroupFx))", + "\n ApplicationMessage.Log(Error.ExchangeRateNotFound, currency, fxPeriod.ToString());", + "\n", + "\n return currencyToGroupFx;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "hcDcg_DFUEOgLrrWw8cE2g", + "cell_type": "markdown", + "source": [ + "## Current and Previous Parameters" + ], + "metadata": {} + }, + { + "id": "qgieIWL7ZUe7mJIVbU_1gQ", + "cell_type": "markdown", + "source": [ + "TODOs:", + "\n
    ", + "\n
  • DataNodes Query: After merging with the new import storage, define IsFirstPeriod property.
  • ", + "\n
  • Once Scenario is defined as a simple property (e.g. in DataNodeState), introduce concept of Priority in LoadCurrentAndPreviousParameterAsync query (see ParameterResultsEntityQueryExtensions in IfrsGeneric).
  • ", + "\n
" + ], + "metadata": {} + }, + { + "id": "X01D1mGxS06sfFEPjwyG-A", + "cell_type": "code", + "source": [ + "public static async Task LoadParameterAsync(", + "\n this IQuerySource querySource,", + "\n int year,", + "\n int month,", + "\n Expression> filterExpression = null ) ", + "\n where T : IWithYearAndMonth", + "\n{", + "\n return await querySource.Query()", + "\n .Where(x => x.Year == year && x.Month <= month || x.Year < year)", + "\n .Where(filterExpression?? (Expression>)(x => true))", + "\n .ToArrayAsync();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "sKO5N-LgyEGBEZam7l9_Fg", + "cell_type": "code", + "source": [ + "public static async Task> LoadCurrentParameterAsync (", + "\n this IQuerySource querySource,", + "\n Args args,", + "\n Func identityExpression,", + "\n Expression> filterExpression = null ) ", + "\n where T : IWithYearAndMonth", + "\n{", + "\n return (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression))", + "\n .GroupBy(identityExpression)", + "\n .Select(y => y.OrderByDescending(x => x.Year)", + "\n .ThenByDescending(x => x.Month)", + "\n .FirstOrDefault())", + "\n .ToDictionary(identityExpression);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "I0M5hxr91UGl2zNnwXzW-g", + "cell_type": "code", + "source": [ + "public static async Task>> LoadCurrentAndPreviousParameterAsync (", + "\n this IQuerySource querySource,", + "\n Args args,", + "\n Func identityExpression,", + "\n Expression> filterExpression = null ) ", + "\n where T : IWithYearAndMonth", + "\n{", + "\n var parameters = (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression)).GroupBy(identityExpression);", + "\n ", + "\n var ret = new Dictionary>();", + "\n foreach(var p in parameters)", + "\n {", + "\n var inner = ret.GetOrAdd(p.Key, _ => new Dictionary());", + "\n", + "\n var currentCandidate = p.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", + "\n var previousCandidate = p.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", + "\n ", + "\n inner.Add(CurrentPeriod, currentCandidate != null ? currentCandidate : previousCandidate);", + "\n inner.Add(PreviousPeriod, previousCandidate != null ? previousCandidate : currentCandidate);", + "\n }", + "\n return ret;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "UMrZ966740-j48yfqsXM2g", + "cell_type": "markdown", + "source": [ + "", + "\n## Yield Curve" + ], + "metadata": {} + }, + { + "id": "qcQgXJr-l0Gql-aOiCdRrQ", + "cell_type": "code", + "source": [ + "public static async Task> LoadLockedInYieldCurveAsync(this IQuerySource querySource, Args args, ", + "\n IEnumerable dataNodes)", + "\n{", + "\n var lockedInYieldCurveByGoc = new Dictionary();", + "\n foreach (var dn in dataNodes.Where(x => x.ValuationApproach == ValuationApproaches.BBA))", + "\n {", + "\n var argsNew = args with {Year = dn.Year, Month = dn.Month};", + "\n var loadedYc = (await querySource.LoadCurrentParameterAsync(argsNew, x => x.Currency, x => x.Currency == dn.ContractualCurrency));", + "\n ", + "\n if(!loadedYc.TryGetValue(dn.ContractualCurrency, out var lockedYc))", + "\n ApplicationMessage.Log(Error.YieldCurveNotFound, dn.ContractualCurrency, argsNew.Year.ToString(), argsNew.Month.ToString());", + "\n ", + "\n lockedInYieldCurveByGoc[dn.DataNode] = lockedYc;", + "\n }", + "\n ", + "\n return lockedInYieldCurveByGoc;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "mkhcBCMjAku6Fqv8M8fhmg", + "cell_type": "code", + "source": [ + "public static async Task>> LoadCurrentYieldCurveAsync(this IQuerySource querySource, Args args, ", + "\n IEnumerable dataNodes)", + "\n{", + "\n var contractualCurrenciesInScope = dataNodes.Select(dn => dn.ContractualCurrency).ToHashSet();", + "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, ", + "\n x => x.Currency,", + "\n x => contractualCurrenciesInScope.Contains(x.Currency)", + "\n ));", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "11r0X9aBAUKWja2qSlbOWQ", + "cell_type": "markdown", + "source": [ + "## Data Node State" + ], + "metadata": {} + }, + { + "id": "ineEPRxhfkOAuclOvhZ1lw", + "cell_type": "code", + "source": [ + "//TODO : remove this method and clean up in queriesTest. We need a new test for LoadDataNodes.", + "\npublic static async Task> LoadDataNodeStateAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n //This querySource is partitioned", + "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode))", + "\n .Where(x => x.Value[CurrentPeriod].State != State.Inactive)", + "\n .ToDictionary(x => x.Key, x => x.Value[CurrentPeriod]);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "B1n-fWXBi0GL93ngrSSRbQ", + "cell_type": "markdown", + "source": [ + "## Data Nodes" + ], + "metadata": {} + }, + { + "id": "jdq7blDf4U6-pmv3CMUQTQ", + "cell_type": "code", + "source": [ + "// TODO: the name of this method is strange, one expects DataNodes in return but instead obtains DataNodeData...", + "\npublic static async Task> LoadDataNodesAsync(this IQuerySource querySource, Args args) //How do we force the user to provide here a partitioned source? IWorkspace?", + "\n{", + "\n var dataNodeStates = await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", + "\n var activeDataNodes = dataNodeStates.Where(kvp => kvp.Value[CurrentPeriod].State != State.Inactive).Select(kvp => kvp.Key);", + "\n ", + "\n return (await querySource.Query().Where(dn => activeDataNodes.Contains(dn.SystemName)).ToArrayAsync())", + "\n .ToDictionary(dn => dn.SystemName, dn => {", + "\n var dnCurrentState = dataNodeStates[dn.SystemName][CurrentPeriod];", + "\n var dnPreviousState = dataNodeStates[dn.SystemName][PreviousPeriod];", + "\n return new DataNodeData(){Year = dnPreviousState.Year, ", + "\n Month = dnPreviousState.Month,", + "\n State = dnCurrentState.State,", + "\n PreviousState = dnPreviousState.State,", + "\n //from Group of Contract", + "\n DataNode = dn.SystemName,", + "\n ContractualCurrency = dn.ContractualCurrency,", + "\n FunctionalCurrency = dn.FunctionalCurrency,", + "\n LineOfBusiness = dn.LineOfBusiness,", + "\n ValuationApproach = dn.ValuationApproach,", + "\n OciType = dn.OciType,", + "\n Portfolio = dn.Portfolio,", + "\n AnnualCohort = dn.AnnualCohort,", + "\n LiabilityType = dn.LiabilityType,", + "\n Profitability = dn.Profitability,", + "\n Partner = dn.Partner,", + "\n IsReinsurance = dn.GetType() == typeof(GroupOfReinsuranceContract),", + "\n };", + "\n }", + "\n );", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "o0-QY0CD_U6QtHo8DUg-XA", + "cell_type": "markdown", + "source": [ + "## Data Node Parameters" + ], + "metadata": {} + }, + { + "id": "u2AAh0Om8k-FVnzV99qeXw", + "cell_type": "markdown", + "source": [ + "### Single data Node" + ], + "metadata": {} + }, + { + "id": "fGw6yDyGdkGSnMtEzlCWNg", + "cell_type": "code", + "source": [ + "public static async Task>> LoadSingleDataNodeParametersAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n return await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "fqKznL41TkGOYs41YCJkIw", + "cell_type": "markdown", + "source": [ + "### Inter data Node" + ], + "metadata": {} + }, + { + "id": "9TJH-kJoTEmIucE-PjX7sw", + "cell_type": "code", + "source": [ + "public static async Task>>> LoadInterDataNodeParametersAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n var identityExpressions = new Func[]{x => x.DataNode, x => x.LinkedDataNode,};", + "\n var parameterArray = (await querySource.LoadParameterAsync(args.Year, args.Month));", + "\n var parameters = identityExpressions.SelectMany(ie => parameterArray.GroupBy(ie));", + "\n ", + "\n return parameters.SelectMany(p => p", + "\n .GroupBy(x => x.DataNode != p.Key ? x.DataNode : x.LinkedDataNode)", + "\n .Select(gg =>", + "\n {", + "\n var currentCandidate = gg.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", + "\n var previousCandidate = gg.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", + "\n return (key: p.Key,", + "\n currentPeriod: currentCandidate != null ? currentCandidate : previousCandidate,", + "\n previousPeriod: previousCandidate != null ? previousCandidate : currentCandidate);", + "\n })", + "\n )", + "\n .ToDictionaryGrouped(x => x.key,", + "\n x => new Dictionary>{ {CurrentPeriod, x.Select(y => y.currentPeriod).ToHashSet()},", + "\n {PreviousPeriod, x.Select(y => y.previousPeriod).ToHashSet()}});", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "m5W0i-9h_USmOALgfJ5ynw", + "cell_type": "markdown", + "source": [ + "## Aoc Step Configuration" + ], + "metadata": {} + }, + { + "id": "foNau3wankChqmtvuPVxmw", + "cell_type": "code", + "source": [ + "public static async Task> LoadAocStepConfigurationAsync(this IQuerySource querySource, int year, int month)", + "\n => (await querySource.LoadParameterAsync(year, month)).GroupBy(x => (x.AocType, x.Novelty), (k, v) => v.OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).First()); " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "u2cguHXQ-kyIKbXgTS6P_g", + "cell_type": "code", + "source": [ + "public static async Task> LoadAocStepConfigurationAsDictionaryAsync(this IQuerySource querySource, int year, int month) => (await querySource.LoadAocStepConfigurationAsync(year, month)).ToDictionary(x => new AocStep(x.AocType, x.Novelty)); " + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "kujIpDbHiUyTpBosaNnjDg", + "cell_type": "markdown", + "source": [ + "# Export Configurations" + ], + "metadata": {} + }, + { + "id": "cdft6A5YOU-JKits9tdQ0w", + "cell_type": "markdown", + "source": [ + "## Main Tab" + ], + "metadata": {} + }, + { + "id": "qAmPBlXGBkanj2uTVSqlCA", + "cell_type": "code", + "source": [ + "public static IDocumentBuilder MainTabConfigurationWoScenario(this IDocumentBuilder builder, T args) where T : IfrsPartition", + "\n => builder.WithTable( config => config .AtBeginning() ", + "\n .WithName(Main) ", + "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n .WithColumn(x => x.Scenario, x => x.Delete()));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xDi9MN7YXE6TzDsUxJKv_g", + "cell_type": "code", + "source": [ + "public static IDocumentBuilder MainTabConfiguration(this IDocumentBuilder builder, T args) where T : IfrsPartition", + "\n => builder.WithTable( config => config .AtBeginning() ", + "\n .WithName(Main) ", + "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", + "\n .WithColumn(x => x.Id, x => x.Delete()));" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "CRZfO8bZy0G9fSLekjFWUg", + "cell_type": "markdown", + "source": [ + "## Dimensions" + ], + "metadata": {} + }, + { + "id": "Ln1Wggqu406eomb1E8Akcw", + "cell_type": "code", + "source": [ + "public static IDocumentBuilder PortfolioConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : Portfolio", + "\n => builder.WithTable(config => { ", + "\n if(DependsOnType != default)", + "\n config = config.DependsOn(DependsOnType); ", + "\n return config .AtBeginning() ", + "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", + "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete());", + "\n });" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6qc9dAkjOkSfbiofWgLnXw", + "cell_type": "code", + "source": [ + "public static IDocumentBuilder GroupofContractConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : GroupOfContract", + "\n => builder.WithTable(config => { ", + "\n if(DependsOnType != default)", + "\n config = config.DependsOn(DependsOnType); ", + "\n if(typeof(T).Name == nameof(GroupOfInsuranceContract))", + "\n config = config.WithColumn(x => x.Partner, x => x.Delete());", + "\n return config .AtBeginning() ", + "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", + "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.ContractualCurrency, x => x.Delete())", + "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete())", + "\n .WithColumn(x => x.LineOfBusiness, x => x.Delete())", + "\n .WithColumn(x => x.OciType, x => x.Delete())", + "\n .WithColumn(x => x.ValuationApproach, x => x.Delete());", + "\n });" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "1dhHyd3JGEOohmsGAjA_gw", + "cell_type": "markdown", + "source": [ + "## Data Node State" + ], + "metadata": {} + }, + { + "id": "Ymq2Wq7sjkeLyNlifepNaQ", + "cell_type": "code", + "source": [ + "using DocumentFormat.OpenXml.Spreadsheet;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "dGKqDg0S5Eq62tKaxG_7yg", + "cell_type": "code", + "source": [ + "public record HelperState { public string State {get; init;} }" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "8HjMW_4oEkSc8gt502-Lkw", + "cell_type": "code", + "source": [ + "public static IExcelDocumentBuilder DataNodeStateConfiguration (this IExcelDocumentBuilder builder, DataNodeState[] data)", + "\n => builder", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(config => config ", + "\n .AtBeginning() ", + "\n .WithSource(source => data.AsQueryable())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Month, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n .WithColumn(x => x.State, y => y.WithDataValidation(z => z.WithReferenceTo(t => t.State)))", + "\n );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "G2bKdGeyiEeKBz1bG8g86w", + "cell_type": "code", + "source": [ + "public static IExcelDocumentBuilder StateEnumConfiguration (this IExcelDocumentBuilder builder)", + "\n{", + "\n var helperState = new[] {new HelperState {State = \"Active\"}, new HelperState {State = \"Inactive\"} }; ", + "\n return builder.WithTable( config => config .WithSheetVisibility(SheetStateValues.Hidden)", + "\n //.WithColumn(x => x.State, z => z.WithNamedRange(y => y.WithName(\"HelperState_State\")))", + "\n .WithColumn(x => x.State, z => z.WithDefaultNamedRange())", + "\n .WithSource(source => helperState.AsQueryable()) );", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "zb2wO1m1uUaw0RbXeMwHGw", + "cell_type": "markdown", + "source": [ + "## Data Node Parameter" + ], + "metadata": {} + }, + { + "id": "4hvQE9cObUS1h9wW2WA_LA", + "cell_type": "code", + "source": [ + "public static IExcelDocumentBuilder DataNodeParameterConfiguration (this IExcelDocumentBuilder builder, Dictionary data)", + "\n => builder", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(config => config ", + "\n .AtBeginning() ", + "\n .WithSource(source => data[nameof(InterDataNodeParameter)].Cast().AsQueryable())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Month, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n )", + "\n .WithTable(config => config ", + "\n .AtBeginning() ", + "\n .WithSource(source => data[nameof(SingleDataNodeParameter)].Cast().AsQueryable())", + "\n .WithColumn(x => x.DataNode, x => x.WithHeader(\"DataNode\"))", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Month, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n );" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "HYdwh4HjBkC--t3kyqy0jg", + "cell_type": "markdown", + "source": [ + "# Report Configurations" + ], + "metadata": {} + }, + { + "id": "qnzf570gh0uWBWG5tHisdw", + "cell_type": "code", + "source": [ + "using Systemorph.Vertex.Pivot.Reporting.Builder;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "L21IHsS-ukOp7q2KpQYwrg", + "cell_type": "code", + "source": [ + "public static ReportBuilder WithGridOptionsForIfrsVariable", + "\n(this ReportBuilder reportBuilder, int reportHeight = 650)", + "\n{", + "\n return reportBuilder.WithGridOptions(go => go.WithColumns(cols => cols.Modify(\"Value\", c => c.WithWidth(300)", + "\n .WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", + "\n .WithRows(rows => rows.Where(r => !r.RowGroup.SystemName.EndsWith(\"NullGroup\")).ToList())", + "\n .WithAutoGroupColumn(c => c.WithWidth(250) with { Pinned = \"left\" }) with { Height = reportHeight, GroupDefaultExpanded = 2, OnGridReady = null }", + "\n );", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "xcQnRFiM80yaO6WWqlVJ3w", + "cell_type": "markdown", + "source": [ + "# Utility Methods Class" + ], + "metadata": {} + }, + { + "id": "Yl-kOA4SvkmoX4bFR30uGA", + "cell_type": "markdown", + "source": [ + "This class contains:", + "\n- EqualityComparer" + ], + "metadata": {} + }, + { + "id": "MzSS_gk3YUqeeUoxH5615g", + "cell_type": "code", + "source": [ + "public static class Utils {", + "\n public static void EqualityComparer (T[] collection1, T[] collection2) ", + "\n {", + "\n collection1.Length.Should().Be(collection2.Length);", + "\n var type = typeof(T);", + "\n var properties = type.GetProperties().Where(p => p.Name != \"Id\").ToArray();", + "\n if(properties.Count() == 0) {", + "\n bool isEqual = Enumerable.SequenceEqual(collection1, collection2);", + "\n isEqual.Should().Be(true);", + "\n }", + "\n foreach(var item1 in collection1) {", + "\n var item2 = collection2.Where(x => ", + "\n properties.All(prop => {", + "\n var propType = prop.PropertyType;", + "\n var val = prop.GetValue(item1);", + "\n var otherVal = prop.GetValue(x);", + "\n if(val == null && otherVal == null) return true;", + "\n else if((val != null && otherVal == null) || (val == null && otherVal != null)) return false;", + "\n else return Convert.ChangeType(otherVal, propType).Equals( Convert.ChangeType(val, propType) );", + "\n })", + "\n );", + "\n item2.Count().Should().NotBe(0);", + "\n }", + "\n }", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Fnb9erxecEyh69YlvuE30Q", + "cell_type": "code", + "source": [ + "// TODO: find a better arrangement to these methods", + "\nstatic var NumericalPrecisionEqualityChecker = 1.0E-10;", + "\n", + "\nstatic bool CheckEquality(this double[] arr1, double[] arr2) ", + "\n{", + "\n if(arr1.Length != arr2.Length) return false;", + "\n for(int i = 0; i < arr1.Length; i++) {", + "\n double d1 = arr1[i];", + "\n double d2 = arr2[i];", + "\n if(Math.Abs(d1) < NumericalPrecisionEqualityChecker && Math.Abs(d1) < NumericalPrecisionEqualityChecker) continue;", + "\n if(Math.Abs( (d1 - d2) / d1 ) > NumericalPrecisionEqualityChecker) return false;", + "\n }", + "\n return true;", + "\n}", + "\n", + "\nstatic bool CheckEquality(this IEnumerable arr1, double[] arr2) => CheckEquality(arr1.ToArray(), arr2);", + "\nstatic bool CheckEquality(this double[] arr1, IEnumerable arr2) => CheckEquality(arr1, arr2.ToArray());", + "\nstatic bool CheckEquality(this IEnumerable arr1, IEnumerable arr2) => CheckEquality(arr1.ToArray(), arr2.ToArray());", + "\nstatic bool CheckEquality(this double d1, double d2) => CheckEquality(d1.RepeatOnce(), d2.RepeatOnce());", + "\n", + "\nstatic bool CheckEquality(this double? d1, double? d2) ", + "\n{", + "\n if(d1 == null && d2 == null) return true;", + "\n else return CheckEquality((double)d1, (double)d2);", + "\n}", + "\n" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "etIXAOoMHEGKXFbnzCCRWA", + "cell_type": "markdown", + "source": [ + "## ToIdentityString" + ], + "metadata": {} + }, + { + "id": "-0U7OSuELUeCMTZ487kI_A", + "cell_type": "code", + "source": [ + "using System.Text;", + "\npublic static string ToIdentityString(this T v)", + "\n where T : class", + "\n{", + "\n StringBuilder sb = new StringBuilder();", + "\n var propertyInfos = v.GetType()", + "\n .GetProperties()", + "\n .Where(x => Attribute.IsDefined(x, typeof(IdentityPropertyAttribute)))", + "\n .OrderByDescending(x => x.PropertyType.Name).ThenByDescending(x => x.Name)", + "\n .Select(x => sb.Append(x.Name).Append(\":\").Append(v.GetType().GetProperty(x.Name)?.GetValue(v, null)).Append(\", \"));", + "\n", + "\nreturn propertyInfos.Select(p => p.ToString()).ToArray().Last();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "cq_4STuakk6krLbs6TZ4yg", + "cell_type": "markdown", + "source": [ + "## GetPreviousIdentities" + ], + "metadata": {} + }, + { + "id": "XYOo4uHfnkeKWMF_MQ5r-Q", + "cell_type": "code", + "source": [ + "public static Dictionary> GetPreviousIdentities(IEnumerable identities)", + "\n{", + "\n var bopNovelties = identities.Where(id => id.AocType == AocTypes.BOP).Select(id => id.Novelty);", + "\n var previousStep = (new string[]{Novelties.N,Novelties.I,Novelties.C})", + "\n .ToDictionary(n => n, n => bopNovelties.Contains(n) ? new AocStep(AocTypes.BOP,n) : null);", + "\n return identities.Where(id => id.AocType != AocTypes.BOP)", + "\n .ToDictionary(x => x, x => {var ret = x.AocType == AocTypes.CL ? previousStep.Where(kvp => kvp.Value != null).Select(kvp => kvp.Value).ToArray() ", + "\n : previousStep[x.Novelty].RepeatOnce();", + "\n previousStep[x.Novelty] = new AocStep(x.AocType, x.Novelty);", + "\n return ret;});", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "XbcZgL57GUy04M44loxF-g", + "cell_type": "markdown", + "source": [ + "## GetReferenceAocStepForCalculated" + ], + "metadata": {} + }, + { + "id": "MLNCUWgSAkyrA-DMWc-JpQ", + "cell_type": "code", + "source": [ + "public static AocStep GetReferenceAocStepForCalculated(this IEnumerable identities, Dictionary aocConfigurationByAocStep, AocStep identityAocStep)", + "\n{", + "\n return identities.LastOrDefault(aocStep => aocConfigurationByAocStep[aocStep].DataType != DataType.Calculated", + "\n && aocConfigurationByAocStep[aocStep].DataType != DataType.CalculatedTelescopic", + "\n && aocConfigurationByAocStep[aocStep].Order < aocConfigurationByAocStep[identityAocStep].Order", + "\n && aocStep.Novelty == identityAocStep.Novelty) ", + "\n ?? new AocStep(default, default);", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "VxJI9sGp3UyCFxyJM7MGKg", + "cell_type": "markdown", + "source": [ + "# Change Sign Rules" + ], + "metadata": {} + }, + { + "id": "Uv2X9RT3wkKLJvMvooTbSw", + "cell_type": "code", + "source": [ + "public static int GetSign((string AocType, string AmountType, string EstimateType, bool IsReinsurance) variable, Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", + "\n{", + "\n var isActual = (new string[] { EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.A }).Contains(variable.EstimateType) ? -1 : 1;", + "\n return isActual;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "MOV5tqPp2kSr4kp0wet0ag", + "cell_type": "markdown", + "source": [ + "# EstimateType And AmountType" + ], + "metadata": {} + }, + { + "id": "jf_kmDreZUyVr-gBkFuuCg", + "cell_type": "code", + "source": [ + "public static Dictionary> GetAmountTypesByEstimateType(Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", + "\n{", + "\n return new Dictionary>(){", + "\n {EstimateTypes.RA, new string[]{}.ToHashSet()},", + "\n {EstimateTypes.C, new string[]{}.ToHashSet()},", + "\n {EstimateTypes.L, new string[]{}.ToHashSet()},", + "\n {EstimateTypes.LR, new string[]{}.ToHashSet()},", + "\n };", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "j0oOSZn9ZkK6D6BR_YxuJg", + "cell_type": "markdown", + "source": [ + "# Technical Margin EstimateType" + ], + "metadata": {} + }, + { + "id": "86CBe5DnrkOi6irqUzCLNw", + "cell_type": "code", + "source": [ + "public static HashSet GetTechnicalMarginEstimateType()", + "\n{", + "\n return new []{EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, }.ToHashSet();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "9OeFmvwQJECtzHY6Dg8Yzw", + "cell_type": "markdown", + "source": [ + "# Discount and Cumulate" + ], + "metadata": {} + }, + { + "id": "Ajyhr4n0106OnU6fEIdL5g", + "cell_type": "code", + "source": [ + "public static double[] ComputeDiscountAndCumulate(this double[] nominalValues, double[] monthlyDiscounting, PeriodType periodType) ", + "\n{ ", + "\n if(nominalValues == null) return Enumerable.Empty().ToArray();", + "\n ", + "\n var ret = new double[nominalValues.Length];", + "\n ", + "\n if(periodType == PeriodType.BeginningOfPeriod)", + "\n {", + "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", + "\n ret[i] = nominalValues[i] + GetElementOrDefault(ret, i + 1) * GetElementOrDefault(monthlyDiscounting, i/12);", + "\n return ret;", + "\n }", + "\n ", + "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", + "\n ret[i] = ( nominalValues[i] + GetElementOrDefault(ret, i + 1) ) * GetElementOrDefault(monthlyDiscounting, i/12);", + "\n ", + "\n return ret;", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "LoqMwHfd8kOJYFyQxw5KNQ", + "cell_type": "code", + "source": [ + "public static double[] ComputeDiscountAndCumulateWithCreditDefaultRisk(this double[] nominalValues, double[] monthlyDiscounting, double nonPerformanceRiskRate) //Is it correct that NonPerformanceRiskRate is a double? Should it be an array that takes as input tau/t?", + "\n{ ", + "\n return Enumerable.Range(0, nominalValues.Length)", + "\n .Select( t => Enumerable.Range(t, nominalValues.Length-t)", + "\n .Select( tau => nominalValues[tau] * Math.Pow(GetElementOrDefault(monthlyDiscounting, t/12), tau-t+1) * (Math.Exp(-nonPerformanceRiskRate*(tau-t)) - 1) )", + "\n .Sum() )", + "\n .ToArray();", + "\n}" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "Y9wSV5wvy0mvkCNsCiRmlQ", + "cell_type": "markdown", + "source": [ + "# Import Configuration" + ], + "metadata": {} + }, + { + "id": "11et4IQ_0US7mUdWWNnouw", + "cell_type": "markdown", + "source": [ + "## Data Nodes" + ], + "metadata": {} + }, + { + "id": "fd6J9NnbXkmWF-7Qi2FmWA", + "cell_type": "code", + "source": [ + "public GroupOfInsuranceContract ExtendGroupOfContract(GroupOfInsuranceContract gic, IDataRow datarow) => gic;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "z4UEzk2bPEOGnwoC6UN3pg", + "cell_type": "code", + "source": [ + "public GroupOfReinsuranceContract ExtendGroupOfContract(GroupOfReinsuranceContract gric, IDataRow datarow) => gric;" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + }, + { + "id": "6k1Zt47Wtk6cltgFOwSPXQ", + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 1, + "outputs": [] + } + ] +} \ No newline at end of file From 4abedf9556ef4556fd6fd2cc9da1380ebda991f7 Mon Sep 17 00:00:00 2001 From: sbusato <103484221+sbusato@users.noreply.github.com> Date: Thu, 29 Sep 2022 17:45:02 +0200 Subject: [PATCH 02/43] Merge pull request #31 from Systemorph/OpeningImporterBug fixed Opening re-import --- Import/ImportStorage.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Import/ImportStorage.ipynb b/Import/ImportStorage.ipynb index c1d8ede4..557210ec 100644 --- a/Import/ImportStorage.ipynb +++ b/Import/ImportStorage.ipynb @@ -250,7 +250,7 @@ "\n //SetPartition to current Period", "\n await querySource.Partition.SetAsync(TargetPartition);", "\n ", - "\n if(primaryScope.Select(dn => DataNodeDataBySystemName[dn]).Any(dnd => dnd.Year == args.Year))", + "\n if(primaryScope.Select(dn => DataNodeDataBySystemName[dn]).Any(dnd => dnd.Year == args.Year) && ImportFormat != ImportFormats.Opening)", "\n openingIfrsVariables = openingIfrsVariables.Concat(await querySource.Query()", "\n .Where(iv => iv.Partition == TargetPartition && iv.AocType == AocTypes.BOP && iv.Novelty == Novelties.I)", "\n .Where(iv => primaryScope.Contains(iv.DataNode) && EstimateTypesByImportFormat[InputSource.Opening.ToString()].Contains(iv.EstimateType) || secondaryScope.Contains(iv.DataNode))", From 0c3428a6942fe8d4d4f16dd0261315b1e7469409 Mon Sep 17 00:00:00 2001 From: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Fri, 30 Sep 2022 11:01:55 +0200 Subject: [PATCH 03/43] Rename "PvBase" to "PresentValue" (#32) --- Import/ImportScopeCalculation.ipynb | 58 +++++----- Test/SpecificationsImportCashflows.ipynb | 130 +++++++++++------------ Test/SpecificationsSetup.ipynb | 2 +- Test/SpecificationsTechnicalMargin.ipynb | 6 +- 4 files changed, 98 insertions(+), 98 deletions(-) diff --git a/Import/ImportScopeCalculation.ipynb b/Import/ImportScopeCalculation.ipynb index 2823aead..9370c157 100644 --- a/Import/ImportScopeCalculation.ipynb +++ b/Import/ImportScopeCalculation.ipynb @@ -896,15 +896,15 @@ "id": "NX2BdeLNxk2VWROO8E5pBg", "cell_type": "code", "source": [ - "public interface PvBase : IWithGetValueFromValues", + "public interface PresentValue : IWithGetValueFromValues", "\n{ ", "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow", "\n || x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode))", - "\n .WithApplicability(x => (x.Identity.Id.AocType == AocTypes.BOP && x.Identity.Id.Novelty != Novelties.C) || x.Identity.Id.AocType == AocTypes.EOP)", + "\n .WithApplicability(x => (x.Identity.Id.AocType == AocTypes.BOP && x.Identity.Id.Novelty != Novelties.C) || x.Identity.Id.AocType == AocTypes.EOP)", "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.CF)", - "\n .WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.IA)", - "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.IA)", + "\n .WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.IA)", + "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.IA)", "\n .WithApplicability(x => new string[]{AocTypes.BOP, AocTypes.EA, AocTypes.AM, AocTypes.RCU}.Contains(x.Identity.Id.AocType) ) //add here combination CRU for At !CDR?", "\n );", "\n ", @@ -917,40 +917,40 @@ "\n public double Value => GetValueFromValues(Values);", "\n}", "\n", - "\npublic interface ComputePvBaseWithIfrsVariable : PvBase", + "\npublic interface ComputePresentValueWithIfrsVariable : PresentValue", "\n{", - "\n double PvBase.Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.CalculationType, EconomicBasis, Identity.AccidentYear); //unify CalculationType and EstimateTypeGet", - "\n double[] PvBase.Values => Enumerable.Empty().ToArray();", + "\n double PresentValue.Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.CalculationType, EconomicBasis, Identity.AccidentYear); //unify CalculationType and EstimateTypeGet", + "\n double[] PresentValue.Values => Enumerable.Empty().ToArray();", "\n}", "\n", - "\npublic interface PvBaseFromDiscountedCashflow : PvBase", + "\npublic interface PresentValueFromDiscountedCashflow : PresentValue", "\n{", "\n [NotVisible]", - "\n double[] PvBase.Values => GetScope(Identity).Values;", + "\n double[] PresentValue.Values => GetScope(Identity).Values;", "\n}", "\n", - "\npublic interface CashflowAocStep : PvBase", + "\npublic interface CashflowAocStep : PresentValue", "\n{", "\n [NotVisible]", - "\n double[] PvBase.Values => -1d * GetScope(Identity).Values;", + "\n double[] PresentValue.Values => -1d * GetScope(Identity).Values;", "\n}", "\n", - "\npublic interface PvBaseWithInterestAccretion : PvBase, IWithInterestAccretion", + "\npublic interface PresentValueWithInterestAccretion : PresentValue, IWithInterestAccretion", "\n{", "\n [NotVisible]", - "\n double[] PvBase.Values => GetInterestAccretion();", + "\n double[] PresentValue.Values => GetInterestAccretion();", "\n}", "\n", - "\npublic interface PvBaseWithInterestAccretionForCreditRisk : PvBase, IWithInterestAccretionForCreditRisk", + "\npublic interface PresentValueWithInterestAccretionForCreditRisk : PresentValue, IWithInterestAccretionForCreditRisk", "\n{", "\n [NotVisible]", - "\n double[] PvBase.Values => GetInterestAccretion();", + "\n double[] PresentValue.Values => GetInterestAccretion();", "\n}", "\n", - "\npublic interface EmptyValuesAocStep : PvBase", + "\npublic interface EmptyValuesAocStep : PresentValue", "\n{", "\n [NotVisible]", - "\n double[] PvBase.Values => Enumerable.Empty().ToArray();", + "\n double[] PresentValue.Values => Enumerable.Empty().ToArray();", "\n}" ], "metadata": {}, @@ -1014,9 +1014,9 @@ "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", "\n ", "\n [NotVisible]", - "\n PvBase[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", + "\n PresentValue[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", "\n .SelectMany(at => accidentYears", - "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", + "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", "\n .ToArray();", "\n double Value => PresentValues.Aggregate().Value;", "\n}", @@ -1032,9 +1032,9 @@ "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", "\n ", "\n [NotVisible]", - "\n PvBase[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", + "\n PresentValue[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", "\n .SelectMany(at => accidentYears", - "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", + "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", "\n .ToArray();", "\n ", "\n double Value => PresentValues.Aggregate().Value;", @@ -1079,7 +1079,7 @@ "\n ", "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", "\n ", - "\n PvBase[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray();", + "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray();", "\n ", "\n double Value => PresentValues.Aggregate().Value;", "\n}", @@ -1093,7 +1093,7 @@ "\n ", "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", "\n ", - "\n PvBase[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray(); ", + "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray(); ", "\n ", "\n double Value => PresentValues.Aggregate().Value;", "\n}" @@ -1580,12 +1580,12 @@ "\n string EstimateType => EstimateTypes.BEPA;", "\n string EconomicBasis => EconomicBases.L;", "\n ", - "\n PvBase[] ByAmountType => GetStorage().GetPremiums().Select(pr => GetStorage().GetPremiumAllocationFactor(Identity) * GetScope((Identity, pr, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis))).ToArray(); ", + "\n PresentValue[] ByAmountType => GetStorage().GetPremiums().Select(pr => GetStorage().GetPremiumAllocationFactor(Identity) * GetScope((Identity, pr, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis))).ToArray(); ", "\n}", "\n", "\npublic interface DefaultValueBeExperienceAdjustmentForPremium : BeExperienceAdjustmentForPremium", "\n{", - "\n PvBase[] BeExperienceAdjustmentForPremium.ByAmountType => Enumerable.Empty().ToArray();", + "\n PresentValue[] BeExperienceAdjustmentForPremium.ByAmountType => Enumerable.Empty().ToArray();", "\n}" ], "metadata": {}, @@ -1702,7 +1702,7 @@ "\n ", "\n double Value => GetScope(Identity.DataNode).BeAmountTypes", "\n .Except(GetStorage().GetNonAttributableAmountType())", - "\n .Sum(at => GetScope((Identity, at, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) +", + "\n .Sum(at => GetScope((Identity, at, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) +", "\n GetScope(Identity).Value;", "\n ", "\n double AggregatedValue => GetScope((Identity, InputSource.Cashflow)).Values", @@ -1755,12 +1755,12 @@ "\n ", "\n private double attributableExpenseAndCommissions => GetStorage().GetAttributableExpenseAndCommissionAmountType().Sum(d =>", "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", - "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, d, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", + "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, d, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, d, EstimateTypes.A, (int?)null)).Value);", "\n", "\n private double investmentClaims => GetStorage().GetInvestmentClaims().Sum(ic =>", "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", - "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, ic, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", + "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, ic, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.A, (int?)null)).Value - ", "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.AA, (int?)null)).Value -", "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.OA, (int?)null)).Value);", diff --git a/Test/SpecificationsImportCashflows.ipynb b/Test/SpecificationsImportCashflows.ipynb index ad03bfe5..27b2e084 100644 --- a/Test/SpecificationsImportCashflows.ipynb +++ b/Test/SpecificationsImportCashflows.ipynb @@ -1296,8 +1296,8 @@ "id": "-_jk2YKNT0u7l9uCTrc18w", "cell_type": "code", "source": [ - "var computedPvBaseBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", - "\ncomputedPvBaseBoP_PR" + "var computedPresentValueBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueBoP_PR" ], "metadata": {}, "execution_count": 1, @@ -1326,7 +1326,7 @@ "id": "he2CNq7s20a2kIAEI1Ew5A", "cell_type": "code", "source": [ - "var expectedPvBaseBoP_PR = discountedBoP_PR.Values;" + "var expectedPresentValueBoP_PR = discountedBoP_PR.Values;" ], "metadata": {}, "execution_count": 1, @@ -1344,7 +1344,7 @@ "id": "E_a4AaUiYU-qVqiFMH4Ffg", "cell_type": "code", "source": [ - "computedPvBaseBoP_PR.Values.CheckEquality( expectedPvBaseBoP_PR )" + "computedPresentValueBoP_PR.Values.CheckEquality( expectedPresentValueBoP_PR )" ], "metadata": {}, "execution_count": 1, @@ -1354,7 +1354,7 @@ "id": "USXwqdZpmEOlDJdxqDBZaA", "cell_type": "code", "source": [ - "computedPvBaseBoP_PR.Values.CheckEquality( expectedPvBaseBoP_PR ).Should().Be(true);" + "computedPresentValueBoP_PR.Values.CheckEquality( expectedPresentValueBoP_PR ).Should().Be(true);" ], "metadata": {}, "execution_count": 1, @@ -1392,8 +1392,8 @@ "id": "nvbs4pu8Sk-fnfw1MqBJEQ", "cell_type": "code", "source": [ - "var computedPvBaseMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", - "\ncomputedPvBaseMC_PR" + "var computedPresentValueMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueMC_PR" ], "metadata": {}, "execution_count": 1, @@ -1432,7 +1432,7 @@ "id": "pqOSCzCTJEyNauxM07RTvg", "cell_type": "code", "source": [ - "var expectedPvBaseMC_PR = discountedMC_PR.Values - discountedBoP_PR.Values;" + "var expectedPresentValueMC_PR = discountedMC_PR.Values - discountedBoP_PR.Values;" ], "metadata": {}, "execution_count": 1, @@ -1450,7 +1450,7 @@ "id": "WOMu6tnVOEWiRZqaziMRcg", "cell_type": "code", "source": [ - "computedPvBaseMC_PR.Values.CheckEquality( expectedPvBaseMC_PR )" + "computedPresentValueMC_PR.Values.CheckEquality( expectedPresentValueMC_PR )" ], "metadata": {}, "execution_count": 1, @@ -1460,7 +1460,7 @@ "id": "TvZ78p6vLkCL-xejOqvUcw", "cell_type": "code", "source": [ - "computedPvBaseMC_PR.Value == expectedPvBaseMC_PR[0]" + "computedPresentValueMC_PR.Value == expectedPresentValueMC_PR[0]" ], "metadata": {}, "execution_count": 1, @@ -1470,7 +1470,7 @@ "id": "w9D4tVGk5UmDB-tTCeS5Rw", "cell_type": "code", "source": [ - "computedPvBaseMC_PR.Values.CheckEquality( expectedPvBaseMC_PR ).Should().Be(true);" + "computedPresentValueMC_PR.Values.CheckEquality( expectedPresentValueMC_PR ).Should().Be(true);" ], "metadata": {}, "execution_count": 1, @@ -1480,7 +1480,7 @@ "id": "nnvwi_zKy0ebrac1nrqanQ", "cell_type": "code", "source": [ - "computedPvBaseMC_PR.Value.Should().Be( expectedPvBaseMC_PR[0] );" + "computedPresentValueMC_PR.Value.Should().Be( expectedPresentValueMC_PR[0] );" ], "metadata": {}, "execution_count": 1, @@ -1517,8 +1517,8 @@ "id": "5sLKCaklikuTAXBf9hAoGQ", "cell_type": "code", "source": [ - "var computedPvBaseCF_PR = Test.GetScope((idCF, \"PR\", \"BE\", (int?)null));", - "\ncomputedPvBaseCF_PR" + "var computedPresentValueCF_PR = Test.GetScope((idCF, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueCF_PR" ], "metadata": {}, "execution_count": 1, @@ -1558,7 +1558,7 @@ "id": "YSGvWpZAgk676PWkouVFvg", "cell_type": "code", "source": [ - "var expectedPvBaseCF_PR = -1.0 * cfNominalReference_PR.Values;" + "var expectedPresentValueCF_PR = -1.0 * cfNominalReference_PR.Values;" ], "metadata": {}, "execution_count": 1, @@ -1576,7 +1576,7 @@ "id": "mlrKZMMExkOXb_z-QA-nzQ", "cell_type": "code", "source": [ - "computedPvBaseCF_PR.Values.CheckEquality( expectedPvBaseCF_PR )" + "computedPresentValueCF_PR.Values.CheckEquality( expectedPresentValueCF_PR )" ], "metadata": {}, "execution_count": 1, @@ -1586,7 +1586,7 @@ "id": "_iXoBI2Ra06t95Lv-UKmdQ", "cell_type": "code", "source": [ - "computedPvBaseCF_PR.Values[0] + computedPvBaseCF_PR.Values[1] + computedPvBaseCF_PR.Values[2] == computedPvBaseCF_PR.Value" + "computedPresentValueCF_PR.Values[0] + computedPresentValueCF_PR.Values[1] + computedPresentValueCF_PR.Values[2] == computedPresentValueCF_PR.Value" ], "metadata": {}, "execution_count": 1, @@ -1596,7 +1596,7 @@ "id": "QWPx_7NUmEyE5Xu_kEeyjg", "cell_type": "code", "source": [ - "computedPvBaseCF_PR.Values.CheckEquality( expectedPvBaseCF_PR ).Should().Be(true);" + "computedPresentValueCF_PR.Values.CheckEquality( expectedPresentValueCF_PR ).Should().Be(true);" ], "metadata": {}, "execution_count": 1, @@ -1606,7 +1606,7 @@ "id": "MSbSF0-9w0-iu_c3cNINjA", "cell_type": "code", "source": [ - "computedPvBaseCF_PR.Value.Should().Be( computedPvBaseCF_PR.Values[0] + computedPvBaseCF_PR.Values[1] + computedPvBaseCF_PR.Values[2] );" + "computedPresentValueCF_PR.Value.Should().Be( computedPresentValueCF_PR.Values[0] + computedPresentValueCF_PR.Values[1] + computedPresentValueCF_PR.Values[2] );" ], "metadata": {}, "execution_count": 1, @@ -1675,8 +1675,8 @@ "id": "ZiyHW9AJqEqeFgbYLv9FQA", "cell_type": "code", "source": [ - "var computedPvBaseIA_PR = Test.GetScope((idIA, \"PR\", \"BE\", (int?)null));", - "\ncomputedPvBaseIA_PR" + "var computedPresentValueIA_PR = Test.GetScope((idIA, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueIA_PR" ], "metadata": {}, "execution_count": 1, @@ -1738,7 +1738,7 @@ "id": "b-s6yRRvEUeLF_z6-rD7lw", "cell_type": "code", "source": [ - "var expectedPvBaseIA_PR = discountedIaReference_PR.Values.Select((val, index) => ( val - nominalIaReference_PR.Values[index]) * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" + "var expectedPresentValueIA_PR = discountedIaReference_PR.Values.Select((val, index) => ( val - nominalIaReference_PR.Values[index]) * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" ], "metadata": {}, "execution_count": 1, @@ -1756,7 +1756,7 @@ "id": "2R1QDTLoAkSYgN3VL0pXxg", "cell_type": "code", "source": [ - "computedPvBaseIA_PR.Values.CheckEquality( expectedPvBaseIA_PR )" + "computedPresentValueIA_PR.Values.CheckEquality( expectedPresentValueIA_PR )" ], "metadata": {}, "execution_count": 1, @@ -1766,7 +1766,7 @@ "id": "ioWKmAEOBk6ly7qdPm8UcQ", "cell_type": "code", "source": [ - "computedPvBaseIA_PR.Values[0] + computedPvBaseIA_PR.Values[1] + computedPvBaseIA_PR.Values[2] == computedPvBaseIA_PR.Value" + "computedPresentValueIA_PR.Values[0] + computedPresentValueIA_PR.Values[1] + computedPresentValueIA_PR.Values[2] == computedPresentValueIA_PR.Value" ], "metadata": {}, "execution_count": 1, @@ -1776,7 +1776,7 @@ "id": "lLcVd6QU_E-CV-zx6UKKyw", "cell_type": "code", "source": [ - "computedPvBaseIA_PR.Values.CheckEquality( expectedPvBaseIA_PR ).Should().Be(true);" + "computedPresentValueIA_PR.Values.CheckEquality( expectedPresentValueIA_PR ).Should().Be(true);" ], "metadata": {}, "execution_count": 1, @@ -1786,7 +1786,7 @@ "id": "nksstSVXV0KMKV3s1Qzbjw", "cell_type": "code", "source": [ - "computedPvBaseIA_PR.Value.Should().Be( computedPvBaseIA_PR.Values[0] + computedPvBaseIA_PR.Values[1] + computedPvBaseIA_PR.Values[2] );" + "computedPresentValueIA_PR.Value.Should().Be( computedPresentValueIA_PR.Values[0] + computedPresentValueIA_PR.Values[1] + computedPresentValueIA_PR.Values[2] );" ], "metadata": {}, "execution_count": 1, @@ -1812,8 +1812,8 @@ "id": "1sPIRjZ290ekFi_RcQIo0g", "cell_type": "code", "source": [ - "var computedPvBaseIA_NIC = Test.GetScope((idIA, \"NIC\", \"BE\", (int?)null));", - "\ncomputedPvBaseIA_NIC" + "var computedPresentValueIA_NIC = Test.GetScope((idIA, \"NIC\", \"BE\", (int?)null));", + "\ncomputedPresentValueIA_NIC" ], "metadata": {}, "execution_count": 1, @@ -1853,7 +1853,7 @@ "id": "CeJcWORR1USjRX0vRrD9uw", "cell_type": "code", "source": [ - "var expectedPvBaseIA_NIC = discountedIaReference_NIC.Values.Select((val, index) => val * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" + "var expectedPresentValueIA_NIC = discountedIaReference_NIC.Values.Select((val, index) => val * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" ], "metadata": {}, "execution_count": 1, @@ -1871,7 +1871,7 @@ "id": "hiB4BkoAvUWvG3yaH-lUgg", "cell_type": "code", "source": [ - "computedPvBaseIA_NIC.Values.CheckEquality( expectedPvBaseIA_NIC )" + "computedPresentValueIA_NIC.Values.CheckEquality( expectedPresentValueIA_NIC )" ], "metadata": {}, "execution_count": 1, @@ -1881,7 +1881,7 @@ "id": "FAOKIDlrpEiY95BXbRJ9Lg", "cell_type": "code", "source": [ - "computedPvBaseIA_NIC.Values[0] + computedPvBaseIA_NIC.Values[1] + computedPvBaseIA_NIC.Values[2] == computedPvBaseIA_NIC.Value" + "computedPresentValueIA_NIC.Values[0] + computedPresentValueIA_NIC.Values[1] + computedPresentValueIA_NIC.Values[2] == computedPresentValueIA_NIC.Value" ], "metadata": {}, "execution_count": 1, @@ -1891,7 +1891,7 @@ "id": "3XieKhmULE2hpsAGvEz6Jw", "cell_type": "code", "source": [ - "computedPvBaseIA_NIC.Values.CheckEquality( expectedPvBaseIA_NIC ).Should().Be(true);" + "computedPresentValueIA_NIC.Values.CheckEquality( expectedPresentValueIA_NIC ).Should().Be(true);" ], "metadata": {}, "execution_count": 1, @@ -1901,7 +1901,7 @@ "id": "7eg7INUm50qXDWFveCVSJA", "cell_type": "code", "source": [ - "computedPvBaseIA_NIC.Value.Should().Be( computedPvBaseIA_NIC.Values[0] + computedPvBaseIA_NIC.Values[1] + computedPvBaseIA_NIC.Values[2] );" + "computedPresentValueIA_NIC.Value.Should().Be( computedPresentValueIA_NIC.Values[0] + computedPresentValueIA_NIC.Values[1] + computedPresentValueIA_NIC.Values[2] );" ], "metadata": {}, "execution_count": 1, @@ -1938,8 +1938,8 @@ "id": "ZtcMBnMzIkCuhjXxj25VQA", "cell_type": "code", "source": [ - "var computedPvBaseYCU_PR = Test.GetScope((idYcu, \"PR\", \"BE\", (int?)null));", - "\ncomputedPvBaseYCU_PR" + "var computedPresentValueYCU_PR = Test.GetScope((idYcu, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueYCU_PR" ], "metadata": {}, "execution_count": 1, @@ -2053,7 +2053,7 @@ "id": "-nB_BwXaFUSg1RGG9OtRWQ", "cell_type": "code", "source": [ - "var expectedPvBaseYCU_PR = ycReferenceDiscountedEop - discountedYcParent.Values;" + "var expectedPresentValueYCU_PR = ycReferenceDiscountedEop - discountedYcParent.Values;" ], "metadata": {}, "execution_count": 1, @@ -2063,7 +2063,7 @@ "id": "oqAvk5VK906PkRkAT2OaRg", "cell_type": "code", "source": [ - "computedPvBaseYCU_PR.Values.CheckEquality( expectedPvBaseYCU_PR )" + "computedPresentValueYCU_PR.Values.CheckEquality( expectedPresentValueYCU_PR )" ], "metadata": {}, "execution_count": 1, @@ -2073,7 +2073,7 @@ "id": "tUv9lq_VLEqCkXFKJJuQig", "cell_type": "code", "source": [ - "computedPvBaseYCU_PR.Value == expectedPvBaseYCU_PR[3]" + "computedPresentValueYCU_PR.Value == expectedPresentValueYCU_PR[3]" ], "metadata": {}, "execution_count": 1, @@ -2083,7 +2083,7 @@ "id": "m4ee2o2DZ0aKf2FH92STsw", "cell_type": "code", "source": [ - "computedPvBaseYCU_PR.Values.CheckEquality( expectedPvBaseYCU_PR ).Should().Be(true);" + "computedPresentValueYCU_PR.Values.CheckEquality( expectedPresentValueYCU_PR ).Should().Be(true);" ], "metadata": {}, "execution_count": 1, @@ -2093,7 +2093,7 @@ "id": "kA0wrkGJaUG-mcZFz8IYPw", "cell_type": "code", "source": [ - "computedPvBaseYCU_PR.Value.Should().Be( expectedPvBaseYCU_PR[3] );" + "computedPresentValueYCU_PR.Value.Should().Be( expectedPresentValueYCU_PR[3] );" ], "metadata": {}, "execution_count": 1, @@ -2138,8 +2138,8 @@ "id": "77exgwl5wUefPwQGSvv_nA", "cell_type": "code", "source": [ - "var computedPvBaseCRU = Test.GetScope((idCru, \"CDR\", \"BE\", (int?)null));", - "\ncomputedPvBaseCRU" + "var computedPresentValueCRU = Test.GetScope((idCru, \"CDR\", \"BE\", (int?)null));", + "\ncomputedPresentValueCRU" ], "metadata": {}, "execution_count": 1, @@ -2280,7 +2280,7 @@ "id": "f8a9p87_WUCugmBsw0E4sA", "cell_type": "code", "source": [ - "var expectedPvBaseCRU = cruExpectedDiscountedCDR - discountedCruParent.Values;" + "var expectedPresentValueCRU = cruExpectedDiscountedCDR - discountedCruParent.Values;" ], "metadata": {}, "execution_count": 1, @@ -2290,7 +2290,7 @@ "id": "7odSeJ5RTUmTR32M-5tlAA", "cell_type": "code", "source": [ - "computedPvBaseCRU.Values.CheckEquality( expectedPvBaseCRU )" + "computedPresentValueCRU.Values.CheckEquality( expectedPresentValueCRU )" ], "metadata": {}, "execution_count": 1, @@ -2300,7 +2300,7 @@ "id": "ojtYz8I9xkaTA1AcV3U1Cw", "cell_type": "code", "source": [ - "computedPvBaseCRU.Value == expectedPvBaseCRU[3]" + "computedPresentValueCRU.Value == expectedPresentValueCRU[3]" ], "metadata": {}, "execution_count": 1, @@ -2310,7 +2310,7 @@ "id": "WH8Cl5EMp0ewbK4iQ7-W3A", "cell_type": "code", "source": [ - "computedPvBaseCRU.Values.CheckEquality( expectedPvBaseCRU ).Should().Be(true);" + "computedPresentValueCRU.Values.CheckEquality( expectedPresentValueCRU ).Should().Be(true);" ], "metadata": {}, "execution_count": 1, @@ -2320,7 +2320,7 @@ "id": "-4irtBVO70uLS-mVjr-3jQ", "cell_type": "code", "source": [ - "computedPvBaseCRU.Value.Should().Be( expectedPvBaseCRU[3] );" + "computedPresentValueCRU.Value.Should().Be( expectedPresentValueCRU[3] );" ], "metadata": {}, "execution_count": 1, @@ -2357,8 +2357,8 @@ "id": "RxytwcSRIEOh4gnpLjM-6A", "cell_type": "code", "source": [ - "var computedPvBaseCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null));", - "\ncomputedPvBaseCL_PR" + "var computedPresentValueCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueCL_PR" ], "metadata": {}, "execution_count": 1, @@ -2387,7 +2387,7 @@ "id": "o7Xu2o42K0SylUpXrn5bIw", "cell_type": "code", "source": [ - "var expectedPvBaseCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null)).Values -", + "var expectedPresentValueCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null)).Values -", "\n clParents.Select(aocStep => Test.GetScope((idCL with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, \"PR\", \"BE\", (int?)null)).Values).Aggregate();" ], "metadata": {}, @@ -2406,7 +2406,7 @@ "id": "mJ3zeyh3YUSL7myhsdowKg", "cell_type": "code", "source": [ - "computedPvBaseCL_PR.Values.CheckEquality( expectedPvBaseCL_PR )" + "computedPresentValueCL_PR.Values.CheckEquality( expectedPresentValueCL_PR )" ], "metadata": {}, "execution_count": 1, @@ -2416,7 +2416,7 @@ "id": "t8dZLcMcYEiQaGohNjbhbw", "cell_type": "code", "source": [ - "computedPvBaseCL_PR.Value == expectedPvBaseCL_PR[3]" + "computedPresentValueCL_PR.Value == expectedPresentValueCL_PR[3]" ], "metadata": {}, "execution_count": 1, @@ -2426,7 +2426,7 @@ "id": "CG2NuOh-OUWD0O9KjUlTKg", "cell_type": "code", "source": [ - "computedPvBaseCL_PR.Values.CheckEquality( expectedPvBaseCL_PR ).Should().Be(true);" + "computedPresentValueCL_PR.Values.CheckEquality( expectedPresentValueCL_PR ).Should().Be(true);" ], "metadata": {}, "execution_count": 1, @@ -2436,7 +2436,7 @@ "id": "FNsLWW7W6UmZwW_agz-FbQ", "cell_type": "code", "source": [ - "computedPvBaseCL_PR.Value.Should().Be( expectedPvBaseCL_PR[3] );" + "computedPresentValueCL_PR.Value.Should().Be( expectedPresentValueCL_PR[3] );" ], "metadata": {}, "execution_count": 1, @@ -2473,8 +2473,8 @@ "id": "s86AHJ-4Pk6Va461mh5gBQ", "cell_type": "code", "source": [ - "var computedPvBaseEOP_NIC = Test.GetScope((idEOP, \"NIC\", \"BE\", (int?)null));", - "\ncomputedPvBaseEOP_NIC" + "var computedPresentValueEOP_NIC = Test.GetScope((idEOP, \"NIC\", \"BE\", (int?)null));", + "\ncomputedPresentValueEOP_NIC" ], "metadata": {}, "execution_count": 1, @@ -2514,7 +2514,7 @@ "id": "TgfGcomxyEu_Bi31dr0a8Q", "cell_type": "code", "source": [ - "var expectedPvBaseEOP_NIC = discountedCL_NIC.Values;" + "var expectedPresentValueEOP_NIC = discountedCL_NIC.Values;" ], "metadata": {}, "execution_count": 1, @@ -2532,7 +2532,7 @@ "id": "uHz3FD5pz0KtlPWvehPSTw", "cell_type": "code", "source": [ - "computedPvBaseEOP_NIC.Values.CheckEquality( expectedPvBaseEOP_NIC )" + "computedPresentValueEOP_NIC.Values.CheckEquality( expectedPresentValueEOP_NIC )" ], "metadata": {}, "execution_count": 1, @@ -2542,7 +2542,7 @@ "id": "NgccZKROIUGyHphm6Pt3mA", "cell_type": "code", "source": [ - "computedPvBaseEOP_NIC.Value == expectedPvBaseEOP_NIC[3]" + "computedPresentValueEOP_NIC.Value == expectedPresentValueEOP_NIC[3]" ], "metadata": {}, "execution_count": 1, @@ -2552,7 +2552,7 @@ "id": "9jo2Z3ljfkyeYFEYk8YevQ", "cell_type": "code", "source": [ - "computedPvBaseEOP_NIC.Values.CheckEquality( expectedPvBaseEOP_NIC ).Should().Be(true);" + "computedPresentValueEOP_NIC.Values.CheckEquality( expectedPresentValueEOP_NIC ).Should().Be(true);" ], "metadata": {}, "execution_count": 1, @@ -2562,7 +2562,7 @@ "id": "wQEKDnBmiEiCcxaQ5z8n_Q", "cell_type": "code", "source": [ - "computedPvBaseEOP_NIC.Value.Should().Be( expectedPvBaseEOP_NIC[3] );" + "computedPresentValueEOP_NIC.Value.Should().Be( expectedPresentValueEOP_NIC[3] );" ], "metadata": {}, "execution_count": 1, @@ -2607,8 +2607,8 @@ "id": "Hbvbc_-ghkCPuBcY4CaNSw", "cell_type": "code", "source": [ - "var computedPvBaseAM_PR = Test.GetScope((idAM, \"PR\", \"BE\", (int?)null));", - "\ncomputedPvBaseAM_PR" + "var computedPresentValueAM_PR = Test.GetScope((idAM, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueAM_PR" ], "metadata": {}, "execution_count": 1, @@ -2618,8 +2618,8 @@ "id": "vtA_SwM1FkWUvn7cz_gsEg", "cell_type": "code", "source": [ - "var computedPvBaseAM_PR = Test.GetScope((idAM, \"NIC\", \"BE\", (int?)null));", - "\ncomputedPvBaseAM_PR" + "var computedPresentValueAM_PR = Test.GetScope((idAM, \"NIC\", \"BE\", (int?)null));", + "\ncomputedPresentValueAM_PR" ], "metadata": {}, "execution_count": 1, diff --git a/Test/SpecificationsSetup.ipynb b/Test/SpecificationsSetup.ipynb index 8fdfb7ae..96e7025a 100644 --- a/Test/SpecificationsSetup.ipynb +++ b/Test/SpecificationsSetup.ipynb @@ -84,7 +84,7 @@ "\n", "\nstatic void ForEach(this IEnumerable self, Action action) => self.ToList().ForEach(action);", "\n", - "\npublic static IfrsVariable FromPvToIfrsVariable(this PvBase scope)", + "\npublic static IfrsVariable FromPvToIfrsVariable(this PresentValue scope)", "\n => new IfrsVariable{ EconomicBasis = scope.EconomicBasis, ", "\n EstimateType = scope.Identity.CalculationType, ", "\n DataNode = scope.Identity.Id.DataNode, ", diff --git a/Test/SpecificationsTechnicalMargin.ipynb b/Test/SpecificationsTechnicalMargin.ipynb index 7368b76c..5e35ce33 100644 --- a/Test/SpecificationsTechnicalMargin.ipynb +++ b/Test/SpecificationsTechnicalMargin.ipynb @@ -1223,7 +1223,7 @@ "cell_type": "code", "source": [ "var premiums = premiumAllocationFactor * Test.GetStorage().GetPremiums()", - "\n .Sum(p => referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n .Sum(p => referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.A, (int?)null)).Value)", "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.AA, (int?)null)).Value)", "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.OA, (int?)null)).Value)", @@ -1264,7 +1264,7 @@ "cell_type": "code", "source": [ "var attributableExpenseAndCommissions = new string[] {AmountTypes.ACA, AmountTypes.AEA}", - "\n .Sum(d => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n .Sum(d => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, EstimateTypes.A, (int?)null)).Value));" ], "metadata": {}, @@ -1302,7 +1302,7 @@ "cell_type": "code", "source": [ "var investmentClaims = Test.GetStorage().GetInvestmentClaims()", - "\n .Sum(ic => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n .Sum(ic => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.A, (int?)null)).Value)", "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.AA, (int?)null)).Value)", "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.OA, (int?)null)).Value)", From 2b320ead7db0b05368cd85a71ca889069022074b Mon Sep 17 00:00:00 2001 From: sbusato <103484221+sbusato@users.noreply.github.com> Date: Wed, 5 Oct 2022 20:28:36 +0200 Subject: [PATCH 04/43] Merge pull request #36 from Systemorph/CleanUpNotebooksSpaces Clean up notebooks spaces --- Constants/Consts.ipynb | 660 +-- Constants/Enums.ipynb | 458 +- Constants/Validations.ipynb | 364 +- DataModel/DataStructure.ipynb | 3890 ++++++------- Database/Configure.ipynb | 218 +- Database/Schema Delete.ipynb | 144 +- Export/MapTemplate.ipynb | 578 +- Import/ImportResultPreview.ipynb | 590 +- Import/ImportScopeCalculation.ipynb | 4348 +++++++-------- Import/ImportStorage.ipynb | 752 ++- Import/Importers.ipynb | 2254 ++++---- .../InitSystemorphBaseToMemory.ipynb | 454 +- Initialization/InitSystemorphToDatabase.ipynb | 526 +- Initialization/InitSystemorphToMemory.ipynb | 242 +- InputFormatDescription.ipynb | 208 +- OverviewCalculationEngine.ipynb | 480 +- Report/ReportConfigurationAndUtils.ipynb | 268 +- Report/ReportScopes.ipynb | 1888 +++---- Report/ReportStorage.ipynb | 454 +- Report/Reports.ipynb | 900 ++- Test/AocStructureTest.ipynb | 1268 ++--- Test/ExportIfrsVariable.ipynb | 214 +- Test/ExportReportVariables.ipynb | 318 +- Test/IfrsVariablesTest.ipynb | 592 +- Test/ImportStorageTest.ipynb | 1298 ++--- Test/MapTemplateAndImportTest.ipynb | 1000 ++-- Test/QueriesTest.ipynb | 952 ++-- Test/ReportStorageTest.ipynb | 218 +- Test/ReportVariablesTest.ipynb | 434 +- Test/ReportVariablesTestBase.ipynb | 284 +- Test/SpecificationsFinancialPerformance.ipynb | 2872 ++++------ Test/SpecificationsImportActuals.ipynb | 1202 ++-- Test/SpecificationsImportCashflows.ipynb | 4892 +++++++---------- Test/SpecificationsSetup.ipynb | 256 +- Test/SpecificationsTechnicalMargin.ipynb | 4334 ++++++--------- Test/TechnicalMarginTest.ipynb | 558 +- Test/Tests.ipynb | 302 +- Utils/ApplicationMessage.ipynb | 260 +- Utils/UtilityMethods.ipynb | 2050 +++---- 39 files changed, 18759 insertions(+), 24221 deletions(-) diff --git a/Constants/Consts.ipynb b/Constants/Consts.ipynb index 21850a86..12992f46 100644 --- a/Constants/Consts.ipynb +++ b/Constants/Consts.ipynb @@ -1,386 +1,280 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "toc-showmarkdowntxt": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "2kYu9e9ygUipdOuqA9Hk6A", - "cell_type": "markdown", - "source": [ - "

Consts

" - ], - "metadata": {} - }, - { - "id": "DmUpa-myfk6s7tnBoktcyw", - "cell_type": "markdown", - "source": [ - "# Numerical Precision" - ], - "metadata": {} - }, - { - "id": "KG3zmL2K_kGTNzWA2eQJvg", - "cell_type": "code", - "source": [ - "public const double Precision = 1E-5;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gMPLPUb7kUiJnLQWtEkkFA", - "cell_type": "code", - "source": [ - "public const double ProjectionPrecision = 1E-3;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gv0HnKTwuU--7Xo8e6UU2w", - "cell_type": "code", - "source": [ - "public const double BenchmarkPrecision = 1E-4;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gbuDd5t2Ike1Jq-lnVVIqg", - "cell_type": "markdown", - "source": [ - "# Time Period" - ], - "metadata": {} - }, - { - "id": "oX6yOw75DE-NwrYkdYTmzg", - "cell_type": "code", - "source": [ - "public const int CurrentPeriod = 0; " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2XFjLebnDEWBoNCyq6lKgg", - "cell_type": "code", - "source": [ - "public const int PreviousPeriod = -1; " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5ydvfd1abEm-CSTH-csz-g", - "cell_type": "code", - "source": [ - "public const int MonthInAYear = 12;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yhpv5BPDJUGKucF6Y_AVeQ", - "cell_type": "markdown", - "source": [ - "# Defaults" - ], - "metadata": {} - }, - { - "id": "uOfb6nvi8USI3mPOH8YvwQ", - "cell_type": "code", - "source": [ - "public const int DefaultDataNodeActivationMonth = 1;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZU5IN71RqEmHfRQSSCUvnw", - "cell_type": "code", - "source": [ - "public const double DefaultPremiumExperienceAdjustmentFactor = 1.0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KNUzhe58B0GBnCuZD1ATOg", - "cell_type": "markdown", - "source": [ - "# Names" - ], - "metadata": {} - }, - { - "id": "hZGPPDopiECnoXlB48cB2Q", - "cell_type": "code", - "source": [ - "public const string Main = nameof(Main);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "w5Zs2AGjxkWgRQfAGs8BIA", - "cell_type": "code", - "source": [ - "public const string Default = nameof(Default);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jAyhudwOJkmsPwMaZM1P4g", - "cell_type": "code", - "source": [ - "public const string ValueType = nameof(ValueType);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Aj_qnZxiqUeFHk088tNruA", - "cell_type": "markdown", - "source": [ - "GroupCurrency defines the SystemName (from Currency Dimension) to be used as the Group Currency." - ], - "metadata": {} - }, - { - "id": "pvlhKSXdW0Wt3dns45SWfQ", - "cell_type": "code", - "source": [ - "public const string GroupCurrency = \"CHF\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9SCJFj6zcUK_5Uczpicjjw", - "cell_type": "markdown", - "source": [ - "# Import Formats" - ], - "metadata": {} - }, - { - "id": "xEDrrk_AxUicpKHTSr6acA", - "cell_type": "code", - "source": [ - "public static class ImportFormats{", - "\n public const string Cashflow = nameof(Cashflow);", - "\n public const string Actual = nameof(Actual);", - "\n public const string DataNodeParameter = nameof(DataNodeParameter);", - "\n public const string SimpleValue = nameof(SimpleValue);", - "\n public const string Opening = nameof(Opening);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "DQHpY4V8xUOGR8L84B7DTg", - "cell_type": "markdown", - "source": [ - "# IFRS specific" - ], - "metadata": {} - }, - { - "id": "YjgOf6OCyUuxcwR9IhoZvA", - "cell_type": "code", - "source": [ - "public static class ValuationApproaches{", - "\n public const string BBA = nameof(BBA); //Building Block Approach", - "\n public const string VFA = nameof(VFA); //Variable Fee Approach", - "\n public const string PAA = nameof(PAA); //Premium Allocation Approach", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "pMhVfzvrjkyXcNpx0Tn4wA", - "cell_type": "code", - "source": [ - "public static class LiabilityTypes{", - "\n public const string LRC = nameof(LRC); //Liability for Remaining Coverage", - "\n public const string LIC = nameof(LIC); //Liability Incurred Claims", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1eDEjgoZmEOfPbRzZthlTQ", - "cell_type": "code", - "source": [ - "public static class CalculationTypes{", - "\n public const string BE = nameof(BE); //Best Estimate", - "\n public const string CU = nameof(CU); //Coverage Units", - "\n public const string RA = nameof(RA); //Risk Adjustment", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "b6cmqzNyQ0q0McHf-Rf5lw", - "cell_type": "code", - "source": [ - "public static class EstimateTypes{", - "\n public const string BE = nameof(BE); //Best Estimate", - "\n public const string RA = nameof(RA); //Risk Adjustment", - "\n public const string A = nameof(A); //Actuals", - "\n public const string AA = nameof(AA); //Advance Actuals", - "\n public const string OA = nameof(OA); //Overdue Actuals", - "\n public const string DA = nameof(DA); //Deferrable Actuals", - "\n public const string C = nameof(C); //Contractual Service Margin", - "\n public const string L = nameof(L); //Loss Component", - "\n public const string LR = nameof(LR); //Loss Recovery", - "\n public const string F = nameof(F); //factors", - "\n public const string FCF = nameof(FCF); //Fulfilment Cash flows", - "\n public const string BEPA = nameof(BEPA); //Experience Adjusted BE Premium to Csm", - "\n public const string APA = nameof(APA); //Experience Adjusted Written Actual Premium to Csm", - "\n public const string AAPA = nameof(AAPA); //Experience Adjusted Advance Actual Premium to Csm", - "\n public const string OAPA = nameof(OAPA); //Experience Adjusted Overdue Actual Premium to Csm", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vCJNvDF6D02HPepD8ay2pA", - "cell_type": "code", - "source": [ - "public static class AocTypes{", - "\n public const string BOP = nameof(BOP);", - "\n public const string MC = nameof(MC);", - "\n public const string RCU = nameof(RCU);", - "\n public const string CF = nameof(CF);", - "\n public const string IA = nameof(IA);", - "\n public const string YCU = nameof(YCU);", - "\n public const string CRU = nameof(CRU);", - "\n public const string WO = nameof(WO);", - "\n public const string EV = nameof(EV);", - "\n public const string CL = nameof(CL);", - "\n public const string EA = nameof(EA);", - "\n public const string AM = nameof(AM);", - "\n public const string FX = nameof(FX);", - "\n public const string EOP = nameof(EOP);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "OE45Je2KUk6WlHo9upd5fA", - "cell_type": "code", - "source": [ - "public static class Novelties{", - "\n public const string I = nameof(I); //In-Force", - "\n public const string N = nameof(N); //New Business", - "\n public const string C = nameof(C); //All Novelties Combined", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BUPmJSTjdkuP8nR7MJyQiw", - "cell_type": "code", - "source": [ - "public static class EconomicBases{", - "\n public const string L = nameof(L); //Locked Interest Rates", - "\n public const string C = nameof(C); //Current Interest Rates", - "\n public const string N = nameof(N); //Nominal Interest Rates", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-cRhXT5tKE-834Umpyaudw", - "cell_type": "code", - "source": [ - "public static class AmountTypes{", - "\n public const string ACA = nameof(ACA); //Attributable Commissions Acquisition", - "\n public const string AEA = nameof(AEA); //Attributable Expenses Acquisition", - "\n public const string CDR = nameof(CDR); //Credit Default Risk", - "\n public const string CL = nameof(CL); //Claims", - "\n public const string PR = nameof(PR); //Premiums", - "\n public const string NIC = nameof(NIC); //Claims Non-Investment component", - "\n public const string ICO = nameof(ICO); //Claims Investment component", - "\n public const string NE = nameof(NE); //Non Attributable Expenses", - "\n public const string ACM = nameof(ACM); //Attributable Commissions Maintenance", - "\n public const string AEM = nameof(AEM); //Attributable Expenses Maintenance", - "\n public const string AC = nameof(AC); //Attributable Commissions", - "\n public const string AE = nameof(AE); //Attributable Expenses", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "e33hFwGm9kmVNOsShmvn4w", - "cell_type": "markdown", - "source": [ - "# Insurance specific" - ], - "metadata": {} - }, - { - "id": "9n2de6iCUEKECrkoUtSuiw", - "cell_type": "code", - "source": [ - "public static class LineOfBusinesses{", - "\n public const string LI = nameof(LI); //Life", - "\n public const string NL = nameof(NL); //Non-Life", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Consts

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Numerical Precision" + ] + }, + { + "cell_type": "code", + "source": [ + "public const double Precision = 1E-5;" + ] + }, + { + "cell_type": "code", + "source": [ + "public const double ProjectionPrecision = 1E-3;" + ] + }, + { + "cell_type": "code", + "source": [ + "public const double BenchmarkPrecision = 1E-4;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Time Period" + ] + }, + { + "cell_type": "code", + "source": [ + "public const int CurrentPeriod = 0; " + ] + }, + { + "cell_type": "code", + "source": [ + "public const int PreviousPeriod = -1; " + ] + }, + { + "cell_type": "code", + "source": [ + "public const int MonthInAYear = 12;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Defaults" + ] + }, + { + "cell_type": "code", + "source": [ + "public const int DefaultDataNodeActivationMonth = 1;" + ] + }, + { + "cell_type": "code", + "source": [ + "public const double DefaultPremiumExperienceAdjustmentFactor = 1.0;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Names" + ] + }, + { + "cell_type": "code", + "source": [ + "public const string Main = nameof(Main);" + ] + }, + { + "cell_type": "code", + "source": [ + "public const string Default = nameof(Default);" + ] + }, + { + "cell_type": "code", + "source": [ + "public const string ValueType = nameof(ValueType);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "GroupCurrency defines the SystemName (from Currency Dimension) to be used as the Group Currency." + ] + }, + { + "cell_type": "code", + "source": [ + "public const string GroupCurrency = \"CHF\";" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Formats" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class ImportFormats{", + "\n public const string Cashflow = nameof(Cashflow);", + "\n public const string Actual = nameof(Actual);", + "\n public const string DataNodeParameter = nameof(DataNodeParameter);", + "\n public const string SimpleValue = nameof(SimpleValue);", + "\n public const string Opening = nameof(Opening);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# IFRS specific" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class ValuationApproaches{", + "\n public const string BBA = nameof(BBA); //Building Block Approach", + "\n public const string VFA = nameof(VFA); //Variable Fee Approach", + "\n public const string PAA = nameof(PAA); //Premium Allocation Approach", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class LiabilityTypes{", + "\n public const string LRC = nameof(LRC); //Liability for Remaining Coverage", + "\n public const string LIC = nameof(LIC); //Liability Incurred Claims", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class CalculationTypes{", + "\n public const string BE = nameof(BE); //Best Estimate", + "\n public const string CU = nameof(CU); //Coverage Units", + "\n public const string RA = nameof(RA); //Risk Adjustment", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class EstimateTypes{", + "\n public const string BE = nameof(BE); //Best Estimate", + "\n public const string RA = nameof(RA); //Risk Adjustment", + "\n public const string A = nameof(A); //Actuals", + "\n public const string AA = nameof(AA); //Advance Actuals", + "\n public const string OA = nameof(OA); //Overdue Actuals", + "\n public const string DA = nameof(DA); //Deferrable Actuals", + "\n public const string C = nameof(C); //Contractual Service Margin", + "\n public const string L = nameof(L); //Loss Component", + "\n public const string LR = nameof(LR); //Loss Recovery", + "\n public const string F = nameof(F); //factors", + "\n public const string FCF = nameof(FCF); //Fulfilment Cash flows", + "\n public const string BEPA = nameof(BEPA); //Experience Adjusted BE Premium to Csm", + "\n public const string APA = nameof(APA); //Experience Adjusted Written Actual Premium to Csm", + "\n public const string AAPA = nameof(AAPA); //Experience Adjusted Advance Actual Premium to Csm", + "\n public const string OAPA = nameof(OAPA); //Experience Adjusted Overdue Actual Premium to Csm", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class AocTypes{", + "\n public const string BOP = nameof(BOP);", + "\n public const string MC = nameof(MC);", + "\n public const string RCU = nameof(RCU);", + "\n public const string CF = nameof(CF);", + "\n public const string IA = nameof(IA);", + "\n public const string YCU = nameof(YCU);", + "\n public const string CRU = nameof(CRU);", + "\n public const string WO = nameof(WO);", + "\n public const string EV = nameof(EV);", + "\n public const string CL = nameof(CL);", + "\n public const string EA = nameof(EA);", + "\n public const string AM = nameof(AM);", + "\n public const string FX = nameof(FX);", + "\n public const string EOP = nameof(EOP);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class Novelties{", + "\n public const string I = nameof(I); //In-Force", + "\n public const string N = nameof(N); //New Business", + "\n public const string C = nameof(C); //All Novelties Combined", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class EconomicBases{", + "\n public const string L = nameof(L); //Locked Interest Rates", + "\n public const string C = nameof(C); //Current Interest Rates", + "\n public const string N = nameof(N); //Nominal Interest Rates", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class AmountTypes{", + "\n public const string ACA = nameof(ACA); //Attributable Commissions Acquisition", + "\n public const string AEA = nameof(AEA); //Attributable Expenses Acquisition", + "\n public const string CDR = nameof(CDR); //Credit Default Risk", + "\n public const string CL = nameof(CL); //Claims", + "\n public const string PR = nameof(PR); //Premiums", + "\n public const string NIC = nameof(NIC); //Claims Non-Investment component", + "\n public const string ICO = nameof(ICO); //Claims Investment component", + "\n public const string NE = nameof(NE); //Non Attributable Expenses", + "\n public const string ACM = nameof(ACM); //Attributable Commissions Maintenance", + "\n public const string AEM = nameof(AEM); //Attributable Expenses Maintenance", + "\n public const string AC = nameof(AC); //Attributable Commissions", + "\n public const string AE = nameof(AE); //Attributable Expenses", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Insurance specific" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class LineOfBusinesses{", + "\n public const string LI = nameof(LI); //Life", + "\n public const string NL = nameof(NL); //Non-Life", + "\n}" + ] + } + ] } \ No newline at end of file diff --git a/Constants/Enums.ipynb b/Constants/Enums.ipynb index 5700a892..63b1b56f 100644 --- a/Constants/Enums.ipynb +++ b/Constants/Enums.ipynb @@ -1,269 +1,193 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "toc-showmarkdowntxt": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "HUFgBXkmYU6rV0daYBo-nQ", - "cell_type": "markdown", - "source": [ - "# Enumerables", - "\n", - "\nIn the case of data which is not expected to change over time, it is convenient to introduce such data as variables of type \"enumerable\"." - ], - "metadata": {} - }, - { - "id": "ALWeaAkPh0uiwQ9SYb9Y-w", - "cell_type": "markdown", - "source": [ - "## Exchange Rates", - "\n", - "\nFor exchange rates, we set the type for which the rates apply:" - ], - "metadata": {} - }, - { - "id": "W6x_0Pa3_kOAd3N9CBgcgQ", - "cell_type": "code", - "source": [ - "public enum FxType { Spot, Average }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "r50zPe2AP0KrCOR-fgpccg", - "cell_type": "code", - "source": [ - "public enum FxPeriod { NotApplicable, BeginningOfPeriod, Average, EndOfPeriod }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YCF3tVHQB0eUa0yWpiRD0g", - "cell_type": "markdown", - "source": [ - "## Currency Types" - ], - "metadata": {} - }, - { - "id": "cF0fRptcGE64Vr1b058rqg", - "cell_type": "markdown", - "source": [ - "Currency Types define which currency is used as standard at different aggregation levels (in the Data Level hierarchy).", - "\n- Functional: this is the standard Currency Type at Reporting Node level", - "\n- Group: this is the standard Currency Type at Group level", - "\n- Contractual: this is the standard Currency Type at Data Node level", - "\n- Transactional: this is the standard Currency Type at Transactional level (used typically for Actuals)" - ], - "metadata": {} - }, - { - "id": "zj07LR0PT0CesH4nRl1Sig", - "cell_type": "code", - "source": [ - "public enum CurrencyType { Functional, Group, Contractual, Transactional }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "wL17I9jyQ0eaeXrSdlvJyA", - "cell_type": "markdown", - "source": [ - "## Period Type" - ], - "metadata": {} - }, - { - "id": "3e3wVNw-rECnTHBTkVOfCQ", - "cell_type": "code", - "source": [ - "public enum PeriodType { NotApplicable, BeginningOfPeriod, EndOfPeriod }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Expd7Urm102om6-y2Skz4w", - "cell_type": "markdown", - "source": [ - "## Valuation Period" - ], - "metadata": {} - }, - { - "id": "dsJwHWIQPkOB29dEUCLHGg", - "cell_type": "code", - "source": [ - "public enum ValuationPeriod { NotApplicable, BeginningOfPeriod, MidOfPeriod, Delta, EndOfPeriod }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "iejG0G0VJ0q_tAg2HGHuOw", - "cell_type": "markdown", - "source": [ - "## Portfolio View" - ], - "metadata": {} - }, - { - "id": "0Pdzxbnsx0SOaIiUb_X1YQ", - "cell_type": "code", - "source": [ - "[Flags] public enum PortfolioView { Gross = 1, Reinsurance = 2, Net = Gross | Reinsurance }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "v7NVqB0p1Ei4vilTCiErFg", - "cell_type": "markdown", - "source": [ - "## Structure Type" - ], - "metadata": {} - }, - { - "id": "Kge1fD31n0S7BW0EiClT0g", - "cell_type": "code", - "source": [ - "public enum StructureType { None, AoC }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "S49a3Gcz_0S7apcSmQy3JA", - "cell_type": "markdown", - "source": [ - "## State" - ], - "metadata": {} - }, - { - "id": "mJADknA9Q0KQjmTmf03Blw", - "cell_type": "markdown", - "source": [ - "State describes the state in which a Data Node can be - There are two types of states:", - "\n- Active: visible in reports and queries", - "\n- Inactive: not visible in reports and queries" - ], - "metadata": {} - }, - { - "id": "lsRYxseYzUaLMcAn7JB2Qw", - "cell_type": "code", - "source": [ - "public enum State { Active, Inactive }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kgMLZfJ4PkCFRU4kLKSGcw", - "cell_type": "markdown", - "source": [ - "## Periodicity" - ], - "metadata": {} - }, - { - "id": "iV_fcqBE2E6B12CgJq2ybg", - "cell_type": "code", - "source": [ - "public enum Periodicity { Monthly, Quarterly, Yearly }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ndV2D2lQL0icIY9VirJweQ", - "cell_type": "markdown", - "source": [ - "## Input Source" - ], - "metadata": {} - }, - { - "id": "z6t0m-civUGAcBEAW0C3Nw", - "cell_type": "code", - "source": [ - "[Flags]", - "\npublic enum InputSource {NotApplicable = 0, Opening = 1, Actual = 2, Cashflow = 4} ", - "\n//Opening + Actual = 3,", - "\n//Opening + Cashflow = 5", - "\n//Actual + Cashflow = 6", - "\n//Opening + Actual + Cashflow = 7" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "aEqUAtvxPESgt-FHx2e7yA", - "cell_type": "markdown", - "source": [ - "## Data Type" - ], - "metadata": {} - }, - { - "id": "LR7R7DUA0k6Ywl5WjSrEvg", - "cell_type": "code", - "source": [ - "public enum DataType { Optional, Mandatory, Calculated, CalculatedTelescopic }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "euBhm6zy1Uib521-G3w3eQ", - "cell_type": "markdown", - "source": [ - "## Import Scope" - ], - "metadata": {} - }, - { - "id": "4PP7M-Sv9k6_6MsJWS1bUg", - "cell_type": "code", - "source": [ - "public enum ImportScope { Primary, Secondary }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Enumerables", + "\n", + "\nIn the case of data which is not expected to change over time, it is convenient to introduce such data as variables of type \"enumerable\"." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Exchange Rates", + "\n", + "\nFor exchange rates, we set the type for which the rates apply:" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum FxType { Spot, Average }" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum FxPeriod { NotApplicable, BeginningOfPeriod, Average, EndOfPeriod }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Currency Types" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Currency Types define which currency is used as standard at different aggregation levels (in the Data Level hierarchy).", + "\n- Functional: this is the standard Currency Type at Reporting Node level", + "\n- Group: this is the standard Currency Type at Group level", + "\n- Contractual: this is the standard Currency Type at Data Node level", + "\n- Transactional: this is the standard Currency Type at Transactional level (used typically for Actuals)" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum CurrencyType { Functional, Group, Contractual, Transactional }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Period Type" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum PeriodType { NotApplicable, BeginningOfPeriod, EndOfPeriod }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Valuation Period" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum ValuationPeriod { NotApplicable, BeginningOfPeriod, MidOfPeriod, Delta, EndOfPeriod }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Portfolio View" + ] + }, + { + "cell_type": "code", + "source": [ + "[Flags] public enum PortfolioView { Gross = 1, Reinsurance = 2, Net = Gross | Reinsurance }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Structure Type" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum StructureType { None, AoC }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## State" + ] + }, + { + "cell_type": "markdown", + "source": [ + "State describes the state in which a Data Node can be - There are two types of states:", + "\n- Active: visible in reports and queries", + "\n- Inactive: not visible in reports and queries" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum State { Active, Inactive }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Periodicity" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum Periodicity { Monthly, Quarterly, Yearly }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Input Source" + ] + }, + { + "cell_type": "code", + "source": [ + "[Flags]", + "\npublic enum InputSource {NotApplicable = 0, Opening = 1, Actual = 2, Cashflow = 4} ", + "\n//Opening + Actual = 3,", + "\n//Opening + Cashflow = 5", + "\n//Actual + Cashflow = 6", + "\n//Opening + Actual + Cashflow = 7" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Type" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum DataType { Optional, Mandatory, Calculated, CalculatedTelescopic }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Import Scope" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum ImportScope { Primary, Secondary }" + ] + } + ] } \ No newline at end of file diff --git a/Constants/Validations.ipynb b/Constants/Validations.ipynb index f58110a8..18f30a6f 100644 --- a/Constants/Validations.ipynb +++ b/Constants/Validations.ipynb @@ -1,200 +1,170 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "toc-showmarkdowntxt": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "LgEd-jVnbEGK9QI-QWcVQw", - "cell_type": "markdown", - "source": [ - "

Errors and Warnings

" - ], - "metadata": {} - }, - { - "id": "-scbNYag2kmx_38hEmkBgA", - "cell_type": "code", - "source": [ - "#!import \"Enums\"", - "\n#!import \"Consts\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8xjDwqEVm0WjJuTlC2QERA", - "cell_type": "markdown", - "source": [ - "# Codes" - ], - "metadata": {} - }, - { - "id": "9CPbuC0YV0aSt5wA3uOxnw", - "cell_type": "code", - "source": [ - "public enum Warning {", - "\n // Import", - "\n ActiveDataNodeWithCashflowBOPI,", - "\n // Default", - "\n Generic", - "\n}; " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QWAQV2xUcEigl3eydHTJaA", - "cell_type": "code", - "source": [ - "public enum Error { ", - "\n // Import", - "\n NoMainTab, IncompleteMainTab, ParsingScientificNotation, ValueTypeNotFound, ValueTypeNotValid, AocTypeNotValid,", - "\n // Partition", - "\n PartitionNotFound, ParsedPartitionNotFound, PartititionNameNotFound, PartitionTypeNotFound,", - "\n // Dimensions", - "\n AmountTypeNotFound, EstimateTypeNotFound,CalculationTypeNotFound, ReportingNodeNotFound, AocTypeMapNotFound, AocTypeNotFound, PortfolioGicNotFound, PortfolioGricNotFound, ", - "\n InvalidAmountTypeEstimateType, MultipleTechnicalMarginOpening,", - "\n // Exchange Rate", - "\n ExchangeRateNotFound, ExchangeRateCurrency,", - "\n // Data Note State", - "\n ChangeDataNodeState, InactiveDataNodeState,", - "\n // Parameters", - "\n ReinsuranceCoverageDataNode, DuplicateInterDataNode, DuplicateSingleDataNode, InvalidDataNode, ", - "\n // Storage", - "\n DataNodeNotFound, PartnerNotFound, RatingNotFound, CreditDefaultRateNotFound, MissingPremiumAllocation, ReinsuranceCoverage, ", - "\n YieldCurveNotFound, YieldCurvePeriodNotApplicable, EconomicBasisNotFound, AccountingVariableTypeNotFound,", - "\n // Scopes", - "\n NotSupportedAocStepReference, MultipleEoP,", - "\n // Data completeness", - "\n MissingDataAtPosting, MissingCombinedLiability, MissingCoverageUnit, ", - "\n // Default", - "\n Generic", - "\n};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ThPESGETMUm31fuq-qS4_w", - "cell_type": "markdown", - "source": [ - "# Messages" - ], - "metadata": {} - }, - { - "id": "x3UlljewwEut3M0NRlUDDg", - "cell_type": "code", - "source": [ - "public static string Get (Error e, params string[] s) => (e, s.Length) switch ", - "\n{", - "\n // Import", - "\n (Error.NoMainTab , _) => $\"No Main tab in the parsed file.\",", - "\n (Error.IncompleteMainTab , _) => $\"Incomplete Main tab in the parsed file.\",", - "\n (Error.ParsingScientificNotation , 1) => $\"While parsing found real number in scientific notation: {s[0]}.\",", - "\n (Error.ValueTypeNotFound , _) => $\"Value Type not found.\",", - "\n (Error.ValueTypeNotValid , 1) => $\"The Value Type {s[0]} is invalid.\",", - "\n (Error.AocTypeNotValid , 1) => $\"The parsed AocType {s[0]} is invalid.\",", - "\n // Partition", - "\n (Error.PartitionNotFound , _) => $\"Partition do not found.\",", - "\n (Error.ParsedPartitionNotFound , 1) => $\"Parsed partition not available: ReportingNode {s[0]}.\",", - "\n (Error.ParsedPartitionNotFound , 4) => $\"Parsed partition not available: ReportingNode {s[0]}, Year {s[1]}, Month {s[2]}, Scenario {s[3]}.\",", - "\n (Error.PartitionTypeNotFound , 1) => $\"Partition type not found: {s[0]}.\",", - "\n // Dimensions", - "\n (Error.AmountTypeNotFound , 1) => $\"AmountType {s[0]} not found.\",", - "\n (Error.EstimateTypeNotFound , 1) => $\"EstimateType {s[0]} not found.\",", - "\n (Error.CalculationTypeNotFound , 1) => $\"CalculationType {s[0]} not found.\",", - "\n (Error.ReportingNodeNotFound , 1) => $\"Reporting Node {s[0]} not found.\",", - "\n (Error.AocTypeNotFound , 1) => $\"AocType {s[0]} not found.\",", - "\n (Error.AocTypeMapNotFound , 2) => $\"AocType {s[0]} and Novelty {s[1]} combination not defined in the mapping.\",", - "\n (Error.PortfolioGicNotFound , 2) => $\"Portfolio {s[0]} assigned to Group of Insurance Contract {s[1]} does not exist.\",", - "\n (Error.PortfolioGricNotFound , 2) => $\"Portfolio {s[0]} assigned to Group of Reinsurance Contract {s[1]} does not exist.\",", - "\n (Error.InvalidAmountTypeEstimateType , 2) => $\"Invalid combination of EstimateType {s[0]} and AmountType {s[1]}.\",", - "\n (Error.MultipleTechnicalMarginOpening , 1) => $\"Multiple opening for techincal margin are not allowed for DataNode {s[0]}.\",", - "\n // Exchange Rate", - "\n (Error.ExchangeRateNotFound , 2) => $\"Exchange Rate for {s[0]} {s[1]} is not present.\",", - "\n (Error.ExchangeRateCurrency , 1) => $\"{s[0]} does not have any Exchange Rate defined.\", ", - "\n // Data Node State", - "\n (Error.ChangeDataNodeState , 0) => $\"Data Node State can not change from Inactive state into Active state.\",", - "\n (Error.ChangeDataNodeState , 1) => $\"Data Node State for {s[0]} can not change from Inactive state into Active state.\",", - "\n (Error.ChangeDataNodeState , 3) => $\"Data Node State for {s[0]} can not change from {s[1]} state into {s[2]} state.\",", - "\n (Error.InactiveDataNodeState , 1) => $\"Data imported for inactive Data Node {s[0]}.\",", - "\n //Parameters", - "\n (Error.ReinsuranceCoverageDataNode , 2) => $\"Invalid Reinsurance Coverage parameter does not link a GroupOfReinsuranceContract to a GroupOfInsuranceContract. Provided GroupOfContracts are: {s[0]}, {s[1]}.\",", - "\n (Error.DuplicateInterDataNode , 2) => $\"Duplicated Inter-DataNode parameter for {s[0]}-{s[1]} is found.\",", - "\n (Error.DuplicateSingleDataNode , 1) => $\"Duplicated Single-DataNode parameter for {s[0]} is found.\",", - "\n (Error.InvalidDataNode , 1) => $\"Data imported for invalid Data Node {s[0]}.\",", - "\n // Storage", - "\n (Error.DataNodeNotFound , 1) => $\"DataNode {s[0]} not found.\",", - "\n (Error.PartnerNotFound , 1) => $\"Partner not found for DataNode {s[0]}.\",", - "\n (Error.RatingNotFound , 1) => $\"Rating not found for Partner {s[0]}.\",", - "\n (Error.CreditDefaultRateNotFound , 1) => $\"Credit Default Rate not found for rating {s[0]}.\",", - "\n (Error.MissingPremiumAllocation , 1) => $\"Premium Allocation Rate not found for Group of Contract {s[0]}.\", // TODO: this is now a warning to be produced by a validation in the importers (default is 1)", - "\n (Error.ReinsuranceCoverage , 1) => $\"Reinsurance Allocation Rate not found for Group of Insurance Contract {s[0]}.\",", - "\n (Error.YieldCurveNotFound , 3) => $\"Yield Curve not found for currency {s[0]}, year {s[1]}, and month {s[2]}.\",", - "\n (Error.YieldCurvePeriodNotApplicable , 2) => $\"YieldCurve period NotApplicable not valid for AocStep with AocType {s[0]} and Novelty {s[1]}.\",", - "\n (Error.EconomicBasisNotFound , 1) => $\"EconomicBasis not valid for DataNode {s[0]}.\",", - "\n (Error.AccountingVariableTypeNotFound , 1) => $\"AccountingVariableType {s[0]} not found.\",", - "\n // Scopes", - "\n (Error.NotSupportedAocStepReference , 1) => $\"Unsupported reference Aoc Step for Aoc Type {s[0]}.\",", - "\n (Error.MultipleEoP , 0) => $\"Closing Balance for both Csm and Lc are computed.\",", - "\n // Data Completeness", - "\n (Error.MissingDataAtPosting , 1) => $\"Missing imported data for {s[0]} DataNode.\",", - "\n (Error.MissingCombinedLiability , 2) => $\"Missing Combined Liability Aoc Type for DataNode {s[0]} and AmountType {s[1]}.\",", - "\n (Error.MissingCoverageUnit , 1) => $\"Missing Coverage Unit cash flow for {s[0]} DataNode.\",", - "\n // Default", - "\n (Error.Generic , _) => $\"{s[0]}\",", - "\n (_ , _) => $\"Error not found.\"", - "\n};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "PnguuqruSkaTERChlORdKw", - "cell_type": "code", - "source": [ - "public static string Get (Warning w, params string[] s) => (w, s.Length) switch {", - "\n // Import", - "\n (Warning.ActiveDataNodeWithCashflowBOPI , _) => $\"Cashflows for active DataNode has been parsed with AocType {AocTypes.BOP} and Novelty {Novelties.I} \",", - "\n // Default", - "\n (Warning.Generic , _) => $\"{s[0]}\",", - "\n (_ , _) => $\"Warning not found.\"", - "\n};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "COxOqdqYwUqx0ozqRQof0w", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Errors and Warnings

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"Enums\"", + "\n#!import \"Consts\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Codes" + ] + }, + { + "cell_type": "code", + "source": [ + "public enum Warning {", + "\n // Import", + "\n ActiveDataNodeWithCashflowBOPI,", + "\n // Default", + "\n Generic", + "\n}; " + ] + }, + { + "cell_type": "code", + "source": [ + "public enum Error { ", + "\n // Import", + "\n NoMainTab, IncompleteMainTab, ParsingScientificNotation, ValueTypeNotFound, ValueTypeNotValid, AocTypeNotValid,", + "\n // Partition", + "\n PartitionNotFound, ParsedPartitionNotFound, PartititionNameNotFound, PartitionTypeNotFound,", + "\n // Dimensions", + "\n AmountTypeNotFound, EstimateTypeNotFound,CalculationTypeNotFound, ReportingNodeNotFound, AocTypeMapNotFound, AocTypeNotFound, PortfolioGicNotFound, PortfolioGricNotFound, ", + "\n InvalidAmountTypeEstimateType, MultipleTechnicalMarginOpening,", + "\n // Exchange Rate", + "\n ExchangeRateNotFound, ExchangeRateCurrency,", + "\n // Data Note State", + "\n ChangeDataNodeState, InactiveDataNodeState,", + "\n // Parameters", + "\n ReinsuranceCoverageDataNode, DuplicateInterDataNode, DuplicateSingleDataNode, InvalidDataNode, ", + "\n // Storage", + "\n DataNodeNotFound, PartnerNotFound, RatingNotFound, CreditDefaultRateNotFound, MissingPremiumAllocation, ReinsuranceCoverage, ", + "\n YieldCurveNotFound, YieldCurvePeriodNotApplicable, EconomicBasisNotFound, AccountingVariableTypeNotFound,", + "\n // Scopes", + "\n NotSupportedAocStepReference, MultipleEoP,", + "\n // Data completeness", + "\n MissingDataAtPosting, MissingCombinedLiability, MissingCoverageUnit, ", + "\n // Default", + "\n Generic", + "\n};" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Messages" + ] + }, + { + "cell_type": "code", + "source": [ + "public static string Get (Error e, params string[] s) => (e, s.Length) switch ", + "\n{", + "\n // Import", + "\n (Error.NoMainTab , _) => $\"No Main tab in the parsed file.\",", + "\n (Error.IncompleteMainTab , _) => $\"Incomplete Main tab in the parsed file.\",", + "\n (Error.ParsingScientificNotation , 1) => $\"While parsing found real number in scientific notation: {s[0]}.\",", + "\n (Error.ValueTypeNotFound , _) => $\"Value Type not found.\",", + "\n (Error.ValueTypeNotValid , 1) => $\"The Value Type {s[0]} is invalid.\",", + "\n (Error.AocTypeNotValid , 1) => $\"The parsed AocType {s[0]} is invalid.\",", + "\n // Partition", + "\n (Error.PartitionNotFound , _) => $\"Partition do not found.\",", + "\n (Error.ParsedPartitionNotFound , 1) => $\"Parsed partition not available: ReportingNode {s[0]}.\",", + "\n (Error.ParsedPartitionNotFound , 4) => $\"Parsed partition not available: ReportingNode {s[0]}, Year {s[1]}, Month {s[2]}, Scenario {s[3]}.\",", + "\n (Error.PartitionTypeNotFound , 1) => $\"Partition type not found: {s[0]}.\",", + "\n // Dimensions", + "\n (Error.AmountTypeNotFound , 1) => $\"AmountType {s[0]} not found.\",", + "\n (Error.EstimateTypeNotFound , 1) => $\"EstimateType {s[0]} not found.\",", + "\n (Error.CalculationTypeNotFound , 1) => $\"CalculationType {s[0]} not found.\",", + "\n (Error.ReportingNodeNotFound , 1) => $\"Reporting Node {s[0]} not found.\",", + "\n (Error.AocTypeNotFound , 1) => $\"AocType {s[0]} not found.\",", + "\n (Error.AocTypeMapNotFound , 2) => $\"AocType {s[0]} and Novelty {s[1]} combination not defined in the mapping.\",", + "\n (Error.PortfolioGicNotFound , 2) => $\"Portfolio {s[0]} assigned to Group of Insurance Contract {s[1]} does not exist.\",", + "\n (Error.PortfolioGricNotFound , 2) => $\"Portfolio {s[0]} assigned to Group of Reinsurance Contract {s[1]} does not exist.\",", + "\n (Error.InvalidAmountTypeEstimateType , 2) => $\"Invalid combination of EstimateType {s[0]} and AmountType {s[1]}.\",", + "\n (Error.MultipleTechnicalMarginOpening , 1) => $\"Multiple opening for techincal margin are not allowed for DataNode {s[0]}.\",", + "\n // Exchange Rate", + "\n (Error.ExchangeRateNotFound , 2) => $\"Exchange Rate for {s[0]} {s[1]} is not present.\",", + "\n (Error.ExchangeRateCurrency , 1) => $\"{s[0]} does not have any Exchange Rate defined.\", ", + "\n // Data Node State", + "\n (Error.ChangeDataNodeState , 0) => $\"Data Node State can not change from Inactive state into Active state.\",", + "\n (Error.ChangeDataNodeState , 1) => $\"Data Node State for {s[0]} can not change from Inactive state into Active state.\",", + "\n (Error.ChangeDataNodeState , 3) => $\"Data Node State for {s[0]} can not change from {s[1]} state into {s[2]} state.\",", + "\n (Error.InactiveDataNodeState , 1) => $\"Data imported for inactive Data Node {s[0]}.\",", + "\n //Parameters", + "\n (Error.ReinsuranceCoverageDataNode , 2) => $\"Invalid Reinsurance Coverage parameter does not link a GroupOfReinsuranceContract to a GroupOfInsuranceContract. Provided GroupOfContracts are: {s[0]}, {s[1]}.\",", + "\n (Error.DuplicateInterDataNode , 2) => $\"Duplicated Inter-DataNode parameter for {s[0]}-{s[1]} is found.\",", + "\n (Error.DuplicateSingleDataNode , 1) => $\"Duplicated Single-DataNode parameter for {s[0]} is found.\",", + "\n (Error.InvalidDataNode , 1) => $\"Data imported for invalid Data Node {s[0]}.\",", + "\n // Storage", + "\n (Error.DataNodeNotFound , 1) => $\"DataNode {s[0]} not found.\",", + "\n (Error.PartnerNotFound , 1) => $\"Partner not found for DataNode {s[0]}.\",", + "\n (Error.RatingNotFound , 1) => $\"Rating not found for Partner {s[0]}.\",", + "\n (Error.CreditDefaultRateNotFound , 1) => $\"Credit Default Rate not found for rating {s[0]}.\",", + "\n (Error.MissingPremiumAllocation , 1) => $\"Premium Allocation Rate not found for Group of Contract {s[0]}.\", // TODO: this is now a warning to be produced by a validation in the importers (default is 1)", + "\n (Error.ReinsuranceCoverage , 1) => $\"Reinsurance Allocation Rate not found for Group of Insurance Contract {s[0]}.\",", + "\n (Error.YieldCurveNotFound , 3) => $\"Yield Curve not found for currency {s[0]}, year {s[1]}, and month {s[2]}.\",", + "\n (Error.YieldCurvePeriodNotApplicable , 2) => $\"YieldCurve period NotApplicable not valid for AocStep with AocType {s[0]} and Novelty {s[1]}.\",", + "\n (Error.EconomicBasisNotFound , 1) => $\"EconomicBasis not valid for DataNode {s[0]}.\",", + "\n (Error.AccountingVariableTypeNotFound , 1) => $\"AccountingVariableType {s[0]} not found.\",", + "\n // Scopes", + "\n (Error.NotSupportedAocStepReference , 1) => $\"Unsupported reference Aoc Step for Aoc Type {s[0]}.\",", + "\n (Error.MultipleEoP , 0) => $\"Closing Balance for both Csm and Lc are computed.\",", + "\n // Data Completeness", + "\n (Error.MissingDataAtPosting , 1) => $\"Missing imported data for {s[0]} DataNode.\",", + "\n (Error.MissingCombinedLiability , 2) => $\"Missing Combined Liability Aoc Type for DataNode {s[0]} and AmountType {s[1]}.\",", + "\n (Error.MissingCoverageUnit , 1) => $\"Missing Coverage Unit cash flow for {s[0]} DataNode.\",", + "\n // Default", + "\n (Error.Generic , _) => $\"{s[0]}\",", + "\n (_ , _) => $\"Error not found.\"", + "\n};" + ] + }, + { + "cell_type": "code", + "source": [ + "public static string Get (Warning w, params string[] s) => (w, s.Length) switch {", + "\n // Import", + "\n (Warning.ActiveDataNodeWithCashflowBOPI , _) => $\"Cashflows for active DataNode has been parsed with AocType {AocTypes.BOP} and Novelty {Novelties.I} \",", + "\n // Default", + "\n (Warning.Generic , _) => $\"{s[0]}\",", + "\n (_ , _) => $\"Warning not found.\"", + "\n};" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/DataModel/DataStructure.ipynb b/DataModel/DataStructure.ipynb index 1e65f8b1..871ff938 100644 --- a/DataModel/DataStructure.ipynb +++ b/DataModel/DataStructure.ipynb @@ -1,2139 +1,1755 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "toc-showmarkdowntxt": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "E3XGdKdQXkSFZwQ0OR8f9Q", - "cell_type": "markdown", - "source": [ - "", - "\n

Data Model

", - "\n", - "\nThis notebook has the main structures used to hold data - This is usually called the **data model**." - ], - "metadata": {} - }, - { - "id": "wIRyXTP_f0aojedzQ_2yaw", - "cell_type": "markdown", - "source": [ - "# References", - "\nThis section initializes libraries and code from other notebooks, which will be used here, as well as information needed for querying data from the database." - ], - "metadata": {} - }, - { - "id": "_ldA06bDKEyrEr1rDJpRng", - "cell_type": "markdown", - "source": [ - "## Libraries" - ], - "metadata": {} - }, - { - "id": "iVjxSwqCvkCRk9OnawoClw", - "cell_type": "code", - "source": [ - "#r \"nuget:Systemorph.Workspace,1.2.0\"", - "\n#r \"nuget:Systemorph.Scopes,1.2.4\"", - "\n#r \"nuget:Systemorph.Import,1.3.0\"", - "\n#r \"nuget:Systemorph.Test,1.2.4\"", - "\n#r \"nuget:Systemorph.Export,1.3.0\"", - "\n#r \"nuget:Systemorph.DataSetReader,1.3.0\"", - "\n#r \"nuget:Systemorph.DataSource,1.2.0\"", - "\n#r \"nuget:Systemorph.DataSource.Conversions,1.2.0\"", - "\n#r \"nuget:Systemorph.Reporting,1.2.4\"", - "\n#r \"nuget:Systemorph.DomainDesigner,1.3.0\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tVqfp6kjPEWcWTsE7nmIJQ", - "cell_type": "markdown", - "source": [ - "## Usings" - ], - "metadata": {} - }, - { - "id": "H4cEfQ5jnE-pcrbgue7FNA", - "cell_type": "code", - "source": [ - "using System.ComponentModel.DataAnnotations;", - "\nusing System.ComponentModel.DataAnnotations.Schema;", - "\nusing Systemorph.Vertex.Grid.Model;", - "\nusing static Systemorph.Vertex.Arithmetics.ArithmeticOperations;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "r7mAcZwhpEOp8xf82HvdyQ", - "cell_type": "markdown", - "source": [ - "## Notebooks" - ], - "metadata": {} - }, - { - "id": "wkcyVZzJ5kqKCJm_siKkNQ", - "cell_type": "code", - "source": [ - "#!import \"../Constants/Enums\"", - "\n#!import \"../Constants/Consts\"", - "\n#!import \"../Constants/Validations\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HTeT_yYbpUCPrWtjwe9fdQ", - "cell_type": "markdown", - "source": [ - "# Data Infrastructure" - ], - "metadata": {} - }, - { - "id": "HrfAYsLiM0SFRqKe6IIlxA", - "cell_type": "markdown", - "source": [ - "", - "\n## Base Interfaces", - "\nThe following interfaces are used to define the granularity at which data is stored.", - "\n", - "\nFor instance, the IKeyed interface corresponds to the lowest granularity which is simply a unique identifier for a certain generic piece of data:" - ], - "metadata": {} - }, - { - "id": "-JHURlI5Z0mY6_UxQ7gfGA", - "cell_type": "code", - "source": [ - "public interface IKeyed", - "\n{ ", - "\n public Guid Id { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TLXXKZET0E-dDwCIcdZXBg", - "cell_type": "markdown", - "source": [ - "The interface IPartition identifies the partitions in the system." - ], - "metadata": {} - }, - { - "id": "A-Onlfa3vkqOVvHu6-JMQg", - "cell_type": "code", - "source": [ - "public interface IPartition : IKeyed {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "iF7QiEQqBE2pxD1M85J2Sw", - "cell_type": "markdown", - "source": [ - "The interface IPartitioned simply assigns a unique identifier for elements of a data partition - The exact definition of such elements can be found in the [partition](#partition) section below." - ], - "metadata": {} - }, - { - "id": "UI71Ps6BF0K27AoG-9UkDw", - "cell_type": "code", - "source": [ - "public interface IPartitioned", - "\n{", - "\n public Guid Partition { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "mwvvs9R7IE6s7-QzaQ44Iw", - "cell_type": "markdown", - "source": [ - "The interface IHierarchy is used for modelling dimensions which have an hierarchical structure, such as [Amount Type](#amount-type)." - ], - "metadata": {} - }, - { - "id": "udn_BFvLkE-kpOBDTNrOzg", - "cell_type": "code", - "source": [ - "public interface IHierarchy", - "\n{", - "\n [Display(Order = 10)]", - "\n public string Name { get; init; }", - "\n ", - "\n [Display(Order = 20)]", - "\n public string Parent { get; init; }", - "\n ", - "\n [Display(Order = 30)]", - "\n public string Child { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qlvXHTn5VUmrP2f97WrtTw", - "cell_type": "markdown", - "source": [ - "The interface IWithYearAndMonth allows to speficy to which year and month a certain piece of data applies to:" - ], - "metadata": {} - }, - { - "id": "jD1t0fnTnUGMALFqTwsLHA", - "cell_type": "code", - "source": [ - "public interface IWithYearAndMonth", - "\n{", - "\n public int Year { get; init; }", - "\n ", - "\n public int Month { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WbhV6bUsy0ukIAm920fzwg", - "cell_type": "markdown", - "source": [ - "", - "\n## Abstract Classes", - "\nThese classes are not reflected in the database, i.e. are not persisted." - ], - "metadata": {} - }, - { - "id": "EVd9ytkY40OTYvjWp5aziA", - "cell_type": "code", - "source": [ - "public abstract record KeyedRecord : IKeyed {", - "\n [Key]", - "\n [NotVisible] ", - "\n public Guid Id { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "h-P8iuN2zUqCz2F1HgnXjQ", - "cell_type": "code", - "source": [ - "public abstract record KeyedDimension : INamed {", - "\n [Key]", - "\n [IdentityProperty]", - "\n [StringLength(16)]", - "\n [Display(Order = 1)]", - "\n public string SystemName { get; init; }", - "\n ", - "\n [Display(Order = 2)]", - "\n [NotVisible]", - "\n public string DisplayName { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "q1r9nxY4cEudsXAFS_0LOA", - "cell_type": "code", - "source": [ - "public abstract record KeyedOrderedDimension : KeyedDimension, IOrdered {", - "\n [NotVisible]", - "\n public int Order { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "V0ZEujrm8EeHPz95bLGLOA", - "cell_type": "code", - "source": [ - "public abstract record KeyedOrderedDimensionWithExternalId : KeyedOrderedDimension {", - "\n [Display(Order = 100)]", - "\n [Conversion(typeof(JsonConverter))]", - "\n public string[] ExternalId { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1ZMlcc50Q0yVI7dZBvBCyQ", - "cell_type": "markdown", - "source": [ - "", - "\n# Dimensions", - "\n", - "\nDimensions are data which tipically can be given a short name, here called 'System Name'. They also change slowly with time. A typical example is currencies, and examples of System Names are EUR, CHF, etc.", - "\n", - "\nThe advantages of using Dimensions are:", - "\n- The data is easier to maintain (the data is said to be 'normalized');", - "\n- The business logic is easier to read;", - "\n- Easier scructuring of the data, e.g. in a data-cube." - ], - "metadata": {} - }, - { - "id": "Nh9SUewfGEisAbZfcpYfPA", - "cell_type": "markdown", - "source": [ - "", - "\n## Hierarchical Dimension With Level", - "\nHierarchical dimensions are useful to define for example the legal structure of a company (reporting nodes and their parents).", - "\n", - "\nBelow we introduce the concept of a hierarchical dimension with level, which is a simple way to keep track of the \"level\" in a hierarchical dimension." - ], - "metadata": {} - }, - { - "id": "4JGV542yw0KkgF5wA8Xc-A", - "cell_type": "code", - "source": [ - "//TODO: Should this be abstract or have a reference to the type?", - "\npublic record HierarchicalDimensionWithLevel(string SystemName, string DisplayName, string Parent, int Level) : IHierarchicalDimension;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3mdUv9EKwUaRHVRzBFxSNw", - "cell_type": "markdown", - "source": [ - "", - "\n## Amount Type" - ], - "metadata": {} - }, - { - "id": "oD4Rl6GEpEqnLIn_CUdivg", - "cell_type": "markdown", - "source": [ - "Amount Type is a dimension used to describe the nature of numbers. For example: Numbers associated to the payment of premiums have Amount Type 'Premiums'; Numbers associated to the payment of claims have Amount Type 'Claims'; Numbers associated to expenses have Amount Type 'Expenses'. ", - "\n", - "\nIt is defined as a hierarchical dimension so that higher-granularity types can be introduced. For example: 'Claim Expenses' have parent 'Claims'.", - "\n", - "\nAmount Types are a central piece in the IFRS 17 application and are used for instance to name the different types of cashflows. For example: There might be cashflows for 'Premiums'; Cashflows for 'Claims', etc. In case the mapping between cash flow and amount type is non-trivial, then specific mappings are introduced through the use of ExternalId." - ], - "metadata": {} - }, - { - "id": "ffEXk8fDRUSuFc1EOOWVXA", - "cell_type": "code", - "source": [ - "public record AmountType : KeyedOrderedDimensionWithExternalId, IHierarchicalDimension", - "\n{", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(AmountType))]", - "\n public string Parent { get; init; }", - "\n ", - "\n [Display(Order = 20)]", - "\n [Dimension(typeof(PeriodType))]", - "\n public PeriodType PeriodType { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xY7Lv0cnPk2ZqR7zMUKVAQ", - "cell_type": "markdown", - "source": [ - "We distinguish between amount types used for cashflows and actuals (**Present Value Amount Types**), and amount types used for deferrable values (**Deferrable Amount Types**). In particular, deferrable amount types are for costs and expenses that can be deferred to the future. These amounts are treated separately from the Present Value Amount Types because they are not considered for the calculation of Contractual Service Margin and Loss Component." - ], - "metadata": {} - }, - { - "id": "u1zwrsAl_06VNVKVjqY52g", - "cell_type": "code", - "source": [ - "public record PvAmountType : AmountType {} //TODO Rename ", - "\n", - "\npublic record DeferrableAmountType : AmountType {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uCEMSSPR00Oh87NXjPpxaQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Calculation Type", - "\nThis dimension is used to distinguish between e.g. **Best Estimate** values and **Risk Adjustment** values:" - ], - "metadata": {} - }, - { - "id": "ZNlHEPmkHky4j1HvhgN88A", - "cell_type": "code", - "source": [ - "public record CalculationType : KeyedOrderedDimension {", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(PeriodType))]", - "\n public PeriodType PeriodType { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vKJfcG-udU2bWMy_nL8WSQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Risk Driver", - "\n", - "\nRisk drivers are used to distinguish between the different Risk Adjustment numbers. For instance: Mortality, Disability, Longevity, etc.", - "\n", - "\nWhen only total risk adjustment values are used, then there is no need to use risk drivers." - ], - "metadata": {} - }, - { - "id": "fa88nNjOdk6ESB_dqpM35w", - "cell_type": "code", - "source": [ - "public record RiskDriver : KeyedOrderedDimension, IHierarchicalDimension", - "\n{", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(RiskDriver))]", - "\n public string Parent { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VkCT-HB9TkyWJJyAcX42QQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Estimate Type", - "\n", - "\nEstimate Type is a dimension used to distinguish the context to which numbers belong to. For instance: Numbers for present values have Estimate Type 'Present Value'; Numbers for Risk Adjustments have Estimate Type 'Risk Adjustment'." - ], - "metadata": {} - }, - { - "id": "PGODf3XfjEOJ2CfpWJNxvw", - "cell_type": "code", - "source": [ - "public record EstimateType : KeyedOrderedDimensionWithExternalId", - "\n{", - "\n [Display(Order = 110)]", - "\n public InputSource InputSource { get; init; }", - "\n ", - "\n [Display(Order = 120)]", - "\n public StructureType StructureType { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bo_ARw7-YEWDtJJsK8ODmA", - "cell_type": "markdown", - "source": [ - "", - "\n## Novelty", - "\n", - "\nNovelty is a [dimension](#dimensions) used to identity the novelty of the business. Typical examples of Novelty are New Busines, In-Force, and Combined." - ], - "metadata": {} - }, - { - "id": "mV4OXu-r_0e7k1vZthQ1IQ", - "cell_type": "code", - "source": [ - "public record Novelty : KeyedOrderedDimension {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "O-7_tXaPPEOL_eRj1Ev76g", - "cell_type": "markdown", - "source": [ - "", - "\n## Variable Type" - ], - "metadata": {} - }, - { - "id": "jFh4gN-zTEyK_KZ55DhlEw", - "cell_type": "code", - "source": [ - "public record VariableType : KeyedOrderedDimension, IHierarchicalDimension", - "\n{ ", - "\n [Display(Order = 10)]", - "\n public string Parent { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RJcV2vGuokmqX1cLgr8tcw", - "cell_type": "markdown", - "source": [ - "", - "\n### AoC Variable Type", - "\n", - "\nThe AocType describes the type of the Analysis of Change step - For example: Amortization, Cashflow, Combined Liabilities etc.", - "\n", - "\nThe **Combined Liability** AocType aims in capturing the difference between the sum of all relevant previous Aoc steps and the end of period Aoc step. Unexplained changes (not captured by any other defined AoC step), are then visible in this Aoc step. Note that the nominal cash flows input in the cashflow input file corresponds to cash flow projection for the end of period step.", - "\nIn addition, this step distinguishes itself from the others for:", - "\n- It is a mandatory AocType as it is used to trigger the Run off of the cashflow. This is achieved by providing a cash flow of 0s. ", - "\n- It is the first AocType for the Combined Novelty and therefore it carries the contribution of combining In force and New business.", - "\n- Its present value is computed as telescoping difference with the last AoC Step for the In-Force novelty and the New Business novelty.", - "\n- In the technical margin calculation it is used to merge the profitability of the In-Force and New business components, which may result in a forced switch." - ], - "metadata": {} - }, - { - "id": "uXawxEZ9akakX3cBhzIvkw", - "cell_type": "code", - "source": [ - "public record AocType : VariableType", - "\n{ ", - "\n [Display(Order = 30)]", - "\n [Dimension(typeof(AocType))]", - "\n public string Parent { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "wURsJ4y22UClSsa-dgRVKg", - "cell_type": "code", - "source": [ - "public record AocStep(string AocType, string Novelty){}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9FQQEf3waUyPGTjoJ3kPvA", - "cell_type": "markdown", - "source": [ - "", - "\n### PnL Variable Type", - "\n", - "\nThe PnlVariableType is used to describe the various profit and loss sections and the corresponding hierarchy." - ], - "metadata": {} - }, - { - "id": "yXjDtNxmtUKCm7l4rInNRw", - "cell_type": "code", - "source": [ - "public record PnlVariableType : VariableType {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6TMaVeubb0yfDj0zHl3dNQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Balance Sheet Variable Type", - "\n", - "\nThe BsVariableType is used to descibe the Anlysis of change of the Balance Sheet reports." - ], - "metadata": {} - }, - { - "id": "kmnM353ouUSOXqQD4IcV7Q", - "cell_type": "code", - "source": [ - "public record BsVariableType : VariableType {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WglnqvLArU6Ahc29yVDgSQ", - "cell_type": "markdown", - "source": [ - "## Accounting Variable Type", - "\nThe AccountingVariableType is used to describe the accounting events that are posted in the accounting output file." - ], - "metadata": {} - }, - { - "id": "tqFR7uu7BkOnFUvISdLF1A", - "cell_type": "code", - "source": [ - "public record AccountingVariableType : VariableType {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gQILcufhBU6Gh3ZoHDRIYA", - "cell_type": "markdown", - "source": [ - "", - "\n## Scenario", - "\nThe Scenario record holds the various scenarios for which calculations should also be performed." - ], - "metadata": {} - }, - { - "id": "WKR88bI5G0qwjmpDyGZTsw", - "cell_type": "code", - "source": [ - "public record Scenario : KeyedDimension {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "c-cppckU8UeROzwpBdL44A", - "cell_type": "markdown", - "source": [ - " The 'neutral' Scenario (i.e. the default one, with no-stress situations applied) is designated as 'Best Estimate'." - ], - "metadata": {} - }, - { - "id": "ysCBY_ONbUmbRFL_KEXoXg", - "cell_type": "markdown", - "source": [ - "", - "\n## Line Of Business" - ], - "metadata": {} - }, - { - "id": "XPrjV3N-LE-TKVM80pV5yQ", - "cell_type": "markdown", - "source": [ - "Line Of Business is a dimension used to identity insurance business according to usual business classifications (usually a market or company-specific business classification representing a convolution of risk covered, 1st party / 3rd party cover type, product type, etc...)", - "\nTypical examples of Line of Business are Motor, Property, Endowment, etc... This is a hierarchical dimension." - ], - "metadata": {} - }, - { - "id": "VxLXh8klyEi6UhXPn1ZKKw", - "cell_type": "code", - "source": [ - "public record LineOfBusiness : KeyedOrderedDimension, IHierarchicalDimension", - "\n{", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(LineOfBusiness))]", - "\n public string Parent { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "pnCYzQI05UWCUkXGHAB9QA", - "cell_type": "markdown", - "source": [ - "", - "\n## Currency" - ], - "metadata": {} - }, - { - "id": "PZEeN2QhsEGXT0BQ4Rjlag", - "cell_type": "markdown", - "source": [ - "Currency is a dimension used to identity the currency.", - "\nTypical examples of Currency are EUR, CHF, USD, etc..." - ], - "metadata": {} - }, - { - "id": "TUEcu5Y_ZE6Nv_pUG-_COQ", - "cell_type": "code", - "source": [ - "public record Currency : KeyedDimension {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TUfMA1ybakuqVJ73ERA3ZQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Economic Basis", - "\n", - "\nThe Economic Basis defines the discount type which is used in calculations. Examples are: Nominal, Current and Locked." - ], - "metadata": {} - }, - { - "id": "rt_ieWyHpU29K0fpiBXLcQ", - "cell_type": "code", - "source": [ - "public record EconomicBasis : KeyedDimension {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CJjymwgpJEiBZhPYBoZV-w", - "cell_type": "markdown", - "source": [ - "", - "\n## Valuation Approach", - "\nThis dimension holds the various methodologies used in the calculations: BBA, VFA and PAA." - ], - "metadata": {} - }, - { - "id": "oPjqx6DSTkyk2Pi5v9Bgww", - "cell_type": "code", - "source": [ - "public record ValuationApproach : KeyedDimension {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "v5-cD3t8RkaWxWs7t5oTxg", - "cell_type": "markdown", - "source": [ - "", - "\n## Liability Type", - "\nThe Liability Type distinguishes betweeen e.g. liabilities for incurred claims and liabilities for remaining coverage." - ], - "metadata": {} - }, - { - "id": "zZBD3LVJqUSlsfat1_eEDw", - "cell_type": "code", - "source": [ - "public record LiabilityType : KeyedDimension, IHierarchicalDimension", - "\n{", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(LiabilityType))]", - "\n public string Parent { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "JkEN-M0lnUaJ5FsC0QM6JQ", - "cell_type": "markdown", - "source": [ - "", - "\n## OCI Type", - "\nOther Comprehensive Income (OCI) Type describes how the financial contributions to the IFRS17 Financial Performance is apportioned between the P&L and the OCI sections." - ], - "metadata": {} - }, - { - "id": "pAjz1mAaPUGhHNTdyP54gw", - "cell_type": "code", - "source": [ - "public record OciType : KeyedDimension {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZvvcNAbtHki9DK9rkMj5PQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Profitability" - ], - "metadata": {} - }, - { - "id": "SpHNgrkn70WBckuZf-9rtA", - "cell_type": "markdown", - "source": [ - "Profitability is a dimension used in IFRS 17 to describe the profitability of a Group of Contracts (GIC/GRIC).", - "\nTypical examples of Profitability are Profitable, Non-Profitable, etc.." - ], - "metadata": {} - }, - { - "id": "rJS1Lqw9gUyBmW8LzFRIAw", - "cell_type": "code", - "source": [ - "public record Profitability : KeyedDimension {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5nzILMYUw06HnJmXUyLYgg", - "cell_type": "markdown", - "source": [ - "", - "\n## Partner", - "\nPartner is the counterparty of a reinsurance contract." - ], - "metadata": {} - }, - { - "id": "_vf2ckZDHkiTBUqDESRY7A", - "cell_type": "code", - "source": [ - "public record Partner : KeyedDimension {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "K48oHe7Yw0GIy27KBHbDtQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Credit Risk Rating", - "\nThis holds the credit risk rating of each Partner." - ], - "metadata": {} - }, - { - "id": "faZdNRqxWkqUXYnGZQNNLQ", - "cell_type": "code", - "source": [ - "public record CreditRiskRating : KeyedDimension {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LrcDCmrTYkiEFks8X5d5qQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Reporting Node", - "\nA Reporting Node is an element in the reporting structure of the company. It has a hierarchical structure and the end nodes is the level at which data is imported." - ], - "metadata": {} - }, - { - "id": "yfIk7Ocnc0SkfFXciN5yfQ", - "cell_type": "code", - "source": [ - "public record ReportingNode : KeyedDimension, IHierarchicalDimension ", - "\n{", - "\n [Display(Order = 20)]", - "\n [Dimension(typeof(ReportingNode))]", - "\n public string Parent { get; init; }", - "\n ", - "\n [Required]", - "\n [Display(Order = 40)]", - "\n [Dimension(typeof(Currency))]", - "\n public virtual string Currency { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dgSDvMwORkWAHKNhcKsOsQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Projection Configuration" - ], - "metadata": {} - }, - { - "id": "SXiQr9uXpEOar1SWj1NbHQ", - "cell_type": "markdown", - "source": [ - "Projections are configured by defining the following 2 parameters:", - "\n", - "\n- Shift defines how many months are in the cashflow file before the first value of the period in interest.
", - "\n- TimeStep defines how many months are in the period of interest.
", - "\n", - "\nBoth Shift and TimeStep are measured in terms of number of months.", - "\nFor instance, for the current year and year-to-date view we have $\\rm{Shift}=0$ and $TimeStep=3$ for the first quarter, $TimeStep=6$ for the 2nd quarter and so on." - ], - "metadata": {} - }, - { - "id": "5roF1i3RCkuAb120D2hlCw", - "cell_type": "code", - "source": [ - "public record ProjectionConfiguration : KeyedDimension", - "\n{", - "\n [IdentityProperty]", - "\n public int Shift { get; init; }", - "\n [IdentityProperty]", - "\n public int TimeStep { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0BJMDgWcZ0-7DaVBFvhhrg", - "cell_type": "markdown", - "source": [ - "", - "\n# Parameters" - ], - "metadata": {} - }, - { - "id": "lZdeQUGmGUmVPRibX3A4mQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Aoc Step Configuration" - ], - "metadata": {} - }, - { - "id": "NRbkQdbBAkSeX6wwNvqeLg", - "cell_type": "markdown", - "source": [ - "The record below holds parameters over time for each combination of AocType and Novelty. In particular:", - "\n- DataType identifies between Calculated aoc steps and Optional inputs or Mandatory inputs.", - "\n- InputSource identifies whether an aoc step is relevant for Actuals, Cashflow or both calculations.", - "\n- FxPeriod identifies which fx rate should be used.", - "\n- YcPeriod identifies which Yield Curve should be used (from current or previous period).", - "\n- CdrPeriod identifies which Credit Default Rate should be used (from current or previous period).", - "\n- ValuationPeriod identifies which value from the Cashflow corresponds to the Present Value.", - "\n- RcPeriod identifies which Reinsurance Coverage should be used (from current or previous period).", - "\n", - "\n
The values for each parameter can be found in [Enums Notebook](./Constants/Enums)." - ], - "metadata": {} - }, - { - "id": "fSKSGQxYvEWCjRwEU8Zp8A", - "cell_type": "code", - "source": [ - "public record AocConfiguration : KeyedRecord, IWithYearAndMonth, IOrdered", - "\n{", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Year))]", - "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 10)]", - "\n public int Year { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Month))]", - "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 20)]", - "\n public int Month { get; init; }", - "\n ", - "\n [IdentityProperty]", - "\n [Display(Order = 30)]", - "\n [Dimension(typeof(AocType))]", - "\n public string AocType { get; init; }", - "\n ", - "\n [IdentityProperty]", - "\n [Display(Order = 40)]", - "\n [Dimension(typeof(Novelty))]", - "\n public string Novelty { get; init; }", - "\n ", - "\n [Display(Order = 50)]", - "\n [Dimension(typeof(DataType))]", - "\n public DataType DataType { get; init; }", - "\n ", - "\n [Display(Order = 55)]", - "\n [Dimension(typeof(InputSource))]", - "\n public InputSource InputSource { get; init; }", - "\n ", - "\n [Display(Order = 60)]", - "\n [Dimension(typeof(FxPeriod))]", - "\n public FxPeriod FxPeriod { get; init; }", - "\n ", - "\n [Display(Order = 70)]", - "\n [Dimension(typeof(PeriodType), nameof(YcPeriod))]", - "\n public PeriodType YcPeriod { get; init; }", - "\n ", - "\n [Display(Order = 80)]", - "\n [Dimension(typeof(PeriodType), nameof(CdrPeriod))]", - "\n public PeriodType CdrPeriod { get; init; }", - "\n ", - "\n [Display(Order = 90)]", - "\n [Dimension(typeof(ValuationPeriod))]", - "\n public ValuationPeriod ValuationPeriod { get; init; }", - "\n ", - "\n [Display(Order = 100)]", - "\n [Dimension(typeof(PeriodType), nameof(RcPeriod))]", - "\n public PeriodType RcPeriod { get; init; }", - "\n ", - "\n [NotVisible]", - "\n public int Order { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9EDmAQK2o0CtkSqxrxadaw", - "cell_type": "markdown", - "source": [ - "", - "\n## Exchange Rate", - "\nThe record below holds the Exchange Rates over time and for each exchange type ([FxType](./Constants/Enums)). Exchange Rate must be updated every reporting period as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", - "\n", - "\nIn case the Exchange Rate for the current period is missing, an error is returned. " - ], - "metadata": {} - }, - { - "id": "0UriZBf9PkWxz4YC-Zj6jQ", - "cell_type": "code", - "source": [ - "public record ExchangeRate : KeyedRecord", - "\n{ ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(Currency))]", - "\n public string Currency { get; init; }", - "\n", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Year))]", - "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 20)]", - "\n public int Year { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Month))]", - "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 30)]", - "\n public int Month { get; init; }", - "\n", - "\n [IdentityProperty]", - "\n [Required]", - "\n [Display(Order = 40)]", - "\n public FxType FxType { get; init; }", - "\n", - "\n [Display(Order = 50)]", - "\n public double FxToGroupCurrency { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "DqeuCXH1bkmJd_iD726ypg", - "cell_type": "markdown", - "source": [ - "", - "\n## Credit Default Rate", - "\nThe record below holds the Credit Default Rates over time for each [Credit Risk Rating](#credit-risk-rating). Credit Default Rate can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", - "\n", - "\nThe Credit Default Rate values must be entered with monthly granularity, i.e. every value corresponds to the default rate for a certain month. The first month entered in column Values0 always corresponds to January of the year entered in column Year. The last value is considered valid also for the following years (for which no value has been provided). ", - "\n", - "\nThe latest Credit Default Rate available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used as the current value during calculation." - ], - "metadata": {} - }, - { - "id": "dGtfTrO3iUaqdptZ0yybYw", - "cell_type": "code", - "source": [ - "public record CreditDefaultRate : KeyedRecord, IWithYearAndMonth", - "\n{ ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(CreditRiskRating))]", - "\n public string CreditRiskRating { get; init; }", - "\n", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Year))]", - "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 20)]", - "\n public int Year { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Month))]", - "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 30)]", - "\n public int Month { get; init; }", - "\n ", - "\n [Conversion(typeof(PrimitiveArrayConverter))]", - "\n [Display(Order = 40)]", - "\n public double[] Values { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9_ycC9yzPkG8EqR3gTj3PA", - "cell_type": "markdown", - "source": [ - "", - "\n## Yield Curve", - "\nThe record below holds the Yield Curves across time for each [Currency](#currency) and [Scenario](#scenario).", - "\nYield curves can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", - "\n", - "\nThe Yield Curve values must be entered with **yearly** granularity, i.e. every value corresponds to the rate of the whole year starting from the year entered in column Year. The last value is considered valid also for the following years (for which no value has been provided). ", - "\n", - "\nWhen the current Yield Curve must be used in the calculation, the latest Yield Curve available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used." - ], - "metadata": {} - }, - { - "id": "3TbdMYHKKk2Wan-Egtuetg", - "cell_type": "code", - "source": [ - "public record YieldCurve : KeyedRecord, IWithYearAndMonth", - "\n{ ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(Currency))]", - "\n public string Currency { get; init; }", - "\n", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Year))]", - "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 20)]", - "\n public int Year { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Month))]", - "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 30)]", - "\n public int Month { get; init; }", - "\n", - "\n [IdentityProperty]", - "\n [Display(Order = 35)]", - "\n public string Scenario { get; init; }", - "\n", - "\n [Conversion(typeof(PrimitiveArrayConverter))]", - "\n [Display(Order = 40)]", - "\n public double[] Values { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kR4nqN3MwkqRBS8Yeb4bOA", - "cell_type": "markdown", - "source": [ - "", - "\n## Partner Rating", - "\nThe record below holds the [Credit Risk Rating](#credit-risk-partner) for each [Partner](#partner) across time. Partner Rating can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. " - ], - "metadata": {} - }, - { - "id": "-yzxBGiz7U62zp3niNtqEA", - "cell_type": "code", - "source": [ - "public record PartnerRating : KeyedRecord, IWithYearAndMonth", - "\n{ ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(Partner))]", - "\n public string Partner { get; init; }", - "\n", - "\n [Required]", - "\n [Display(Order = 20)]", - "\n [Dimension(typeof(CreditRiskRating))]", - "\n public string CreditRiskRating { get; init; }", - "\n", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Year))]", - "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 30)]", - "\n public int Year { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Month))]", - "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 40)]", - "\n public int Month { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4bFzr4BUxECkAZN1KK83Kg", - "cell_type": "markdown", - "source": [ - "", - "\n# Partitions", - "\nThe notion of Partition is used to define small but meaningful sets of data, called partitions. Partitions are then used to optimize the extraction of data from the database, i.e. only the data for a certain partition is retrieved." - ], - "metadata": {} - }, - { - "id": "lfo6j69S00S5MmeGEgWhWA", - "cell_type": "code", - "source": [ - "public abstract record IfrsPartition : IPartition {", - "\n [Key]", - "\n [PartitionId]", - "\n public Guid Id { get; init; }", - "\n", - "\n [Required]", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(ReportingNode))]", - "\n [IdentityProperty]", - "\n public string ReportingNode { get; init; }", - "\n", - "\n [Display(Order = 50)]", - "\n [Dimension(typeof(Scenario))]", - "\n [IdentityProperty]", - "\n public string Scenario { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Oy6PSvNeAkOrHXzbWi144g", - "cell_type": "markdown", - "source": [ - "For instance, the data pertaining to a certain [Reporting Node](#reporting-node) for a certain [Scenario](#scenario) is called an IfrsPartition and assigned a unique identifier:" - ], - "metadata": {} - }, - { - "id": "YQl5TqjBQUui3Ao3FsgiUw", - "cell_type": "code", - "source": [ - "public record PartitionByReportingNode : IfrsPartition {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "M8p4dGJQHkC7dFwqXU4RXQ", - "cell_type": "markdown", - "source": [ - "The partition PartitionByReportingNodeAndPeriod is a further partition of the IfrsPartition sets - In particular, it defines sets for the data pertaining to a certain [Reporting Node](#reporting-node), [Scenario](#scenario), year and month. The value of the Month is the last month of the reporting period to which the data belongs to. " - ], - "metadata": {} - }, - { - "id": "a7nDH2imYUeP23B6WT5yZw", - "cell_type": "code", - "source": [ - "public record PartitionByReportingNodeAndPeriod : IfrsPartition {", - "\n [Display(Order = 30)]", - "\n [Dimension(typeof(int), nameof(Year))]", - "\n [IdentityProperty]", - "\n public int Year { get; init; }", - "\n", - "\n [Display(Order = 40)]", - "\n [Dimension(typeof(int), nameof(Month))]", - "\n [IdentityProperty]", - "\n public int Month { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TZvDAkF0M02LQtQKCZLJRA", - "cell_type": "markdown", - "source": [ - "", - "\n# Policy-related Data Structures", - "\n", - "\nThe data structures below are the pieces of the data model where policy-related data is held." - ], - "metadata": {} - }, - { - "id": "kjn-7dhJgEa7EDS2jG2CbA", - "cell_type": "markdown", - "source": [ - "", - "\n## Data Node", - "\n", - "\nA data node is basically a set of labels which identify data according to its:", - "\n- Reporting Node", - "\n- Scenario", - "\n- Contractual Currency", - "\n- FunctionalCurrency", - "\n- LineOfBusiness", - "\n- ValuationApproach", - "\n- OCI Type" - ], - "metadata": {} - }, - { - "id": "7I3_uOSDzkuHhcVJMukGlA", - "cell_type": "markdown", - "source": [ - "TODOs:", - "\n
    ", - "\n
  • Remove Scenario from Partition and include it as simple property (see Year, Month). Introduce concept of Priority in LoadCurrentAndPreviousParameterAsync query (see ParameterResultsEntityQueryExtensions in IfrsGeneric).
  • ", - "\n
" - ], - "metadata": {} - }, - { - "id": "XlZfZAGgi0GjV_7P_tJtiQ", - "cell_type": "code", - "source": [ - "public record DataNode : KeyedDimension, IPartitioned {", - "\n [NotVisible]", - "\n [PartitionKey(typeof(PartitionByReportingNode))]", - "\n public Guid Partition { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(Currency))]", - "\n //[Required] // TODO: check", - "\n //[Immutable] // TODO: Not available yet", - "\n public string ContractualCurrency { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(Currency))]", - "\n //[Required] // TODO: check", - "\n //[Immutable]", - "\n public string FunctionalCurrency { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(LineOfBusiness))]", - "\n //[Immutable]", - "\n public string LineOfBusiness { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(ValuationApproach))]", - "\n [Required]", - "\n //[Immutable]", - "\n public string ValuationApproach { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(OciType))]", - "\n //[Immutable]", - "\n public string OciType { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0Zg-7p1UNU6Wdzok3kr-AA", - "cell_type": "markdown", - "source": [ - "", - "\n## Portfolios", - "\n", - "\nA Portfolio is a set of Group of Contracts. The relationship is set on the Group of Contracts (see below).", - "\n", - "\nPortfolios are of type DataNode and there are two types: Insurance Portfolio and Reinsurance Portfolios." - ], - "metadata": {} - }, - { - "id": "0P3rhAjUNUyBonuP1k9uHg", - "cell_type": "code", - "source": [ - "public record Portfolio : DataNode {}", - "\n", - "\npublic record InsurancePortfolio : Portfolio {}", - "\npublic record ReinsurancePortfolio : Portfolio {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xbAt9JzjCE614P7B97aiVA", - "cell_type": "markdown", - "source": [ - "", - "\n## Group of Contracts", - "\n", - "\nA Group of Contract is a set of contracts with the same Annual Cohort, Liability Type, Profitability and Partner (in case the contracts are done with a re-insurer).", - "\n", - "\nVarious Group of Contracts are put together into portfolios." - ], - "metadata": {} - }, - { - "id": "la_B6Lgw10-Y8UNDpmZ3gA", - "cell_type": "code", - "source": [ - "public record GroupOfContract : DataNode {", - "\n [NotVisible] ", - "\n [Dimension(typeof(int), nameof(AnnualCohort))]", - "\n //[Immutable]", - "\n public int AnnualCohort { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(LiabilityType))]", - "\n //[Immutable]", - "\n public string LiabilityType { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(Profitability))]", - "\n //[Immutable]", - "\n public string Profitability { get; init; }", - "\n ", - "\n [Required]", - "\n [NotVisible] ", - "\n [Dimension(typeof(Portfolio))]", - "\n //[Immutable]", - "\n public string Portfolio { get; init; }", - "\n ", - "\n public virtual string Partner { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qgBtX4_gZEeQFJWmImnXKg", - "cell_type": "markdown", - "source": [ - "A group of insurance contracts is called a **GIC** and has no information on Partner.", - "\n", - "\nOnly Groups of Reinsurance Contracts, defined below and usually called **GRIC**s, have Partner information.", - "\nAgain, there are Insurance GRICs and Reinsurance GRICs:" - ], - "metadata": {} - }, - { - "id": "IGY1DT71jECwSzukcliQKg", - "cell_type": "code", - "source": [ - "public record GroupOfInsuranceContract : GroupOfContract {", - "\n [Required]", - "\n [NotVisible] ", - "\n [Display(Name = \"InsurancePortfolio\")]", - "\n [Dimension(typeof(InsurancePortfolio))]", - "\n //[Immutable]", - "\n public string Portfolio { get => base.Portfolio; init => base.Portfolio = value; }", - "\n ", - "\n // TODO: for the case of internal reinsurance the Partner would be the reporting node, hence not null.", - "\n // If this is true we need the [Required] attribute here, add some validation at dataNode import ", - "\n // and to add logic in the GetNonPerformanceRiskRate method in ImportStorage.", - "\n [NotVisible] ", - "\n [NotMapped]", - "\n //[Immutable]", - "\n public override string Partner => null;", - "\n}", - "\n", - "\npublic record GroupOfReinsuranceContract : GroupOfContract {", - "\n [Required]", - "\n [NotVisible] ", - "\n [Display(Name = \"ReinsurancePortfolio\")]", - "\n [Dimension(typeof(ReinsurancePortfolio))]", - "\n //[Immutable]", - "\n public string Portfolio { get => base.Portfolio; init => base.Portfolio = value; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "STd2Dg5TnU-jBYDxq-VbnA", - "cell_type": "markdown", - "source": [ - "", - "\n## Data Node State", - "\n", - "\nThe Data State is used to track whether a GOC is Active or Inactive across time (year and month). ", - "\nIt is only possible to update the state of a Group of Contract from Active to Inactive." - ], - "metadata": {} - }, - { - "id": "l1RwYYRGQUuYklornedCUA", - "cell_type": "code", - "source": [ - "public record DataNodeState : KeyedRecord, IPartitioned, IWithYearAndMonth", - "\n{", - "\n [NotVisible]", - "\n [PartitionKey(typeof(PartitionByReportingNode))]", - "\n public Guid Partition { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(GroupOfContract))]", - "\n public string DataNode { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Year))]", - "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 20)]", - "\n public int Year { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Month))]", - "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 30)]", - "\n [DefaultValue(DefaultDataNodeActivationMonth)]", - "\n public int Month { get; init; } = DefaultDataNodeActivationMonth;", - "\n ", - "\n [Required]", - "\n [Display(Order = 40)]", - "\n [DefaultValue(State.Active)]", - "\n public State State { get; init; } = State.Active;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "siMZOfujgkCvYRhglSafRw", - "cell_type": "markdown", - "source": [ - "", - "\n## Data Node Parameters", - "\n", - "\nData Node Parameters are used to keep track of other parameters pertaining to each Data Node, and their movements in time (year and month).", - "\n
PremiumAllocation : defines the weight of Premium to be included in the Experience Adjustement AocType of the Technical Margin and is valid only for Group of Insurance Contract with LiabilityType : Liability for Remaining Coverage.", - "\n
ReinsuranceCoverage : defines the weight of the underlying gross business to be considered in the computation of the allocation of the Technical Margin in a Reinsurance case.", - "\n", - "\nThe latest Data Node Parameters available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used as the current value during calculation." - ], - "metadata": {} - }, - { - "id": "Y9V4hdUwV0WlDgxhiVJ0lg", - "cell_type": "code", - "source": [ - "public record DataNodeParameter : KeyedRecord, IPartitioned, IWithYearAndMonth", - "\n{", - "\n [NotVisible]", - "\n [PartitionKey(typeof(PartitionByReportingNode))]", - "\n public Guid Partition { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Year))]", - "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 20)]", - "\n public int Year { get; init; }", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Month))]", - "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n [Display(Order = 30)]", - "\n [DefaultValue(DefaultDataNodeActivationMonth)]", - "\n public int Month { get; init; } = DefaultDataNodeActivationMonth;", - "\n ", - "\n [Required]", - "\n [IdentityProperty]", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(GroupOfContract))]", - "\n public string DataNode { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Cnr2el8xg0OjF0x79bM9lQ", - "cell_type": "code", - "source": [ - "public record SingleDataNodeParameter : DataNodeParameter {", - "\n [DefaultValue(DefaultPremiumExperienceAdjustmentFactor)]", - "\n [Range(0, 1, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n public double PremiumAllocation { get; init; } = DefaultPremiumExperienceAdjustmentFactor;", - "\n}", - "\n", - "\npublic record InterDataNodeParameter : DataNodeParameter {", - "\n [Required]", - "\n [IdentityProperty]", - "\n [Display(Order = 20)]", - "\n [Dimension(typeof(GroupOfContract))]", - "\n public string LinkedDataNode { get; init; }", - "\n ", - "\n [Range(0, 1, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", - "\n public double ReinsuranceCoverage { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WCZyCC4Qlkm0FjxSRHM0xw", - "cell_type": "markdown", - "source": [ - "## DataNodeData PocoType", - "\nThe DataNodeData type is not persisted (i.e. not stored in the database) and is used in order to hold Data Node data during data manipulations." - ], - "metadata": {} - }, - { - "id": "koNxFi27ZkuU4_2cCG2GMA", - "cell_type": "code", - "source": [ - "public record DataNodeData {", - "\n public string DataNode { get; init; }", - "\n ", - "\n //Portfolio", - "\n public string ContractualCurrency { get; init; }", - "\n public string FunctionalCurrency { get; init; }", - "\n public string LineOfBusiness { get; init; }", - "\n public string ValuationApproach { get; init; }", - "\n public string OciType { get; init; }", - "\n ", - "\n //GroupOfContract", - "\n public string Portfolio { get; init; }", - "\n public int AnnualCohort { get; init; }", - "\n public string LiabilityType { get; init; }", - "\n public string Profitability { get; init; }", - "\n public string Partner { get; init; }", - "\n ", - "\n //DataNodeState", - "\n public int Year { get; init; }", - "\n public int Month { get; init; }", - "\n public State State { get; init; }", - "\n public State PreviousState { get; init; }", - "\n ", - "\n public bool IsReinsurance { get; init; }", - "\n ", - "\n public DataNodeData(){}", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9zeoLgvZ8EKhCCDbihId8w", - "cell_type": "markdown", - "source": [ - "", - "\n## Raw Variables (Cashflows)", - "\n", - "\nRaw Variables are used to store **cashflows** on the database during import, i.e. *after* mappings are applied and *before* calculations are applied.", - "\n", - "\nThey are stored on the database for both audit and re-calculation purposes." - ], - "metadata": {} - }, - { - "id": "vy4oWvNmmUGJTicrwsX63Q", - "cell_type": "code", - "source": [ - "public abstract record BaseVariableIdentity {", - "\n [NotVisible]", - "\n [Dimension(typeof(GroupOfContract))]", - "\n [IdentityProperty]", - "\n public string DataNode { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(AocType))]", - "\n [IdentityProperty]", - "\n public string AocType { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(Novelty))]", - "\n [IdentityProperty]", - "\n public string Novelty { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_bTxTL4-o0efG6zNvhuDjg", - "cell_type": "code", - "source": [ - "public abstract record BaseDataRecord : BaseVariableIdentity, IKeyed, IPartitioned {", - "\n [Key]", - "\n [NotVisible] ", - "\n public Guid Id { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [PartitionKey(typeof(PartitionByReportingNodeAndPeriod))]", - "\n public Guid Partition { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(AmountType))]", - "\n [IdentityProperty]", - "\n public string AmountType { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(int),nameof(AccidentYear))]", - "\n [IdentityProperty]", - "\n public int? AccidentYear { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "X688yB4HTEm3riHh8lTrug", - "cell_type": "markdown", - "source": [ - "Basically, RawVariable is defined for a certain Reporting Node, Scenario, Year, Month, Amount Type and Calculation Type:" - ], - "metadata": {} - }, - { - "id": "kfbf0LwJSEGaxyUuPFnsKg", - "cell_type": "code", - "source": [ - "public record RawVariable : BaseDataRecord", - "\n{", - "\n [Conversion(typeof(PrimitiveArrayConverter))]", - "\n public double[] Values { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(CalculationType))]", - "\n [IdentityProperty]", - "\n public string CalculationType { get; init; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "IeCO6PmNPEioYptDRrzHTA", - "cell_type": "markdown", - "source": [ - "", - "\n## Ifrs Variable", - "\n", - "\nIfrs Variables are used to store:", - "\n", - "\n- **Actual Values**", - "\n- **Present Values**", - "\n", - "\nPresent Values are calculated from the [raw variables](#raw-variables) during the import of cashflows.", - "\n", - "\nIfrs Variables are stored on the database, i.e. they are 'persisted', for performance purposes." - ], - "metadata": {} - }, - { - "id": "H9N-c0drk0GPoWh-VfRXzA", - "cell_type": "code", - "source": [ - "public record IfrsVariable : BaseDataRecord", - "\n{", - "\n public double Value { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(EstimateType))]", - "\n [IdentityProperty]", - "\n public string EstimateType { get; init; }", - "\n ", - "\n [NotVisible] ", - "\n [Dimension(typeof(EconomicBasis))]", - "\n [IdentityProperty]", - "\n public string EconomicBasis { get; init; }", - "\n ", - "\n public IfrsVariable (){}", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MCh8EtPVKUyEIcixf6Q_1Q", - "cell_type": "markdown", - "source": [ - "", - "\n## Import Identity", - "\nThe Import Identity contains the data elements used to determine the data sets which are used when performing data manipulations, e.g. during a [data import](./Import/ImportScopeCalculation) - In particular, an Import Identity is defined by: DataNode, AocType, Novelty, and whether it's reinsurance data or not:" - ], - "metadata": {} - }, - { - "id": "w5SSaFTyYE-3Xj0yy0eobw", - "cell_type": "code", - "source": [ - "public record ImportIdentity : BaseVariableIdentity {", - "\n ", - "\n [NotVisible]", - "\n public bool IsReinsurance { get; init; }", - "\n ", - "\n [NotVisible]", - "\n public string ValuationApproach { get; init; }", - "\n ", - "\n [NotVisible]", - "\n public int ProjectionPeriod { get; init; }", - "\n ", - "\n public (string, string) AocStep => (AocType, Novelty);", - "\n ", - "\n public ImportScope ImportScope { get; init; }", - "\n ", - "\n public ImportIdentity(RawVariable rv){", - "\n DataNode = rv.DataNode;", - "\n AocType = rv.AocType;", - "\n Novelty = rv.Novelty;", - "\n }", - "\n ", - "\n public ImportIdentity(IfrsVariable iv){", - "\n DataNode = iv.DataNode;", - "\n AocType = iv.AocType;", - "\n Novelty = iv.Novelty;", - "\n }", - "\n", - "\n public ImportIdentity(){}", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "31-e-C4gwESKBN8E0Rr6gQ", - "cell_type": "markdown", - "source": [ - "", - "\n# Report Variable", - "\n", - "\nReport Variables are used to hold data after data manipulations and before being outputed in the form of a report. They are not persisted, i.e. they are not saved on the database." - ], - "metadata": {} - }, - { - "id": "2yvEMKViYE6wZPnuy7AClg", - "cell_type": "code", - "source": [ - "public record ReportVariable {", - "\n", - "\n [NotVisible]", - "\n [Dimension(typeof(ReportingNode))]", - "\n [IdentityProperty]", - "\n public string ReportingNode { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(Scenario))]", - "\n [IdentityProperty]", - "\n public string Scenario { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(Currency), nameof(FunctionalCurrency))]", - "\n [IdentityProperty]", - "\n //[AggregateBy]", - "\n public string FunctionalCurrency { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(Currency), nameof(ContractualCurrency))]", - "\n [IdentityProperty]", - "\n //[AggregateBy]", - "\n public string ContractualCurrency { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(GroupOfContract))]", - "\n [IdentityProperty]", - "\n public string GroupOfContract { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(Portfolio))]", - "\n [IdentityProperty]", - "\n public string Portfolio { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(LineOfBusiness))]", - "\n [IdentityProperty]", - "\n public string LineOfBusiness { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(LiabilityType))]", - "\n [IdentityProperty]", - "\n public string LiabilityType { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(Profitability), nameof(InitialProfitability))]", - "\n [IdentityProperty]", - "\n public string InitialProfitability { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(ValuationApproach))]", - "\n [IdentityProperty]", - "\n public string ValuationApproach { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(AnnualCohort))]", - "\n [IdentityProperty]", - "\n public int AnnualCohort { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(OciType))]", - "\n [IdentityProperty]", - "\n public string OciType { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(Partner))]", - "\n [IdentityProperty]", - "\n public string Partner { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [IdentityProperty]", - "\n public bool IsReinsurance { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(AccidentYear))]", - "\n [IdentityProperty]", - "\n public int AccidentYear { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [NoArithmetics(ArithmeticOperation.Scale)]", - "\n [Dimension(typeof(int), nameof(Projection))]", - "\n [IdentityProperty]", - "\n //[AggregateBy]", - "\n public int Projection { get; init;}", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(VariableType))]", - "\n [IdentityProperty]", - "\n public string VariableType { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(Novelty))]", - "\n [IdentityProperty]", - "\n public string Novelty { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(AmountType))]", - "\n [IdentityProperty]", - "\n public string AmountType { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(EstimateType))]", - "\n [IdentityProperty]", - "\n public string EstimateType { get; init; }", - "\n ", - "\n [NotVisible]", - "\n [Dimension(typeof(EconomicBasis))]", - "\n [IdentityProperty]", - "\n //[AggregateBy]", - "\n public string EconomicBasis { get; init; }", - "\n ", - "\n public double Value { get; init; }", - "\n ", - "\n public ReportVariable(){}", - "\n public ReportVariable(ReportVariable rv){", - "\n ReportingNode = rv.ReportingNode;", - "\n Scenario = rv.Scenario;", - "\n FunctionalCurrency = rv.FunctionalCurrency;", - "\n ContractualCurrency = rv.ContractualCurrency;", - "\n GroupOfContract = rv.GroupOfContract;", - "\n Portfolio = rv.Portfolio;", - "\n LineOfBusiness = rv.LineOfBusiness;", - "\n LiabilityType = rv.LiabilityType;", - "\n InitialProfitability = rv.InitialProfitability;", - "\n ValuationApproach = rv.ValuationApproach;", - "\n AnnualCohort = rv.AnnualCohort;", - "\n OciType = rv.OciType;", - "\n Partner = rv.Partner;", - "\n IsReinsurance = rv.IsReinsurance;", - "\n AccidentYear = rv.AccidentYear;", - "\n Projection = rv.Projection;", - "\n VariableType = rv.VariableType;", - "\n Novelty = rv.Novelty;", - "\n AmountType = rv.AmountType;", - "\n EstimateType = rv.EstimateType;", - "\n EconomicBasis = rv.EconomicBasis;", - "\n Value = rv.Value;", - "\n }", - "\n public ReportVariable(DataNodeData dn, IfrsVariable iv){", - "\n FunctionalCurrency = dn.FunctionalCurrency;", - "\n ContractualCurrency = dn.ContractualCurrency;", - "\n GroupOfContract = dn.DataNode;", - "\n Portfolio = dn.Portfolio;", - "\n LineOfBusiness = dn.LineOfBusiness;", - "\n LiabilityType = dn.LiabilityType;", - "\n InitialProfitability = dn.Profitability;", - "\n ValuationApproach = dn.ValuationApproach;", - "\n AnnualCohort = dn.AnnualCohort;", - "\n OciType = dn.OciType;", - "\n Partner = dn.Partner;", - "\n IsReinsurance = dn.IsReinsurance;", - "\n AccidentYear = iv.AccidentYear ?? default;", - "\n VariableType = iv.AocType;", - "\n Novelty = iv.Novelty;", - "\n AmountType = iv.AmountType;", - "\n EstimateType = iv.EstimateType;", - "\n EconomicBasis = iv.EconomicBasis;", - "\n Value = iv.Value;", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WtIFU8efQE2aUaVim03Iog", - "cell_type": "markdown", - "source": [ - "# Args" - ], - "metadata": {} - }, - { - "id": "i8WBwS3IuUqLxaV5XGKWsg", - "cell_type": "code", - "source": [ - "public record Args(string ReportingNode, int Year, int Month, Periodicity Periodicity, string Scenario){}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6FcgQqQpzE2yPeqwZNRfiQ", - "cell_type": "code", - "source": [ - "public record ImportArgs : Args", - "\n{", - "\n public string ImportFormat { get; init; }", - "\n ", - "\n public ImportArgs(string reportingNode, int year, int month, Periodicity periodicity, string scenario, string importFormat)", - "\n : base(reportingNode, year, month, periodicity, scenario)", - "\n {", - "\n ImportFormat = importFormat;", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "mJUZ9khq1k-jUZcG-qZniQ", - "cell_type": "code", - "source": [ - "public record ReportArgs : Args", - "\n{", - "\n public string HierarchyName { get; init; }", - "\n ", - "\n public CurrencyType CurrencyType { get; init; }", - "\n ", - "\n public string ReportName { get; init; } // this is the key to which data to load (like loading behavior). If null, loads everything", - "\n ", - "\n public ReportArgs(string reportingNode, int year, int month, Periodicity periodicity, string scenario, string hierarchyName, CurrencyType currencyType)", - "\n : base(reportingNode, year, month, periodicity, scenario)", - "\n {", - "\n CurrencyType = currencyType;", - "\n HierarchyName = hierarchyName;", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "", + "\n

Data Model

", + "\n", + "\nThis notebook has the main structures used to hold data - This is usually called the **data model**." + ] + }, + { + "cell_type": "markdown", + "source": [ + "# References", + "\nThis section initializes libraries and code from other notebooks, which will be used here, as well as information needed for querying data from the database." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Libraries" + ] + }, + { + "cell_type": "code", + "source": [ + "#r \"nuget:Systemorph.Workspace,1.2.0\"", + "\n#r \"nuget:Systemorph.Scopes,1.2.4\"", + "\n#r \"nuget:Systemorph.Import,1.3.0\"", + "\n#r \"nuget:Systemorph.Test,1.2.4\"", + "\n#r \"nuget:Systemorph.Export,1.3.0\"", + "\n#r \"nuget:Systemorph.DataSetReader,1.3.0\"", + "\n#r \"nuget:Systemorph.DataSource,1.2.0\"", + "\n#r \"nuget:Systemorph.DataSource.Conversions,1.2.0\"", + "\n#r \"nuget:Systemorph.Reporting,1.2.4\"", + "\n#r \"nuget:Systemorph.DomainDesigner,1.3.0\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Usings" + ] + }, + { + "cell_type": "code", + "source": [ + "using System.ComponentModel.DataAnnotations;", + "\nusing System.ComponentModel.DataAnnotations.Schema;", + "\nusing Systemorph.Vertex.Grid.Model;", + "\nusing static Systemorph.Vertex.Arithmetics.ArithmeticOperations;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Notebooks" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Constants/Enums\"", + "\n#!import \"../Constants/Consts\"", + "\n#!import \"../Constants/Validations\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Data Infrastructure" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Base Interfaces", + "\nThe following interfaces are used to define the granularity at which data is stored.", + "\n", + "\nFor instance, the IKeyed interface corresponds to the lowest granularity which is simply a unique identifier for a certain generic piece of data:" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IKeyed", + "\n{ ", + "\n public Guid Id { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The interface IPartition identifies the partitions in the system." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IPartition : IKeyed {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The interface IPartitioned simply assigns a unique identifier for elements of a data partition - The exact definition of such elements can be found in the [partition](#partition) section below." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IPartitioned", + "\n{", + "\n public Guid Partition { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The interface IHierarchy is used for modelling dimensions which have an hierarchical structure, such as [Amount Type](#amount-type)." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IHierarchy", + "\n{", + "\n [Display(Order = 10)]", + "\n public string Name { get; init; }", + "\n ", + "\n [Display(Order = 20)]", + "\n public string Parent { get; init; }", + "\n ", + "\n [Display(Order = 30)]", + "\n public string Child { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The interface IWithYearAndMonth allows to speficy to which year and month a certain piece of data applies to:" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IWithYearAndMonth", + "\n{", + "\n public int Year { get; init; }", + "\n ", + "\n public int Month { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Abstract Classes", + "\nThese classes are not reflected in the database, i.e. are not persisted." + ] + }, + { + "cell_type": "code", + "source": [ + "public abstract record KeyedRecord : IKeyed {", + "\n [Key]", + "\n [NotVisible] ", + "\n public Guid Id { get; init; }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public abstract record KeyedDimension : INamed {", + "\n [Key]", + "\n [IdentityProperty]", + "\n [StringLength(16)]", + "\n [Display(Order = 1)]", + "\n public string SystemName { get; init; }", + "\n ", + "\n [Display(Order = 2)]", + "\n [NotVisible]", + "\n public string DisplayName { get; init; }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public abstract record KeyedOrderedDimension : KeyedDimension, IOrdered {", + "\n [NotVisible]", + "\n public int Order { get; init; }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public abstract record KeyedOrderedDimensionWithExternalId : KeyedOrderedDimension {", + "\n [Display(Order = 100)]", + "\n [Conversion(typeof(JsonConverter))]", + "\n public string[] ExternalId { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Dimensions", + "\n", + "\nDimensions are data which tipically can be given a short name, here called 'System Name'. They also change slowly with time. A typical example is currencies, and examples of System Names are EUR, CHF, etc.", + "\n", + "\nThe advantages of using Dimensions are:", + "\n- The data is easier to maintain (the data is said to be 'normalized');", + "\n- The business logic is easier to read;", + "\n- Easier scructuring of the data, e.g. in a data-cube." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Hierarchical Dimension With Level", + "\nHierarchical dimensions are useful to define for example the legal structure of a company (reporting nodes and their parents).", + "\n", + "\nBelow we introduce the concept of a hierarchical dimension with level, which is a simple way to keep track of the \"level\" in a hierarchical dimension." + ] + }, + { + "cell_type": "code", + "source": [ + "//TODO: Should this be abstract or have a reference to the type?", + "\npublic record HierarchicalDimensionWithLevel(string SystemName, string DisplayName, string Parent, int Level) : IHierarchicalDimension;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Amount Type" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Amount Type is a dimension used to describe the nature of numbers. For example: Numbers associated to the payment of premiums have Amount Type 'Premiums'; Numbers associated to the payment of claims have Amount Type 'Claims'; Numbers associated to expenses have Amount Type 'Expenses'. ", + "\n", + "\nIt is defined as a hierarchical dimension so that higher-granularity types can be introduced. For example: 'Claim Expenses' have parent 'Claims'.", + "\n", + "\nAmount Types are a central piece in the IFRS 17 application and are used for instance to name the different types of cashflows. For example: There might be cashflows for 'Premiums'; Cashflows for 'Claims', etc. In case the mapping between cash flow and amount type is non-trivial, then specific mappings are introduced through the use of ExternalId." + ] + }, + { + "cell_type": "code", + "source": [ + "public record AmountType : KeyedOrderedDimensionWithExternalId, IHierarchicalDimension", + "\n{", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(AmountType))]", + "\n public string Parent { get; init; }", + "\n ", + "\n [Display(Order = 20)]", + "\n [Dimension(typeof(PeriodType))]", + "\n public PeriodType PeriodType { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "We distinguish between amount types used for cashflows and actuals (**Present Value Amount Types**), and amount types used for deferrable values (**Deferrable Amount Types**). In particular, deferrable amount types are for costs and expenses that can be deferred to the future. These amounts are treated separately from the Present Value Amount Types because they are not considered for the calculation of Contractual Service Margin and Loss Component." + ] + }, + { + "cell_type": "code", + "source": [ + "public record PvAmountType : AmountType {} //TODO Rename ", + "\n", + "\npublic record DeferrableAmountType : AmountType {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Calculation Type", + "\nThis dimension is used to distinguish between e.g. **Best Estimate** values and **Risk Adjustment** values:" + ] + }, + { + "cell_type": "code", + "source": [ + "public record CalculationType : KeyedOrderedDimension {", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(PeriodType))]", + "\n public PeriodType PeriodType { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Risk Driver", + "\n", + "\nRisk drivers are used to distinguish between the different Risk Adjustment numbers. For instance: Mortality, Disability, Longevity, etc.", + "\n", + "\nWhen only total risk adjustment values are used, then there is no need to use risk drivers." + ] + }, + { + "cell_type": "code", + "source": [ + "public record RiskDriver : KeyedOrderedDimension, IHierarchicalDimension", + "\n{", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(RiskDriver))]", + "\n public string Parent { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Estimate Type", + "\n", + "\nEstimate Type is a dimension used to distinguish the context to which numbers belong to. For instance: Numbers for present values have Estimate Type 'Present Value'; Numbers for Risk Adjustments have Estimate Type 'Risk Adjustment'." + ] + }, + { + "cell_type": "code", + "source": [ + "public record EstimateType : KeyedOrderedDimensionWithExternalId", + "\n{", + "\n [Display(Order = 110)]", + "\n public InputSource InputSource { get; init; }", + "\n ", + "\n [Display(Order = 120)]", + "\n public StructureType StructureType { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Novelty", + "\n", + "\nNovelty is a [dimension](#dimensions) used to identity the novelty of the business. Typical examples of Novelty are New Busines, In-Force, and Combined." + ] + }, + { + "cell_type": "code", + "source": [ + "public record Novelty : KeyedOrderedDimension {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Variable Type" + ] + }, + { + "cell_type": "code", + "source": [ + "public record VariableType : KeyedOrderedDimension, IHierarchicalDimension", + "\n{ ", + "\n [Display(Order = 10)]", + "\n public string Parent { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### AoC Variable Type", + "\n", + "\nThe AocType describes the type of the Analysis of Change step - For example: Amortization, Cashflow, Combined Liabilities etc.", + "\n", + "\nThe **Combined Liability** AocType aims in capturing the difference between the sum of all relevant previous Aoc steps and the end of period Aoc step. Unexplained changes (not captured by any other defined AoC step), are then visible in this Aoc step. Note that the nominal cash flows input in the cashflow input file corresponds to cash flow projection for the end of period step.", + "\nIn addition, this step distinguishes itself from the others for:", + "\n- It is a mandatory AocType as it is used to trigger the Run off of the cashflow. This is achieved by providing a cash flow of 0s. ", + "\n- It is the first AocType for the Combined Novelty and therefore it carries the contribution of combining In force and New business.", + "\n- Its present value is computed as telescoping difference with the last AoC Step for the In-Force novelty and the New Business novelty.", + "\n- In the technical margin calculation it is used to merge the profitability of the In-Force and New business components, which may result in a forced switch." + ] + }, + { + "cell_type": "code", + "source": [ + "public record AocType : VariableType", + "\n{ ", + "\n [Display(Order = 30)]", + "\n [Dimension(typeof(AocType))]", + "\n public string Parent { get; init; }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public record AocStep(string AocType, string Novelty){}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### PnL Variable Type", + "\n", + "\nThe PnlVariableType is used to describe the various profit and loss sections and the corresponding hierarchy." + ] + }, + { + "cell_type": "code", + "source": [ + "public record PnlVariableType : VariableType {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Balance Sheet Variable Type", + "\n", + "\nThe BsVariableType is used to descibe the Anlysis of change of the Balance Sheet reports." + ] + }, + { + "cell_type": "code", + "source": [ + "public record BsVariableType : VariableType {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Accounting Variable Type", + "\nThe AccountingVariableType is used to describe the accounting events that are posted in the accounting output file." + ] + }, + { + "cell_type": "code", + "source": [ + "public record AccountingVariableType : VariableType {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Scenario", + "\nThe Scenario record holds the various scenarios for which calculations should also be performed." + ] + }, + { + "cell_type": "code", + "source": [ + "public record Scenario : KeyedDimension {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + " The 'neutral' Scenario (i.e. the default one, with no-stress situations applied) is designated as 'Best Estimate'." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Line Of Business" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Line Of Business is a dimension used to identity insurance business according to usual business classifications (usually a market or company-specific business classification representing a convolution of risk covered, 1st party / 3rd party cover type, product type, etc...)", + "\nTypical examples of Line of Business are Motor, Property, Endowment, etc... This is a hierarchical dimension." + ] + }, + { + "cell_type": "code", + "source": [ + "public record LineOfBusiness : KeyedOrderedDimension, IHierarchicalDimension", + "\n{", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(LineOfBusiness))]", + "\n public string Parent { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Currency" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Currency is a dimension used to identity the currency.", + "\nTypical examples of Currency are EUR, CHF, USD, etc..." + ] + }, + { + "cell_type": "code", + "source": [ + "public record Currency : KeyedDimension {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Economic Basis", + "\n", + "\nThe Economic Basis defines the discount type which is used in calculations. Examples are: Nominal, Current and Locked." + ] + }, + { + "cell_type": "code", + "source": [ + "public record EconomicBasis : KeyedDimension {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Valuation Approach", + "\nThis dimension holds the various methodologies used in the calculations: BBA, VFA and PAA." + ] + }, + { + "cell_type": "code", + "source": [ + "public record ValuationApproach : KeyedDimension {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Liability Type", + "\nThe Liability Type distinguishes betweeen e.g. liabilities for incurred claims and liabilities for remaining coverage." + ] + }, + { + "cell_type": "code", + "source": [ + "public record LiabilityType : KeyedDimension, IHierarchicalDimension", + "\n{", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(LiabilityType))]", + "\n public string Parent { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## OCI Type", + "\nOther Comprehensive Income (OCI) Type describes how the financial contributions to the IFRS17 Financial Performance is apportioned between the P&L and the OCI sections." + ] + }, + { + "cell_type": "code", + "source": [ + "public record OciType : KeyedDimension {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Profitability" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Profitability is a dimension used in IFRS 17 to describe the profitability of a Group of Contracts (GIC/GRIC).", + "\nTypical examples of Profitability are Profitable, Non-Profitable, etc.." + ] + }, + { + "cell_type": "code", + "source": [ + "public record Profitability : KeyedDimension {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Partner", + "\nPartner is the counterparty of a reinsurance contract." + ] + }, + { + "cell_type": "code", + "source": [ + "public record Partner : KeyedDimension {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Credit Risk Rating", + "\nThis holds the credit risk rating of each Partner." + ] + }, + { + "cell_type": "code", + "source": [ + "public record CreditRiskRating : KeyedDimension {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Reporting Node", + "\nA Reporting Node is an element in the reporting structure of the company. It has a hierarchical structure and the end nodes is the level at which data is imported." + ] + }, + { + "cell_type": "code", + "source": [ + "public record ReportingNode : KeyedDimension, IHierarchicalDimension ", + "\n{", + "\n [Display(Order = 20)]", + "\n [Dimension(typeof(ReportingNode))]", + "\n public string Parent { get; init; }", + "\n ", + "\n [Required]", + "\n [Display(Order = 40)]", + "\n [Dimension(typeof(Currency))]", + "\n public virtual string Currency { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Projection Configuration" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Projections are configured by defining the following 2 parameters:", + "\n", + "\n- Shift defines how many months are in the cashflow file before the first value of the period in interest.
", + "\n- TimeStep defines how many months are in the period of interest.
", + "\n", + "\nBoth Shift and TimeStep are measured in terms of number of months.", + "\nFor instance, for the current year and year-to-date view we have $\\rm{Shift}=0$ and $TimeStep=3$ for the first quarter, $TimeStep=6$ for the 2nd quarter and so on." + ] + }, + { + "cell_type": "code", + "source": [ + "public record ProjectionConfiguration : KeyedDimension", + "\n{", + "\n [IdentityProperty]", + "\n public int Shift { get; init; }", + "\n [IdentityProperty]", + "\n public int TimeStep { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Parameters" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Aoc Step Configuration" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The record below holds parameters over time for each combination of AocType and Novelty. In particular:", + "\n- DataType identifies between Calculated aoc steps and Optional inputs or Mandatory inputs.", + "\n- InputSource identifies whether an aoc step is relevant for Actuals, Cashflow or both calculations.", + "\n- FxPeriod identifies which fx rate should be used.", + "\n- YcPeriod identifies which Yield Curve should be used (from current or previous period).", + "\n- CdrPeriod identifies which Credit Default Rate should be used (from current or previous period).", + "\n- ValuationPeriod identifies which value from the Cashflow corresponds to the Present Value.", + "\n- RcPeriod identifies which Reinsurance Coverage should be used (from current or previous period).", + "\n", + "\n
The values for each parameter can be found in [Enums Notebook](./Constants/Enums)." + ] + }, + { + "cell_type": "code", + "source": [ + "public record AocConfiguration : KeyedRecord, IWithYearAndMonth, IOrdered", + "\n{", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 10)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Month { get; init; }", + "\n ", + "\n [IdentityProperty]", + "\n [Display(Order = 30)]", + "\n [Dimension(typeof(AocType))]", + "\n public string AocType { get; init; }", + "\n ", + "\n [IdentityProperty]", + "\n [Display(Order = 40)]", + "\n [Dimension(typeof(Novelty))]", + "\n public string Novelty { get; init; }", + "\n ", + "\n [Display(Order = 50)]", + "\n [Dimension(typeof(DataType))]", + "\n public DataType DataType { get; init; }", + "\n ", + "\n [Display(Order = 55)]", + "\n [Dimension(typeof(InputSource))]", + "\n public InputSource InputSource { get; init; }", + "\n ", + "\n [Display(Order = 60)]", + "\n [Dimension(typeof(FxPeriod))]", + "\n public FxPeriod FxPeriod { get; init; }", + "\n ", + "\n [Display(Order = 70)]", + "\n [Dimension(typeof(PeriodType), nameof(YcPeriod))]", + "\n public PeriodType YcPeriod { get; init; }", + "\n ", + "\n [Display(Order = 80)]", + "\n [Dimension(typeof(PeriodType), nameof(CdrPeriod))]", + "\n public PeriodType CdrPeriod { get; init; }", + "\n ", + "\n [Display(Order = 90)]", + "\n [Dimension(typeof(ValuationPeriod))]", + "\n public ValuationPeriod ValuationPeriod { get; init; }", + "\n ", + "\n [Display(Order = 100)]", + "\n [Dimension(typeof(PeriodType), nameof(RcPeriod))]", + "\n public PeriodType RcPeriod { get; init; }", + "\n ", + "\n [NotVisible]", + "\n public int Order { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Exchange Rate", + "\nThe record below holds the Exchange Rates over time and for each exchange type ([FxType](./Constants/Enums)). Exchange Rate must be updated every reporting period as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", + "\n", + "\nIn case the Exchange Rate for the current period is missing, an error is returned. " + ] + }, + { + "cell_type": "code", + "source": [ + "public record ExchangeRate : KeyedRecord", + "\n{ ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(Currency))]", + "\n public string Currency { get; init; }", + "\n", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n public int Month { get; init; }", + "\n", + "\n [IdentityProperty]", + "\n [Required]", + "\n [Display(Order = 40)]", + "\n public FxType FxType { get; init; }", + "\n", + "\n [Display(Order = 50)]", + "\n public double FxToGroupCurrency { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Credit Default Rate", + "\nThe record below holds the Credit Default Rates over time for each [Credit Risk Rating](#credit-risk-rating). Credit Default Rate can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", + "\n", + "\nThe Credit Default Rate values must be entered with monthly granularity, i.e. every value corresponds to the default rate for a certain month. The first month entered in column Values0 always corresponds to January of the year entered in column Year. The last value is considered valid also for the following years (for which no value has been provided). ", + "\n", + "\nThe latest Credit Default Rate available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used as the current value during calculation." + ] + }, + { + "cell_type": "code", + "source": [ + "public record CreditDefaultRate : KeyedRecord, IWithYearAndMonth", + "\n{ ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(CreditRiskRating))]", + "\n public string CreditRiskRating { get; init; }", + "\n", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n public int Month { get; init; }", + "\n ", + "\n [Conversion(typeof(PrimitiveArrayConverter))]", + "\n [Display(Order = 40)]", + "\n public double[] Values { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Yield Curve", + "\nThe record below holds the Yield Curves across time for each [Currency](#currency) and [Scenario](#scenario).", + "\nYield curves can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", + "\n", + "\nThe Yield Curve values must be entered with **yearly** granularity, i.e. every value corresponds to the rate of the whole year starting from the year entered in column Year. The last value is considered valid also for the following years (for which no value has been provided). ", + "\n", + "\nWhen the current Yield Curve must be used in the calculation, the latest Yield Curve available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used." + ] + }, + { + "cell_type": "code", + "source": [ + "public record YieldCurve : KeyedRecord, IWithYearAndMonth", + "\n{ ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(Currency))]", + "\n public string Currency { get; init; }", + "\n", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n public int Month { get; init; }", + "\n", + "\n [IdentityProperty]", + "\n [Display(Order = 35)]", + "\n public string Scenario { get; init; }", + "\n", + "\n [Conversion(typeof(PrimitiveArrayConverter))]", + "\n [Display(Order = 40)]", + "\n public double[] Values { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Partner Rating", + "\nThe record below holds the [Credit Risk Rating](#credit-risk-partner) for each [Partner](#partner) across time. Partner Rating can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. " + ] + }, + { + "cell_type": "code", + "source": [ + "public record PartnerRating : KeyedRecord, IWithYearAndMonth", + "\n{ ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(Partner))]", + "\n public string Partner { get; init; }", + "\n", + "\n [Required]", + "\n [Display(Order = 20)]", + "\n [Dimension(typeof(CreditRiskRating))]", + "\n public string CreditRiskRating { get; init; }", + "\n", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 40)]", + "\n public int Month { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Partitions", + "\nThe notion of Partition is used to define small but meaningful sets of data, called partitions. Partitions are then used to optimize the extraction of data from the database, i.e. only the data for a certain partition is retrieved." + ] + }, + { + "cell_type": "code", + "source": [ + "public abstract record IfrsPartition : IPartition {", + "\n [Key]", + "\n [PartitionId]", + "\n public Guid Id { get; init; }", + "\n", + "\n [Required]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(ReportingNode))]", + "\n [IdentityProperty]", + "\n public string ReportingNode { get; init; }", + "\n", + "\n [Display(Order = 50)]", + "\n [Dimension(typeof(Scenario))]", + "\n [IdentityProperty]", + "\n public string Scenario { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For instance, the data pertaining to a certain [Reporting Node](#reporting-node) for a certain [Scenario](#scenario) is called an IfrsPartition and assigned a unique identifier:" + ] + }, + { + "cell_type": "code", + "source": [ + "public record PartitionByReportingNode : IfrsPartition {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The partition PartitionByReportingNodeAndPeriod is a further partition of the IfrsPartition sets - In particular, it defines sets for the data pertaining to a certain [Reporting Node](#reporting-node), [Scenario](#scenario), year and month. The value of the Month is the last month of the reporting period to which the data belongs to. " + ] + }, + { + "cell_type": "code", + "source": [ + "public record PartitionByReportingNodeAndPeriod : IfrsPartition {", + "\n [Display(Order = 30)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [IdentityProperty]", + "\n public int Year { get; init; }", + "\n", + "\n [Display(Order = 40)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [IdentityProperty]", + "\n public int Month { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Policy-related Data Structures", + "\n", + "\nThe data structures below are the pieces of the data model where policy-related data is held." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data Node", + "\n", + "\nA data node is basically a set of labels which identify data according to its:", + "\n- Reporting Node", + "\n- Scenario", + "\n- Contractual Currency", + "\n- FunctionalCurrency", + "\n- LineOfBusiness", + "\n- ValuationApproach", + "\n- OCI Type" + ] + }, + { + "cell_type": "markdown", + "source": [ + "TODOs:", + "\n
    ", + "\n
  • Remove Scenario from Partition and include it as simple property (see Year, Month). Introduce concept of Priority in LoadCurrentAndPreviousParameterAsync query (see ParameterResultsEntityQueryExtensions in IfrsGeneric).
  • ", + "\n
" + ] + }, + { + "cell_type": "code", + "source": [ + "public record DataNode : KeyedDimension, IPartitioned {", + "\n [NotVisible]", + "\n [PartitionKey(typeof(PartitionByReportingNode))]", + "\n public Guid Partition { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(Currency))]", + "\n //[Required] // TODO: check", + "\n //[Immutable] // TODO: Not available yet", + "\n public string ContractualCurrency { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(Currency))]", + "\n //[Required] // TODO: check", + "\n //[Immutable]", + "\n public string FunctionalCurrency { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(LineOfBusiness))]", + "\n //[Immutable]", + "\n public string LineOfBusiness { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(ValuationApproach))]", + "\n [Required]", + "\n //[Immutable]", + "\n public string ValuationApproach { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(OciType))]", + "\n //[Immutable]", + "\n public string OciType { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Portfolios", + "\n", + "\nA Portfolio is a set of Group of Contracts. The relationship is set on the Group of Contracts (see below).", + "\n", + "\nPortfolios are of type DataNode and there are two types: Insurance Portfolio and Reinsurance Portfolios." + ] + }, + { + "cell_type": "code", + "source": [ + "public record Portfolio : DataNode {}", + "\n", + "\npublic record InsurancePortfolio : Portfolio {}", + "\npublic record ReinsurancePortfolio : Portfolio {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Group of Contracts", + "\n", + "\nA Group of Contract is a set of contracts with the same Annual Cohort, Liability Type, Profitability and Partner (in case the contracts are done with a re-insurer).", + "\n", + "\nVarious Group of Contracts are put together into portfolios." + ] + }, + { + "cell_type": "code", + "source": [ + "public record GroupOfContract : DataNode {", + "\n [NotVisible] ", + "\n [Dimension(typeof(int), nameof(AnnualCohort))]", + "\n //[Immutable]", + "\n public int AnnualCohort { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(LiabilityType))]", + "\n //[Immutable]", + "\n public string LiabilityType { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(Profitability))]", + "\n //[Immutable]", + "\n public string Profitability { get; init; }", + "\n ", + "\n [Required]", + "\n [NotVisible] ", + "\n [Dimension(typeof(Portfolio))]", + "\n //[Immutable]", + "\n public string Portfolio { get; init; }", + "\n ", + "\n public virtual string Partner { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "A group of insurance contracts is called a **GIC** and has no information on Partner.", + "\n", + "\nOnly Groups of Reinsurance Contracts, defined below and usually called **GRIC**s, have Partner information.", + "\nAgain, there are Insurance GRICs and Reinsurance GRICs:" + ] + }, + { + "cell_type": "code", + "source": [ + "public record GroupOfInsuranceContract : GroupOfContract {", + "\n [Required]", + "\n [NotVisible] ", + "\n [Display(Name = \"InsurancePortfolio\")]", + "\n [Dimension(typeof(InsurancePortfolio))]", + "\n //[Immutable]", + "\n public string Portfolio { get => base.Portfolio; init => base.Portfolio = value; }", + "\n ", + "\n // TODO: for the case of internal reinsurance the Partner would be the reporting node, hence not null.", + "\n // If this is true we need the [Required] attribute here, add some validation at dataNode import ", + "\n // and to add logic in the GetNonPerformanceRiskRate method in ImportStorage.", + "\n [NotVisible] ", + "\n [NotMapped]", + "\n //[Immutable]", + "\n public override string Partner => null;", + "\n}", + "\n", + "\npublic record GroupOfReinsuranceContract : GroupOfContract {", + "\n [Required]", + "\n [NotVisible] ", + "\n [Display(Name = \"ReinsurancePortfolio\")]", + "\n [Dimension(typeof(ReinsurancePortfolio))]", + "\n //[Immutable]", + "\n public string Portfolio { get => base.Portfolio; init => base.Portfolio = value; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data Node State", + "\n", + "\nThe Data State is used to track whether a GOC is Active or Inactive across time (year and month). ", + "\nIt is only possible to update the state of a Group of Contract from Active to Inactive." + ] + }, + { + "cell_type": "code", + "source": [ + "public record DataNodeState : KeyedRecord, IPartitioned, IWithYearAndMonth", + "\n{", + "\n [NotVisible]", + "\n [PartitionKey(typeof(PartitionByReportingNode))]", + "\n public Guid Partition { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n public string DataNode { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n [DefaultValue(DefaultDataNodeActivationMonth)]", + "\n public int Month { get; init; } = DefaultDataNodeActivationMonth;", + "\n ", + "\n [Required]", + "\n [Display(Order = 40)]", + "\n [DefaultValue(State.Active)]", + "\n public State State { get; init; } = State.Active;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data Node Parameters", + "\n", + "\nData Node Parameters are used to keep track of other parameters pertaining to each Data Node, and their movements in time (year and month).", + "\n
PremiumAllocation : defines the weight of Premium to be included in the Experience Adjustement AocType of the Technical Margin and is valid only for Group of Insurance Contract with LiabilityType : Liability for Remaining Coverage.", + "\n
ReinsuranceCoverage : defines the weight of the underlying gross business to be considered in the computation of the allocation of the Technical Margin in a Reinsurance case.", + "\n", + "\nThe latest Data Node Parameters available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used as the current value during calculation." + ] + }, + { + "cell_type": "code", + "source": [ + "public record DataNodeParameter : KeyedRecord, IPartitioned, IWithYearAndMonth", + "\n{", + "\n [NotVisible]", + "\n [PartitionKey(typeof(PartitionByReportingNode))]", + "\n public Guid Partition { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n [Range(1900, 2100, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 20)]", + "\n public int Year { get; init; }", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n [Display(Order = 30)]", + "\n [DefaultValue(DefaultDataNodeActivationMonth)]", + "\n public int Month { get; init; } = DefaultDataNodeActivationMonth;", + "\n ", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 10)]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n public string DataNode { get; init; }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public record SingleDataNodeParameter : DataNodeParameter {", + "\n [DefaultValue(DefaultPremiumExperienceAdjustmentFactor)]", + "\n [Range(0, 1, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n public double PremiumAllocation { get; init; } = DefaultPremiumExperienceAdjustmentFactor;", + "\n}", + "\n", + "\npublic record InterDataNodeParameter : DataNodeParameter {", + "\n [Required]", + "\n [IdentityProperty]", + "\n [Display(Order = 20)]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n public string LinkedDataNode { get; init; }", + "\n ", + "\n [Range(0, 1, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", + "\n public double ReinsuranceCoverage { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## DataNodeData PocoType", + "\nThe DataNodeData type is not persisted (i.e. not stored in the database) and is used in order to hold Data Node data during data manipulations." + ] + }, + { + "cell_type": "code", + "source": [ + "public record DataNodeData {", + "\n public string DataNode { get; init; }", + "\n ", + "\n //Portfolio", + "\n public string ContractualCurrency { get; init; }", + "\n public string FunctionalCurrency { get; init; }", + "\n public string LineOfBusiness { get; init; }", + "\n public string ValuationApproach { get; init; }", + "\n public string OciType { get; init; }", + "\n ", + "\n //GroupOfContract", + "\n public string Portfolio { get; init; }", + "\n public int AnnualCohort { get; init; }", + "\n public string LiabilityType { get; init; }", + "\n public string Profitability { get; init; }", + "\n public string Partner { get; init; }", + "\n ", + "\n //DataNodeState", + "\n public int Year { get; init; }", + "\n public int Month { get; init; }", + "\n public State State { get; init; }", + "\n public State PreviousState { get; init; }", + "\n ", + "\n public bool IsReinsurance { get; init; }", + "\n ", + "\n public DataNodeData(){}", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Raw Variables (Cashflows)", + "\n", + "\nRaw Variables are used to store **cashflows** on the database during import, i.e. *after* mappings are applied and *before* calculations are applied.", + "\n", + "\nThey are stored on the database for both audit and re-calculation purposes." + ] + }, + { + "cell_type": "code", + "source": [ + "public abstract record BaseVariableIdentity {", + "\n [NotVisible]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n [IdentityProperty]", + "\n public string DataNode { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(AocType))]", + "\n [IdentityProperty]", + "\n public string AocType { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(Novelty))]", + "\n [IdentityProperty]", + "\n public string Novelty { get; init; }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public abstract record BaseDataRecord : BaseVariableIdentity, IKeyed, IPartitioned {", + "\n [Key]", + "\n [NotVisible] ", + "\n public Guid Id { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [PartitionKey(typeof(PartitionByReportingNodeAndPeriod))]", + "\n public Guid Partition { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(AmountType))]", + "\n [IdentityProperty]", + "\n public string AmountType { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(int),nameof(AccidentYear))]", + "\n [IdentityProperty]", + "\n public int? AccidentYear { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Basically, RawVariable is defined for a certain Reporting Node, Scenario, Year, Month, Amount Type and Calculation Type:" + ] + }, + { + "cell_type": "code", + "source": [ + "public record RawVariable : BaseDataRecord", + "\n{", + "\n [Conversion(typeof(PrimitiveArrayConverter))]", + "\n public double[] Values { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(CalculationType))]", + "\n [IdentityProperty]", + "\n public string CalculationType { get; init; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Ifrs Variable", + "\n", + "\nIfrs Variables are used to store:", + "\n", + "\n- **Actual Values**", + "\n- **Present Values**", + "\n", + "\nPresent Values are calculated from the [raw variables](#raw-variables) during the import of cashflows.", + "\n", + "\nIfrs Variables are stored on the database, i.e. they are 'persisted', for performance purposes." + ] + }, + { + "cell_type": "code", + "source": [ + "public record IfrsVariable : BaseDataRecord", + "\n{", + "\n public double Value { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(EstimateType))]", + "\n [IdentityProperty]", + "\n public string EstimateType { get; init; }", + "\n ", + "\n [NotVisible] ", + "\n [Dimension(typeof(EconomicBasis))]", + "\n [IdentityProperty]", + "\n public string EconomicBasis { get; init; }", + "\n ", + "\n public IfrsVariable (){}", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Import Identity", + "\nThe Import Identity contains the data elements used to determine the data sets which are used when performing data manipulations, e.g. during a [data import](./Import/ImportScopeCalculation) - In particular, an Import Identity is defined by: DataNode, AocType, Novelty, and whether it's reinsurance data or not:" + ] + }, + { + "cell_type": "code", + "source": [ + "public record ImportIdentity : BaseVariableIdentity {", + "\n ", + "\n [NotVisible]", + "\n public bool IsReinsurance { get; init; }", + "\n ", + "\n [NotVisible]", + "\n public string ValuationApproach { get; init; }", + "\n ", + "\n [NotVisible]", + "\n public int ProjectionPeriod { get; init; }", + "\n ", + "\n public (string, string) AocStep => (AocType, Novelty);", + "\n ", + "\n public ImportScope ImportScope { get; init; }", + "\n ", + "\n public ImportIdentity(RawVariable rv){", + "\n DataNode = rv.DataNode;", + "\n AocType = rv.AocType;", + "\n Novelty = rv.Novelty;", + "\n }", + "\n ", + "\n public ImportIdentity(IfrsVariable iv){", + "\n DataNode = iv.DataNode;", + "\n AocType = iv.AocType;", + "\n Novelty = iv.Novelty;", + "\n }", + "\n", + "\n public ImportIdentity(){}", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Report Variable", + "\n", + "\nReport Variables are used to hold data after data manipulations and before being outputed in the form of a report. They are not persisted, i.e. they are not saved on the database." + ] + }, + { + "cell_type": "code", + "source": [ + "public record ReportVariable {", + "\n", + "\n [NotVisible]", + "\n [Dimension(typeof(ReportingNode))]", + "\n [IdentityProperty]", + "\n public string ReportingNode { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Scenario))]", + "\n [IdentityProperty]", + "\n public string Scenario { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Currency), nameof(FunctionalCurrency))]", + "\n [IdentityProperty]", + "\n //[AggregateBy]", + "\n public string FunctionalCurrency { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Currency), nameof(ContractualCurrency))]", + "\n [IdentityProperty]", + "\n //[AggregateBy]", + "\n public string ContractualCurrency { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(GroupOfContract))]", + "\n [IdentityProperty]", + "\n public string GroupOfContract { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Portfolio))]", + "\n [IdentityProperty]", + "\n public string Portfolio { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(LineOfBusiness))]", + "\n [IdentityProperty]", + "\n public string LineOfBusiness { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(LiabilityType))]", + "\n [IdentityProperty]", + "\n public string LiabilityType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Profitability), nameof(InitialProfitability))]", + "\n [IdentityProperty]", + "\n public string InitialProfitability { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(ValuationApproach))]", + "\n [IdentityProperty]", + "\n public string ValuationApproach { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(AnnualCohort))]", + "\n [IdentityProperty]", + "\n public int AnnualCohort { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(OciType))]", + "\n [IdentityProperty]", + "\n public string OciType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Partner))]", + "\n [IdentityProperty]", + "\n public string Partner { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [IdentityProperty]", + "\n public bool IsReinsurance { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(AccidentYear))]", + "\n [IdentityProperty]", + "\n public int AccidentYear { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [NoArithmetics(ArithmeticOperation.Scale)]", + "\n [Dimension(typeof(int), nameof(Projection))]", + "\n [IdentityProperty]", + "\n //[AggregateBy]", + "\n public int Projection { get; init;}", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(VariableType))]", + "\n [IdentityProperty]", + "\n public string VariableType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(Novelty))]", + "\n [IdentityProperty]", + "\n public string Novelty { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(AmountType))]", + "\n [IdentityProperty]", + "\n public string AmountType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(EstimateType))]", + "\n [IdentityProperty]", + "\n public string EstimateType { get; init; }", + "\n ", + "\n [NotVisible]", + "\n [Dimension(typeof(EconomicBasis))]", + "\n [IdentityProperty]", + "\n //[AggregateBy]", + "\n public string EconomicBasis { get; init; }", + "\n ", + "\n public double Value { get; init; }", + "\n ", + "\n public ReportVariable(){}", + "\n public ReportVariable(ReportVariable rv){", + "\n ReportingNode = rv.ReportingNode;", + "\n Scenario = rv.Scenario;", + "\n FunctionalCurrency = rv.FunctionalCurrency;", + "\n ContractualCurrency = rv.ContractualCurrency;", + "\n GroupOfContract = rv.GroupOfContract;", + "\n Portfolio = rv.Portfolio;", + "\n LineOfBusiness = rv.LineOfBusiness;", + "\n LiabilityType = rv.LiabilityType;", + "\n InitialProfitability = rv.InitialProfitability;", + "\n ValuationApproach = rv.ValuationApproach;", + "\n AnnualCohort = rv.AnnualCohort;", + "\n OciType = rv.OciType;", + "\n Partner = rv.Partner;", + "\n IsReinsurance = rv.IsReinsurance;", + "\n AccidentYear = rv.AccidentYear;", + "\n Projection = rv.Projection;", + "\n VariableType = rv.VariableType;", + "\n Novelty = rv.Novelty;", + "\n AmountType = rv.AmountType;", + "\n EstimateType = rv.EstimateType;", + "\n EconomicBasis = rv.EconomicBasis;", + "\n Value = rv.Value;", + "\n }", + "\n public ReportVariable(DataNodeData dn, IfrsVariable iv){", + "\n FunctionalCurrency = dn.FunctionalCurrency;", + "\n ContractualCurrency = dn.ContractualCurrency;", + "\n GroupOfContract = dn.DataNode;", + "\n Portfolio = dn.Portfolio;", + "\n LineOfBusiness = dn.LineOfBusiness;", + "\n LiabilityType = dn.LiabilityType;", + "\n InitialProfitability = dn.Profitability;", + "\n ValuationApproach = dn.ValuationApproach;", + "\n AnnualCohort = dn.AnnualCohort;", + "\n OciType = dn.OciType;", + "\n Partner = dn.Partner;", + "\n IsReinsurance = dn.IsReinsurance;", + "\n AccidentYear = iv.AccidentYear ?? default;", + "\n VariableType = iv.AocType;", + "\n Novelty = iv.Novelty;", + "\n AmountType = iv.AmountType;", + "\n EstimateType = iv.EstimateType;", + "\n EconomicBasis = iv.EconomicBasis;", + "\n Value = iv.Value;", + "\n }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Args" + ] + }, + { + "cell_type": "code", + "source": [ + "public record Args(string ReportingNode, int Year, int Month, Periodicity Periodicity, string Scenario){}" + ] + }, + { + "cell_type": "code", + "source": [ + "public record ImportArgs : Args", + "\n{", + "\n public string ImportFormat { get; init; }", + "\n ", + "\n public ImportArgs(string reportingNode, int year, int month, Periodicity periodicity, string scenario, string importFormat)", + "\n : base(reportingNode, year, month, periodicity, scenario)", + "\n {", + "\n ImportFormat = importFormat;", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public record ReportArgs : Args", + "\n{", + "\n public string HierarchyName { get; init; }", + "\n ", + "\n public CurrencyType CurrencyType { get; init; }", + "\n ", + "\n public string ReportName { get; init; } // this is the key to which data to load (like loading behavior). If null, loads everything", + "\n ", + "\n public ReportArgs(string reportingNode, int year, int month, Periodicity periodicity, string scenario, string hierarchyName, CurrencyType currencyType)", + "\n : base(reportingNode, year, month, periodicity, scenario)", + "\n {", + "\n CurrencyType = currencyType;", + "\n HierarchyName = hierarchyName;", + "\n }", + "\n}" + ] + } + ] } \ No newline at end of file diff --git a/Database/Configure.ipynb b/Database/Configure.ipynb index 2819a9af..edca53dd 100644 --- a/Database/Configure.ipynb +++ b/Database/Configure.ipynb @@ -1,131 +1,93 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "toc-showmarkdowntxt": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "vWKQtrDv20CeZFovAj82Vw", - "cell_type": "markdown", - "source": [ - "

DataSource Configuration

" - ], - "metadata": {} - }, - { - "id": "ekOMREP2YkKF0vgtOn6cyQ", - "cell_type": "code", - "source": [ - "#!import \"../DataModel/DataStructure\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "eEI7AS2fc0-CFjAR_WzdHg", - "cell_type": "code", - "source": [ - "#!import \"PersonalConnection\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZoHg5nndvEWdxnUy6nU0aQ", - "cell_type": "code", - "source": [ - "using System.Reflection;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "V3sPPe7bkEOIAjZHtM5oTw", - "cell_type": "markdown", - "source": [ - "# Database Configure" - ], - "metadata": {} - }, - { - "id": "ZxIo5q84i02LBlbq4AQnNA", - "cell_type": "code", - "source": [ - "var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())", - "\n .Where(t => (t.IsAssignableTo(typeof(IKeyed)) || t.IsAssignableTo(typeof(KeyedDimension)))", - "\n && !t.IsInterface", - "\n && !t.IsAbstract", - "\n ).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Wi93Z_KSukSEMiLoOfsKXA", - "cell_type": "code", - "source": [ - "await DataSource.Configure().UseMsSql(opt => opt.WithConnectionString(connectionStringMsSql)", - "\n .WithTypes(allTypes)) .ConnectAsync();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4jSr3apQzEm6bXs7ot9uJQ", - "cell_type": "code", - "source": [ - "await DataSource.CommitAsync();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "SUiuO25f-0S6Uv5at0MehA", - "cell_type": "markdown", - "source": [ - "# Reset Workspace" - ], - "metadata": {} - }, - { - "id": "T0pNd11nrkuDwN6S0YgItg", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "sAYMeiwmiUWC-T3QYXi7aw", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

DataSource Configuration

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../DataModel/DataStructure\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"PersonalConnection\"" + ] + }, + { + "cell_type": "code", + "source": [ + "using System.Reflection;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Database Configure" + ] + }, + { + "cell_type": "code", + "source": [ + "var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())", + "\n .Where(t => (t.IsAssignableTo(typeof(IKeyed)) || t.IsAssignableTo(typeof(KeyedDimension)))", + "\n && !t.IsInterface", + "\n && !t.IsAbstract", + "\n ).ToArray();" + ] + }, + { + "cell_type": "code", + "source": [ + "await DataSource.Configure().UseMsSql(opt => opt.WithConnectionString(connectionStringMsSql)", + "\n .WithTypes(allTypes)) .ConnectAsync();" + ] + }, + { + "cell_type": "code", + "source": [ + "await DataSource.CommitAsync();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Reset Workspace" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules());" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Database/Schema Delete.ipynb b/Database/Schema Delete.ipynb index 49792b90..e3e1eb69 100644 --- a/Database/Schema Delete.ipynb +++ b/Database/Schema Delete.ipynb @@ -1,87 +1,63 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "documentInfo": "{\r\n \"authors\": [\r\n \"Peter Kunszt\"\r\n ],\r\n \"contributors\": [],\r\n \"tags\": [\r\n \"storage\",\r\n \"database\",\r\n \"persistence\",\r\n \"dependency\"\r\n ],\r\n \"title\": \"Multiple Storages with Persistence\",\r\n \"description\": \"Demo the usage of database backend to resolve a data dependency.\",\r\n \"createdDate\": \"Jan. 2022\",\r\n \"publishedDate\": \"Jan. 2022\",\r\n \"changelog\": [\r\n {\r\n \"version\": \"1.0\",\r\n \"description\": \"Initial Notebook\"\r\n }\r\n ]\r\n }", + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + } }, - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, - "documentInfo": "{\r\n \"authors\": [\r\n \"Peter Kunszt\"\r\n ],\r\n \"contributors\": [],\r\n \"tags\": [\r\n \"storage\",\r\n \"database\",\r\n \"persistence\",\r\n \"dependency\"\r\n ],\r\n \"title\": \"Multiple Storages with Persistence\",\r\n \"description\": \"Demo the usage of database backend to resolve a data dependency.\",\r\n \"createdDate\": \"Jan. 2022\",\r\n \"publishedDate\": \"Jan. 2022\",\r\n \"changelog\": [\r\n {\r\n \"version\": \"1.0\",\r\n \"description\": \"Initial Notebook\"\r\n }\r\n ]\r\n }" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "XekEwxVoCk6YtMSTaBi_6A", - "cell_type": "code", - "source": [ - "#!import \"PersonalConnection\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "aMGWTiny-EO8ZtyaiC0M2A", - "cell_type": "code", - "source": [ - "#r \"nuget:SqlConnection,1.0.4\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dKBE6yQHq0CZbS4Oq7ZXag", - "cell_type": "code", - "source": [ - "string[] split = connectionStringMsSql.Split(new char[] { '=', ':', ',', ';' });", - "\n", - "\nstring serverName = split[2];", - "\nstring database = split[5];", - "\nstring userID = split[9];", - "\nstring password = split[11];" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BBbDUGWgHUywoxk289vQ2A", - "cell_type": "code", - "source": [ - "using SQLConnection;", - "\nusing System;", - "\nusing System.Data.SqlClient;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "S-_OArgE70qFUpEbX12H3Q", - "cell_type": "code", - "source": [ - "string query = \"DECLARE @sql NVARCHAR(max)='' SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; 'FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' Exec Sp_executesql @sql\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "oeQryPr0l0uflGqNrUvmLw", - "cell_type": "code", - "source": [ - "int rowAffect = SqlServer.AzureSqlConnection(serverName, database, userID, password, query);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!import \"PersonalConnection\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#r \"nuget:SqlConnection,1.0.4\"" + ] + }, + { + "cell_type": "code", + "source": [ + "string[] split = connectionStringMsSql.Split(new char[] { '=', ':', ',', ';' });", + "\n", + "\nstring serverName = split[2];", + "\nstring database = split[5];", + "\nstring userID = split[9];", + "\nstring password = split[11];" + ] + }, + { + "cell_type": "code", + "source": [ + "using SQLConnection;", + "\nusing System;", + "\nusing System.Data.SqlClient;" + ] + }, + { + "cell_type": "code", + "source": [ + "string query = \"DECLARE @sql NVARCHAR(max)='' SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; 'FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' Exec Sp_executesql @sql\";" + ] + }, + { + "cell_type": "code", + "source": [ + "int rowAffect = SqlServer.AzureSqlConnection(serverName, database, userID, password, query);" + ] + } + ] } \ No newline at end of file diff --git a/Export/MapTemplate.ipynb b/Export/MapTemplate.ipynb index c1fb9d01..1f91daa0 100644 --- a/Export/MapTemplate.ipynb +++ b/Export/MapTemplate.ipynb @@ -1,338 +1,244 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "J7Lk0NfjhkC9DBXVAnd4ag", - "cell_type": "markdown", - "source": [ - "

Map Template

" - ], - "metadata": {} - }, - { - "id": "nJozo1XeSkeGCLiQXUPlzA", - "cell_type": "markdown", - "source": [ - "This Notebook exports the Data nodes, states, and parameters for the target partition to a spreadsheet file which can be read, modified, and is ready to be re-imported." - ], - "metadata": {} - }, - { - "id": "T4LYGKNFjke1IDEPU8E44Q", - "cell_type": "markdown", - "source": [ - "After setting the desired target Partition, the Data present in the workspace is ready to be exported. " - ], - "metadata": {} - }, - { - "id": "J3Om4qznT0qnFdizsJg6gA", - "cell_type": "markdown", - "source": [ - "# Import dependencies" - ], - "metadata": {} - }, - { - "id": "jz0ZzjaNNkyPlNjH7p_9CQ", - "cell_type": "code", - "source": [ - "#!import \"../Utils/UtilityMethods\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4kGmVeM2F0y1LR3iEJJAaA", - "cell_type": "markdown", - "source": [ - "# Select Initialization" - ], - "metadata": {} - }, - { - "id": "nVFGNWhtb0iw49kOFNKpUQ", - "cell_type": "markdown", - "source": [ - "Choose to run the Map Template either with the set of Systemorph data in memory or with the data present in the Database. Uncomment the desired option." - ], - "metadata": {} - }, - { - "id": "MbQiJg5acUurtMhQFZOPtw", - "cell_type": "code", - "source": [ - "/* The DataSource is configured and connected to real database */", - "\n//#!eval-notebook \"Database/Configure\"", - "\n/* The Systemorph set of dimensions + mockdata are dispatched to the unconfigured in-memory DataSource */", - "\n#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Ma-JBoxkmUqAb81Pb2v8EA", - "cell_type": "markdown", - "source": [ - "# Workspace Initialization " - ], - "metadata": {} - }, - { - "id": "zaO0K3_d3UOftmtrwhqrFg", - "cell_type": "markdown", - "source": [ - "Firstly, the Workspace is initialized with basic dimensions and with Data Nodes. For a list of the dimensions please refer to the DataModel/DataStructure notebook." - ], - "metadata": {} - }, - { - "id": "BP4HG8krfkul6dXSvdGHnw", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CirOR3dQA0iqxXipYfNcFQ", - "cell_type": "markdown", - "source": [ - "# Map Template: Data Node" - ], - "metadata": {} - }, - { - "id": "z1pGwBuU20ywRLjN6Gj5eg", - "cell_type": "markdown", - "source": [ - "## Set Partition" - ], - "metadata": {} - }, - { - "id": "8y9ezk2H7EetGACPthoNUw", - "cell_type": "code", - "source": [ - "static var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XFPlV7vwiUCUY7llRpEeEQ", - "cell_type": "code", - "source": [ - "await Workspace.Partition.SetAsync( partition );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "7MTJTAXvjUCDuc6-sHSUQQ", - "cell_type": "markdown", - "source": [ - "## Export" - ], - "metadata": {} - }, - { - "id": "yBbsPeQ5XkO5M_mXJtkiTw", - "cell_type": "code", - "source": [ - "await Export.ToExcel(\"DataNodes\")", - "\n .WithSource(Workspace)", - "\n .PortfolioConfiguration()", - "\n .PortfolioConfiguration()", - "\n .GroupofContractConfiguration(typeof(ReinsurancePortfolio))", - "\n .GroupofContractConfiguration(typeof(InsurancePortfolio))", - "\n .MainTabConfigurationWoScenario(partition)", - "\n.ExecuteAsync()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "SG9iYPdfGkOJqrcbjN-cIQ", - "cell_type": "markdown", - "source": [ - "# Map Template: Data Node State" - ], - "metadata": {} - }, - { - "id": "go7LKWKxBECDgXOhv9Se8g", - "cell_type": "markdown", - "source": [ - "## Set Partition" - ], - "metadata": {} - }, - { - "id": "b7xD5r6TuE2QTO-J6L8q-Q", - "cell_type": "code", - "source": [ - "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "q1MIgSZcNE60Sx6cCGC9YA", - "cell_type": "code", - "source": [ - "await Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "reWr-I2FeUijpPeiXGdOCA", - "cell_type": "markdown", - "source": [ - "## Export" - ], - "metadata": {} - }, - { - "id": "iW-JFPjuS0q_aGWGSn4Ujg", - "cell_type": "code", - "source": [ - "var dataNodeStates = (await Workspace.Query()", - "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year).ToArrayAsync())", - "\n .GroupBy(x => x.DataNode)", - "\n .Select(x => x.OrderByDescending(y => y.Year).ThenByDescending(y => y.Month))", - "\n .Select(x => x.Last())", - "\n .ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "64_Gk6W_qkuh47zAJ1xcZw", - "cell_type": "code", - "source": [ - "await Export.ToExcel(\"DataNodeState\")", - "\n .WithSource(Workspace)", - "\n .StateEnumConfiguration() ", - "\n .DataNodeStateConfiguration(dataNodeStates)", - "\n .MainTabConfigurationWoScenario(partition)", - "\n.ExecuteAsync()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Aolg5llKGkWX3-v94jBP8A", - "cell_type": "markdown", - "source": [ - "# Map Template: Data Node Parameter" - ], - "metadata": {} - }, - { - "id": "amCy5h6BA0K6wxCh7NvZrg", - "cell_type": "markdown", - "source": [ - "## Set Partition" - ], - "metadata": {} - }, - { - "id": "kMTcDi7DFEC6FuMagh5uDg", - "cell_type": "code", - "source": [ - "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-tmD3uOmwUmFUX_q78nD7A", - "cell_type": "code", - "source": [ - "await Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "z6pkleZXd0mZN82EQprS3w", - "cell_type": "markdown", - "source": [ - "## Export" - ], - "metadata": {} - }, - { - "id": "0zdLZPrPw0Sm4w1TjesGMQ", - "cell_type": "code", - "source": [ - "var dataNodeParameters = (await Workspace.Query()", - "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year).ToArrayAsync())", - "\n .GroupBy(x => x.GetType().Name)", - "\n .ToDictionary(x => x.Key, ", - "\n x => x.GroupBy(y => y.DataNode)", - "\n .Select(y => y.OrderByDescending(z => z.Year).ThenByDescending(z => z.Month))", - "\n .Select(y => y.Last())", - "\n .ToArray() );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xp0dlpVqC0mQfbqqrpn8Aw", - "cell_type": "code", - "source": [ - "await Export.ToExcel(\"DataNodeParameter\")", - "\n .WithSource(Workspace)", - "\n .DataNodeParameterConfiguration(dataNodeParameters)", - "\n .MainTabConfiguration(partition)", - "\n.ExecuteAsync()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3tf3mjl0gUqui_fD_X7OmQ", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Map Template

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This Notebook exports the Data nodes, states, and parameters for the target partition to a spreadsheet file which can be read, modified, and is ready to be re-imported." + ] + }, + { + "cell_type": "markdown", + "source": [ + "After setting the desired target Partition, the Data present in the workspace is ready to be exported. " + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import dependencies" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Utils/UtilityMethods\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Select Initialization" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Choose to run the Map Template either with the set of Systemorph data in memory or with the data present in the Database. Uncomment the desired option." + ] + }, + { + "cell_type": "code", + "source": [ + "/* The DataSource is configured and connected to real database */", + "\n//#!eval-notebook \"Database/Configure\"", + "\n/* The Systemorph set of dimensions + mockdata are dispatched to the unconfigured in-memory DataSource */", + "\n#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Workspace Initialization " + ] + }, + { + "cell_type": "markdown", + "source": [ + "Firstly, the Workspace is initialized with basic dimensions and with Data Nodes. For a list of the dimensions please refer to the DataModel/DataStructure notebook." + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Map Template: Data Node" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Set Partition" + ] + }, + { + "cell_type": "code", + "source": [ + "static var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };" + ] + }, + { + "cell_type": "code", + "source": [ + "await Workspace.Partition.SetAsync( partition );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Export" + ] + }, + { + "cell_type": "code", + "source": [ + "await Export.ToExcel(\"DataNodes\")", + "\n .WithSource(Workspace)", + "\n .PortfolioConfiguration()", + "\n .PortfolioConfiguration()", + "\n .GroupofContractConfiguration(typeof(ReinsurancePortfolio))", + "\n .GroupofContractConfiguration(typeof(InsurancePortfolio))", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Map Template: Data Node State" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Set Partition" + ] + }, + { + "cell_type": "code", + "source": [ + "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };" + ] + }, + { + "cell_type": "code", + "source": [ + "await Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Export" + ] + }, + { + "cell_type": "code", + "source": [ + "var dataNodeStates = (await Workspace.Query()", + "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year).ToArrayAsync())", + "\n .GroupBy(x => x.DataNode)", + "\n .Select(x => x.OrderByDescending(y => y.Year).ThenByDescending(y => y.Month))", + "\n .Select(x => x.Last())", + "\n .ToArray();" + ] + }, + { + "cell_type": "code", + "source": [ + "await Export.ToExcel(\"DataNodeState\")", + "\n .WithSource(Workspace)", + "\n .StateEnumConfiguration() ", + "\n .DataNodeStateConfiguration(dataNodeStates)", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Map Template: Data Node Parameter" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Set Partition" + ] + }, + { + "cell_type": "code", + "source": [ + "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };" + ] + }, + { + "cell_type": "code", + "source": [ + "await Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Export" + ] + }, + { + "cell_type": "code", + "source": [ + "var dataNodeParameters = (await Workspace.Query()", + "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year).ToArrayAsync())", + "\n .GroupBy(x => x.GetType().Name)", + "\n .ToDictionary(x => x.Key, ", + "\n x => x.GroupBy(y => y.DataNode)", + "\n .Select(y => y.OrderByDescending(z => z.Year).ThenByDescending(z => z.Month))", + "\n .Select(y => y.Last())", + "\n .ToArray() );" + ] + }, + { + "cell_type": "code", + "source": [ + "await Export.ToExcel(\"DataNodeParameter\")", + "\n .WithSource(Workspace)", + "\n .DataNodeParameterConfiguration(dataNodeParameters)", + "\n .MainTabConfiguration(partition)", + "\n.ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Import/ImportResultPreview.ipynb b/Import/ImportResultPreview.ipynb index 4b61bb94..22cd4398 100644 --- a/Import/ImportResultPreview.ipynb +++ b/Import/ImportResultPreview.ipynb @@ -1,344 +1,250 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "9Q5yj6YN-EKdGXz1kK8Q6A", - "cell_type": "markdown", - "source": [ - "# Temporary for debugging (initialize data and construct/initialize storage)" - ], - "metadata": {} - }, - { - "id": "maDeKWCseEWbze58VbJlyw", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "S2vYnVC3LUuldJH71p8jfA", - "cell_type": "code", - "source": [ - "#!import \"../Test/SpecificationsSetup\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BmCoR4B2rEuIBBIgZnqI1w", - "cell_type": "markdown", - "source": [ - "", - "\nGiven the current status of the implementation, in order to display Actual reports it is necessary to set Actual format in the Args while to display Cashflow it is necessary to set Cashflow format." - ], - "metadata": {} - }, - { - "id": "trcP0qut1kWbOQTgIF35cg", - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;", - "\nvar economicBasis = \"L\" ;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2m1t-aisOEiw325jWesNXQ", - "cell_type": "code", - "source": [ - "var UniversePreview = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "AbkLGXiDFk6sdSdWtinXjA", - "cell_type": "code", - "source": [ - "var importStorage = UniversePreview.GetStorage();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "k9qNkaSwjUqp_Y_vGf9RwA", - "cell_type": "markdown", - "source": [ - "# Import Preview" - ], - "metadata": {} - }, - { - "id": "5EP-6YDPFkeMJcxDTaO7qw", - "cell_type": "markdown", - "source": [ - "## Present Value" - ], - "metadata": {} - }, - { - "id": "XTFLl2lau0SjbCIEtOTHpA", - "cell_type": "code", - "source": [ - "var identities = UniversePreview.GetScopes(importStorage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yEjsrBVzEk26kz9jgLkJ-Q", - "cell_type": "code", - "source": [ - "var pvs = UniversePreview.GetScopes(identities, o => o.WithStorage(importStorage)).SelectMany(x => x.PvCurrent.Concat(x.PvLocked));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ck9xZbpeDUyh_Tw6FOoxKg", - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(pvs", - "\n //.Where(x => x.DataNode == \"DTR1.1\")", - "\n )", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.EconomicBasis)", - "\n //.GroupColumnsBy(x => x.AmountType)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n //VariableType", - "\n //.GroupColumnsBy(x => x.DataNode)", - "\n //.GroupColumnsBy(x => x.Novelty)", - "\n .WithGridOptionsForIfrsVariable(720)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XIPJIPxfyEy6P4JYfRAXTA", - "cell_type": "markdown", - "source": [ - "## Risk Adjustment" - ], - "metadata": {} - }, - { - "id": "4bBaRnP3pE-ZbxPKKnxOCA", - "cell_type": "code", - "source": [ - "var ras = UniversePreview.GetScopes(identities).SelectMany(x => x.RaCurrent.Concat(x.RaLocked));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "AiOWaeI_Hku1SDbNB-xlXA", - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(ras)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.EconomicBasis)", - "\n //.GroupRowsBy(x => x.DataNode)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n //VariableType", - "\n //.GroupColumnsBy(x => x.DataNode)", - "\n //.GroupColumnsBy(x => x.Novelty)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "rqCr51d6kUGgBzGRAqrtXw", - "cell_type": "markdown", - "source": [ - "## Actuals" - ], - "metadata": {} - }, - { - "id": "vl8E9tTAT06fpVUcTfflbg", - "cell_type": "code", - "source": [ - "var actuals = UniversePreview.GetScopes(identities).SelectMany(x => x.Actual);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hQUJ7t1AB0O-L0PVYPqsVw", - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(actuals)", - "\n .WithQuerySource(Workspace)", - "\n .GroupRowsBy(x => x.AmountType)", - "\n //.GroupColumnsBy(x => x.DataNode)", - "\n .WithGridOptionsForIfrsVariable(550)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nwWJHZ5vTUuJsHqFTGwLQw", - "cell_type": "markdown", - "source": [ - "## Advance, Overdue Actuals" - ], - "metadata": {} - }, - { - "id": "UYvTQnP0NUe4pLm0fnYEAA", - "cell_type": "code", - "source": [ - "var aoActuals = UniversePreview.GetScopes(identities).SelectMany(x => x.AdvanceActual.Concat(x.OverdueActual));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1v6tcALrVEGG-vdRDV7HIQ", - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(aoActuals)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupColumnsBy(x => x.EstimateType)", - "\n .GroupColumnsBy(x => x.AmountType)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable(300)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ab2P4J7DO0mkVrlsP09fhQ", - "cell_type": "markdown", - "source": [ - "## Deferrable Actuals" - ], - "metadata": {} - }, - { - "id": "KCZlxRFa10CYDduJ65KMHg", - "cell_type": "code", - "source": [ - "var deferrableActuals = UniversePreview.GetScopes(identities).SelectMany(x => x.DeferrableActual);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zln4EOOdqUiUTFbwoqTirw", - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(deferrableActuals)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable(350)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "l5uZz5MhKUOYLsKpzNZwvQ", - "cell_type": "markdown", - "source": [ - "## Csm Lc LoReCo" - ], - "metadata": {} - }, - { - "id": "WZ_xvxUBtEKO2jingfCpRQ", - "cell_type": "code", - "source": [ - "var csm = UniversePreview.GetScopes(identities).SelectMany(x => x.Csms);", - "\nvar loss = UniversePreview.GetScopes(identities).SelectMany(x => x.Loss);", - "\nvar csmLcLoReCo = Enumerable.Empty().Concat(csm).Concat(loss);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RAN7qdbDLECNmb-kxUNx1A", - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(csmLcLoReCo", - "\n //.Where(x => x.DataNode == \"DT1.1\")", - "\n )", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupColumnsBy(x => x.EstimateType)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "GszVX-_KiEa9h0m0P0rlhQ", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Temporary for debugging (initialize data and construct/initialize storage)" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Test/SpecificationsSetup\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\nGiven the current status of the implementation, in order to display Actual reports it is necessary to set Actual format in the Args while to display Cashflow it is necessary to set Cashflow format." + ] + }, + { + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;", + "\nvar economicBasis = \"L\" ;" + ] + }, + { + "cell_type": "code", + "source": [ + "var UniversePreview = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" + ] + }, + { + "cell_type": "code", + "source": [ + "var importStorage = UniversePreview.GetStorage();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Preview" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Present Value" + ] + }, + { + "cell_type": "code", + "source": [ + "var identities = UniversePreview.GetScopes(importStorage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);" + ] + }, + { + "cell_type": "code", + "source": [ + "var pvs = UniversePreview.GetScopes(identities, o => o.WithStorage(importStorage)).SelectMany(x => x.PvCurrent.Concat(x.PvLocked));" + ] + }, + { + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(pvs", + "\n //.Where(x => x.DataNode == \"DTR1.1\")", + "\n )", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.EconomicBasis)", + "\n //.GroupColumnsBy(x => x.AmountType)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n //VariableType", + "\n //.GroupColumnsBy(x => x.DataNode)", + "\n //.GroupColumnsBy(x => x.Novelty)", + "\n .WithGridOptionsForIfrsVariable(720)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Risk Adjustment" + ] + }, + { + "cell_type": "code", + "source": [ + "var ras = UniversePreview.GetScopes(identities).SelectMany(x => x.RaCurrent.Concat(x.RaLocked));" + ] + }, + { + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(ras)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.EconomicBasis)", + "\n //.GroupRowsBy(x => x.DataNode)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n //VariableType", + "\n //.GroupColumnsBy(x => x.DataNode)", + "\n //.GroupColumnsBy(x => x.Novelty)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "var actuals = UniversePreview.GetScopes(identities).SelectMany(x => x.Actual);" + ] + }, + { + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(actuals)", + "\n .WithQuerySource(Workspace)", + "\n .GroupRowsBy(x => x.AmountType)", + "\n //.GroupColumnsBy(x => x.DataNode)", + "\n .WithGridOptionsForIfrsVariable(550)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Advance, Overdue Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "var aoActuals = UniversePreview.GetScopes(identities).SelectMany(x => x.AdvanceActual.Concat(x.OverdueActual));" + ] + }, + { + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(aoActuals)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupColumnsBy(x => x.EstimateType)", + "\n .GroupColumnsBy(x => x.AmountType)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable(300)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Deferrable Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "var deferrableActuals = UniversePreview.GetScopes(identities).SelectMany(x => x.DeferrableActual);" + ] + }, + { + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(deferrableActuals)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable(350)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Csm Lc LoReCo" + ] + }, + { + "cell_type": "code", + "source": [ + "var csm = UniversePreview.GetScopes(identities).SelectMany(x => x.Csms);", + "\nvar loss = UniversePreview.GetScopes(identities).SelectMany(x => x.Loss);", + "\nvar csmLcLoReCo = Enumerable.Empty().Concat(csm).Concat(loss);" + ] + }, + { + "cell_type": "code", + "source": [ + "Report", + "\n .ForObjects(csmLcLoReCo", + "\n //.Where(x => x.DataNode == \"DT1.1\")", + "\n )", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupColumnsBy(x => x.EstimateType)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Import/ImportScopeCalculation.ipynb b/Import/ImportScopeCalculation.ipynb index 9370c157..b932e924 100644 --- a/Import/ImportScopeCalculation.ipynb +++ b/Import/ImportScopeCalculation.ipynb @@ -1,2296 +1,2056 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "a6wbTgZMQ0q5Of99FfYD-A", - "cell_type": "markdown", - "source": [ - "", - "\n

Import Scopes (IFRS17 Methodology Business Logic)

", - "\n", - "\nThis notebook contains the logic used to perform calculations upon import of data (actuals and cashflows). This is also called 'Data Loading' and the concept of Scope is used here to define the logic and provide the means of executing the logic." - ], - "metadata": {} - }, - { - "id": "6qZO0vcpd0GtSc7GvLlgBQ", - "cell_type": "markdown", - "source": [ - "# References", - "\nLibraries and other notebooks which are needed for this notebook are imported below." - ], - "metadata": {} - }, - { - "id": "G75a3tlrBkqn_MN5as22Jw", - "cell_type": "markdown", - "source": [ - "## Notebooks" - ], - "metadata": {} - }, - { - "id": "HQwfAINEvUqJK5l5FV_SOg", - "cell_type": "code", - "source": [ - "#!import \"ImportStorage\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kd06OH9YcE2hGUtgERwXhA", - "cell_type": "markdown", - "source": [ - "", - "\n# Scopes", - "\nScopes are used to define and perform data handling in a structured and easy-to-read-through fashion.", - "\n", - "\nThe IModel interface below will be used to execute calculations (i.e. evaluate the scopes) based on imported data." - ], - "metadata": {} - }, - { - "id": "3ye2s5-hWEWsy3YLTe5R-w", - "cell_type": "code", - "source": [ - "public interface IModel : IMutableScopeWithStorage{}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LjnVkU0bq0yP61Cb1_EMxA", - "cell_type": "markdown", - "source": [ - "## Getting Existing Identities", - "\n", - "\nAn [Identity](../DataModel/DataStructure#import-identity) is a set of identifiers for a certain set of data. In particular, an identity consists of a certain [AoC Type](../DataModel/DataStructure#aoc-type), [Novelty](../DataModel/DataStructure#novelty), [Data Node](../DataModel/DataStructure#data-node), Accident Year, and information on whether the data is for reinsurance or not. ", - "\n", - "\nGiven a certain Data Node and Accident Year, the interface GetIdentities returns all the existing identities (e.g. for Actuals and Cashflows) which have that Data Node and Accident Year." - ], - "metadata": {} - }, - { - "id": "SyhE8EzOsECEpMzUSS6kGQ", - "cell_type": "code", - "source": [ - "public interface AllCfIdentities : IScope // string represents a DataNode", - "\n{", - "\n public IEnumerable ids => GetStorage().GetAllAocSteps(InputSource.Cashflow)", - "\n .Select(aocStep => new ImportIdentity {", - "\n AocType = aocStep.AocType,", - "\n Novelty = aocStep.Novelty,", - "\n DataNode = Identity", - "\n });", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_LsQEeHMYE6G4pGS8dK4RQ", - "cell_type": "code", - "source": [ - "public interface GetIdentities : IScope", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().IsSecondaryScope(x.Identity))", - "\n .WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Actual)", - "\n .WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Cashflow)", - "\n .WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Opening)", - "\n );", - "\n ", - "\n private IEnumerable computedIdentities => new string[]{AocTypes.EA, AocTypes.AM, AocTypes.EOP}", - "\n .Select(aocType => new ImportIdentity {", - "\n AocType = aocType,", - "\n Novelty = Novelties.C,", - "\n DataNode = Identity", - "\n });", - "\n private IEnumerable allIdentities => ParsedIdentities.Concat(computedIdentities).Concat(SpecialIdentities).ToHashSet(); ", - "\n ", - "\n IEnumerable ParsedIdentities => Enumerable.Empty(); ", - "\n IEnumerable SpecialIdentities => Enumerable.Empty();", - "\n ", - "\n //Set DataNode properties and ProjectionPeriod", - "\n IEnumerable Identities => allIdentities.Select(id => id with { IsReinsurance = GetStorage().DataNodeDataBySystemName[id.DataNode].IsReinsurance,", - "\n ValuationApproach = GetStorage().DataNodeDataBySystemName[id.DataNode].ValuationApproach", - "\n });", - "\n /* .SelectMany(id => Enumerable.Range(0,GetStorage().GetProjectionCount() + 1)", - "\n .Select(pp => id with {ProjectionPeriod = pp })", - "\n );*/", - "\n}", - "\n", - "\npublic interface AllCashflowIdentities : GetIdentities", - "\n{", - "\n IEnumerable GetIdentities.SpecialIdentities => GetScope(Identity).ids;", - "\n}", - "\n", - "\n", - "\npublic interface GetActualIdentities : GetIdentities", - "\n{", - "\n private IEnumerable actualEstimateTypes => GetStorage().EstimateTypesByImportFormat[ImportFormats.Actual];", - "\n ", - "\n IEnumerable GetIdentities.ParsedIdentities => GetStorage().GetIfrsVariables(Identity).Where(iv => actualEstimateTypes.Contains(iv.EstimateType)).Select(v => new ImportIdentity(v));", - "\n IEnumerable GetIdentities.SpecialIdentities => GetScope(Identity).ids", - "\n .Concat(GetStorage().GetAllAocSteps(InputSource.Opening)", - "\n .Select(aocStep => new ImportIdentity {AocType = aocStep.AocType, ", - "\n Novelty = aocStep.Novelty,", - "\n DataNode = Identity", - "\n }));", - "\n}", - "\n", - "\npublic interface GetCashflowIdentities : GetIdentities", - "\n{", - "\n private bool isReinsurance => GetStorage().DataNodeDataBySystemName[Identity].IsReinsurance; //clean up in the next PR", - "\n ", - "\n IEnumerable GetIdentities.ParsedIdentities => GetStorage().GetRawVariables(Identity).Select(v => new ImportIdentity(v));", - "\n ", - "\n IEnumerable GetIdentities.SpecialIdentities => ParsedIdentities.Where(id => id.Novelty != Novelties.C)", - "\n .Select(id => id.Novelty).ToHashSet()", - "\n .SelectMany(n => (n == Novelties.N ", - "\n ? new string[]{AocTypes.IA, AocTypes.CF} //Add IA, CF, for New Business", - "\n : isReinsurance ", - "\n ? new string[]{AocTypes.IA, AocTypes.CF, AocTypes.YCU, AocTypes.CRU, AocTypes.RCU} //Add IA, CF, YCU, CRU, RCU for in force", - "\n : new string[]{AocTypes.IA, AocTypes.CF, AocTypes.YCU}) //Add IA, CF, YCU,", - "\n .Select(aocType => new ImportIdentity {", - "\n AocType = aocType,", - "\n Novelty = n,", - "\n DataNode = Identity }))", - "\n .Concat(new ImportIdentity {", - "\n AocType = AocTypes.CF, //Add CF for Deferral", - "\n Novelty = Novelties.C,", - "\n DataNode = Identity", - "\n }.RepeatOnce()) ", - "\n .Concat(GetStorage().GetAllAocSteps(InputSource.Opening)", - "\n .Select(aocStep => new ImportIdentity {AocType = aocStep.AocType, ", - "\n Novelty = aocStep.Novelty,", - "\n DataNode = Identity", - "\n })); ", - "\n}", - "\n", - "\npublic interface GetAllIdentities : GetIdentities", - "\n{", - "\n IEnumerable GetIdentities.SpecialIdentities => GetScope(Identity).ids", - "\n .Concat(GetStorage().GetAllAocSteps(InputSource.Actual)", - "\n .Select(aocStep => new ImportIdentity {AocType = aocStep.AocType, ", - "\n Novelty = aocStep.Novelty,", - "\n DataNode = Identity,", - "\n }));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZVtzxigEF0yEaftuPtLQlw", - "cell_type": "markdown", - "source": [ - "## Getting Amount Types", - "\n", - "\nSimilarly, given a certain Data Node and Accident Year, the interface ValidAmountType returns all the amount types which are used in imported data with that Data Node and Accident Year." - ], - "metadata": {} - }, - { - "id": "kE72GkEJNE2GPEnIe78RDA", - "cell_type": "code", - "source": [ - "public interface ValidAmountType : IScope", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow ||", - "\n x.GetStorage().IsSecondaryScope(x.Identity)));", - "\n ", - "\n IEnumerable BeAmountTypes => GetStorage().GetRawVariables(Identity)", - "\n .Where(rv => rv.AmountType != null)", - "\n .Select(x => x.AmountType)", - "\n .Concat(GetStorage().DataNodeDataBySystemName[Identity].IsReinsurance ? (AmountTypes.CDR).RepeatOnce() : Enumerable.Empty())", - "\n .ToHashSet();", - "\n ", - "\n ", - "\n IEnumerable ActualAmountTypes => GetStorage().GetIfrsVariables(Identity)", - "\n .Where(iv => GetStorage().EstimateTypesByImportFormat[ImportFormats.Actual].Contains(iv.EstimateType))", - "\n .Select(x => x.AmountType)", - "\n .ToHashSet();", - "\n}", - "\npublic interface BeAmountTypesFromIfrsVariables : ValidAmountType", - "\n{", - "\n IEnumerable ValidAmountType.BeAmountTypes => GetStorage().GetIfrsVariables(Identity)", - "\n .Where(iv => GetStorage().EstimateTypesByImportFormat[ImportFormats.Cashflow].Contains(iv.EstimateType) && iv.AmountType != null)", - "\n .Select(x => x.AmountType)", - "\n .ToHashSet();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "OppPBfh8o0-NsCYyUGOVLg", - "cell_type": "markdown", - "source": [ - "", - "\n## AoC Step Structure", - "\n", - "\nThe Aoc step structure is constructed from the data which is delivered as input. It is assumed that it depends only on the Group of Contrat (i.e. it is invariant across Amount types or Accident Year). " - ], - "metadata": {} - }, - { - "id": "54mTUE9VgUG3fW8ov6K3Uw", - "cell_type": "markdown", - "source": [ - "### ParentAocStep ", - "\nThe **ParentAocStep** scope computes and provides an important piece of information for each [Identity](../DataModel/DataStructure#import-identity), i.e. for a certain [AocType](../DataModel/DataStructure#aoc-type) and [Novelty](../DataModel/DataStructure#novelty).", - "\n", - "\nIt provides the list of the adjacent AocSteps prior to Identity one. It can be more than one only for the step **CL** where a parent for each novelty is considered.", - "\nParentAocStep is critical when computing the *telescoping* differences. ", - "\n", - "\nThey are defined as follows:", - "\n", - "\n$$", - "\n\\text{ParentAocStep}(\\text{AoC step}) = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{AoC step with AoC Type YCU and Novelty I} & \\text{if AocType CRU} \\\\", - "\n\\text{The last AoC step with Data Type != Calculated and same Novelty as the AocStep} & \\text{if AocType YCU} \\\\", - "\n\\text{The AoC step which comes before in terms of order (as defined by AocType)} & \\text{otherwise} \\\\", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n" - ], - "metadata": {} - }, - { - "id": "l9dack27s0Kc15M14T2vxg", - "cell_type": "code", - "source": [ - "public interface ParentAocStep : IScope<(ImportIdentity Id, string AmountType), ImportStorage>", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.AmountType != AmountTypes.CDR));", - "\n ", - "\n private HashSet ParsedAocSteps => GetScope(Identity.Id.DataNode).ParsedIdentities.Select(id => new AocStep(id.AocType, id.Novelty)).ToHashSet();", - "\n private IEnumerable OrderedParsedAocSteps => ParsedAocSteps.Concat(CalculatedTelescopicAocStep).OrderBy(x => GetStorage().AocConfigurationByAocStep[x].Order);", - "\n ", - "\n private Dictionary> ParentParsedIdentities => GetPreviousIdentities(OrderedParsedAocSteps);", - "\n private AocStep identityAocStep => new AocStep(Identity.Id.AocType, Identity.Id.Novelty);", - "\n ", - "\n IEnumerable CalculatedTelescopicAocStep => GetStorage().GetCalculatedTelescopicAocSteps();", - "\n ", - "\n IEnumerable Values => ", - "\n Identity.Id.AocType switch {", - "\n AocTypes.CRU => new AocStep(AocTypes.YCU, Novelties.I).RepeatOnce(),", - "\n AocTypes.YCU => OrderedParsedAocSteps.GetReferenceAocStepForCalculated(GetStorage().AocConfigurationByAocStep, identityAocStep).RepeatOnce(),", - "\n _ => ParentParsedIdentities.TryGetValue(identityAocStep, out var parents) ? parents : Enumerable.Empty(),", - "\n };", - "\n}", - "\n", - "\npublic interface ParentAocStepForCreditRisk : ParentAocStep", - "\n{", - "\n IEnumerable ParentAocStep.CalculatedTelescopicAocStep => ", - "\n GetStorage().GetCalculatedTelescopicAocSteps().Where(aoc => aoc.AocType != AocTypes.CRU);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5L-2OpNhxki8UNE8od5BLQ", - "cell_type": "markdown", - "source": [ - "### ReferenceAocStep", - "\n", - "\nThe **ReferenceAocStep** scope provides the AocStep from which to retrieve the data in order to compute its value (e.g. AoC step EA retrieves Present Values, while AoC step YCU retrieves Nominal).", - "\n", - "\nThey are defined as follows:", - "\n", - "\n$$", - "\n\\text{ReferenceAocStep}(\\text{AoC step}) = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{self} & \\text{if AocStep InputSource is not Calculated} \\\\", - "\n\\text{The last AoC step with Data Type != Calculated and same Novelty as the input AocStep} ~, & \\text{if AocType } \\in \\text{\\{RCU, CF, IA, YCU, CRU\\}} \\\\", - "\n\\text{AoC step with AoC Type CF and Novelty as the AocStep} & \\text{if AocType EA} \\\\", - "\n\\text{AoC step with AoC Type CL and Novelty C} & \\text{if AocType $\\in$ \\{AM, EOP\\}} \\\\", - "\n\\text{empty} & \\text{if AocType is BOP} \\\\", - "\n\\text{log NotSupportedAocStepReference error} & \\text{otherwise} \\\\", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere the last AocStep is obtained by ordering the AocSteps according to their order (as defined by its AocType) and taking the last one." - ], - "metadata": {} - }, - { - "id": "ItSTOo7qmE68A7gENSMguQ", - "cell_type": "code", - "source": [ - "public interface ReferenceAocStep : IScope ", - "\n{", - "\n private IEnumerable OrderedParsedAocSteps => GetScope(Identity.DataNode).ParsedIdentities", - "\n .Select(id => new AocStep(id.AocType, id.Novelty))", - "\n .Distinct()", - "\n .OrderBy(aocStep => GetStorage().AocConfigurationByAocStep[aocStep].Order);", - "\n private AocStep identityAocStep => new AocStep(Identity.AocType, Identity.Novelty);", - "\n private AocStep GetReferenceAocStep(string aocType) {", - "\n return aocType switch {", - "\n AocTypes.RCU or AocTypes.CF or AocTypes.IA or AocTypes.YCU or AocTypes.CRU => OrderedParsedAocSteps.GetReferenceAocStepForCalculated(GetStorage().AocConfigurationByAocStep, identityAocStep),", - "\n AocTypes.EA => new AocStep(AocTypes.CF, Identity.Novelty),", - "\n AocTypes.AM or AocTypes.EOP => new AocStep(AocTypes.CL, Novelties.C),", - "\n AocTypes.BOP => new AocStep(default, default), //BOP, C has DataType == Calculated. See ReferenceAocStep condition.", - "\n _ => (AocStep)ApplicationMessage.Log(Error.NotSupportedAocStepReference, Identity.AocType),", - "\n };", - "\n }", - "\n", - "\n // The Reference AocStep from which get data (Nominal or PV) to compute", - "\n AocStep Value => GetStorage().AocConfigurationByAocStep[identityAocStep].DataType == DataType.Calculated ", - "\n || GetStorage().AocConfigurationByAocStep[identityAocStep].DataType == DataType.CalculatedTelescopic ", - "\n ? GetReferenceAocStep(Identity.AocType)", - "\n : identityAocStep;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tzXoa0VDqUSEqPJLe4LCdA", - "cell_type": "markdown", - "source": [ - "### PreviousAocSteps", - "\nThe **PreviousAocSteps** scope computes and provides an other important piece of information for each [Identity](../DataModel/DataStructure#import-identity), i.e. for a certain [AocType](../DataModel/DataStructure#aoc-type) and [Novelty](../DataModel/DataStructure#novelty).", - "\n", - "\nIt provides the list of all previous AocSteps up to the **BOP** step, whereby a Combined novelty will branch into the InForce and New Business AocTypes.", - "\n", - "\nPreviousAocSteps is critical when computing aggregated values along the various dimensions (such as for example Line of Business) and ", - "\nis formed by the ParentAocStep and its parent and so on until there is no parent.", - "\n", - "\n$$", - "\n\\text{PreviousAocSteps}(\\rm{AocStep}) = \\{PAS_1, PAS_2, \\ldots\\}", - "\n$$", - "\nwhere", - "\n$$", - "\n\\rm{PAS}_1 = \\rm{ParentAocStep}(\\rm{AocStep})", - "\n$$", - "\n$$", - "\n\\rm{PAS}_2 = \\rm{ParentAocStep}(\\rm{PAS}_1).", - "\n$$", - "\n", - "\nThis scope depends on the InputSource (Actual or Cashflow) for which the PreviousSteps are requested due to the AocChain differences between Actual reports and the rest." - ], - "metadata": {} - }, - { - "id": "4AJrFGaLqEm52QmmXGl6pg", - "cell_type": "code", - "source": [ - "public interface PreviousAocSteps : IScope<(ImportIdentity Id, InputSource ScopeInputSource), ImportStorage> ", - "\n{ ", - "\n private AocStep identityAocStep => new AocStep(Identity.Id.AocType, Identity.Id.Novelty);", - "\n private int aocStepOrder => GetStorage().AocConfigurationByAocStep[identityAocStep].Order;", - "\n private HashSet allAocSteps => GetStorage().GetAllAocSteps(Identity.ScopeInputSource).ToHashSet();", - "\n IEnumerable Values => allAocSteps.Contains(identityAocStep)", - "\n ? GetScope(Identity.Id.DataNode).Identities", - "\n .Select(id => new AocStep(id.AocType, id.Novelty))", - "\n .Distinct()", - "\n .Where(aoc => allAocSteps.Contains(aoc) && ", - "\n GetStorage().AocConfigurationByAocStep[aoc].Order < aocStepOrder && ", - "\n (Identity.Id.Novelty != Novelties.C ? aoc.Novelty == Identity.Id.Novelty : true) )", - "\n .OrderBy(aoc => GetStorage().AocConfigurationByAocStep[aoc].Order)", - "\n : Enumerable.Empty();", - "\n} " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "JJ7sk4vUDUSWJJvVDpbZNw", - "cell_type": "markdown", - "source": [ - "The exact structure being return depends on the **order** of the AoC Steps (which is set by the [AoC Type](../DataModel/DataStructure#aoc-type)), and on which AoC steps exist.", - "\n", - "\nFor an example of the usage of the AocStep scope see [here](../Test/AocStructureTest)." - ], - "metadata": {} - }, - { - "id": "1qVdizG_x0OI3MI-IEVZKA", - "cell_type": "markdown", - "source": [ - "", - "\n## Discounting", - "\n", - "\nThe calculation of IFRS17 figures is based on cumulated discounted cashflows." - ], - "metadata": {} - }, - { - "id": "bKrNP0O7ZEOtm23hLJyEyg", - "cell_type": "markdown", - "source": [ - "", - "\n### Yield Curves", - "\n", - "\nThe Yield Curves used for the discounting calculations are functions of the [Currency](../DataModel/DataStructure#currency), the [Data Node](../DataModel/DataStructure#data-node) and the [Economic Basis](../DataModel/DataStructure#economic-basis).", - "\n", - "\nIn particular:", - "\n- For the **Locked-in** economic basis, the yield curve used is the latest available as per end of the DataNode's inception year;", - "\n- Whereas for the **Current** economic base, the yield curve used is the latest available as per the current period.", - "\n", - "\nThe algorithm which retrieves the latest available yield curve is [here](../Utils/UtilityMethods#yield-curve)." - ], - "metadata": {} - }, - { - "id": "DcHXuat1WUaOAFa_MsVSdQ", - "cell_type": "markdown", - "source": [ - "", - "\n### Interest and Discount Rates and Factors", - "\n", - "\nThe factors used for discounting have the same granularity as the cashflow, i.e. monthly. The yield curves have yearly granularity, so the annual Interest factor is 1 + interest rate. The monthly Interest Interest and Discount factors are obtained from the annual factors such that the product of 12 months results in the annual factors, as follows:", - "\n", - "\n$$", - "\n\\text{Discount}_i = ( 1 + \\text{YC}_i ) ^{-\\frac{1}{12}} ~,", - "\n$$", - "\nand ", - "\n$$", - "\n\\text{Interest}_i = ( 1 + \\text{YC}_i) ^{\\frac{1}{12}} ~,", - "\n$$", - "\n", - "\nwhere the index $i$ denotes years." - ], - "metadata": {} - }, - { - "id": "yCCcQcUwzEO1lzy3iwRM8Q", - "cell_type": "code", - "source": [ - "public interface MonthlyRate : IScope", - "\n{", - "\n private string EconomicBasis => GetContext();", - "\n ", - "\n private double[] YearlyYieldCurve => GetStorage().GetYearlyYieldCurve(Identity, EconomicBasis);", - "\n ", - "\n private double Perturbation => 0; //GetStorage().GetYieldCurvePerturbation(); => switch Args.Scenario { 10ptsU => 0.1, 10ptsD => -0.1, _ => default)", - "\n ", - "\n double[] Interest => YearlyYieldCurve.Select(rate => Math.Pow(1d + rate, 1d / 12d) + Perturbation).ToArray(); ", - "\n ", - "\n double[] Discount => Interest^(-1);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ON4hzALyrkapbo6dsJaCYA", - "cell_type": "markdown", - "source": [ - "For an example of these calculations see [here](../Test/SpecificationsImportCashflows#interest-and-discount-rates)." - ], - "metadata": {} - }, - { - "id": "wCY9O1rFG0OcsUmqNLVm4Q", - "cell_type": "markdown", - "source": [ - "", - "\n## Nominal Values", - "\n", - "\nThe nominal cashflow values correspond to the cashflows provided in the Cashflow input file. ", - "\n
These values are stored in the database as [RawVariable](../DataModel/DataStructure#raw-variables).", - "\n
Refer to the ReferenceAocStep of the AocStructure calculation to identify the correct AocType and Novelty to retrieve.", - "\n
Due to the Credit Default Risk of a reinsurance partner, the logic to compute the Nominal Cashflows for this Amount Type must be defined separately. " - ], - "metadata": {} - }, - { - "id": "YZrg-gGldUGe6pZF0Kh3Qw", - "cell_type": "code", - "source": [ - "public interface NominalCashflow : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.CF)", - "\n .WithApplicability(x => x.Identity.AmountType == AmountTypes.CDR));", - "\n", - "\n AocStep referenceAocStep => GetScope(Identity.Id).Value;", - "\n double[] Values => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, Identity.AmountType, Identity.CalculationType, Identity.AccidentYear);", - "\n}", - "\n", - "\npublic interface CreditDefaultRiskNominalCashflow : NominalCashflow", - "\n{", - "\n private double[] NominalClaimsCashflow => GetStorage().GetClaims()", - "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.CalculationType, Identity.AccidentYear))", - "\n .Aggregate();", - "\n ", - "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", - "\n ", - "\n private double[] PvCdrDecumulated { get {", - "\n var ret = new double[NominalClaimsCashflow.Length];", - "\n for (var i = NominalClaimsCashflow.Length - 1; i >= 0; i--)", - "\n ret[i] = Math.Exp(-nonPerformanceRiskRate) * ret.ElementAtOrDefault(i + 1) + NominalClaimsCashflow[i] - NominalClaimsCashflow.ElementAtOrDefault(i + 1);", - "\n return ret; } } ", - "\n ", - "\n double[] NominalCashflow.Values => PvCdrDecumulated - NominalClaimsCashflow;", - "\n}", - "\n", - "\npublic interface AllClaimsCashflow : NominalCashflow", - "\n{", - "\n double[] NominalCashflow.Values => GetStorage().GetClaims()", - "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.CalculationType, Identity.AccidentYear))", - "\n .Aggregate();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "OPI-l8iwREuVVszAP89Hqw", - "cell_type": "markdown", - "source": [ - "For a given month $i$ they are denoted as $\\rm{Nominal}_i$." - ], - "metadata": {} - }, - { - "id": "7RRmYOmkFEuqu8yfOR-0rw", - "cell_type": "markdown", - "source": [ - "For an example of nominal cashflow values see [here](../Test/SpecificationsImportCashflows#nominal-cashflow)." - ], - "metadata": {} - }, - { - "id": "q0ZU9L_OMUqLUKUOUcLuAw", - "cell_type": "markdown", - "source": [ - "", - "\n## Present Values", - "\n", - "\nPresent Values are calculated during the import of the cashflows and stored on the database. They are computed for the relevant Economic Basis, depending on the Valuation Basis.", - "\n", - "\nTheir calculation is described in the following sections and is summarized in the $\\rm{PV}$ formula [below](#present-value)." - ], - "metadata": {} - }, - { - "id": "4SsmFu7Uo0aIEmes8Z4LoQ", - "cell_type": "markdown", - "source": [ - "", - "\n### Cumulated Discounted Cashflows", - "\n", - "\nCumulated and Discounted cashflows $\\rm{CDC}$ are computed using the monthly discount rates and in a recursive manner, as follows:", - "\n", - "\n$$", - "\n\\text{CDC}_i(\\text{AoC step}) = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{Nominal}_i + \\text{CDC}_{i+1} \\cdot {\\text{Valid Discount}_{\\frac{i}{12}}} ~, & \\text{if Aoc Type's Period Type is Beginning Of Period} \\\\", - "\n\\big( \\text{Nominal}_i + \\text{CDC}_{i+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{i}{12}}} ~, & \\text{if Aoc Type's Period Type is End Of Period}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere Transaction Period depends on which Best Estimate value is being computed, in particular on what its [Amount Type](../DataModel/DataStructure#amount-type) is (each Amount Type has its own [Period Type](../Constants/Enums)); and $\\text{Valid Discount}$ stands for the fact that in case the Discount Curves are shorter than the required index, then their last element is returned.", - "\n", - "\n
Also here, the Credit Default Risk contribution is calculated separately. Since it is based on Claims, the Period Type is implicitly defined." - ], - "metadata": {} - }, - { - "id": "n0bMVVX8JUGCvXh-hcQi9g", - "cell_type": "code", - "source": [ - "public interface DiscountedCashflow : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? Accidentyear), ImportStorage>", - "\n{", - "\n private PeriodType periodType => GetStorage().GetPeriodType(Identity.AmountType, Identity.CalculationType); ", - "\n ", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR));", - "\n", - "\n [NotVisible]", - "\n string EconomicBasis => GetContext();", - "\n", - "\n [NotVisible]", - "\n double[] MonthlyDiscounting => GetScope(Identity.Id).Discount;", - "\n ", - "\n [NotVisible]", - "\n double[] NominalValues => GetScope(Identity).Values;", - "\n", - "\n double[] Values => NominalValues.ComputeDiscountAndCumulate(MonthlyDiscounting, periodType);", - "\n}", - "\n", - "\npublic interface DiscountedCreditRiskCashflow : DiscountedCashflow", - "\n{ ", - "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", - "\n ", - "\n double[] DiscountedCashflow.Values => NominalValues.ComputeDiscountAndCumulateWithCreditDefaultRisk(MonthlyDiscounting, nonPerformanceRiskRate);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "V8aa9nD9bUqsX54-bD1Hiw", - "cell_type": "markdown", - "source": [ - "For example calculations for Cumulated Discounted Cashflows see [here](../Test/SpecificationsImportCashflows#cumulated-discounted-cashflow)." - ], - "metadata": {} - }, - { - "id": "bYq1f5UE80q1fxb-AON3pA", - "cell_type": "markdown", - "source": [ - "", - "\n### Telescoping Difference", - "\n", - "\n", - "\nPresent Value figures for a specific period are typically reported through an analysis of change, where for each [AocStep](#aoc-steps-structure) the variation with respect to the preceding AocStep is shown.", - "\n", - "\nThe Telescoping Difference is basically the delta between two adjacent AoC steps, whereby the [ParentAocStep](#aoc-steps-structure) is used to determine the AoC step. ", - "\n", - "\nIt is defined as follows:", - "\n", - "\n$$", - "\n\\text{TelescopingDifference}_i = ", - "\n\\text{CDC}_{i}\\big(\\text{current AoC step}\\big) - \\text{CDC}_{i}\\big(\\text{parent AoC step}\\big)", - "\n$$", - "\n", - "\nwhere AocType is the AoC Type of the AoC Step for which the calculations are being performed." - ], - "metadata": {} - }, - { - "id": "cNNeXkyxjkiDODg6ARR5Zw", - "cell_type": "code", - "source": [ - "public interface TelescopicDifference : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? Accidentyear), ImportStorage>", - "\n{", - "\n [NotVisible]", - "\n string EconomicBasis => GetContext();", - "\n private double[] CurrentValues => GetScope(Identity).Values;", - "\n ", - "\n private double[] PreviousValues => (GetScope((Identity.Id, Identity.AmountType)))", - "\n .Values", - "\n .Select(aoc => GetScope((Identity.Id with {AocType = aoc.AocType, Novelty = aoc.Novelty}, Identity.AmountType, Identity.CalculationType, Identity.Accidentyear)).Values)", - "\n .Where(cf => cf.Count() > 0)", - "\n .Aggregate();", - "\n ", - "\n double[] Values => CurrentValues - PreviousValues;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "cYmNPbah5UaC9Iu3db7pqA", - "cell_type": "markdown", - "source": [ - "Examples of Telescoping Difference calculations for different AoC steps start [here](../Test/SpecificationsImportCashflows#modelcorrections)." - ], - "metadata": {} - }, - { - "id": "Z42Ysovu4UmepvVo0U429w", - "cell_type": "markdown", - "source": [ - "", - "\n### Present Value", - "\n", - "\nThe present value ($\\rm{PV}$) can be determined by taking the appropriate elements of the cumulated discounted cashflows. This is done as function of the two [projection parameters](../DataModel/DataStructure#projection-configuration) $\\rm{Shift}$ ($S$) and $\\rm{TimeStep}$ ($TS$):", - "\n", - "\n$$", - "\n\\text{PV}(S, TS) = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{PV Base}_{S} ~, & \\text{if Valuation Period is Beginning of Period} \\\\", - "\n\\text{PV Base}_{S+TS/2 -1} ~, & \\text{if Valuation Period is Mid of Period} \\\\", - "\n\\sum_{i=S}^{S + TS - 1}\\text{PV Base}_{i} ~, & \\text{if Valuation Period is Delta} \\\\", - "\n\\text{PV Base}_{S + TS} ~, & \\text{if Valuation Period is End of Period} \\\\", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere [PV Base](#present-value-base) is defined below, and the term $TS/2$ uses MidpointRounding.AwayFromZero (as defined by *https:[]()//docs.microsoft.com/en-us/dotnet/api/system.midpointrounding?view=net-6.0)*: rounding to the nearest number, away from zero in the exact halfway case. Furthermore, if the array is smaller than the index, then the last element is returned.", - "\n", - "\nFor instance, for the current year and year-to-date view we have $S=0$ and $TS=3$ for the first quarter, $TS=6$ for the 2nd quarter and so on.", - "\nFor the projection values of next year first quarter we would have $S=12$ and $TS=3$, etc." - ], - "metadata": {} - }, - { - "id": "a_j0Wz_NsEeWjap6zY-mDA", - "cell_type": "code", - "source": [ - "public interface IWithGetValueFromValues : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", - "\n{", - "\n private int shift => GetStorage().GetShift(0);//Identity.Id.ProjectionPeriod", - "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.Id.ProjectionPeriod", - "\n ", - "\n public double GetValueFromValues(double[] Values)", - "\n {", - "\n return GetStorage().GetValuationPeriod(Identity.Id) switch {", - "\n ValuationPeriod.BeginningOfPeriod => Values.ElementAtOrDefault(shift),", - "\n ValuationPeriod.MidOfPeriod => Values.ElementAtOrDefault(shift + Convert.ToInt32(Math.Round(timeStep / 2d, MidpointRounding.AwayFromZero)) - 1),", - "\n ValuationPeriod.Delta => Values.Skip(shift).Take(timeStep).Sum(),", - "\n ValuationPeriod.EndOfPeriod => Values.ElementAtOrDefault(shift + timeStep),", - "\n ValuationPeriod.NotApplicable => default", - "\n };", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LX0IfHO1HkG3juJfHtyRsQ", - "cell_type": "markdown", - "source": [ - "An example of Projected Present Value calculations can be found [here](../Test/SpecificationsImportCashflows#present-value)." - ], - "metadata": {} - }, - { - "id": "JablJ7mjvkSSqXmjUWZ-mg", - "cell_type": "markdown", - "source": [ - "", - "\n### Interest Accretion", - "\n", - "\nSince the Interest Accretion cashflows are typically not provided as input (as they can be computed from its parent AocStep), its present values can be computed as follows:", - "\n", - "\n$$", - "\n\\text{InterestAccretion}_i(\\text{AoC step}) = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\big(\\text{CDC}_i(\\text{Parent AoC step}) - \\text{Nominal}_i(\\text{parent AoC step}) \\big) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, & \\text{if Amount Type's Transaction Period is Beginning of Period} \\\\", - "\n\\text{CDC}_i(\\text{parent AoC step}) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, & \\text{otherwise}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\n
Due to the Credit Default Risk of a reinsurance partner, the logic to compute the Interest Accretion for this Amount Type must be defined separately. Since it is based on Claims, the Period Type is implicitly defined." - ], - "metadata": {} - }, - { - "id": "vGVQDaWg2UeXvSxdJ18zpA", - "cell_type": "code", - "source": [ - "public interface IWithInterestAccretion : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", - "\n{", - "\n private double[] parentDiscountedValues => GetScope(Identity).Values; ", - "\n private double[] parentNominalValues => GetScope(Identity).Values;", - "\n private double[] monthlyInterestFactor => GetScope(Identity.Id).Interest;", - "\n ", - "\n double[] GetInterestAccretion() ", - "\n {", - "\n var periodType = GetStorage().GetPeriodType(Identity.AmountType, Identity.CalculationType);", - "\n var ret = new double[parentDiscountedValues.Length];", - "\n ", - "\n switch (periodType) {", - "\n case PeriodType.BeginningOfPeriod :", - "\n for (var i = 0; i < parentDiscountedValues.Length; i++)", - "\n ret[i] = (parentDiscountedValues[i] - parentNominalValues[i]) * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", - "\n break;", - "\n default :", - "\n for (var i = 0; i < parentDiscountedValues.Length; i++)", - "\n ret[i] = parentDiscountedValues[i] * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", - "\n break;", - "\n }", - "\n ", - "\n return ret;", - "\n }", - "\n}", - "\n", - "\npublic interface IWithInterestAccretionForCreditRisk : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", - "\n{", - "\n private double[] nominalClaimsCashflow => GetScope(Identity).Values;", - "\n private double[] nominalValuesCreditRisk => -1 * GetScope(Identity with {Id = Identity.Id with {AocType = AocTypes.CF}}).Values;", - "\n private double[] monthlyInterestFactor => GetScope(Identity.Id).Interest;", - "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", - "\n ", - "\n double[] GetInterestAccretion() ", - "\n {", - "\n var interestOnClaimsCashflow = new double[nominalClaimsCashflow.Length];", - "\n var interestOnClaimsCashflowCreditRisk = new double[nominalClaimsCashflow.Length];", - "\n var effectCreditRisk = new double[nominalClaimsCashflow.Length];", - "\n for (var i = nominalClaimsCashflow.Length - 1; i >= 0; i--) {", - "\n interestOnClaimsCashflow[i] = 1 / GetElementOrDefault(monthlyInterestFactor, i/12) * (interestOnClaimsCashflow.ElementAtOrDefault(i + 1) + nominalClaimsCashflow[i] - nominalClaimsCashflow.ElementAtOrDefault(i + 1));", - "\n interestOnClaimsCashflowCreditRisk[i] = 1 / GetElementOrDefault(monthlyInterestFactor, i/12) * (Math.Exp(-nonPerformanceRiskRate) * interestOnClaimsCashflowCreditRisk.ElementAtOrDefault(i + 1) + nominalClaimsCashflow[i] - nominalClaimsCashflow.ElementAtOrDefault(i + 1));", - "\n effectCreditRisk[i] = interestOnClaimsCashflow[i] - interestOnClaimsCashflowCreditRisk[i];", - "\n }", - "\n ", - "\n return effectCreditRisk - nominalValuesCreditRisk;", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "f_Nqjp76YUWFtL08hw0iTg", - "cell_type": "markdown", - "source": [ - "An example of the Interest Accretion calculations can be found [here](../Test/SpecificationsImportCashflows#interest-accretion)." - ], - "metadata": {} - }, - { - "id": "lWN9DuSvtkWi8KPDtnLcZA", - "cell_type": "markdown", - "source": [ - "", - "\n### Present Value Base", - "\n", - "\nThe PV Base values are valid for all choices of the [Economic Basis](../DataModel/DataStructure#economic-basis):", - "\n", - "\n$$", - "\n\\text{PV Base}_i (\\text{AoC step}) = \\left\\{", - "\n\\begin{array}{rl}", - "\n\\text{CDC}_i ~, & \\text{if AoCType = BOP} \\\\", - "\n-\\text{Nominal}_i(\\text{Parent AoC step}) ~, & \\text{if AoCType = CF } \\\\", - "\n\\text{InterestAccretion}_i ~, & \\text{if AoCType = IA } \\\\", - "\n0 ~, & \\text{if AoCType = AM } \\\\\\", - "\n\\text{CDC}_i(\\text{Parent AoC step}) ~, & \\text{if AoCType = EOP } \\\\", - "\n\\text{TelescopingDifference}_i ~, & \\text{otherwise}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere $i$ denotes the months, and the [$\\rm{TelescopingDifference}_i$](#telescopic-difference) and the [$\\rm{InterestAccretion}_i$](#interest-accretion) quantities are defined above." - ], - "metadata": {} - }, - { - "id": "NX2BdeLNxk2VWROO8E5pBg", - "cell_type": "code", - "source": [ - "public interface PresentValue : IWithGetValueFromValues", - "\n{ ", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow", - "\n || x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode))", - "\n .WithApplicability(x => (x.Identity.Id.AocType == AocTypes.BOP && x.Identity.Id.Novelty != Novelties.C) || x.Identity.Id.AocType == AocTypes.EOP)", - "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.CF)", - "\n .WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.IA)", - "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.IA)", - "\n .WithApplicability(x => new string[]{AocTypes.BOP, AocTypes.EA, AocTypes.AM, AocTypes.RCU}.Contains(x.Identity.Id.AocType) ) //add here combination CRU for At !CDR?", - "\n );", - "\n ", - "\n [NotVisible][IdentityProperty][Dimension(typeof(EconomicBasis))]", - "\n string EconomicBasis => GetContext();", - "\n ", - "\n [NotVisible]", - "\n double[] Values => GetScope(Identity).Values;", - "\n ", - "\n public double Value => GetValueFromValues(Values);", - "\n}", - "\n", - "\npublic interface ComputePresentValueWithIfrsVariable : PresentValue", - "\n{", - "\n double PresentValue.Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.CalculationType, EconomicBasis, Identity.AccidentYear); //unify CalculationType and EstimateTypeGet", - "\n double[] PresentValue.Values => Enumerable.Empty().ToArray();", - "\n}", - "\n", - "\npublic interface PresentValueFromDiscountedCashflow : PresentValue", - "\n{", - "\n [NotVisible]", - "\n double[] PresentValue.Values => GetScope(Identity).Values;", - "\n}", - "\n", - "\npublic interface CashflowAocStep : PresentValue", - "\n{", - "\n [NotVisible]", - "\n double[] PresentValue.Values => -1d * GetScope(Identity).Values;", - "\n}", - "\n", - "\npublic interface PresentValueWithInterestAccretion : PresentValue, IWithInterestAccretion", - "\n{", - "\n [NotVisible]", - "\n double[] PresentValue.Values => GetInterestAccretion();", - "\n}", - "\n", - "\npublic interface PresentValueWithInterestAccretionForCreditRisk : PresentValue, IWithInterestAccretionForCreditRisk", - "\n{", - "\n [NotVisible]", - "\n double[] PresentValue.Values => GetInterestAccretion();", - "\n}", - "\n", - "\npublic interface EmptyValuesAocStep : PresentValue", - "\n{", - "\n [NotVisible]", - "\n double[] PresentValue.Values => Enumerable.Empty().ToArray();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yZbP0Jm3ckC1XQBFERPm_g", - "cell_type": "markdown", - "source": [ - "An example of the Present Value Base calculations can be found [here](../Test/SpecificationsImportCashflows#present-value)." - ], - "metadata": {} - }, - { - "id": "lWMlf8gT5kGtPaXz4CcdLg", - "cell_type": "markdown", - "source": [ - "", - "\n### Current and Locked", - "\n", - "\nPV Current and PV Locked below basically hold the Present Values [PV](#present-value) computed using the **Current** yield curves and the **Locked** yield curves, respectively.", - "\n", - "\nValues are available for each AmountType (by calling PvLocked.ByAmountType):", - "\n", - "\n$$", - "\n\\text{PV Locked}(\\text{AoC step}, \\text{Amount Type}) = \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = L}}", - "\n$$", - "\n", - "\n$$", - "\n\\text{PV Current}(\\text{AoC step}, \\text{Amount Type}) = \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = C}}", - "\n$$", - "\n", - "\n", - "\nAnd aggregated values are also available as the sum over all [Amount Types](../DataModel/DataStructure#amount-type) (by calling PvLocked.Value):", - "\n", - "\n$$", - "\n\\text{PV Locked}(\\text{AoC step}) = \\sum_{\\text{Amount Types}} \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = L}}", - "\n$$", - "\n", - "\n$$", - "\n\\text{PV Current}(\\text{AoC step}) = \\sum_{\\text{Amount Types}} \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = C}}", - "\n$$", - "\n", - "\nThese are used in the BBA methodology, whereby in the CSM calculations only PV Locked is used, and both of them are stored in the database under the [IfrsVariable](../DataModel/DataStructure#ifrs-variable) data structure." - ], - "metadata": {} - }, - { - "id": "1wOqzclAjkaUcoGzwf1ldQ", - "cell_type": "code", - "source": [ - "public interface PvLocked : IScope", - "\n{ ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", - "\n string EconomicBasis => EconomicBases.L;", - "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.BE;", - "\n ", - "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", - "\n ", - "\n [NotVisible]", - "\n PresentValue[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", - "\n .SelectMany(at => accidentYears", - "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", - "\n .ToArray();", - "\n double Value => PresentValues.Aggregate().Value;", - "\n}", - "\n", - "\npublic interface PvCurrent : IScope", - "\n{", - "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", - "\n string EconomicBasis => EconomicBases.C;", - "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.BE;", - "\n ", - "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", - "\n ", - "\n [NotVisible]", - "\n PresentValue[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", - "\n .SelectMany(at => accidentYears", - "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", - "\n .ToArray();", - "\n ", - "\n double Value => PresentValues.Aggregate().Value;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6pCT1yWm30S4fz2w2Km62w", - "cell_type": "markdown", - "source": [ - "", - "\n## Risk Adjustment", - "\n", - "\nRisk Adjustment values ($\\rm{RA}$) are accessible from the [PV Base](#present-value-base) data and have [Calculation Type](../DataModel/DataStructure#calculation-type) $RA$. In particular, the Locked-In and Current values are given by:", - "\n", - "\n$$", - "\n\\text{RA Locked}(\\text{AoC step}) = \\text{PV}(\\text{AoC step})|_{\\text{Calculation Type = RA},~ \\text{Economic Basis = L}}", - "\n$$", - "\n", - "\n$$", - "\n\\text{RA Current}(\\text{AoC step}) = \\text{PV}(\\text{AoC step})|_{\\text{Calculation Type = RA},~ \\text{Economic Basis = C}}", - "\n$$", - "\n", - "\nwhere PV is defined [above](#present-value) and uses the input cashflows with Calculation Type = RA." - ], - "metadata": {} - }, - { - "id": "TrbvThWf6EergPrBDCULNQ", - "cell_type": "code", - "source": [ - "public interface RaLocked : IScope", - "\n{ ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", - "\n string EconomicBasis => EconomicBases.L;", - "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.RA;", - "\n ", - "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", - "\n ", - "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray();", - "\n ", - "\n double Value => PresentValues.Aggregate().Value;", - "\n}", - "\npublic interface RaCurrent : IScope", - "\n{", - "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", - "\n string EconomicBasis => EconomicBases.C;", - "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.RA;", - "\n ", - "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", - "\n ", - "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray(); ", - "\n ", - "\n double Value => PresentValues.Aggregate().Value;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "lCTjmXtNM0anxWCIugOk1g", - "cell_type": "markdown", - "source": [ - "", - "\n## Amortization", - "\n", - "\nFor the Amortization AoC Step (AoC Type **AM**), the amortization factors to be used are defined below." - ], - "metadata": {} - }, - { - "id": "1EJRTEzTH02xfXBuVK6aQQ", - "cell_type": "markdown", - "source": [ - "", - "\n### Coverage Units", - "\n", - "\nThe coverage unit (CU) of a GIC is introduced in the standard as the quantity of the service provided in that GIC. The service is", - "\nmeasured by considering the quantity of benefits provided as well as the expected coverage period of the GIC.", - "\n", - "\nThe cashflows of coverage units are retrieved from the discounted cashflows with [Calculation Type](../DataModel/DataStructure#calculation-type) CU." - ], - "metadata": {} - }, - { - "id": "8s4nf1G3h0O5cmlvAC3QLw", - "cell_type": "code", - "source": [ - "public interface CoverageUnitCashflow : IScope", - "\n{ ", - "\n [NotVisible] string EconomicBasis => GetContext();", - "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.CU;", - "\n ", - "\n double[] Values => GetScope((Identity, (string)null, CalculationType, (int?)null)).Values;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BTET6Z8yrkOpMBOGK5Bu3g", - "cell_type": "markdown", - "source": [ - "", - "\n### Amortization Factor" - ], - "metadata": {} - }, - { - "id": "m1VQAxKwaEuv9KI6qEVFxA", - "cell_type": "markdown", - "source": [ - "For a certain GIC, the monthly Amortization Factors $\\text{Monthly }AF_i$ are computed from the cashflows of the underlying coverage unit for that GIC:", - "\n", - "\n$$", - "\n\\text{Monthly }AF_i = 1 - \\frac{ \\text{Nominal}_i(CL)} {\\text{CDC}_i(CL) } ~.", - "\n$$", - "\n", - "\nwhere:", - "\n- $i$ denotes a monthly period;", - "\n- the nominal cash flows $\\text{Nominal}_i(CL)$ are the nominal cashflows of the coverage unit for the AoC Step **Combined Liability** (CL) (input data);", - "\n- and the corresponding cumulated discounted cashflows $\\text{CDC}_i$ are defined [above](#cumulated-discounted-cashflows)." - ], - "metadata": {} - }, - { - "id": "ilj2SgcU7kOjz53Sf946cw", - "cell_type": "code", - "source": [ - "public interface MonthlyAmortizationFactorCashflow : IScope", - "\n{", - "\n private double[] NominalCuCashflow => GetScope((Identity with {AocType = AocTypes.CL}, (string)null, CalculationTypes.CU, (int?)null)).Values;", - "\n private double[] DiscountedCuCashflow => GetScope(Identity with {AocType = AocTypes.CL}, o => o.WithContext(EconomicBasis)).Values;", - "\n ", - "\n [NotVisible] string EconomicBasis => GetContext();", - "\n ", - "\n double[] MonthlyAmortizationFactors => Identity.AocType switch {", - "\n AocTypes.AM => NominalCuCashflow.Zip(DiscountedCuCashflow, //Extract to an other scope with month in the identity to avoid Zip?", - "\n (nominal, discountedCumulated) => discountedCumulated >= Precision ", - "\n ? 1 - nominal / discountedCumulated ", - "\n : 0).ToArray(),", - "\n _ => Enumerable.Empty().ToArray(),", - "\n };", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bqUlBh41xUCZmzV497BLug", - "cell_type": "markdown", - "source": [ - "For a certain projection period - defined by the Shift, $S$, and the Time-Step, $TS$, parameters - the Amortization Factor is then given by the product of the corresponding monthly amortization factors:", - "\n", - "\n$$", - "\nAF = \\prod _{i = S}^{TS} \\text{Monthly }AF_i ~.", - "\n$$", - "\n", - "\nEach GIC will have his own AF." - ], - "metadata": {} - }, - { - "id": "6OE1dyBDq0-W4sMSuAQoeQ", - "cell_type": "code", - "source": [ - "public interface CurrentPeriodAmortizationFactor : IScope", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => ", - "\n s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow", - "\n || x.GetStorage().IsSecondaryScope(x.Identity.DataNode)));", - "\n ", - "\n private int shift => GetStorage().GetShift(0);//Identity.ProjectionPeriod", - "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.ProjectionPeriod", - "\n ", - "\n [NotVisible] string EconomicBasis => GetContext();", - "\n ", - "\n string EstimateType => EstimateTypes.F;", - "\n double Value => GetScope(Identity)", - "\n .MonthlyAmortizationFactors", - "\n .Skip(shift)", - "\n .Take(timeStep)", - "\n .Aggregate(1d, (x, y) => x * y);", - "\n}", - "\n", - "\npublic interface AmfFromIfrsVariable : CurrentPeriodAmortizationFactor", - "\n{", - "\n double CurrentPeriodAmortizationFactor.Value => GetStorage().GetValue(Identity, (string)null, EstimateType, EconomicBasis, (int?)null); //unify CalculationType and EstimateTypeGet", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jpW8fnmKpEi5m8fmZckqfA", - "cell_type": "markdown", - "source": [ - "", - "\n## Actual Values", - "\n", - "\nWe consider 4 types of Actual values, which are distinguished through their [Estimate Type](../DataModel/DataStructure#estimate-type):", - "\n- Actuals (A)", - "\n- Advance Actuals (AA)", - "\n- Overdue Actuals (OA)", - "\n- Deferrable Actuals (DA)", - "\n", - "\nwith the Estimate Type's system name shown between parenthesis above.", - "\n", - "\nThe following simplified AoC Chain applies for Advance and Overdue Actuals:", - "\n
 BOP", - "\n
 Release", - "\n
 Write-off", - "\n
 EOP" - ], - "metadata": {} - }, - { - "id": "EBK-msISl0WxxcRgAvBDWQ", - "cell_type": "markdown", - "source": [ - "", - "\n### Actual Base", - "\n", - "\nThe Actual Base sets values for actual, advance, and overdue as follows:", - "\n", - "\n$$", - "\n\\text{Actual Base} (\\text{AoC step}) = \\left\\{", - "\n\\begin{array}{rl}", - "\n0 ~, & \\text{if AoC Step's AoC Type = AM} \\\\", - "\n\\text{Actual Base}(\\rm{BOP}) + \\text{Actual Base}(\\rm{CF}) + \\text{Actual Base}(\\rm{WO}) ~, & \\text{if AoC Step's AoC Type = EOP and EstimateType is not A} \\\\", - "\n\\text{Imported Actual} ~, & \\text{otherwise}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere the value is also function of the [Estimate Type](../DataModel/DataStructure#EstimateType) and [Amount Type](../DataModel/DataStructure#AmountType), and the $\\text{Imported Actual}$ value is described [here]()." - ], - "metadata": {} - }, - { - "id": "_w7DsklRxEy1-gr0L3xnxQ", - "cell_type": "code", - "source": [ - "public interface ActualBase : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Actual ", - "\n && !x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode)", - "\n && x.Identity.Id.AocType == AocTypes.AM)", - "\n .WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow ", - "\n && !x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode)", - "\n && x.Identity.Id.AocType == AocTypes.EOP ", - "\n && x.Identity.EstimateType != EstimateTypes.A)", - "\n );", - "\n public double Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.EstimateType, Identity.AccidentYear); ", - "\n}", - "\n", - "\npublic interface EndOfPeriodActual : ActualBase", - "\n{", - "\n double ActualBase.Value => GetScope((Identity.Id, InputSource.Actual)).Values", - "\n .Sum(aocStep => GetScope((Identity.Id with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, Identity.AmountType, Identity.EstimateType, Identity.AccidentYear)).Value);", - "\n}", - "\n", - "\npublic interface EmptyValuesActual : ActualBase", - "\n{", - "\n double ActualBase.Value => 0;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hZgnWCXsbEm7b3a_M5X91Q", - "cell_type": "markdown", - "source": [ - "An example of Actual Base figures can be found [here](../Test/SpecificationsImportActuals#base-actual)." - ], - "metadata": {} - }, - { - "id": "seP-q4-pNEKPbBJB6XWgGQ", - "cell_type": "markdown", - "source": [ - "", - "\n### Actuals", - "\nThe Actuals correspond to ActualBase values with estimate type $A$.", - "\nThe only valid Aoc step is Release:", - "\n", - "\n$$", - "\n\\text{Actual} (\\text{Release}) = \\text{Actual Base} (\\text{Release})|_{\\text{Estimate Type} = A}", - "\n$$" - ], - "metadata": {} - }, - { - "id": "rA5FAU7rP0mVtOb_OMRAQQ", - "cell_type": "code", - "source": [ - "public interface Actual : IScope", - "\n{", - "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", - "\n string EstimateType => EstimateTypes.A;", - "\n ", - "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", - "\n ", - "\n [NotVisible]", - "\n ActualBase[] Actuals => GetScope(Identity.DataNode).ActualAmountTypes", - "\n .SelectMany(at => accidentYears", - "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tQS8QPziAEWrDh1ztulzDw", - "cell_type": "markdown", - "source": [ - "", - "\n### Advance Actuals", - "\n", - "\n**Advance Actuals** are those cashflows with due date inside the reporting period but which occured *before* the reporting period - They include:", - "\n- Receivable Claims", - "\n- Receivable Expenses", - "\n- Payable Premiums", - "\n", - "\nAdvance Actuals are given by", - "\n", - "\n$$", - "\n\\text{Advance Actual} (\\text{AoC step}) = \\text{Actual Base} (\\text{AoC step})|_{\\text{Estimate Type} = AA}", - "\n$$" - ], - "metadata": {} - }, - { - "id": "BGCY3AvaxkWvnU8Py4UK5w", - "cell_type": "code", - "source": [ - "public interface AdvanceActual : IScope", - "\n{", - "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", - "\n string EstimateType => EstimateTypes.AA;", - "\n ", - "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", - "\n ", - "\n [NotVisible]", - "\n ActualBase[] Actuals => GetScope(Identity.DataNode).ActualAmountTypes", - "\n .SelectMany(at => accidentYears", - "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "EDA0vEXMd0602tAx8vQ8Eg", - "cell_type": "markdown", - "source": [ - "", - "\n### Overdue Actuals", - "\n", - "\n**Overdue Actuals** are those cashflows with due date inside the reporting period but which occur *after* the reporting period - They contain:", - "\n- Payable Claims", - "\n- Payable Expenses", - "\n- Receivable Premiums", - "\n", - "\nThe sign convention is the inverse of the default behavior - In particular: Premiums have positive value, whereas Claims and Expenses have negative value.", - "\n", - "\nThe Overdue Actuals are given by", - "\n", - "\n$$", - "\n\\text{Overdue Actual} (\\text{AoC step}) = \\text{Actual Base} (\\text{AoC step})|_{\\text{Estimate Type} = OA}", - "\n$$" - ], - "metadata": {} - }, - { - "id": "JhdC-O-53k-OPdsSNtyTqQ", - "cell_type": "code", - "source": [ - "public interface OverdueActual : IScope", - "\n{", - "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", - "\n string EstimateType => EstimateTypes.OA;", - "\n ", - "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", - "\n ", - "\n [NotVisible]", - "\n ActualBase[] Actuals => GetScope(Identity.DataNode).ActualAmountTypes", - "\n .SelectMany(at => accidentYears", - "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BU02PReB0UyuCXL3rgF7kw", - "cell_type": "markdown", - "source": [ - "", - "\n### Deferrable Actuals", - "\n", - "\nFinally, Deferrable Actuals are given by", - "\n", - "\n$$", - "\n\\text{Deferrable Actual} (\\text{AoC step}) = \\left\\{", - "\n\\begin{array}{rl}", - "\n\\sum_{\\text{Amount Type}~\\in~\\text{\\{ACA, AEA}\\}}\\text{Actual Base}(\\rm{CF})|_{\\text{Estimate Type = A}} ~, & \\text{if AoC Step's AoC Type = CF } \\\\", - "\n- \\text{Amortization Factor} \\cdot \\big( \\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) \\big) ~, & \\text{if AoC Step's AoC Type = AM } \\\\", - "\n\\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) + \\text{Deferrable Actual}(\\rm{AM}) ~, & \\text{if AoC Step's AoC Type = EOP } \\\\", - "\n\\text{Input Actual}|_{\\text{Estimate Type = DA}} ~, & \\text{ otherwise } \\\\", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere $ACA$ and $AEA$ are *Aquisition* Amount Types from **Attributable Commission** and **Attributable Expenses**, respectively." - ], - "metadata": {} - }, - { - "id": "ydbJzjQG6kGLXvpaU9QqxQ", - "cell_type": "code", - "source": [ - "public interface DeferrableActual : IScope", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.ValuationApproach == ValuationApproaches.VFA, ", - "\n p => p.ForMember(s => s.EconomicBasis))", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.CF)", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.AM)", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.EOP)", - "\n );", - "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", - "\n string EstimateType => EstimateTypes.DA;", - "\n ", - "\n [NotVisible] string EconomicBasis => EconomicBases.L;", - "\n ", - "\n public double Value => GetStorage().GetValue(Identity, (string)null, EstimateType, (int?)null);", - "\n}", - "\n", - "\npublic interface DeferrableActualForCurrentBasis : DeferrableActual", - "\n{", - "\n [NotVisible] string DeferrableActual.EconomicBasis => EconomicBases.C;", - "\n}", - "\n", - "\npublic interface ReleaseDeferrable : DeferrableActual", - "\n{", - "\n double DeferrableActual.Value => GetStorage().GetAttributableExpenseAndCommissionAmountType().Sum(at => GetScope((Identity, at, EstimateTypes.A, (int?)null)).Value);", - "\n}", - "\n", - "\npublic interface AmortizationDeferrable : DeferrableActual", - "\n{", - "\n private double AmortizationFactor => GetScope(Identity, o => o.WithContext(EconomicBasis)).Value;", - "\n private double AggregatedDeferrable => GetScope((Identity, InputSource.Actual)).Values", - "\n .Sum(aocStep => GetScope(Identity with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}).Value);", - "\n double DeferrableActual.Value => -1d * AggregatedDeferrable * AmortizationFactor;", - "\n}", - "\n", - "\npublic interface EndOfPeriodDeferrable : DeferrableActual", - "\n{", - "\n double DeferrableActual.Value => GetScope((Identity, InputSource.Actual)).Values", - "\n .Sum(aocStep => GetScope(Identity with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}).Value);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "p-VbKXd52UuaKecFYnE8iQ", - "cell_type": "markdown", - "source": [ - "An example of Deferrable Actual figures can be found [here](../Test/SpecificationsImportActuals#deferrable-actual)." - ], - "metadata": {} - }, - { - "id": "Mtf0XXuvUkS76O6DBZUr4A", - "cell_type": "markdown", - "source": [ - "", - "\n## Contractual Service Margin, Loss Component and Loss Recovery Component", - "\n", - "\nThe Contractual Service Margin ($CSM$) denotes the unearned profit from an insurance contract or group of insurance contracts and plays a critical role in the calculation of profit & loss values. Similarly, the unearned loss is denoted by Loss Component ($LC$), Loss Recovery Component in the case of reinsurance contracts." - ], - "metadata": {} - }, - { - "id": "Wq-e5YleykGCYEopzDLT4A", - "cell_type": "markdown", - "source": [ - "## Experience Adjustment on Premium" - ], - "metadata": {} - }, - { - "id": "JwOnE_oxnE6u4nU3ZQku3Q", - "cell_type": "markdown", - "source": [ - "The Experience Adjustment (EA) on Premiums weights the cash-flow (CF aocSteps) for premium amount types by the PremiumAllocationFactor input for each group of insurance contract. ", - "\nThe contributions of present values and actuals are computed separately.", - "\n", - "\n$$", - "\nEA (\\rm{PV}) = \\text{Premium Allocation Factor} \\cdot \\big( PV (\\text{AocType = CF}) \\big)~, \\\\", - "\n$$", - "\n$$", - "\nEA (\\text{Actual}) = \\text{Premium Allocation Factor} \\cdot \\big( \\text{Actual}(\\text{AocType = CF}) + \\text{Advance Actual}(\\text{AocType = CF})+ \\text{Overdue Actual}(\\text{AocType = CF}) \\big) ~,", - "\n$$", - "\nwhere amount type premium and its children are considered, novelties in-force and new business are considered for $PV$ whereas novelty combined is considered for Actual. The allocation is always done in the finest granularity (novelty, line of business, ..) possible." - ], - "metadata": {} - }, - { - "id": "pEi0POgs0UejZ_BJaXi_LQ", - "cell_type": "code", - "source": [ - "public interface BeExperienceAdjustmentForPremium : IScope", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s", - "\n .WithApplicability(x => x.Identity.AocType != AocTypes.CF));", - "\n", - "\n string EstimateType => EstimateTypes.BEPA;", - "\n string EconomicBasis => EconomicBases.L;", - "\n ", - "\n PresentValue[] ByAmountType => GetStorage().GetPremiums().Select(pr => GetStorage().GetPremiumAllocationFactor(Identity) * GetScope((Identity, pr, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis))).ToArray(); ", - "\n}", - "\n", - "\npublic interface DefaultValueBeExperienceAdjustmentForPremium : BeExperienceAdjustmentForPremium", - "\n{", - "\n PresentValue[] BeExperienceAdjustmentForPremium.ByAmountType => Enumerable.Empty().ToArray();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CA2eQXhYYUevjiAr92nN6Q", - "cell_type": "code", - "source": [ - "public interface ActualExperienceAdjustmentForPremium : IScope", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s", - "\n .WithApplicability(x => x.Identity.AocType != AocTypes.CF));", - "\n ", - "\n public ActualBase[] ByAmountTypeAndEstimateType => GetStorage().GetPremiums().SelectMany(pr => ", - "\n GetStorage().ExperienceAdjustEstimateTypeMapping.Keys", - "\n .Select(et => GetStorage().GetPremiumAllocationFactor(Identity) * ", - "\n GetScope((Identity, pr, et, (int?)null)))).ToArray(); ", - "\n}", - "\n", - "\npublic interface DefaultValueActualExperienceAdjustmentForPremium : ActualExperienceAdjustmentForPremium", - "\n{", - "\n ActualBase[] ActualExperienceAdjustmentForPremium.ByAmountTypeAndEstimateType => Enumerable.Empty().ToArray();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "czmwLF-VTkKtolr0jqiX8w", - "cell_type": "markdown", - "source": [ - "", - "\n## Technical Margin", - "\n", - "\nFor the computation of the $CSM$ or $LC$ component values for each step of the [AoC Step Structure](#aoc-step-structure), it is convenient to introduce the ", - "\nnotion of technical margin $TM$. In the case of BBA methodology, the Locked-in interest rates discounting is applied to obtain the PV and RA values.", - "\n", - "\nThis can be summarized as follows:", - "\n", - "\n$$", - "\nTM(s) = \\left\\{", - "\n\\begin{array}{rl}", - "\nTM(\\rm{EOP}) \\text{ of the previous period} ~ & \\text{if }s = \\text{BOP and Novelty is In-Force}.", - "\n\\\\", - "\n0 ~ & \\text{if }s = \\text{CF}.", - "\n\\\\", - "\nIAF \\cdot~\\text{Aggregated}~TM(\\text{IA}) ~ & \\text{if }s = \\text{IA and Novelty is In-Force}.", - "\n\\\\", - "\n\\rm{Premiums} + \\text{Attributable Expense and Commissions} + \\text{Investment Claims} ~ & \\text{if }s = \\text{EA}.", - "\n\\\\", - "\n-AF \\cdot~\\text{Aggregated}~TM(\\text{AM})~ & \\text{if }s = \\text{AM}.", - "\n\\\\", - "\n\\text{PV}(\\text{s})\\bigg|_{\\substack{\\text{Non Attributable} \\\\ \\text{Amount Types} \\\\ \\text{excluded}}} ", - "\n+ \\text{RA}(\\text{s})~ & \\text{otherwise} ", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere", - "\n", - "\n$$", - "\n\\text{Aggregated}~TM (\\text{AoC step}) = \\sum_{s\\in\\text{ previous AoC steps}} TM(s)~.", - "\n$$", - "\n", - "\nand the Interest Accretion Factor ($IAF$) is given by", - "\n", - "\n$$", - "\nIAF = \\prod_{i=1}^{TS} \\text{Interest}_i - 1", - "\n$$", - "\n", - "\nwhere $\\text{Interest}_i$ is the monthly interest factor obtained from the [Yield Curve](#yield-curves) and $TS$ is the Time-Step.", - "\n", - "\nFinally, the Premiums, Attributable Expense and Commissions and Investment Claims terms are given by:", - "\n", - "\n$$", - "\n\\rm{Premiums} = \\sum_{\\text{Amount Type}\\in\\{\\text{PR and its children}\\}}", - "\nEA(\\rm{PV}) - EA(\\text{Actual}) ~,", - "\n$$", - "\n", - "\n$$", - "\n\\text{Attributable Expense and Commissions} = \\sum_{\\text{Amount Type}\\in\\{\\rm{ACA}, \\rm{AEA}\\}}", - "\n\\big(PV_{\\text{Novelty = I}} + PV_{\\text{Novelty = N}} \\big) - \\text{Actual}_{\\text{Novelty=C}} ~,", - "\n$$", - "\n", - "\n$$", - "\n\\text{Investment Claims } = \\sum_{\\text{Amount Type}\\in\\{\\text{ICO and its children}\\}}", - "\n\\big(PV_{\\text{Novelty = I}} + PV_{\\text{Novelty = N}} \\big) - \\big( \\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}}+ \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~,", - "\n$$", - "\n", - "\nwhere the AoC Step **CF** is implicit for all formulas, $PV$ is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **AA**, and **OA** (see details [here](#actual-values))." - ], - "metadata": {} - }, - { - "id": "uWXzMWj2I0mfBjJ6P43ZFg", - "cell_type": "code", - "source": [ - "public interface TechnicalMargin : IScope", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) => ", - "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.ValuationApproach == ValuationApproaches.VFA, p => p.ForMember(s => s.EconomicBasis))", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.BOP && x.Identity.Novelty == Novelties.I)", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.CF)", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.IA && x.Identity.Novelty == Novelties.I)", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.EA && !x.Identity.IsReinsurance)", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.AM)", - "\n );", - "\n ", - "\n [NotVisible] string EconomicBasis => EconomicBases.L;", - "\n ", - "\n double Value => GetScope(Identity.DataNode).BeAmountTypes", - "\n .Except(GetStorage().GetNonAttributableAmountType())", - "\n .Sum(at => GetScope((Identity, at, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) +", - "\n GetScope(Identity).Value;", - "\n ", - "\n double AggregatedValue => GetScope((Identity, InputSource.Cashflow)).Values", - "\n .Sum(aoc => GetScope(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);", - "\n}", - "\n", - "\npublic interface TechnicalMarginForCurrentBasis : TechnicalMargin", - "\n{", - "\n [NotVisible] string TechnicalMargin.EconomicBasis => EconomicBases.C;", - "\n}", - "\n", - "\npublic interface TechnicalMarginForBOP : TechnicalMargin", - "\n{", - "\n private double ValueCsm => GetStorage().GetValue(Identity, null, EstimateTypes.C, null);", - "\n private double ValueLc => GetStorage().GetValue(Identity, null, EstimateTypes.L, null);", - "\n private double ValueLr => GetStorage().GetValue(Identity, null, EstimateTypes.LR, null);", - "\n ", - "\n double TechnicalMargin.Value => -1d * ValueCsm + ValueLc + ValueLr;", - "\n}", - "\n", - "\npublic interface TechnicalMarginDefaultValue : TechnicalMargin", - "\n{", - "\n double TechnicalMargin.Value => default;", - "\n}", - "\n", - "\npublic interface TechnicalMarginForIA : TechnicalMargin", - "\n{", - "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.Id.ProjectionPeriod", - "\n private int shift => GetStorage().GetShift(0);//Identity.Id.ProjectionPeriod", - "\n ", - "\n private double[] monthlyInterestFactor => GetScope(Identity, o => o.WithContext(EconomicBasis)).Interest;", - "\n ", - "\n private double interestAccretionFactor => Enumerable.Range(shift,timeStep)", - "\n .Select(i => GetElementOrDefault(monthlyInterestFactor, i/12))", - "\n .Aggregate(1d, (x, y) => x * y ) - 1d;", - "\n ", - "\n double TechnicalMargin.Value => AggregatedValue * interestAccretionFactor;", - "\n}", - "\n", - "\npublic interface TechnicalMarginForEA : TechnicalMargin", - "\n{", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilderInner(ApplicabilityBuilder builder) => ", - "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.IsReinsurance));", - "\n ", - "\n private string referenceAocType => GetScope(Identity).Value.AocType;", - "\n ", - "\n private double premiums => GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", - "\n .Sum(n => GetScope(Identity with {AocType = referenceAocType, Novelty = n}).ByAmountType.Sum(sc => sc.Value)) -", - "\n GetScope(Identity with {AocType = referenceAocType, Novelty = Novelties.C}).ByAmountTypeAndEstimateType.Sum(sc => sc.Value);", - "\n ", - "\n private double attributableExpenseAndCommissions => GetStorage().GetAttributableExpenseAndCommissionAmountType().Sum(d =>", - "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", - "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, d, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", - "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, d, EstimateTypes.A, (int?)null)).Value);", - "\n", - "\n private double investmentClaims => GetStorage().GetInvestmentClaims().Sum(ic =>", - "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", - "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, ic, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", - "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.A, (int?)null)).Value - ", - "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.AA, (int?)null)).Value -", - "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.OA, (int?)null)).Value);", - "\n ", - "\n double TechnicalMargin.Value => premiums + attributableExpenseAndCommissions + investmentClaims;", - "\n}", - "\n", - "\npublic interface TechnicalMarginForAM : TechnicalMargin", - "\n{", - "\n double TechnicalMargin.Value => -1d * AggregatedValue * GetScope(Identity, o => o.WithContext(EconomicBasis)).Value;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "eV_qYONYOU-QbM_aQVg7vg", - "cell_type": "markdown", - "source": [ - "", - "\n## Switch Logic", - "\n ", - "\nThe $CSM$ and $LC$ components are computed from the [technical margin](#technical-margin). In particular, for a given AoC step $s$, TM is allocated to the $LC$ when $\\text{Aggregated } TM$ is positive whereas it is allocated to the $CSM$ when $\\text{Aggregated } TM$ is negative:", - "\n", - "\n$$", - "\n\\begin{array}{rl}", - "\nCSM({\\text{Aoc step}}) = 0,~~ LC({\\text{AoC step}}) = TM({\\text{AoC step}}) ~ & \\text{if }\\text{Aggregated }TM({\\text{AoC step}}) > 0.", - "\n\\\\", - "\nCSM({\\text{Aoc step}}) = - TM({\\text{AoC step}}),~~ LC({\\text{AoC step}}) = 0 ~ & \\text{otherwise} ", - "\n\\end{array}", - "\n$$", - "\n", - "\n", - "\nThe figures reported under CSM are the opposite of the TM value in order to satisfy our sign convention.", - "\n", - "\nIt is possible to switch from $CSM$ to $LC$ and from $LC$ to $CSM$ at any AoC step $s$ with the only exception of **Amortization** where there is no switch from the previous step.", - "\nWhen a switch occurs the total contribution to the $CSM$ ($LC$) prior the switching step is brought to 0 and the remaing amount is allocated to $LC$ ($CSM$).", - "\n", - "\n", - "\n### Gross case (i.e. no reinsurance)", - "\n", - "\nThe switch logic is applied ***separately*** to the In-Force and New Business novelties. The Combined Liability Aoc Step **CL** will bring both contributions to CSM and LC together as the novelities are summed up.", - "\n", - "\nIn detail, and as we go through the AoC steps in the AoC chain, we have", - "\n", - "\n**A)** For the **BOP**:", - "\n$$", - "\n\\begin{array}{rl}", - "\nCSM(\\text{BOP}) &= CSM(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", - "\n\\\\", - "\nLC(\\text{BOP}) &= LC(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", - "\n\\end{array}", - "\n$$", - "\n", - "\n", - "\n**B)** For the **following AoC steps**, the switch logic is preferably formulated using the delta variations between steps, $\\Delta CSM$ and $\\Delta LC$ for the CSM and the LC respectively.", - "\n", - "\nThe switch logic for these AoC steps with the *exception* of Combined Liability is:", - "\n", - "\nIf $\\text{Aggregated }TM(\\text{AoC Step}) > 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) \\le 0$, then there is a switch from $LC$ to $CSM$:", - "\n", - "\n$$", - "\n\\begin{array}{rl}", - "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step}) -\\text{Aggregated } TM(\\text{AoC Step})", - "\n\\\\", - "\n\\Delta LC(\\text{AoC step}) &= -\\text{Aggregated } TM(\\text{AoC Step}) ", - "\n\\end{array}", - "\n$$", - "\n", - "\nOn the other hand, if $\\text{Aggregated }TM(\\text{AoC Step}) \\le 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) > 0$, then the switch is from $CSM$ to $LC$:", - "\n", - "\n$$", - "\n\\begin{array}{rl}", - "\n\\Delta CSM(\\text{AoC step}) &= \\text{Aggregated } TM(\\text{AoC Step}) ", - "\n\\\\", - "\n\\Delta LC(\\text{AoC step}) &= TM(\\text{AoC Step}) + \\text{Aggregated } TM(\\text{AoC Step}) ", - "\n\\end{array}", - "\n$$", - "\n", - "\nIf there is no switch from $CSM$, i.e. $\\text{Aggregated }TM(\\text{AoC Step}) \\le 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) \\le 0 $, then:", - "\n", - "\n$$", - "\n\\begin{array}{rl}", - "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step})", - "\n\\\\", - "\n\\Delta LC(\\text{AoC step}) &= 0", - "\n\\end{array}", - "\n$$", - "\n", - "\nAnd finally, if there is no switch from $LC$, i.e. $\\text{Aggregated }TM(\\text{AoC Step}) > 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) \\ge 0 $, then:", - "\n", - "\n$$", - "\n\\begin{array}{rl}", - "\n\\Delta CSM(\\text{AoC step}) &= 0", - "\n\\\\", - "\n\\Delta LC(\\text{AoC step}) &= TM(\\text{AoC Step})", - "\n\\end{array}", - "\n$$", - "\n", - "\n**C)** For the AoC step Combined Liability **CL**, the switch logic is similar to the one above, except that a switch from $LC$ to $CSM$ can happen **because of New Business and despite of In-Force**, in which case we have:", - "\n", - "\n$$", - "\n\\begin{array}{rl}", - "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step}) -\\big(\\text{Aggregated } TM(\\text{Last In-Force AoC step})+TM(\\text{Last In-Force AoC step}) \\big)", - "\n\\\\", - "\n\\Delta LC(\\text{AoC step}) &= -\\big(\\text{Aggregated } TM(\\text{Last In-Force AoC step}) + TM(\\text{Last In-Force AoC step}) \\big)", - "\n\\end{array}", - "\n$$", - "\n", - "\nIf, on the other hand, the switch from $LC$ to $CSM$ happens **because of In-Force and despite of New Business**, then we have:", - "\n", - "\n$$", - "\n\\begin{array}{rl}", - "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step}) -\\big(\\text{Aggregated } TM(\\text{Last NB AoC step})+TM(\\text{Last NB AoC step}) \\big)", - "\n\\\\", - "\n\\Delta LC(\\text{AoC step}) &= -\\big(\\text{Aggregated } TM(\\text{Last NB AoC step}) + TM(\\text{Last NB AoC step}) \\big)", - "\n\\end{array}", - "\n$$", - "\n", - "\nFor the switch in the other direction, i.e. from $CSM$ to $LC$ the formulas are similar except that LC and CSM are swapped.", - "\n", - "\n**D)** Finally, for the last AoC step, the **EOP**, we have:", - "\n", - "\n$$", - "\n\\begin{array}{rl}", - "\nCSM(\\text{EOP}) &= \\sum_{s~\\in~\\text{previous AoC steps}}\\Delta CSM(s)", - "\n\\\\", - "\nLC(\\text{EOP}) &= \\sum_{s~\\in~\\text{previous AoC steps}}\\Delta LC(s)", - "\n\\end{array}", - "\n$$", - "\n", - "\n", - "\n### Reinsurance case", - "\n", - "\nFor the reinsurance case, the switch logic is identical to the one described above, except that it uses the gross Technical Margins multiplied by the weights coming from the Reinsurance Coverage Parameter (see [Data Node Parameters](../DataModel/DataStructure#data-node-parameters)). In case a GRIC has multiple GICs, then these weighted $TM$s are aggregated." - ], - "metadata": {} - }, - { - "id": "UnZAtItpLkaBp5iMJesSzw", - "cell_type": "code", - "source": [ - "public interface AllocateTechnicalMargin: IScope", - "\n{", - "\n //Switch", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) => ", - "\n builder.ForScope(s => s", - "\n .WithApplicability(x => x.Identity.IsReinsurance && x.Identity.AocType == AocTypes.CL) ", - "\n .WithApplicability(x => x.Identity.IsReinsurance, ", - "\n p => p.ForMember(s => s.ComputedEstimateType)", - "\n .ForMember(s => s.HasSwitch))", - "\n .WithApplicability(x => x.GetStorage().IsSecondaryScope(x.Identity.DataNode)) ", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.BOP)", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.CL)", - "\n .WithApplicability(x => x.Identity.AocType == AocTypes.EOP)", - "\n );", - "\n ", - "\n [NotVisible] double AggregatedTechnicalMargin => GetScope(Identity).AggregatedValue; ", - "\n [NotVisible] double TechnicalMargin => GetScope(Identity).Value;", - "\n ", - "\n [NotVisible] string ComputedEstimateType => ComputeEstimateType(GetScope(Identity).AggregatedValue + TechnicalMargin);", - "\n [NotVisible] bool HasSwitch => ComputedEstimateType != ComputeEstimateType(GetScope(Identity).AggregatedValue);", - "\n ", - "\n //Allocate ", - "\n [NotVisible] string EstimateType => GetContext();", - "\n ", - "\n double Value => (HasSwitch, EstimateType == ComputedEstimateType) switch {", - "\n (true, true) => TechnicalMargin + AggregatedTechnicalMargin,", - "\n (true, false) => -1d * AggregatedTechnicalMargin,", - "\n (false, true) => TechnicalMargin,", - "\n _ => default", - "\n };", - "\n ", - "\n string ComputeEstimateType(double aggregatedTechnicalMargin) => aggregatedTechnicalMargin > Precision ? EstimateTypes.L : EstimateTypes.C;", - "\n}", - "\n", - "\npublic interface ComputeAllocateTechnicalMarginWithIfrsVariable : AllocateTechnicalMargin", - "\n{ ", - "\n double AllocateTechnicalMargin.TechnicalMargin => ComputeTechnicalMarginFromIfrsVariables(Identity);", - "\n double AllocateTechnicalMargin.AggregatedTechnicalMargin => GetScope((Identity, InputSource.Cashflow)).Values", - "\n .Sum(aoc => ComputeTechnicalMarginFromIfrsVariables(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}));", - "\n ", - "\n private double ComputeTechnicalMarginFromIfrsVariables(ImportIdentity id)", - "\n {", - "\n return GetStorage().GetValue(Identity, null, EstimateTypes.LR, null) +", - "\n GetStorage().GetValue(Identity, null, EstimateTypes.L, null) - ", - "\n GetStorage().GetValue(Identity, null, EstimateTypes.C, null);", - "\n }", - "\n}", - "\n", - "\npublic interface AllocateTechnicalMarginForReinsurance : AllocateTechnicalMargin", - "\n{ ", - "\n //TODO add Reinsurance Coverage Update (RCU, Novelty=I) AocStep", - "\n private IEnumerable underlyingGic => GetStorage().GetUnderlyingGic(Identity);", - "\n ", - "\n private double weightedUnderlyingTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", - "\n GetScope(Identity with {DataNode = gic}).TechnicalMargin);", - "\n ", - "\n private double weightedUnderlyingAggregatedTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", - "\n GetScope(Identity with {DataNode = gic}).AggregatedTechnicalMargin);", - "\n ", - "\n private string ComputeReinsuranceEstimateType(double aggregatedFcf) => aggregatedFcf > Precision ? EstimateTypes.LR : EstimateTypes.C;", - "\n ", - "\n [NotVisible] string AllocateTechnicalMargin.ComputedEstimateType => ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM + weightedUnderlyingTM);", - "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => ComputedEstimateType != ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM); ", - "\n}", - "\n", - "\npublic interface AllocateTechnicalMarginForReinsuranceCL : AllocateTechnicalMargin", - "\n{ ", - "\n //In common1", - "\n private IEnumerable underlyingGic => GetStorage().GetUnderlyingGic(Identity);", - "\n ", - "\n private double weightedUnderlyingTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", - "\n GetScope(Identity with {DataNode = gic}).TechnicalMargin);", - "\n ", - "\n private double weightedUnderlyingAggregatedTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", - "\n GetScope(Identity with {DataNode = gic}).AggregatedTechnicalMargin);", - "\n private string ComputeReinsuranceEstimateType(double aggregatedFcf) => aggregatedFcf > Precision ? EstimateTypes.LR : EstimateTypes.C;", - "\n ", - "\n string AllocateTechnicalMargin.ComputedEstimateType => ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM + weightedUnderlyingTM);", - "\n //In common2", - "\n private double balancingValue => GetScope((Identity, InputSource.Cashflow))", - "\n .Values", - "\n .GroupBy(x => x.Novelty)", - "\n .Select(g => g.Last())", - "\n .Sum(aoc => { ", - "\n var id = Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty};", - "\n return GetScope(id).ComputedEstimateType != ComputedEstimateType ? ", - "\n GetScope(id).TechnicalMargin + GetScope(id).AggregatedTechnicalMargin", - "\n : (double)default; });", - "\n ", - "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => Math.Abs(balancingValue) > Precision;", - "\n [NotVisible] double AllocateTechnicalMargin.AggregatedTechnicalMargin => balancingValue; ", - "\n}", - "\n", - "\npublic interface AllocateTechnicalMarginForCl : AllocateTechnicalMargin", - "\n{", - "\n private double balancingValue => GetScope((Identity, InputSource.Cashflow))", - "\n .Values", - "\n .GroupBy(x => x.Novelty)", - "\n .Select(g => g.Last())", - "\n .Sum(aoc => { ", - "\n var id = Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty};", - "\n return GetScope(id).ComputedEstimateType != ComputedEstimateType ? ", - "\n GetScope(id).TechnicalMargin + GetScope(id).AggregatedTechnicalMargin", - "\n : (double)default; });", - "\n", - "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => Math.Abs(balancingValue) > Precision;", - "\n ", - "\n [NotVisible] double AllocateTechnicalMargin.AggregatedTechnicalMargin => balancingValue;", - "\n}", - "\n", - "\npublic interface AllocateTechnicalMarginForBop : AllocateTechnicalMargin", - "\n{ ", - "\n bool AllocateTechnicalMargin.HasSwitch => false;", - "\n}", - "\n", - "\npublic interface AllocateTechnicalMarginForEop : AllocateTechnicalMargin", - "\n{", - "\n double AllocateTechnicalMargin.Value => GetScope((Identity, InputSource.Cashflow)).Values", - "\n .Sum(aoc => GetScope(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);", - "\n [NotVisible] string AllocateTechnicalMargin.ComputedEstimateType => ComputeEstimateType(AggregatedTechnicalMargin);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vY4oXJJJ8ke97-m8ASMsAw", - "cell_type": "markdown", - "source": [ - "For the **Group of Reinsurance Contracts** (GRICs), the switch is computed within the underlying GIC context and $CSM$ and $LR$ are then computed in the same manner as for the underlying GICs CSM and LC." - ], - "metadata": {} - }, - { - "id": "DqGSuXbt6USNumZ69sErWg", - "cell_type": "markdown", - "source": [ - "The scopes below are simply used to set the appropriate Estimate Type (C for $CSM$, L for $LC$ and LR for $LCR$), as well as to set $CSM$ values to be positive:" - ], - "metadata": {} - }, - { - "id": "n2dT4_znvk2eUSMMef6OIg", - "cell_type": "code", - "source": [ - "public interface Csm : IScope", - "\n{", - "\n [NotVisible]string EstimateType => EstimateTypes.C;", - "\n ", - "\n double Value => -1d * GetScope(Identity, o => o.WithContext(EstimateType)).Value;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1fUoYZjlOki4f5GCvCmpoA", - "cell_type": "code", - "source": [ - "public interface Lc : IScope", - "\n{", - "\n [NotVisible]string EstimateType => EstimateTypes.L;", - "\n ", - "\n double Value => GetScope(Identity, o => o.WithContext(EstimateType)).Value;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TmqOsKRObkaw3PKUdp_lDw", - "cell_type": "code", - "source": [ - "public interface LoReCo : IScope", - "\n{ ", - "\n [NotVisible]string EstimateType => EstimateTypes.LR;", - "\n ", - "\n double Value => GetScope(Identity, o => o.WithContext(EstimateType)).Value;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_ejvWQaq-kSPyTqB4Y2n9Q", - "cell_type": "markdown", - "source": [ - "## Computing All Scopes", - "\n", - "\nSince all the calculations defined in the various scopes are to be performed together, it is useful to introduce the scope ComputeAllScopes below, which given a certain Import Identity and Import Storage, performs all the calculations (defined above) based on the corresponding data:" - ], - "metadata": {} - }, - { - "id": "68_d30x6ZUGoP_UjvJ9SBg", - "cell_type": "code", - "source": [ - "public interface ComputeAllScopes: IScope //ComputeIfrsVariable", - "\n{", - "\n IEnumerable PvLocked => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", - "\n EstimateType = x.Identity.CalculationType, ", - "\n DataNode = x.Identity.Id.DataNode, ", - "\n AocType = x.Identity.Id.AocType, ", - "\n Novelty = x.Identity.Id.Novelty, ", - "\n AccidentYear = x.Identity.AccidentYear,", - "\n AmountType = x.Identity.AmountType,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n IEnumerable PvCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", - "\n EstimateType = x.Identity.CalculationType, ", - "\n DataNode = x.Identity.Id.DataNode, ", - "\n AocType = x.Identity.Id.AocType, ", - "\n Novelty = x.Identity.Id.Novelty, ", - "\n AccidentYear = x.Identity.AccidentYear,", - "\n AmountType = x.Identity.AmountType,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n IEnumerable RaCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", - "\n EstimateType = x.Identity.CalculationType, ", - "\n DataNode = x.Identity.Id.DataNode, ", - "\n AocType = x.Identity.Id.AocType, ", - "\n Novelty = x.Identity.Id.Novelty, ", - "\n AccidentYear = x.Identity.AccidentYear,", - "\n AmountType = null,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n IEnumerable RaLocked => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", - "\n EstimateType = x.Identity.CalculationType, ", - "\n DataNode = x.Identity.Id.DataNode, ", - "\n AocType = x.Identity.Id.AocType, ", - "\n Novelty = x.Identity.Id.Novelty, ", - "\n AccidentYear = x.Identity.AccidentYear,", - "\n AmountType = null,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n private string EconomicBasis => Identity.ValuationApproach == ValuationApproaches.VFA ? EconomicBases.C : EconomicBases.L;", - "\n private IEnumerable amortizationFactor => Identity.AocType == AocTypes.AM", - "\n ? GetScope(Identity, o => o.WithContext(EconomicBasis))", - "\n .RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", - "\n DataNode = x.Identity.DataNode,", - "\n AocType = x.Identity.AocType,", - "\n Novelty = x.Identity.Novelty,", - "\n EconomicBasis = x.EconomicBasis,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n })", - "\n : Enumerable.Empty();", - "\n IEnumerable Actual => GetScope(Identity).Actuals.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.Identity.EstimateType,", - "\n DataNode = x.Identity.Id.DataNode,", - "\n AocType = x.Identity.Id.AocType,", - "\n Novelty = x.Identity.Id.Novelty,", - "\n AccidentYear = x.Identity.AccidentYear,", - "\n AmountType = x.Identity.AmountType,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n IEnumerable AdvanceActual => GetScope(Identity).Actuals.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.Identity.EstimateType,", - "\n DataNode = x.Identity.Id.DataNode,", - "\n AocType = x.Identity.Id.AocType,", - "\n Novelty = x.Identity.Id.Novelty,", - "\n AccidentYear = x.Identity.AccidentYear,", - "\n AmountType = x.Identity.AmountType,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n IEnumerable OverdueActual => GetScope(Identity).Actuals.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.Identity.EstimateType,", - "\n DataNode = x.Identity.Id.DataNode,", - "\n AocType = x.Identity.Id.AocType,", - "\n Novelty = x.Identity.Id.Novelty,", - "\n AccidentYear = x.Identity.AccidentYear,", - "\n AmountType = x.Identity.AmountType,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n IEnumerable DeferrableActual => GetScope(Identity).RepeatOnce().Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", - "\n DataNode = x.Identity.DataNode,", - "\n AocType = x.Identity.AocType,", - "\n Novelty = x.Identity.Novelty,", - "\n AccidentYear = null,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n ", - "\n IEnumerable BeEAForPremium => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", - "\n || Identity.IsReinsurance", - "\n ? Enumerable.Empty()", - "\n : GetScope(Identity)", - "\n .ByAmountType", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(sc => new IfrsVariable{ EstimateType = GetScope(Identity).EstimateType, ", - "\n DataNode = sc.Identity.Id.DataNode, ", - "\n AocType = sc.Identity.Id.AocType, ", - "\n Novelty = sc.Identity.Id.Novelty, ", - "\n AccidentYear = sc.Identity.AccidentYear,", - "\n EconomicBasis = sc.EconomicBasis,", - "\n AmountType = sc.Identity.AmountType,", - "\n Value = sc.Value,", - "\n Partition = sc.GetStorage().TargetPartition });", - "\n ", - "\n IEnumerable ActEAForPremium => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", - "\n || Identity.IsReinsurance", - "\n ? Enumerable.Empty()", - "\n : GetScope(Identity)", - "\n .ByAmountTypeAndEstimateType", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(sc => new IfrsVariable{ EstimateType = GetStorage().ExperienceAdjustEstimateTypeMapping[sc.Identity.EstimateType], ", - "\n DataNode = sc.Identity.Id.DataNode, ", - "\n AocType = sc.Identity.Id.AocType, ", - "\n Novelty = sc.Identity.Id.Novelty, ", - "\n AccidentYear = sc.Identity.AccidentYear,", - "\n //EconomicBasis = scope.EconomicBasis,", - "\n AmountType = sc.Identity.AmountType,", - "\n Value = sc.Value,", - "\n Partition = GetStorage().TargetPartition });", - "\n ", - "\n IEnumerable Csms => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", - "\n ? Enumerable.Empty()", - "\n : GetScope(Identity).RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", - "\n DataNode = x.Identity.DataNode,", - "\n AocType = x.Identity.AocType,", - "\n Novelty = x.Identity.Novelty,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n", - "\n IEnumerable Loss => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", - "\n ? Enumerable.Empty()", - "\n : Identity.IsReinsurance ", - "\n ? GetScope(Identity).RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", - "\n DataNode = x.Identity.DataNode,", - "\n AocType = x.Identity.AocType,", - "\n Novelty = x.Identity.Novelty,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n })", - "\n : GetScope(Identity).RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", - "\n DataNode = x.Identity.DataNode,", - "\n AocType = x.Identity.AocType,", - "\n Novelty = x.Identity.Novelty,", - "\n Value = x.Value,", - "\n Partition = GetStorage().TargetPartition", - "\n });", - "\n", - "\n /*private double validateSingleEoP => Math.Abs(ValueCsm) > Precision && Math.Abs(ValueLc) > Precision ", - "\n ? (double)ApplicationMessage.Log(Error.MultipleEoP)", - "\n : default;", - "\n */", - "\n IEnumerable CalculatedIfrsVariables => GetStorage().ImportFormat switch {", - "\n ImportFormats.Actual => Actual.Concat(AdvanceActual).Concat(OverdueActual).Concat(ActEAForPremium)", - "\n .Concat(DeferrableActual).Concat(Csms).Concat(Loss),", - "\n ImportFormats.Cashflow => PvLocked.Concat(PvCurrent).Concat(RaCurrent).Concat(RaLocked)", - "\n .Concat(amortizationFactor).Concat(BeEAForPremium)", - "\n .Concat(DeferrableActual).Concat(Csms).Concat(Loss),", - "\n ImportFormats.Opening => AdvanceActual.Concat(OverdueActual).Concat(DeferrableActual)", - "\n .Concat(Csms).Concat(Loss),", - "\n };", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "I56SQek6SkukwZ49PojX-g", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "", + "\n

Import Scopes (IFRS17 Methodology Business Logic)

", + "\n", + "\nThis notebook contains the logic used to perform calculations upon import of data (actuals and cashflows). This is also called 'Data Loading' and the concept of Scope is used here to define the logic and provide the means of executing the logic." + ] + }, + { + "cell_type": "markdown", + "source": [ + "# References", + "\nLibraries and other notebooks which are needed for this notebook are imported below." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Notebooks" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"ImportStorage\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Scopes", + "\nScopes are used to define and perform data handling in a structured and easy-to-read-through fashion.", + "\n", + "\nThe IModel interface below will be used to execute calculations (i.e. evaluate the scopes) based on imported data." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IModel : IMutableScopeWithStorage{}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Getting Existing Identities", + "\n", + "\nAn [Identity](../DataModel/DataStructure#import-identity) is a set of identifiers for a certain set of data. In particular, an identity consists of a certain [AoC Type](../DataModel/DataStructure#aoc-type), [Novelty](../DataModel/DataStructure#novelty), [Data Node](../DataModel/DataStructure#data-node), Accident Year, and information on whether the data is for reinsurance or not. ", + "\n", + "\nGiven a certain Data Node and Accident Year, the interface GetIdentities returns all the existing identities (e.g. for Actuals and Cashflows) which have that Data Node and Accident Year." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface AllCfIdentities : IScope // string represents a DataNode", + "\n{", + "\n public IEnumerable ids => GetStorage().GetAllAocSteps(InputSource.Cashflow)", + "\n .Select(aocStep => new ImportIdentity {", + "\n AocType = aocStep.AocType,", + "\n Novelty = aocStep.Novelty,", + "\n DataNode = Identity", + "\n });", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface GetIdentities : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().IsSecondaryScope(x.Identity))", + "\n .WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Actual)", + "\n .WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Cashflow)", + "\n .WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Opening)", + "\n );", + "\n ", + "\n private IEnumerable computedIdentities => new string[]{AocTypes.EA, AocTypes.AM, AocTypes.EOP}", + "\n .Select(aocType => new ImportIdentity {", + "\n AocType = aocType,", + "\n Novelty = Novelties.C,", + "\n DataNode = Identity", + "\n });", + "\n private IEnumerable allIdentities => ParsedIdentities.Concat(computedIdentities).Concat(SpecialIdentities).ToHashSet(); ", + "\n ", + "\n IEnumerable ParsedIdentities => Enumerable.Empty(); ", + "\n IEnumerable SpecialIdentities => Enumerable.Empty();", + "\n ", + "\n //Set DataNode properties and ProjectionPeriod", + "\n IEnumerable Identities => allIdentities.Select(id => id with { IsReinsurance = GetStorage().DataNodeDataBySystemName[id.DataNode].IsReinsurance,", + "\n ValuationApproach = GetStorage().DataNodeDataBySystemName[id.DataNode].ValuationApproach", + "\n });", + "\n /* .SelectMany(id => Enumerable.Range(0,GetStorage().GetProjectionCount() + 1)", + "\n .Select(pp => id with {ProjectionPeriod = pp })", + "\n );*/", + "\n}", + "\n", + "\npublic interface AllCashflowIdentities : GetIdentities", + "\n{", + "\n IEnumerable GetIdentities.SpecialIdentities => GetScope(Identity).ids;", + "\n}", + "\n", + "\n", + "\npublic interface GetActualIdentities : GetIdentities", + "\n{", + "\n private IEnumerable actualEstimateTypes => GetStorage().EstimateTypesByImportFormat[ImportFormats.Actual];", + "\n ", + "\n IEnumerable GetIdentities.ParsedIdentities => GetStorage().GetIfrsVariables(Identity).Where(iv => actualEstimateTypes.Contains(iv.EstimateType)).Select(v => new ImportIdentity(v));", + "\n IEnumerable GetIdentities.SpecialIdentities => GetScope(Identity).ids", + "\n .Concat(GetStorage().GetAllAocSteps(InputSource.Opening)", + "\n .Select(aocStep => new ImportIdentity {AocType = aocStep.AocType, ", + "\n Novelty = aocStep.Novelty,", + "\n DataNode = Identity", + "\n }));", + "\n}", + "\n", + "\npublic interface GetCashflowIdentities : GetIdentities", + "\n{", + "\n private bool isReinsurance => GetStorage().DataNodeDataBySystemName[Identity].IsReinsurance; //clean up in the next PR", + "\n ", + "\n IEnumerable GetIdentities.ParsedIdentities => GetStorage().GetRawVariables(Identity).Select(v => new ImportIdentity(v));", + "\n ", + "\n IEnumerable GetIdentities.SpecialIdentities => ParsedIdentities.Where(id => id.Novelty != Novelties.C)", + "\n .Select(id => id.Novelty).ToHashSet()", + "\n .SelectMany(n => (n == Novelties.N ", + "\n ? new string[]{AocTypes.IA, AocTypes.CF} //Add IA, CF, for New Business", + "\n : isReinsurance ", + "\n ? new string[]{AocTypes.IA, AocTypes.CF, AocTypes.YCU, AocTypes.CRU, AocTypes.RCU} //Add IA, CF, YCU, CRU, RCU for in force", + "\n : new string[]{AocTypes.IA, AocTypes.CF, AocTypes.YCU}) //Add IA, CF, YCU,", + "\n .Select(aocType => new ImportIdentity {", + "\n AocType = aocType,", + "\n Novelty = n,", + "\n DataNode = Identity }))", + "\n .Concat(new ImportIdentity {", + "\n AocType = AocTypes.CF, //Add CF for Deferral", + "\n Novelty = Novelties.C,", + "\n DataNode = Identity", + "\n }.RepeatOnce()) ", + "\n .Concat(GetStorage().GetAllAocSteps(InputSource.Opening)", + "\n .Select(aocStep => new ImportIdentity {AocType = aocStep.AocType, ", + "\n Novelty = aocStep.Novelty,", + "\n DataNode = Identity", + "\n })); ", + "\n}", + "\n", + "\npublic interface GetAllIdentities : GetIdentities", + "\n{", + "\n IEnumerable GetIdentities.SpecialIdentities => GetScope(Identity).ids", + "\n .Concat(GetStorage().GetAllAocSteps(InputSource.Actual)", + "\n .Select(aocStep => new ImportIdentity {AocType = aocStep.AocType, ", + "\n Novelty = aocStep.Novelty,", + "\n DataNode = Identity,", + "\n }));", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Getting Amount Types", + "\n", + "\nSimilarly, given a certain Data Node and Accident Year, the interface ValidAmountType returns all the amount types which are used in imported data with that Data Node and Accident Year." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface ValidAmountType : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow ||", + "\n x.GetStorage().IsSecondaryScope(x.Identity)));", + "\n ", + "\n IEnumerable BeAmountTypes => GetStorage().GetRawVariables(Identity)", + "\n .Where(rv => rv.AmountType != null)", + "\n .Select(x => x.AmountType)", + "\n .Concat(GetStorage().DataNodeDataBySystemName[Identity].IsReinsurance ? (AmountTypes.CDR).RepeatOnce() : Enumerable.Empty())", + "\n .ToHashSet();", + "\n ", + "\n ", + "\n IEnumerable ActualAmountTypes => GetStorage().GetIfrsVariables(Identity)", + "\n .Where(iv => GetStorage().EstimateTypesByImportFormat[ImportFormats.Actual].Contains(iv.EstimateType))", + "\n .Select(x => x.AmountType)", + "\n .ToHashSet();", + "\n}", + "\npublic interface BeAmountTypesFromIfrsVariables : ValidAmountType", + "\n{", + "\n IEnumerable ValidAmountType.BeAmountTypes => GetStorage().GetIfrsVariables(Identity)", + "\n .Where(iv => GetStorage().EstimateTypesByImportFormat[ImportFormats.Cashflow].Contains(iv.EstimateType) && iv.AmountType != null)", + "\n .Select(x => x.AmountType)", + "\n .ToHashSet();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## AoC Step Structure", + "\n", + "\nThe Aoc step structure is constructed from the data which is delivered as input. It is assumed that it depends only on the Group of Contrat (i.e. it is invariant across Amount types or Accident Year). " + ] + }, + { + "cell_type": "markdown", + "source": [ + "### ParentAocStep ", + "\nThe **ParentAocStep** scope computes and provides an important piece of information for each [Identity](../DataModel/DataStructure#import-identity), i.e. for a certain [AocType](../DataModel/DataStructure#aoc-type) and [Novelty](../DataModel/DataStructure#novelty).", + "\n", + "\nIt provides the list of the adjacent AocSteps prior to Identity one. It can be more than one only for the step **CL** where a parent for each novelty is considered.", + "\nParentAocStep is critical when computing the *telescoping* differences. ", + "\n", + "\nThey are defined as follows:", + "\n", + "\n$$", + "\n\\text{ParentAocStep}(\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{AoC step with AoC Type YCU and Novelty I} & \\text{if AocType CRU} \\\\", + "\n\\text{The last AoC step with Data Type != Calculated and same Novelty as the AocStep} & \\text{if AocType YCU} \\\\", + "\n\\text{The AoC step which comes before in terms of order (as defined by AocType)} & \\text{otherwise} \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface ParentAocStep : IScope<(ImportIdentity Id, string AmountType), ImportStorage>", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.AmountType != AmountTypes.CDR));", + "\n ", + "\n private HashSet ParsedAocSteps => GetScope(Identity.Id.DataNode).ParsedIdentities.Select(id => new AocStep(id.AocType, id.Novelty)).ToHashSet();", + "\n private IEnumerable OrderedParsedAocSteps => ParsedAocSteps.Concat(CalculatedTelescopicAocStep).OrderBy(x => GetStorage().AocConfigurationByAocStep[x].Order);", + "\n ", + "\n private Dictionary> ParentParsedIdentities => GetPreviousIdentities(OrderedParsedAocSteps);", + "\n private AocStep identityAocStep => new AocStep(Identity.Id.AocType, Identity.Id.Novelty);", + "\n ", + "\n IEnumerable CalculatedTelescopicAocStep => GetStorage().GetCalculatedTelescopicAocSteps();", + "\n ", + "\n IEnumerable Values => ", + "\n Identity.Id.AocType switch {", + "\n AocTypes.CRU => new AocStep(AocTypes.YCU, Novelties.I).RepeatOnce(),", + "\n AocTypes.YCU => OrderedParsedAocSteps.GetReferenceAocStepForCalculated(GetStorage().AocConfigurationByAocStep, identityAocStep).RepeatOnce(),", + "\n _ => ParentParsedIdentities.TryGetValue(identityAocStep, out var parents) ? parents : Enumerable.Empty(),", + "\n };", + "\n}", + "\n", + "\npublic interface ParentAocStepForCreditRisk : ParentAocStep", + "\n{", + "\n IEnumerable ParentAocStep.CalculatedTelescopicAocStep => ", + "\n GetStorage().GetCalculatedTelescopicAocSteps().Where(aoc => aoc.AocType != AocTypes.CRU);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### ReferenceAocStep", + "\n", + "\nThe **ReferenceAocStep** scope provides the AocStep from which to retrieve the data in order to compute its value (e.g. AoC step EA retrieves Present Values, while AoC step YCU retrieves Nominal).", + "\n", + "\nThey are defined as follows:", + "\n", + "\n$$", + "\n\\text{ReferenceAocStep}(\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{self} & \\text{if AocStep InputSource is not Calculated} \\\\", + "\n\\text{The last AoC step with Data Type != Calculated and same Novelty as the input AocStep} ~, & \\text{if AocType } \\in \\text{\\{RCU, CF, IA, YCU, CRU\\}} \\\\", + "\n\\text{AoC step with AoC Type CF and Novelty as the AocStep} & \\text{if AocType EA} \\\\", + "\n\\text{AoC step with AoC Type CL and Novelty C} & \\text{if AocType $\\in$ \\{AM, EOP\\}} \\\\", + "\n\\text{empty} & \\text{if AocType is BOP} \\\\", + "\n\\text{log NotSupportedAocStepReference error} & \\text{otherwise} \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere the last AocStep is obtained by ordering the AocSteps according to their order (as defined by its AocType) and taking the last one." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface ReferenceAocStep : IScope ", + "\n{", + "\n private IEnumerable OrderedParsedAocSteps => GetScope(Identity.DataNode).ParsedIdentities", + "\n .Select(id => new AocStep(id.AocType, id.Novelty))", + "\n .Distinct()", + "\n .OrderBy(aocStep => GetStorage().AocConfigurationByAocStep[aocStep].Order);", + "\n private AocStep identityAocStep => new AocStep(Identity.AocType, Identity.Novelty);", + "\n private AocStep GetReferenceAocStep(string aocType) {", + "\n return aocType switch {", + "\n AocTypes.RCU or AocTypes.CF or AocTypes.IA or AocTypes.YCU or AocTypes.CRU => OrderedParsedAocSteps.GetReferenceAocStepForCalculated(GetStorage().AocConfigurationByAocStep, identityAocStep),", + "\n AocTypes.EA => new AocStep(AocTypes.CF, Identity.Novelty),", + "\n AocTypes.AM or AocTypes.EOP => new AocStep(AocTypes.CL, Novelties.C),", + "\n AocTypes.BOP => new AocStep(default, default), //BOP, C has DataType == Calculated. See ReferenceAocStep condition.", + "\n _ => (AocStep)ApplicationMessage.Log(Error.NotSupportedAocStepReference, Identity.AocType),", + "\n };", + "\n }", + "\n", + "\n // The Reference AocStep from which get data (Nominal or PV) to compute", + "\n AocStep Value => GetStorage().AocConfigurationByAocStep[identityAocStep].DataType == DataType.Calculated ", + "\n || GetStorage().AocConfigurationByAocStep[identityAocStep].DataType == DataType.CalculatedTelescopic ", + "\n ? GetReferenceAocStep(Identity.AocType)", + "\n : identityAocStep;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### PreviousAocSteps", + "\nThe **PreviousAocSteps** scope computes and provides an other important piece of information for each [Identity](../DataModel/DataStructure#import-identity), i.e. for a certain [AocType](../DataModel/DataStructure#aoc-type) and [Novelty](../DataModel/DataStructure#novelty).", + "\n", + "\nIt provides the list of all previous AocSteps up to the **BOP** step, whereby a Combined novelty will branch into the InForce and New Business AocTypes.", + "\n", + "\nPreviousAocSteps is critical when computing aggregated values along the various dimensions (such as for example Line of Business) and ", + "\nis formed by the ParentAocStep and its parent and so on until there is no parent.", + "\n", + "\n$$", + "\n\\text{PreviousAocSteps}(\\rm{AocStep}) = \\{PAS_1, PAS_2, \\ldots\\}", + "\n$$", + "\nwhere", + "\n$$", + "\n\\rm{PAS}_1 = \\rm{ParentAocStep}(\\rm{AocStep})", + "\n$$", + "\n$$", + "\n\\rm{PAS}_2 = \\rm{ParentAocStep}(\\rm{PAS}_1).", + "\n$$", + "\n", + "\nThis scope depends on the InputSource (Actual or Cashflow) for which the PreviousSteps are requested due to the AocChain differences between Actual reports and the rest." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface PreviousAocSteps : IScope<(ImportIdentity Id, InputSource ScopeInputSource), ImportStorage> ", + "\n{ ", + "\n private AocStep identityAocStep => new AocStep(Identity.Id.AocType, Identity.Id.Novelty);", + "\n private int aocStepOrder => GetStorage().AocConfigurationByAocStep[identityAocStep].Order;", + "\n private HashSet allAocSteps => GetStorage().GetAllAocSteps(Identity.ScopeInputSource).ToHashSet();", + "\n IEnumerable Values => allAocSteps.Contains(identityAocStep)", + "\n ? GetScope(Identity.Id.DataNode).Identities", + "\n .Select(id => new AocStep(id.AocType, id.Novelty))", + "\n .Distinct()", + "\n .Where(aoc => allAocSteps.Contains(aoc) && ", + "\n GetStorage().AocConfigurationByAocStep[aoc].Order < aocStepOrder && ", + "\n (Identity.Id.Novelty != Novelties.C ? aoc.Novelty == Identity.Id.Novelty : true) )", + "\n .OrderBy(aoc => GetStorage().AocConfigurationByAocStep[aoc].Order)", + "\n : Enumerable.Empty();", + "\n} " + ] + }, + { + "cell_type": "markdown", + "source": [ + "The exact structure being return depends on the **order** of the AoC Steps (which is set by the [AoC Type](../DataModel/DataStructure#aoc-type)), and on which AoC steps exist.", + "\n", + "\nFor an example of the usage of the AocStep scope see [here](../Test/AocStructureTest)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Discounting", + "\n", + "\nThe calculation of IFRS17 figures is based on cumulated discounted cashflows." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Yield Curves", + "\n", + "\nThe Yield Curves used for the discounting calculations are functions of the [Currency](../DataModel/DataStructure#currency), the [Data Node](../DataModel/DataStructure#data-node) and the [Economic Basis](../DataModel/DataStructure#economic-basis).", + "\n", + "\nIn particular:", + "\n- For the **Locked-in** economic basis, the yield curve used is the latest available as per end of the DataNode's inception year;", + "\n- Whereas for the **Current** economic base, the yield curve used is the latest available as per the current period.", + "\n", + "\nThe algorithm which retrieves the latest available yield curve is [here](../Utils/UtilityMethods#yield-curve)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Interest and Discount Rates and Factors", + "\n", + "\nThe factors used for discounting have the same granularity as the cashflow, i.e. monthly. The yield curves have yearly granularity, so the annual Interest factor is 1 + interest rate. The monthly Interest Interest and Discount factors are obtained from the annual factors such that the product of 12 months results in the annual factors, as follows:", + "\n", + "\n$$", + "\n\\text{Discount}_i = ( 1 + \\text{YC}_i ) ^{-\\frac{1}{12}} ~,", + "\n$$", + "\nand ", + "\n$$", + "\n\\text{Interest}_i = ( 1 + \\text{YC}_i) ^{\\frac{1}{12}} ~,", + "\n$$", + "\n", + "\nwhere the index $i$ denotes years." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface MonthlyRate : IScope", + "\n{", + "\n private string EconomicBasis => GetContext();", + "\n ", + "\n private double[] YearlyYieldCurve => GetStorage().GetYearlyYieldCurve(Identity, EconomicBasis);", + "\n ", + "\n private double Perturbation => 0; //GetStorage().GetYieldCurvePerturbation(); => switch Args.Scenario { 10ptsU => 0.1, 10ptsD => -0.1, _ => default)", + "\n ", + "\n double[] Interest => YearlyYieldCurve.Select(rate => Math.Pow(1d + rate, 1d / 12d) + Perturbation).ToArray(); ", + "\n ", + "\n double[] Discount => Interest^(-1);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For an example of these calculations see [here](../Test/SpecificationsImportCashflows#interest-and-discount-rates)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Nominal Values", + "\n", + "\nThe nominal cashflow values correspond to the cashflows provided in the Cashflow input file. ", + "\n
These values are stored in the database as [RawVariable](../DataModel/DataStructure#raw-variables).", + "\n
Refer to the ReferenceAocStep of the AocStructure calculation to identify the correct AocType and Novelty to retrieve.", + "\n
Due to the Credit Default Risk of a reinsurance partner, the logic to compute the Nominal Cashflows for this Amount Type must be defined separately. " + ] + }, + { + "cell_type": "code", + "source": [ + "public interface NominalCashflow : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.Identity.AmountType == AmountTypes.CDR));", + "\n", + "\n AocStep referenceAocStep => GetScope(Identity.Id).Value;", + "\n double[] Values => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, Identity.AmountType, Identity.CalculationType, Identity.AccidentYear);", + "\n}", + "\n", + "\npublic interface CreditDefaultRiskNominalCashflow : NominalCashflow", + "\n{", + "\n private double[] NominalClaimsCashflow => GetStorage().GetClaims()", + "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.CalculationType, Identity.AccidentYear))", + "\n .Aggregate();", + "\n ", + "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", + "\n ", + "\n private double[] PvCdrDecumulated { get {", + "\n var ret = new double[NominalClaimsCashflow.Length];", + "\n for (var i = NominalClaimsCashflow.Length - 1; i >= 0; i--)", + "\n ret[i] = Math.Exp(-nonPerformanceRiskRate) * ret.ElementAtOrDefault(i + 1) + NominalClaimsCashflow[i] - NominalClaimsCashflow.ElementAtOrDefault(i + 1);", + "\n return ret; } } ", + "\n ", + "\n double[] NominalCashflow.Values => PvCdrDecumulated - NominalClaimsCashflow;", + "\n}", + "\n", + "\npublic interface AllClaimsCashflow : NominalCashflow", + "\n{", + "\n double[] NominalCashflow.Values => GetStorage().GetClaims()", + "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.CalculationType, Identity.AccidentYear))", + "\n .Aggregate();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For a given month $i$ they are denoted as $\\rm{Nominal}_i$." + ] + }, + { + "cell_type": "markdown", + "source": [ + "For an example of nominal cashflow values see [here](../Test/SpecificationsImportCashflows#nominal-cashflow)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Present Values", + "\n", + "\nPresent Values are calculated during the import of the cashflows and stored on the database. They are computed for the relevant Economic Basis, depending on the Valuation Basis.", + "\n", + "\nTheir calculation is described in the following sections and is summarized in the $\\rm{PV}$ formula [below](#present-value)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Cumulated Discounted Cashflows", + "\n", + "\nCumulated and Discounted cashflows $\\rm{CDC}$ are computed using the monthly discount rates and in a recursive manner, as follows:", + "\n", + "\n$$", + "\n\\text{CDC}_i(\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{Nominal}_i + \\text{CDC}_{i+1} \\cdot {\\text{Valid Discount}_{\\frac{i}{12}}} ~, & \\text{if Aoc Type's Period Type is Beginning Of Period} \\\\", + "\n\\big( \\text{Nominal}_i + \\text{CDC}_{i+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{i}{12}}} ~, & \\text{if Aoc Type's Period Type is End Of Period}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere Transaction Period depends on which Best Estimate value is being computed, in particular on what its [Amount Type](../DataModel/DataStructure#amount-type) is (each Amount Type has its own [Period Type](../Constants/Enums)); and $\\text{Valid Discount}$ stands for the fact that in case the Discount Curves are shorter than the required index, then their last element is returned.", + "\n", + "\n
Also here, the Credit Default Risk contribution is calculated separately. Since it is based on Claims, the Period Type is implicitly defined." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface DiscountedCashflow : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? Accidentyear), ImportStorage>", + "\n{", + "\n private PeriodType periodType => GetStorage().GetPeriodType(Identity.AmountType, Identity.CalculationType); ", + "\n ", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR));", + "\n", + "\n [NotVisible]", + "\n string EconomicBasis => GetContext();", + "\n", + "\n [NotVisible]", + "\n double[] MonthlyDiscounting => GetScope(Identity.Id).Discount;", + "\n ", + "\n [NotVisible]", + "\n double[] NominalValues => GetScope(Identity).Values;", + "\n", + "\n double[] Values => NominalValues.ComputeDiscountAndCumulate(MonthlyDiscounting, periodType);", + "\n}", + "\n", + "\npublic interface DiscountedCreditRiskCashflow : DiscountedCashflow", + "\n{ ", + "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", + "\n ", + "\n double[] DiscountedCashflow.Values => NominalValues.ComputeDiscountAndCumulateWithCreditDefaultRisk(MonthlyDiscounting, nonPerformanceRiskRate);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For example calculations for Cumulated Discounted Cashflows see [here](../Test/SpecificationsImportCashflows#cumulated-discounted-cashflow)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Telescoping Difference", + "\n", + "\n", + "\nPresent Value figures for a specific period are typically reported through an analysis of change, where for each [AocStep](#aoc-steps-structure) the variation with respect to the preceding AocStep is shown.", + "\n", + "\nThe Telescoping Difference is basically the delta between two adjacent AoC steps, whereby the [ParentAocStep](#aoc-steps-structure) is used to determine the AoC step. ", + "\n", + "\nIt is defined as follows:", + "\n", + "\n$$", + "\n\\text{TelescopingDifference}_i = ", + "\n\\text{CDC}_{i}\\big(\\text{current AoC step}\\big) - \\text{CDC}_{i}\\big(\\text{parent AoC step}\\big)", + "\n$$", + "\n", + "\nwhere AocType is the AoC Type of the AoC Step for which the calculations are being performed." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface TelescopicDifference : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? Accidentyear), ImportStorage>", + "\n{", + "\n [NotVisible]", + "\n string EconomicBasis => GetContext();", + "\n private double[] CurrentValues => GetScope(Identity).Values;", + "\n ", + "\n private double[] PreviousValues => (GetScope((Identity.Id, Identity.AmountType)))", + "\n .Values", + "\n .Select(aoc => GetScope((Identity.Id with {AocType = aoc.AocType, Novelty = aoc.Novelty}, Identity.AmountType, Identity.CalculationType, Identity.Accidentyear)).Values)", + "\n .Where(cf => cf.Count() > 0)", + "\n .Aggregate();", + "\n ", + "\n double[] Values => CurrentValues - PreviousValues;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Examples of Telescoping Difference calculations for different AoC steps start [here](../Test/SpecificationsImportCashflows#modelcorrections)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Present Value", + "\n", + "\nThe present value ($\\rm{PV}$) can be determined by taking the appropriate elements of the cumulated discounted cashflows. This is done as function of the two [projection parameters](../DataModel/DataStructure#projection-configuration) $\\rm{Shift}$ ($S$) and $\\rm{TimeStep}$ ($TS$):", + "\n", + "\n$$", + "\n\\text{PV}(S, TS) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{PV Base}_{S} ~, & \\text{if Valuation Period is Beginning of Period} \\\\", + "\n\\text{PV Base}_{S+TS/2 -1} ~, & \\text{if Valuation Period is Mid of Period} \\\\", + "\n\\sum_{i=S}^{S + TS - 1}\\text{PV Base}_{i} ~, & \\text{if Valuation Period is Delta} \\\\", + "\n\\text{PV Base}_{S + TS} ~, & \\text{if Valuation Period is End of Period} \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere [PV Base](#present-value-base) is defined below, and the term $TS/2$ uses MidpointRounding.AwayFromZero (as defined by *https:[]()//docs.microsoft.com/en-us/dotnet/api/system.midpointrounding?view=net-6.0)*: rounding to the nearest number, away from zero in the exact halfway case. Furthermore, if the array is smaller than the index, then the last element is returned.", + "\n", + "\nFor instance, for the current year and year-to-date view we have $S=0$ and $TS=3$ for the first quarter, $TS=6$ for the 2nd quarter and so on.", + "\nFor the projection values of next year first quarter we would have $S=12$ and $TS=3$, etc." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IWithGetValueFromValues : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "\n{", + "\n private int shift => GetStorage().GetShift(0);//Identity.Id.ProjectionPeriod", + "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.Id.ProjectionPeriod", + "\n ", + "\n public double GetValueFromValues(double[] Values)", + "\n {", + "\n return GetStorage().GetValuationPeriod(Identity.Id) switch {", + "\n ValuationPeriod.BeginningOfPeriod => Values.ElementAtOrDefault(shift),", + "\n ValuationPeriod.MidOfPeriod => Values.ElementAtOrDefault(shift + Convert.ToInt32(Math.Round(timeStep / 2d, MidpointRounding.AwayFromZero)) - 1),", + "\n ValuationPeriod.Delta => Values.Skip(shift).Take(timeStep).Sum(),", + "\n ValuationPeriod.EndOfPeriod => Values.ElementAtOrDefault(shift + timeStep),", + "\n ValuationPeriod.NotApplicable => default", + "\n };", + "\n }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "An example of Projected Present Value calculations can be found [here](../Test/SpecificationsImportCashflows#present-value)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Interest Accretion", + "\n", + "\nSince the Interest Accretion cashflows are typically not provided as input (as they can be computed from its parent AocStep), its present values can be computed as follows:", + "\n", + "\n$$", + "\n\\text{InterestAccretion}_i(\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\big(\\text{CDC}_i(\\text{Parent AoC step}) - \\text{Nominal}_i(\\text{parent AoC step}) \\big) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, & \\text{if Amount Type's Transaction Period is Beginning of Period} \\\\", + "\n\\text{CDC}_i(\\text{parent AoC step}) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\n
Due to the Credit Default Risk of a reinsurance partner, the logic to compute the Interest Accretion for this Amount Type must be defined separately. Since it is based on Claims, the Period Type is implicitly defined." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IWithInterestAccretion : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "\n{", + "\n private double[] parentDiscountedValues => GetScope(Identity).Values; ", + "\n private double[] parentNominalValues => GetScope(Identity).Values;", + "\n private double[] monthlyInterestFactor => GetScope(Identity.Id).Interest;", + "\n ", + "\n double[] GetInterestAccretion() ", + "\n {", + "\n var periodType = GetStorage().GetPeriodType(Identity.AmountType, Identity.CalculationType);", + "\n var ret = new double[parentDiscountedValues.Length];", + "\n ", + "\n switch (periodType) {", + "\n case PeriodType.BeginningOfPeriod :", + "\n for (var i = 0; i < parentDiscountedValues.Length; i++)", + "\n ret[i] = (parentDiscountedValues[i] - parentNominalValues[i]) * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", + "\n break;", + "\n default :", + "\n for (var i = 0; i < parentDiscountedValues.Length; i++)", + "\n ret[i] = parentDiscountedValues[i] * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", + "\n break;", + "\n }", + "\n ", + "\n return ret;", + "\n }", + "\n}", + "\n", + "\npublic interface IWithInterestAccretionForCreditRisk : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "\n{", + "\n private double[] nominalClaimsCashflow => GetScope(Identity).Values;", + "\n private double[] nominalValuesCreditRisk => -1 * GetScope(Identity with {Id = Identity.Id with {AocType = AocTypes.CF}}).Values;", + "\n private double[] monthlyInterestFactor => GetScope(Identity.Id).Interest;", + "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", + "\n ", + "\n double[] GetInterestAccretion() ", + "\n {", + "\n var interestOnClaimsCashflow = new double[nominalClaimsCashflow.Length];", + "\n var interestOnClaimsCashflowCreditRisk = new double[nominalClaimsCashflow.Length];", + "\n var effectCreditRisk = new double[nominalClaimsCashflow.Length];", + "\n for (var i = nominalClaimsCashflow.Length - 1; i >= 0; i--) {", + "\n interestOnClaimsCashflow[i] = 1 / GetElementOrDefault(monthlyInterestFactor, i/12) * (interestOnClaimsCashflow.ElementAtOrDefault(i + 1) + nominalClaimsCashflow[i] - nominalClaimsCashflow.ElementAtOrDefault(i + 1));", + "\n interestOnClaimsCashflowCreditRisk[i] = 1 / GetElementOrDefault(monthlyInterestFactor, i/12) * (Math.Exp(-nonPerformanceRiskRate) * interestOnClaimsCashflowCreditRisk.ElementAtOrDefault(i + 1) + nominalClaimsCashflow[i] - nominalClaimsCashflow.ElementAtOrDefault(i + 1));", + "\n effectCreditRisk[i] = interestOnClaimsCashflow[i] - interestOnClaimsCashflowCreditRisk[i];", + "\n }", + "\n ", + "\n return effectCreditRisk - nominalValuesCreditRisk;", + "\n }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "An example of the Interest Accretion calculations can be found [here](../Test/SpecificationsImportCashflows#interest-accretion)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Present Value Base", + "\n", + "\nThe PV Base values are valid for all choices of the [Economic Basis](../DataModel/DataStructure#economic-basis):", + "\n", + "\n$$", + "\n\\text{PV Base}_i (\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{rl}", + "\n\\text{CDC}_i ~, & \\text{if AoCType = BOP} \\\\", + "\n-\\text{Nominal}_i(\\text{Parent AoC step}) ~, & \\text{if AoCType = CF } \\\\", + "\n\\text{InterestAccretion}_i ~, & \\text{if AoCType = IA } \\\\", + "\n0 ~, & \\text{if AoCType = AM } \\\\\\", + "\n\\text{CDC}_i(\\text{Parent AoC step}) ~, & \\text{if AoCType = EOP } \\\\", + "\n\\text{TelescopingDifference}_i ~, & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere $i$ denotes the months, and the [$\\rm{TelescopingDifference}_i$](#telescopic-difference) and the [$\\rm{InterestAccretion}_i$](#interest-accretion) quantities are defined above." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface PresentValue : IWithGetValueFromValues", + "\n{ ", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow", + "\n || x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode))", + "\n .WithApplicability(x => (x.Identity.Id.AocType == AocTypes.BOP && x.Identity.Id.Novelty != Novelties.C) || x.Identity.Id.AocType == AocTypes.EOP)", + "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.IA)", + "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.IA)", + "\n .WithApplicability(x => new string[]{AocTypes.BOP, AocTypes.EA, AocTypes.AM, AocTypes.RCU}.Contains(x.Identity.Id.AocType) ) //add here combination CRU for At !CDR?", + "\n );", + "\n ", + "\n [NotVisible][IdentityProperty][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => GetContext();", + "\n ", + "\n [NotVisible]", + "\n double[] Values => GetScope(Identity).Values;", + "\n ", + "\n public double Value => GetValueFromValues(Values);", + "\n}", + "\n", + "\npublic interface ComputePresentValueWithIfrsVariable : PresentValue", + "\n{", + "\n double PresentValue.Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.CalculationType, EconomicBasis, Identity.AccidentYear); //unify CalculationType and EstimateTypeGet", + "\n double[] PresentValue.Values => Enumerable.Empty().ToArray();", + "\n}", + "\n", + "\npublic interface PresentValueFromDiscountedCashflow : PresentValue", + "\n{", + "\n [NotVisible]", + "\n double[] PresentValue.Values => GetScope(Identity).Values;", + "\n}", + "\n", + "\npublic interface CashflowAocStep : PresentValue", + "\n{", + "\n [NotVisible]", + "\n double[] PresentValue.Values => -1d * GetScope(Identity).Values;", + "\n}", + "\n", + "\npublic interface PresentValueWithInterestAccretion : PresentValue, IWithInterestAccretion", + "\n{", + "\n [NotVisible]", + "\n double[] PresentValue.Values => GetInterestAccretion();", + "\n}", + "\n", + "\npublic interface PresentValueWithInterestAccretionForCreditRisk : PresentValue, IWithInterestAccretionForCreditRisk", + "\n{", + "\n [NotVisible]", + "\n double[] PresentValue.Values => GetInterestAccretion();", + "\n}", + "\n", + "\npublic interface EmptyValuesAocStep : PresentValue", + "\n{", + "\n [NotVisible]", + "\n double[] PresentValue.Values => Enumerable.Empty().ToArray();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "An example of the Present Value Base calculations can be found [here](../Test/SpecificationsImportCashflows#present-value)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Current and Locked", + "\n", + "\nPV Current and PV Locked below basically hold the Present Values [PV](#present-value) computed using the **Current** yield curves and the **Locked** yield curves, respectively.", + "\n", + "\nValues are available for each AmountType (by calling PvLocked.ByAmountType):", + "\n", + "\n$$", + "\n\\text{PV Locked}(\\text{AoC step}, \\text{Amount Type}) = \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = L}}", + "\n$$", + "\n", + "\n$$", + "\n\\text{PV Current}(\\text{AoC step}, \\text{Amount Type}) = \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = C}}", + "\n$$", + "\n", + "\n", + "\nAnd aggregated values are also available as the sum over all [Amount Types](../DataModel/DataStructure#amount-type) (by calling PvLocked.Value):", + "\n", + "\n$$", + "\n\\text{PV Locked}(\\text{AoC step}) = \\sum_{\\text{Amount Types}} \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = L}}", + "\n$$", + "\n", + "\n$$", + "\n\\text{PV Current}(\\text{AoC step}) = \\sum_{\\text{Amount Types}} \\text{PV}(\\text{AoC step}, \\text{Amount Type})|_{\\text{Economic Base = C}}", + "\n$$", + "\n", + "\nThese are used in the BBA methodology, whereby in the CSM calculations only PV Locked is used, and both of them are stored in the database under the [IfrsVariable](../DataModel/DataStructure#ifrs-variable) data structure." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface PvLocked : IScope", + "\n{ ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => EconomicBases.L;", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.BE;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", + "\n ", + "\n [NotVisible]", + "\n PresentValue[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", + "\n .ToArray();", + "\n double Value => PresentValues.Aggregate().Value;", + "\n}", + "\n", + "\npublic interface PvCurrent : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => EconomicBases.C;", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.BE;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", + "\n ", + "\n [NotVisible]", + "\n PresentValue[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", + "\n .ToArray();", + "\n ", + "\n double Value => PresentValues.Aggregate().Value;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Risk Adjustment", + "\n", + "\nRisk Adjustment values ($\\rm{RA}$) are accessible from the [PV Base](#present-value-base) data and have [Calculation Type](../DataModel/DataStructure#calculation-type) $RA$. In particular, the Locked-In and Current values are given by:", + "\n", + "\n$$", + "\n\\text{RA Locked}(\\text{AoC step}) = \\text{PV}(\\text{AoC step})|_{\\text{Calculation Type = RA},~ \\text{Economic Basis = L}}", + "\n$$", + "\n", + "\n$$", + "\n\\text{RA Current}(\\text{AoC step}) = \\text{PV}(\\text{AoC step})|_{\\text{Calculation Type = RA},~ \\text{Economic Basis = C}}", + "\n$$", + "\n", + "\nwhere PV is defined [above](#present-value) and uses the input cashflows with Calculation Type = RA." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface RaLocked : IScope", + "\n{ ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => EconomicBases.L;", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.RA;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", + "\n ", + "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray();", + "\n ", + "\n double Value => PresentValues.Aggregate().Value;", + "\n}", + "\npublic interface RaCurrent : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", + "\n string EconomicBasis => EconomicBases.C;", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.RA;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", + "\n ", + "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray(); ", + "\n ", + "\n double Value => PresentValues.Aggregate().Value;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Amortization", + "\n", + "\nFor the Amortization AoC Step (AoC Type **AM**), the amortization factors to be used are defined below." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Coverage Units", + "\n", + "\nThe coverage unit (CU) of a GIC is introduced in the standard as the quantity of the service provided in that GIC. The service is", + "\nmeasured by considering the quantity of benefits provided as well as the expected coverage period of the GIC.", + "\n", + "\nThe cashflows of coverage units are retrieved from the discounted cashflows with [Calculation Type](../DataModel/DataStructure#calculation-type) CU." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface CoverageUnitCashflow : IScope", + "\n{ ", + "\n [NotVisible] string EconomicBasis => GetContext();", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", + "\n string CalculationType => CalculationTypes.CU;", + "\n ", + "\n double[] Values => GetScope((Identity, (string)null, CalculationType, (int?)null)).Values;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Amortization Factor" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For a certain GIC, the monthly Amortization Factors $\\text{Monthly }AF_i$ are computed from the cashflows of the underlying coverage unit for that GIC:", + "\n", + "\n$$", + "\n\\text{Monthly }AF_i = 1 - \\frac{ \\text{Nominal}_i(CL)} {\\text{CDC}_i(CL) } ~.", + "\n$$", + "\n", + "\nwhere:", + "\n- $i$ denotes a monthly period;", + "\n- the nominal cash flows $\\text{Nominal}_i(CL)$ are the nominal cashflows of the coverage unit for the AoC Step **Combined Liability** (CL) (input data);", + "\n- and the corresponding cumulated discounted cashflows $\\text{CDC}_i$ are defined [above](#cumulated-discounted-cashflows)." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface MonthlyAmortizationFactorCashflow : IScope", + "\n{", + "\n private double[] NominalCuCashflow => GetScope((Identity with {AocType = AocTypes.CL}, (string)null, CalculationTypes.CU, (int?)null)).Values;", + "\n private double[] DiscountedCuCashflow => GetScope(Identity with {AocType = AocTypes.CL}, o => o.WithContext(EconomicBasis)).Values;", + "\n ", + "\n [NotVisible] string EconomicBasis => GetContext();", + "\n ", + "\n double[] MonthlyAmortizationFactors => Identity.AocType switch {", + "\n AocTypes.AM => NominalCuCashflow.Zip(DiscountedCuCashflow, //Extract to an other scope with month in the identity to avoid Zip?", + "\n (nominal, discountedCumulated) => discountedCumulated >= Precision ", + "\n ? 1 - nominal / discountedCumulated ", + "\n : 0).ToArray(),", + "\n _ => Enumerable.Empty().ToArray(),", + "\n };", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For a certain projection period - defined by the Shift, $S$, and the Time-Step, $TS$, parameters - the Amortization Factor is then given by the product of the corresponding monthly amortization factors:", + "\n", + "\n$$", + "\nAF = \\prod _{i = S}^{TS} \\text{Monthly }AF_i ~.", + "\n$$", + "\n", + "\nEach GIC will have his own AF." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface CurrentPeriodAmortizationFactor : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => ", + "\n s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow", + "\n || x.GetStorage().IsSecondaryScope(x.Identity.DataNode)));", + "\n ", + "\n private int shift => GetStorage().GetShift(0);//Identity.ProjectionPeriod", + "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.ProjectionPeriod", + "\n ", + "\n [NotVisible] string EconomicBasis => GetContext();", + "\n ", + "\n string EstimateType => EstimateTypes.F;", + "\n double Value => GetScope(Identity)", + "\n .MonthlyAmortizationFactors", + "\n .Skip(shift)", + "\n .Take(timeStep)", + "\n .Aggregate(1d, (x, y) => x * y);", + "\n}", + "\n", + "\npublic interface AmfFromIfrsVariable : CurrentPeriodAmortizationFactor", + "\n{", + "\n double CurrentPeriodAmortizationFactor.Value => GetStorage().GetValue(Identity, (string)null, EstimateType, EconomicBasis, (int?)null); //unify CalculationType and EstimateTypeGet", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Actual Values", + "\n", + "\nWe consider 4 types of Actual values, which are distinguished through their [Estimate Type](../DataModel/DataStructure#estimate-type):", + "\n- Actuals (A)", + "\n- Advance Actuals (AA)", + "\n- Overdue Actuals (OA)", + "\n- Deferrable Actuals (DA)", + "\n", + "\nwith the Estimate Type's system name shown between parenthesis above.", + "\n", + "\nThe following simplified AoC Chain applies for Advance and Overdue Actuals:", + "\n
 BOP", + "\n
 Release", + "\n
 Write-off", + "\n
 EOP" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Actual Base", + "\n", + "\nThe Actual Base sets values for actual, advance, and overdue as follows:", + "\n", + "\n$$", + "\n\\text{Actual Base} (\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{rl}", + "\n0 ~, & \\text{if AoC Step's AoC Type = AM} \\\\", + "\n\\text{Actual Base}(\\rm{BOP}) + \\text{Actual Base}(\\rm{CF}) + \\text{Actual Base}(\\rm{WO}) ~, & \\text{if AoC Step's AoC Type = EOP and EstimateType is not A} \\\\", + "\n\\text{Imported Actual} ~, & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere the value is also function of the [Estimate Type](../DataModel/DataStructure#EstimateType) and [Amount Type](../DataModel/DataStructure#AmountType), and the $\\text{Imported Actual}$ value is described [here]()." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface ActualBase : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat == ImportFormats.Actual ", + "\n && !x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode)", + "\n && x.Identity.Id.AocType == AocTypes.AM)", + "\n .WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow ", + "\n && !x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode)", + "\n && x.Identity.Id.AocType == AocTypes.EOP ", + "\n && x.Identity.EstimateType != EstimateTypes.A)", + "\n );", + "\n public double Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.EstimateType, Identity.AccidentYear); ", + "\n}", + "\n", + "\npublic interface EndOfPeriodActual : ActualBase", + "\n{", + "\n double ActualBase.Value => GetScope((Identity.Id, InputSource.Actual)).Values", + "\n .Sum(aocStep => GetScope((Identity.Id with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, Identity.AmountType, Identity.EstimateType, Identity.AccidentYear)).Value);", + "\n}", + "\n", + "\npublic interface EmptyValuesActual : ActualBase", + "\n{", + "\n double ActualBase.Value => 0;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "An example of Actual Base figures can be found [here](../Test/SpecificationsImportActuals#base-actual)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Actuals", + "\nThe Actuals correspond to ActualBase values with estimate type $A$.", + "\nThe only valid Aoc step is Release:", + "\n", + "\n$$", + "\n\\text{Actual} (\\text{Release}) = \\text{Actual Base} (\\text{Release})|_{\\text{Estimate Type} = A}", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Actual : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.A;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", + "\n ", + "\n [NotVisible]", + "\n ActualBase[] Actuals => GetScope(Identity.DataNode).ActualAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Advance Actuals", + "\n", + "\n**Advance Actuals** are those cashflows with due date inside the reporting period but which occured *before* the reporting period - They include:", + "\n- Receivable Claims", + "\n- Receivable Expenses", + "\n- Payable Premiums", + "\n", + "\nAdvance Actuals are given by", + "\n", + "\n$$", + "\n\\text{Advance Actual} (\\text{AoC step}) = \\text{Actual Base} (\\text{AoC step})|_{\\text{Estimate Type} = AA}", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface AdvanceActual : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.AA;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", + "\n ", + "\n [NotVisible]", + "\n ActualBase[] Actuals => GetScope(Identity.DataNode).ActualAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Overdue Actuals", + "\n", + "\n**Overdue Actuals** are those cashflows with due date inside the reporting period but which occur *after* the reporting period - They contain:", + "\n- Payable Claims", + "\n- Payable Expenses", + "\n- Receivable Premiums", + "\n", + "\nThe sign convention is the inverse of the default behavior - In particular: Premiums have positive value, whereas Claims and Expenses have negative value.", + "\n", + "\nThe Overdue Actuals are given by", + "\n", + "\n$$", + "\n\\text{Overdue Actual} (\\text{AoC step}) = \\text{Actual Base} (\\text{AoC step})|_{\\text{Estimate Type} = OA}", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface OverdueActual : IScope", + "\n{", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.OA;", + "\n ", + "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", + "\n ", + "\n [NotVisible]", + "\n ActualBase[] Actuals => GetScope(Identity.DataNode).ActualAmountTypes", + "\n .SelectMany(at => accidentYears", + "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Deferrable Actuals", + "\n", + "\nFinally, Deferrable Actuals are given by", + "\n", + "\n$$", + "\n\\text{Deferrable Actual} (\\text{AoC step}) = \\left\\{", + "\n\\begin{array}{rl}", + "\n\\sum_{\\text{Amount Type}~\\in~\\text{\\{ACA, AEA}\\}}\\text{Actual Base}(\\rm{CF})|_{\\text{Estimate Type = A}} ~, & \\text{if AoC Step's AoC Type = CF } \\\\", + "\n- \\text{Amortization Factor} \\cdot \\big( \\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) \\big) ~, & \\text{if AoC Step's AoC Type = AM } \\\\", + "\n\\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) + \\text{Deferrable Actual}(\\rm{AM}) ~, & \\text{if AoC Step's AoC Type = EOP } \\\\", + "\n\\text{Input Actual}|_{\\text{Estimate Type = DA}} ~, & \\text{ otherwise } \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere $ACA$ and $AEA$ are *Aquisition* Amount Types from **Attributable Commission** and **Attributable Expenses**, respectively." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface DeferrableActual : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.ValuationApproach == ValuationApproaches.VFA, ", + "\n p => p.ForMember(s => s.EconomicBasis))", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.AM)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.EOP)", + "\n );", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.DA;", + "\n ", + "\n [NotVisible] string EconomicBasis => EconomicBases.L;", + "\n ", + "\n public double Value => GetStorage().GetValue(Identity, (string)null, EstimateType, (int?)null);", + "\n}", + "\n", + "\npublic interface DeferrableActualForCurrentBasis : DeferrableActual", + "\n{", + "\n [NotVisible] string DeferrableActual.EconomicBasis => EconomicBases.C;", + "\n}", + "\n", + "\npublic interface ReleaseDeferrable : DeferrableActual", + "\n{", + "\n double DeferrableActual.Value => GetStorage().GetAttributableExpenseAndCommissionAmountType().Sum(at => GetScope((Identity, at, EstimateTypes.A, (int?)null)).Value);", + "\n}", + "\n", + "\npublic interface AmortizationDeferrable : DeferrableActual", + "\n{", + "\n private double AmortizationFactor => GetScope(Identity, o => o.WithContext(EconomicBasis)).Value;", + "\n private double AggregatedDeferrable => GetScope((Identity, InputSource.Actual)).Values", + "\n .Sum(aocStep => GetScope(Identity with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}).Value);", + "\n double DeferrableActual.Value => -1d * AggregatedDeferrable * AmortizationFactor;", + "\n}", + "\n", + "\npublic interface EndOfPeriodDeferrable : DeferrableActual", + "\n{", + "\n double DeferrableActual.Value => GetScope((Identity, InputSource.Actual)).Values", + "\n .Sum(aocStep => GetScope(Identity with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}).Value);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "An example of Deferrable Actual figures can be found [here](../Test/SpecificationsImportActuals#deferrable-actual)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Contractual Service Margin, Loss Component and Loss Recovery Component", + "\n", + "\nThe Contractual Service Margin ($CSM$) denotes the unearned profit from an insurance contract or group of insurance contracts and plays a critical role in the calculation of profit & loss values. Similarly, the unearned loss is denoted by Loss Component ($LC$), Loss Recovery Component in the case of reinsurance contracts." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Experience Adjustment on Premium" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Experience Adjustment (EA) on Premiums weights the cash-flow (CF aocSteps) for premium amount types by the PremiumAllocationFactor input for each group of insurance contract. ", + "\nThe contributions of present values and actuals are computed separately.", + "\n", + "\n$$", + "\nEA (\\rm{PV}) = \\text{Premium Allocation Factor} \\cdot \\big( PV (\\text{AocType = CF}) \\big)~, \\\\", + "\n$$", + "\n$$", + "\nEA (\\text{Actual}) = \\text{Premium Allocation Factor} \\cdot \\big( \\text{Actual}(\\text{AocType = CF}) + \\text{Advance Actual}(\\text{AocType = CF})+ \\text{Overdue Actual}(\\text{AocType = CF}) \\big) ~,", + "\n$$", + "\nwhere amount type premium and its children are considered, novelties in-force and new business are considered for $PV$ whereas novelty combined is considered for Actual. The allocation is always done in the finest granularity (novelty, line of business, ..) possible." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface BeExperienceAdjustmentForPremium : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s", + "\n .WithApplicability(x => x.Identity.AocType != AocTypes.CF));", + "\n", + "\n string EstimateType => EstimateTypes.BEPA;", + "\n string EconomicBasis => EconomicBases.L;", + "\n ", + "\n PresentValue[] ByAmountType => GetStorage().GetPremiums().Select(pr => GetStorage().GetPremiumAllocationFactor(Identity) * GetScope((Identity, pr, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis))).ToArray(); ", + "\n}", + "\n", + "\npublic interface DefaultValueBeExperienceAdjustmentForPremium : BeExperienceAdjustmentForPremium", + "\n{", + "\n PresentValue[] BeExperienceAdjustmentForPremium.ByAmountType => Enumerable.Empty().ToArray();", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface ActualExperienceAdjustmentForPremium : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s", + "\n .WithApplicability(x => x.Identity.AocType != AocTypes.CF));", + "\n ", + "\n public ActualBase[] ByAmountTypeAndEstimateType => GetStorage().GetPremiums().SelectMany(pr => ", + "\n GetStorage().ExperienceAdjustEstimateTypeMapping.Keys", + "\n .Select(et => GetStorage().GetPremiumAllocationFactor(Identity) * ", + "\n GetScope((Identity, pr, et, (int?)null)))).ToArray(); ", + "\n}", + "\n", + "\npublic interface DefaultValueActualExperienceAdjustmentForPremium : ActualExperienceAdjustmentForPremium", + "\n{", + "\n ActualBase[] ActualExperienceAdjustmentForPremium.ByAmountTypeAndEstimateType => Enumerable.Empty().ToArray();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Technical Margin", + "\n", + "\nFor the computation of the $CSM$ or $LC$ component values for each step of the [AoC Step Structure](#aoc-step-structure), it is convenient to introduce the ", + "\nnotion of technical margin $TM$. In the case of BBA methodology, the Locked-in interest rates discounting is applied to obtain the PV and RA values.", + "\n", + "\nThis can be summarized as follows:", + "\n", + "\n$$", + "\nTM(s) = \\left\\{", + "\n\\begin{array}{rl}", + "\nTM(\\rm{EOP}) \\text{ of the previous period} ~ & \\text{if }s = \\text{BOP and Novelty is In-Force}.", + "\n\\\\", + "\n0 ~ & \\text{if }s = \\text{CF}.", + "\n\\\\", + "\nIAF \\cdot~\\text{Aggregated}~TM(\\text{IA}) ~ & \\text{if }s = \\text{IA and Novelty is In-Force}.", + "\n\\\\", + "\n\\rm{Premiums} + \\text{Attributable Expense and Commissions} + \\text{Investment Claims} ~ & \\text{if }s = \\text{EA}.", + "\n\\\\", + "\n-AF \\cdot~\\text{Aggregated}~TM(\\text{AM})~ & \\text{if }s = \\text{AM}.", + "\n\\\\", + "\n\\text{PV}(\\text{s})\\bigg|_{\\substack{\\text{Non Attributable} \\\\ \\text{Amount Types} \\\\ \\text{excluded}}} ", + "\n+ \\text{RA}(\\text{s})~ & \\text{otherwise} ", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere", + "\n", + "\n$$", + "\n\\text{Aggregated}~TM (\\text{AoC step}) = \\sum_{s\\in\\text{ previous AoC steps}} TM(s)~.", + "\n$$", + "\n", + "\nand the Interest Accretion Factor ($IAF$) is given by", + "\n", + "\n$$", + "\nIAF = \\prod_{i=1}^{TS} \\text{Interest}_i - 1", + "\n$$", + "\n", + "\nwhere $\\text{Interest}_i$ is the monthly interest factor obtained from the [Yield Curve](#yield-curves) and $TS$ is the Time-Step.", + "\n", + "\nFinally, the Premiums, Attributable Expense and Commissions and Investment Claims terms are given by:", + "\n", + "\n$$", + "\n\\rm{Premiums} = \\sum_{\\text{Amount Type}\\in\\{\\text{PR and its children}\\}}", + "\nEA(\\rm{PV}) - EA(\\text{Actual}) ~,", + "\n$$", + "\n", + "\n$$", + "\n\\text{Attributable Expense and Commissions} = \\sum_{\\text{Amount Type}\\in\\{\\rm{ACA}, \\rm{AEA}\\}}", + "\n\\big(PV_{\\text{Novelty = I}} + PV_{\\text{Novelty = N}} \\big) - \\text{Actual}_{\\text{Novelty=C}} ~,", + "\n$$", + "\n", + "\n$$", + "\n\\text{Investment Claims } = \\sum_{\\text{Amount Type}\\in\\{\\text{ICO and its children}\\}}", + "\n\\big(PV_{\\text{Novelty = I}} + PV_{\\text{Novelty = N}} \\big) - \\big( \\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}}+ \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~,", + "\n$$", + "\n", + "\nwhere the AoC Step **CF** is implicit for all formulas, $PV$ is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **AA**, and **OA** (see details [here](#actual-values))." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface TechnicalMargin : IScope", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) => ", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.ValuationApproach == ValuationApproaches.VFA, p => p.ForMember(s => s.EconomicBasis))", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.BOP && x.Identity.Novelty == Novelties.I)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.IA && x.Identity.Novelty == Novelties.I)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.EA && !x.Identity.IsReinsurance)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.AM)", + "\n );", + "\n ", + "\n [NotVisible] string EconomicBasis => EconomicBases.L;", + "\n ", + "\n double Value => GetScope(Identity.DataNode).BeAmountTypes", + "\n .Except(GetStorage().GetNonAttributableAmountType())", + "\n .Sum(at => GetScope((Identity, at, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) +", + "\n GetScope(Identity).Value;", + "\n ", + "\n double AggregatedValue => GetScope((Identity, InputSource.Cashflow)).Values", + "\n .Sum(aoc => GetScope(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);", + "\n}", + "\n", + "\npublic interface TechnicalMarginForCurrentBasis : TechnicalMargin", + "\n{", + "\n [NotVisible] string TechnicalMargin.EconomicBasis => EconomicBases.C;", + "\n}", + "\n", + "\npublic interface TechnicalMarginForBOP : TechnicalMargin", + "\n{", + "\n private double ValueCsm => GetStorage().GetValue(Identity, null, EstimateTypes.C, null);", + "\n private double ValueLc => GetStorage().GetValue(Identity, null, EstimateTypes.L, null);", + "\n private double ValueLr => GetStorage().GetValue(Identity, null, EstimateTypes.LR, null);", + "\n ", + "\n double TechnicalMargin.Value => -1d * ValueCsm + ValueLc + ValueLr;", + "\n}", + "\n", + "\npublic interface TechnicalMarginDefaultValue : TechnicalMargin", + "\n{", + "\n double TechnicalMargin.Value => default;", + "\n}", + "\n", + "\npublic interface TechnicalMarginForIA : TechnicalMargin", + "\n{", + "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.Id.ProjectionPeriod", + "\n private int shift => GetStorage().GetShift(0);//Identity.Id.ProjectionPeriod", + "\n ", + "\n private double[] monthlyInterestFactor => GetScope(Identity, o => o.WithContext(EconomicBasis)).Interest;", + "\n ", + "\n private double interestAccretionFactor => Enumerable.Range(shift,timeStep)", + "\n .Select(i => GetElementOrDefault(monthlyInterestFactor, i/12))", + "\n .Aggregate(1d, (x, y) => x * y ) - 1d;", + "\n ", + "\n double TechnicalMargin.Value => AggregatedValue * interestAccretionFactor;", + "\n}", + "\n", + "\npublic interface TechnicalMarginForEA : TechnicalMargin", + "\n{", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilderInner(ApplicabilityBuilder builder) => ", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.IsReinsurance));", + "\n ", + "\n private string referenceAocType => GetScope(Identity).Value.AocType;", + "\n ", + "\n private double premiums => GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", + "\n .Sum(n => GetScope(Identity with {AocType = referenceAocType, Novelty = n}).ByAmountType.Sum(sc => sc.Value)) -", + "\n GetScope(Identity with {AocType = referenceAocType, Novelty = Novelties.C}).ByAmountTypeAndEstimateType.Sum(sc => sc.Value);", + "\n ", + "\n private double attributableExpenseAndCommissions => GetStorage().GetAttributableExpenseAndCommissionAmountType().Sum(d =>", + "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", + "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, d, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", + "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, d, EstimateTypes.A, (int?)null)).Value);", + "\n", + "\n private double investmentClaims => GetStorage().GetInvestmentClaims().Sum(ic =>", + "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", + "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, ic, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", + "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.A, (int?)null)).Value - ", + "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.AA, (int?)null)).Value -", + "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.OA, (int?)null)).Value);", + "\n ", + "\n double TechnicalMargin.Value => premiums + attributableExpenseAndCommissions + investmentClaims;", + "\n}", + "\n", + "\npublic interface TechnicalMarginForAM : TechnicalMargin", + "\n{", + "\n double TechnicalMargin.Value => -1d * AggregatedValue * GetScope(Identity, o => o.WithContext(EconomicBasis)).Value;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Switch Logic", + "\n ", + "\nThe $CSM$ and $LC$ components are computed from the [technical margin](#technical-margin). In particular, for a given AoC step $s$, TM is allocated to the $LC$ when $\\text{Aggregated } TM$ is positive whereas it is allocated to the $CSM$ when $\\text{Aggregated } TM$ is negative:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\nCSM({\\text{Aoc step}}) = 0,~~ LC({\\text{AoC step}}) = TM({\\text{AoC step}}) ~ & \\text{if }\\text{Aggregated }TM({\\text{AoC step}}) > 0.", + "\n\\\\", + "\nCSM({\\text{Aoc step}}) = - TM({\\text{AoC step}}),~~ LC({\\text{AoC step}}) = 0 ~ & \\text{otherwise} ", + "\n\\end{array}", + "\n$$", + "\n", + "\n", + "\nThe figures reported under CSM are the opposite of the TM value in order to satisfy our sign convention.", + "\n", + "\nIt is possible to switch from $CSM$ to $LC$ and from $LC$ to $CSM$ at any AoC step $s$ with the only exception of **Amortization** where there is no switch from the previous step.", + "\nWhen a switch occurs the total contribution to the $CSM$ ($LC$) prior the switching step is brought to 0 and the remaing amount is allocated to $LC$ ($CSM$).", + "\n", + "\n", + "\n### Gross case (i.e. no reinsurance)", + "\n", + "\nThe switch logic is applied ***separately*** to the In-Force and New Business novelties. The Combined Liability Aoc Step **CL** will bring both contributions to CSM and LC together as the novelities are summed up.", + "\n", + "\nIn detail, and as we go through the AoC steps in the AoC chain, we have", + "\n", + "\n**A)** For the **BOP**:", + "\n$$", + "\n\\begin{array}{rl}", + "\nCSM(\\text{BOP}) &= CSM(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", + "\n\\\\", + "\nLC(\\text{BOP}) &= LC(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", + "\n\\end{array}", + "\n$$", + "\n", + "\n", + "\n**B)** For the **following AoC steps**, the switch logic is preferably formulated using the delta variations between steps, $\\Delta CSM$ and $\\Delta LC$ for the CSM and the LC respectively.", + "\n", + "\nThe switch logic for these AoC steps with the *exception* of Combined Liability is:", + "\n", + "\nIf $\\text{Aggregated }TM(\\text{AoC Step}) > 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) \\le 0$, then there is a switch from $LC$ to $CSM$:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step}) -\\text{Aggregated } TM(\\text{AoC Step})", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= -\\text{Aggregated } TM(\\text{AoC Step}) ", + "\n\\end{array}", + "\n$$", + "\n", + "\nOn the other hand, if $\\text{Aggregated }TM(\\text{AoC Step}) \\le 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) > 0$, then the switch is from $CSM$ to $LC$:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= \\text{Aggregated } TM(\\text{AoC Step}) ", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= TM(\\text{AoC Step}) + \\text{Aggregated } TM(\\text{AoC Step}) ", + "\n\\end{array}", + "\n$$", + "\n", + "\nIf there is no switch from $CSM$, i.e. $\\text{Aggregated }TM(\\text{AoC Step}) \\le 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) \\le 0 $, then:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step})", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= 0", + "\n\\end{array}", + "\n$$", + "\n", + "\nAnd finally, if there is no switch from $LC$, i.e. $\\text{Aggregated }TM(\\text{AoC Step}) > 0$ and $\\text{Aggregated }TM(\\text{AoC Step}) + TM(\\text{AoC Step}) \\ge 0 $, then:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= 0", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= TM(\\text{AoC Step})", + "\n\\end{array}", + "\n$$", + "\n", + "\n**C)** For the AoC step Combined Liability **CL**, the switch logic is similar to the one above, except that a switch from $LC$ to $CSM$ can happen **because of New Business and despite of In-Force**, in which case we have:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step}) -\\big(\\text{Aggregated } TM(\\text{Last In-Force AoC step})+TM(\\text{Last In-Force AoC step}) \\big)", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= -\\big(\\text{Aggregated } TM(\\text{Last In-Force AoC step}) + TM(\\text{Last In-Force AoC step}) \\big)", + "\n\\end{array}", + "\n$$", + "\n", + "\nIf, on the other hand, the switch from $LC$ to $CSM$ happens **because of In-Force and despite of New Business**, then we have:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\n\\Delta CSM(\\text{AoC step}) &= -TM(\\text{AoC Step}) -\\big(\\text{Aggregated } TM(\\text{Last NB AoC step})+TM(\\text{Last NB AoC step}) \\big)", + "\n\\\\", + "\n\\Delta LC(\\text{AoC step}) &= -\\big(\\text{Aggregated } TM(\\text{Last NB AoC step}) + TM(\\text{Last NB AoC step}) \\big)", + "\n\\end{array}", + "\n$$", + "\n", + "\nFor the switch in the other direction, i.e. from $CSM$ to $LC$ the formulas are similar except that LC and CSM are swapped.", + "\n", + "\n**D)** Finally, for the last AoC step, the **EOP**, we have:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\nCSM(\\text{EOP}) &= \\sum_{s~\\in~\\text{previous AoC steps}}\\Delta CSM(s)", + "\n\\\\", + "\nLC(\\text{EOP}) &= \\sum_{s~\\in~\\text{previous AoC steps}}\\Delta LC(s)", + "\n\\end{array}", + "\n$$", + "\n", + "\n", + "\n### Reinsurance case", + "\n", + "\nFor the reinsurance case, the switch logic is identical to the one described above, except that it uses the gross Technical Margins multiplied by the weights coming from the Reinsurance Coverage Parameter (see [Data Node Parameters](../DataModel/DataStructure#data-node-parameters)). In case a GRIC has multiple GICs, then these weighted $TM$s are aggregated." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface AllocateTechnicalMargin: IScope", + "\n{", + "\n //Switch", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) => ", + "\n builder.ForScope(s => s", + "\n .WithApplicability(x => x.Identity.IsReinsurance && x.Identity.AocType == AocTypes.CL) ", + "\n .WithApplicability(x => x.Identity.IsReinsurance, ", + "\n p => p.ForMember(s => s.ComputedEstimateType)", + "\n .ForMember(s => s.HasSwitch))", + "\n .WithApplicability(x => x.GetStorage().IsSecondaryScope(x.Identity.DataNode)) ", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.BOP)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.CL)", + "\n .WithApplicability(x => x.Identity.AocType == AocTypes.EOP)", + "\n );", + "\n ", + "\n [NotVisible] double AggregatedTechnicalMargin => GetScope(Identity).AggregatedValue; ", + "\n [NotVisible] double TechnicalMargin => GetScope(Identity).Value;", + "\n ", + "\n [NotVisible] string ComputedEstimateType => ComputeEstimateType(GetScope(Identity).AggregatedValue + TechnicalMargin);", + "\n [NotVisible] bool HasSwitch => ComputedEstimateType != ComputeEstimateType(GetScope(Identity).AggregatedValue);", + "\n ", + "\n //Allocate ", + "\n [NotVisible] string EstimateType => GetContext();", + "\n ", + "\n double Value => (HasSwitch, EstimateType == ComputedEstimateType) switch {", + "\n (true, true) => TechnicalMargin + AggregatedTechnicalMargin,", + "\n (true, false) => -1d * AggregatedTechnicalMargin,", + "\n (false, true) => TechnicalMargin,", + "\n _ => default", + "\n };", + "\n ", + "\n string ComputeEstimateType(double aggregatedTechnicalMargin) => aggregatedTechnicalMargin > Precision ? EstimateTypes.L : EstimateTypes.C;", + "\n}", + "\n", + "\npublic interface ComputeAllocateTechnicalMarginWithIfrsVariable : AllocateTechnicalMargin", + "\n{ ", + "\n double AllocateTechnicalMargin.TechnicalMargin => ComputeTechnicalMarginFromIfrsVariables(Identity);", + "\n double AllocateTechnicalMargin.AggregatedTechnicalMargin => GetScope((Identity, InputSource.Cashflow)).Values", + "\n .Sum(aoc => ComputeTechnicalMarginFromIfrsVariables(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}));", + "\n ", + "\n private double ComputeTechnicalMarginFromIfrsVariables(ImportIdentity id)", + "\n {", + "\n return GetStorage().GetValue(Identity, null, EstimateTypes.LR, null) +", + "\n GetStorage().GetValue(Identity, null, EstimateTypes.L, null) - ", + "\n GetStorage().GetValue(Identity, null, EstimateTypes.C, null);", + "\n }", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForReinsurance : AllocateTechnicalMargin", + "\n{ ", + "\n //TODO add Reinsurance Coverage Update (RCU, Novelty=I) AocStep", + "\n private IEnumerable underlyingGic => GetStorage().GetUnderlyingGic(Identity);", + "\n ", + "\n private double weightedUnderlyingTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", + "\n GetScope(Identity with {DataNode = gic}).TechnicalMargin);", + "\n ", + "\n private double weightedUnderlyingAggregatedTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", + "\n GetScope(Identity with {DataNode = gic}).AggregatedTechnicalMargin);", + "\n ", + "\n private string ComputeReinsuranceEstimateType(double aggregatedFcf) => aggregatedFcf > Precision ? EstimateTypes.LR : EstimateTypes.C;", + "\n ", + "\n [NotVisible] string AllocateTechnicalMargin.ComputedEstimateType => ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM + weightedUnderlyingTM);", + "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => ComputedEstimateType != ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM); ", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForReinsuranceCL : AllocateTechnicalMargin", + "\n{ ", + "\n //In common1", + "\n private IEnumerable underlyingGic => GetStorage().GetUnderlyingGic(Identity);", + "\n ", + "\n private double weightedUnderlyingTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", + "\n GetScope(Identity with {DataNode = gic}).TechnicalMargin);", + "\n ", + "\n private double weightedUnderlyingAggregatedTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", + "\n GetScope(Identity with {DataNode = gic}).AggregatedTechnicalMargin);", + "\n private string ComputeReinsuranceEstimateType(double aggregatedFcf) => aggregatedFcf > Precision ? EstimateTypes.LR : EstimateTypes.C;", + "\n ", + "\n string AllocateTechnicalMargin.ComputedEstimateType => ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM + weightedUnderlyingTM);", + "\n //In common2", + "\n private double balancingValue => GetScope((Identity, InputSource.Cashflow))", + "\n .Values", + "\n .GroupBy(x => x.Novelty)", + "\n .Select(g => g.Last())", + "\n .Sum(aoc => { ", + "\n var id = Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty};", + "\n return GetScope(id).ComputedEstimateType != ComputedEstimateType ? ", + "\n GetScope(id).TechnicalMargin + GetScope(id).AggregatedTechnicalMargin", + "\n : (double)default; });", + "\n ", + "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => Math.Abs(balancingValue) > Precision;", + "\n [NotVisible] double AllocateTechnicalMargin.AggregatedTechnicalMargin => balancingValue; ", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForCl : AllocateTechnicalMargin", + "\n{", + "\n private double balancingValue => GetScope((Identity, InputSource.Cashflow))", + "\n .Values", + "\n .GroupBy(x => x.Novelty)", + "\n .Select(g => g.Last())", + "\n .Sum(aoc => { ", + "\n var id = Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty};", + "\n return GetScope(id).ComputedEstimateType != ComputedEstimateType ? ", + "\n GetScope(id).TechnicalMargin + GetScope(id).AggregatedTechnicalMargin", + "\n : (double)default; });", + "\n", + "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => Math.Abs(balancingValue) > Precision;", + "\n ", + "\n [NotVisible] double AllocateTechnicalMargin.AggregatedTechnicalMargin => balancingValue;", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForBop : AllocateTechnicalMargin", + "\n{ ", + "\n bool AllocateTechnicalMargin.HasSwitch => false;", + "\n}", + "\n", + "\npublic interface AllocateTechnicalMarginForEop : AllocateTechnicalMargin", + "\n{", + "\n double AllocateTechnicalMargin.Value => GetScope((Identity, InputSource.Cashflow)).Values", + "\n .Sum(aoc => GetScope(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);", + "\n [NotVisible] string AllocateTechnicalMargin.ComputedEstimateType => ComputeEstimateType(AggregatedTechnicalMargin);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For the **Group of Reinsurance Contracts** (GRICs), the switch is computed within the underlying GIC context and $CSM$ and $LR$ are then computed in the same manner as for the underlying GICs CSM and LC." + ] + }, + { + "cell_type": "markdown", + "source": [ + "The scopes below are simply used to set the appropriate Estimate Type (C for $CSM$, L for $LC$ and LR for $LCR$), as well as to set $CSM$ values to be positive:" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Csm : IScope", + "\n{", + "\n [NotVisible]string EstimateType => EstimateTypes.C;", + "\n ", + "\n double Value => -1d * GetScope(Identity, o => o.WithContext(EstimateType)).Value;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Lc : IScope", + "\n{", + "\n [NotVisible]string EstimateType => EstimateTypes.L;", + "\n ", + "\n double Value => GetScope(Identity, o => o.WithContext(EstimateType)).Value;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface LoReCo : IScope", + "\n{ ", + "\n [NotVisible]string EstimateType => EstimateTypes.LR;", + "\n ", + "\n double Value => GetScope(Identity, o => o.WithContext(EstimateType)).Value;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Computing All Scopes", + "\n", + "\nSince all the calculations defined in the various scopes are to be performed together, it is useful to introduce the scope ComputeAllScopes below, which given a certain Import Identity and Import Storage, performs all the calculations (defined above) based on the corresponding data:" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface ComputeAllScopes: IScope //ComputeIfrsVariable", + "\n{", + "\n IEnumerable PvLocked => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n EstimateType = x.Identity.CalculationType, ", + "\n DataNode = x.Identity.Id.DataNode, ", + "\n AocType = x.Identity.Id.AocType, ", + "\n Novelty = x.Identity.Id.Novelty, ", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable PvCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n EstimateType = x.Identity.CalculationType, ", + "\n DataNode = x.Identity.Id.DataNode, ", + "\n AocType = x.Identity.Id.AocType, ", + "\n Novelty = x.Identity.Id.Novelty, ", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable RaCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n EstimateType = x.Identity.CalculationType, ", + "\n DataNode = x.Identity.Id.DataNode, ", + "\n AocType = x.Identity.Id.AocType, ", + "\n Novelty = x.Identity.Id.Novelty, ", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = null,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable RaLocked => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n EstimateType = x.Identity.CalculationType, ", + "\n DataNode = x.Identity.Id.DataNode, ", + "\n AocType = x.Identity.Id.AocType, ", + "\n Novelty = x.Identity.Id.Novelty, ", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = null,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n private string EconomicBasis => Identity.ValuationApproach == ValuationApproaches.VFA ? EconomicBases.C : EconomicBases.L;", + "\n private IEnumerable amortizationFactor => Identity.AocType == AocTypes.AM", + "\n ? GetScope(Identity, o => o.WithContext(EconomicBasis))", + "\n .RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n EconomicBasis = x.EconomicBasis,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n })", + "\n : Enumerable.Empty();", + "\n IEnumerable Actual => GetScope(Identity).Actuals.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.Identity.EstimateType,", + "\n DataNode = x.Identity.Id.DataNode,", + "\n AocType = x.Identity.Id.AocType,", + "\n Novelty = x.Identity.Id.Novelty,", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable AdvanceActual => GetScope(Identity).Actuals.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.Identity.EstimateType,", + "\n DataNode = x.Identity.Id.DataNode,", + "\n AocType = x.Identity.Id.AocType,", + "\n Novelty = x.Identity.Id.Novelty,", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable OverdueActual => GetScope(Identity).Actuals.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.Identity.EstimateType,", + "\n DataNode = x.Identity.Id.DataNode,", + "\n AocType = x.Identity.Id.AocType,", + "\n Novelty = x.Identity.Id.Novelty,", + "\n AccidentYear = x.Identity.AccidentYear,", + "\n AmountType = x.Identity.AmountType,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n IEnumerable DeferrableActual => GetScope(Identity).RepeatOnce().Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n AccidentYear = null,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n ", + "\n IEnumerable BeEAForPremium => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", + "\n || Identity.IsReinsurance", + "\n ? Enumerable.Empty()", + "\n : GetScope(Identity)", + "\n .ByAmountType", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(sc => new IfrsVariable{ EstimateType = GetScope(Identity).EstimateType, ", + "\n DataNode = sc.Identity.Id.DataNode, ", + "\n AocType = sc.Identity.Id.AocType, ", + "\n Novelty = sc.Identity.Id.Novelty, ", + "\n AccidentYear = sc.Identity.AccidentYear,", + "\n EconomicBasis = sc.EconomicBasis,", + "\n AmountType = sc.Identity.AmountType,", + "\n Value = sc.Value,", + "\n Partition = sc.GetStorage().TargetPartition });", + "\n ", + "\n IEnumerable ActEAForPremium => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", + "\n || Identity.IsReinsurance", + "\n ? Enumerable.Empty()", + "\n : GetScope(Identity)", + "\n .ByAmountTypeAndEstimateType", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(sc => new IfrsVariable{ EstimateType = GetStorage().ExperienceAdjustEstimateTypeMapping[sc.Identity.EstimateType], ", + "\n DataNode = sc.Identity.Id.DataNode, ", + "\n AocType = sc.Identity.Id.AocType, ", + "\n Novelty = sc.Identity.Id.Novelty, ", + "\n AccidentYear = sc.Identity.AccidentYear,", + "\n //EconomicBasis = scope.EconomicBasis,", + "\n AmountType = sc.Identity.AmountType,", + "\n Value = sc.Value,", + "\n Partition = GetStorage().TargetPartition });", + "\n ", + "\n IEnumerable Csms => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", + "\n ? Enumerable.Empty()", + "\n : GetScope(Identity).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n", + "\n IEnumerable Loss => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", + "\n ? Enumerable.Empty()", + "\n : Identity.IsReinsurance ", + "\n ? GetScope(Identity).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n })", + "\n : GetScope(Identity).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", + "\n DataNode = x.Identity.DataNode,", + "\n AocType = x.Identity.AocType,", + "\n Novelty = x.Identity.Novelty,", + "\n Value = x.Value,", + "\n Partition = GetStorage().TargetPartition", + "\n });", + "\n", + "\n /*private double validateSingleEoP => Math.Abs(ValueCsm) > Precision && Math.Abs(ValueLc) > Precision ", + "\n ? (double)ApplicationMessage.Log(Error.MultipleEoP)", + "\n : default;", + "\n */", + "\n IEnumerable CalculatedIfrsVariables => GetStorage().ImportFormat switch {", + "\n ImportFormats.Actual => Actual.Concat(AdvanceActual).Concat(OverdueActual).Concat(ActEAForPremium)", + "\n .Concat(DeferrableActual).Concat(Csms).Concat(Loss),", + "\n ImportFormats.Cashflow => PvLocked.Concat(PvCurrent).Concat(RaCurrent).Concat(RaLocked)", + "\n .Concat(amortizationFactor).Concat(BeEAForPremium)", + "\n .Concat(DeferrableActual).Concat(Csms).Concat(Loss),", + "\n ImportFormats.Opening => AdvanceActual.Concat(OverdueActual).Concat(DeferrableActual)", + "\n .Concat(Csms).Concat(Loss),", + "\n };", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Import/ImportStorage.ipynb b/Import/ImportStorage.ipynb index 557210ec..ea1af2cc 100644 --- a/Import/ImportStorage.ipynb +++ b/Import/ImportStorage.ipynb @@ -1,387 +1,371 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "zXp-Bu79BE-93BUbDiTYAg", - "cell_type": "markdown", - "source": [ - "", - "\n

Import Storage

", - "\n", - "\nThe Import Storage collects the following data upon import of a file:", - "\n", - "\n- Current Period (year, month)", - "\n- Previous Period", - "\n- [Partitions](../DataModel/DataStructure)", - "\n- [RawVariables](../DataModel/DataStructure)", - "\n- [IfrsVariables](../DataModel/DataStructure)", - "\n- [Projection Configuration](../DataModel/DataStructure)", - "\n- [YieldCurve](../DataModel/DataStructure)", - "\n- [AocType](../DataModel/DataStructure)", - "\n- [AmountType](../DataModel/DataStructure)", - "\n- [CalculationType](../DataModel/DataStructure)", - "\n- [DataNodes](../DataModel/DataStructure)", - "\n", - "\nSuch storage is then passed to calculations defined in the corresponding [Import Scopes](./ImportScopeCalculation)." - ], - "metadata": {} - }, - { - "id": "BBcl8VllBE2yH3necdNVxQ", - "cell_type": "code", - "source": [ - "#!import \"../Utils/UtilityMethods\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "aIs6_wKUtEKp2vLJAPpVpQ", - "cell_type": "markdown", - "source": [ - "# Import Storage" - ], - "metadata": {} - }, - { - "id": "kigCPC7MoEy40WWR1LAtFA", - "cell_type": "code", - "source": [ - "public class ImportStorage", - "\n{ ", - "\n private readonly IDataSource querySource; ", - "\n private readonly IWorkspace workspace;", - "\n private readonly Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache;", - "\n private readonly ImportArgs args;", - "\n ", - "\n // Constants", - "\n private static int periodicityInMonths => 3; // Revisit", - "\n ", - "\n //Format", - "\n public string ImportFormat => args.ImportFormat; ", - "\n ", - "\n //Time Periods ", - "\n public (int Year, int Month) CurrentReportingPeriod => (args.Year, args.Month);", - "\n public (int Year, int Month) PreviousReportingPeriod => (args.Year - 1, MonthInAYear); // YTD Logic", - "\n", - "\n //Partitions", - "\n public Guid PartitionByRn;", - "\n public Guid TargetPartition;", - "\n public Guid DefaultPartition;", - "\n public Guid PreviousPeriodPartition; ", - "\n", - "\n //Projections", - "\n private ProjectionConfiguration[] ProjectionConfiguration;", - "\n ", - "\n //DataNodes", - "\n public IDictionary DataNodeDataBySystemName { get; private set; }", - "\n public IDictionary> DataNodesByImportScope { get; private set; }", - "\n public IDictionary> AccidentYearsByDataNode { get; private set; }", - "\n //Variables", - "\n public IDictionary> RawVariablesByImportIdentity { get; private set; }", - "\n public IDictionary> IfrsVariablesByImportIdentity { get; private set; }", - "\n ", - "\n //Parameters", - "\n public Dictionary LockedInYieldCurve { get; private set; }", - "\n public Dictionary> CurrentYieldCurve { get; private set; }", - "\n public Dictionary> PartnerRating { get; private set; }", - "\n public Dictionary> CreditDefaultRates { get; private set; }", - "\n public Dictionary> SingleDataNodeParametersByGoc { get; private set; }", - "\n public Dictionary>> InterDataNodeParametersByGoc { get; private set; }", - "\n public Dictionary AocConfigurationByAocStep { get; private set; }", - "\n ", - "\n private Dictionary> aocStepByInputSource;", - "\n ", - "\n //Dimensions", - "\n public Dictionary AmountTypeDimension { get; private set; }", - "\n public Dictionary NoveltyDimension { get; private set; }", - "\n public Dictionary CalculationTypeDimension { get; private set; }", - "\n public Dictionary EstimateTypeDimension { get; private set; }", - "\n public Dictionary> EstimateTypesByImportFormat { get; private set; }", - "\n public Dictionary ExperienceAdjustEstimateTypeMapping { get; private set; } ", - "\n ", - "\n //Constructor", - "\n public ImportStorage(ImportArgs args, IDataSource querySource, IWorkspace workspace)", - "\n {", - "\n this.querySource = querySource;", - "\n this.workspace = workspace;", - "\n hierarchyCache = workspace.ToHierarchicalDimensionCache();", - "\n this.args = args;", - "\n }", - "\n ", - "\n //Initialize", - "\n public async Task InitializeAsync()", - "\n { ", - "\n //Dimensions", - "\n var estimateTypes = (await workspace.Query().ToArrayAsync());", - "\n ", - "\n EstimateTypeDimension = estimateTypes.ToDictionary(x => x.SystemName);", - "\n AmountTypeDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", - "\n NoveltyDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", - "\n CalculationTypeDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", - "\n ", - "\n ExperienceAdjustEstimateTypeMapping = new Dictionary{{EstimateTypes.A, EstimateTypes.APA}, {EstimateTypes.AA, EstimateTypes.AAPA}, {EstimateTypes.OA, EstimateTypes.OAPA}}; //TODO move this logic", - "\n ", - "\n //Hierarchy Cache", - "\n hierarchyCache.Initialize();", - "\n ", - "\n //EstimateType to load and to update", - "\n EstimateTypesByImportFormat = new InputSource[] { InputSource.Opening, InputSource.Actual, InputSource.Cashflow,}", - "\n .ToDictionary(x => x.ToString(), ", - "\n x => estimateTypes", - "\n .Where(et => et.InputSource.Contains(x))", - "\n .Select(et => et.SystemName)", - "\n .ToHashSet());", - "\n ", - "\n //ProjectionConfiguration : Current Period + projection for every Quarter End for current Year and next Years as in projectionConfiguration.csv", - "\n ProjectionConfiguration = (await workspace.Query()", - "\n .Where(x => x.Shift > 0 || x.TimeStep == args.Month || (x.TimeStep > args.Month && x.TimeStep % periodicityInMonths == 0))", - "\n .OrderBy(x => x.Shift).ThenBy(x => x.TimeStep).ToArrayAsync());", - "\n ", - "\n //Get Partitions", - "\n PartitionByRn = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode).ToArrayAsync()).Single().Id;", - "\n TargetPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", - "\n p.Year == CurrentReportingPeriod.Year &&", - "\n p.Month == CurrentReportingPeriod.Month &&", - "\n p.Scenario == args.Scenario).ToArrayAsync()).Single().Id;", - "\n DefaultPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", - "\n p.Year == CurrentReportingPeriod.Year &&", - "\n p.Month == CurrentReportingPeriod.Month &&", - "\n p.Scenario == null).ToArrayAsync()).Single().Id;", - "\n //Set Partitions", - "\n await querySource.Partition.SetAsync(PartitionByRn);", - "\n await workspace.Partition.SetAsync(PartitionByRn);", - "\n ", - "\n await querySource.Partition.SetAsync(TargetPartition);", - "\n await workspace.Partition.SetAsync(TargetPartition);", - "\n ", - "\n //Get data from Workspace (result of parsing)", - "\n var parsedRawVariables = await workspace.Query().ToArrayAsync();", - "\n var parsedIfrsVariables = await workspace.Query().ToArrayAsync();", - "\n ", - "\n //DataNodes", - "\n DataNodeDataBySystemName = await workspace.LoadDataNodesAsync(args);", - "\n ", - "\n //Accident Years", - "\n AccidentYearsByDataNode = (IDictionary>)", - "\n (ImportFormat == ImportFormats.Cashflow ? parsedRawVariables.Select(x => new {x.DataNode, x.AccidentYear}) : parsedIfrsVariables.Select(x => new {x.DataNode, x.AccidentYear}))", - "\n .ToDictionaryGrouped(x => x.DataNode, x => (ICollection)x.Select(y => y.AccidentYear).ToHashSet());", - "\n ", - "\n // Import Scopes and Data Node relationship parameters", - "\n InterDataNodeParametersByGoc = await workspace.LoadInterDataNodeParametersAsync(args);", - "\n ", - "\n var primaryScopeFromParsedVariables = (ImportFormat == ImportFormats.Cashflow ? parsedRawVariables.Select(x => x.DataNode) : parsedIfrsVariables.Select(x => x.DataNode)).ToHashSet();", - "\n var primaryScopeFromLinkedReinsurance = primaryScopeFromParsedVariables", - "\n .Where(goc => !DataNodeDataBySystemName[goc].IsReinsurance && DataNodeDataBySystemName[goc].LiabilityType == LiabilityTypes.LRC)", - "\n .SelectMany(goc => InterDataNodeParametersByGoc.TryGetValue(goc, out var interDataNodeParamByPeriod)", - "\n ? interDataNodeParamByPeriod[CurrentPeriod].Select(param => param.DataNode == goc ? param.LinkedDataNode : param.DataNode).Where(goc => !primaryScopeFromParsedVariables.Contains(goc))", - "\n : Enumerable.Empty())", - "\n .ToHashSet();", - "\n ", - "\n var primaryScope = primaryScopeFromParsedVariables.Concat(primaryScopeFromLinkedReinsurance).ToHashSet();", - "\n var secondaryScope = InterDataNodeParametersByGoc", - "\n .Where(kvp => primaryScope.Contains(kvp.Key))", - "\n .SelectMany(kvp => { var linkedGocs = kvp.Value[CurrentPeriod].Select(param => param.DataNode == kvp.Key ? param.LinkedDataNode : param.DataNode);", - "\n return linkedGocs.Where(goc => !primaryScope.Contains(goc));}).ToHashSet();", - "\n var allImportScopes = new HashSet(primaryScope.Concat(secondaryScope));", - "\n ", - "\n DataNodesByImportScope = new Dictionary> { { ImportScope.Primary, primaryScope }, { ImportScope.Secondary, secondaryScope } };", - "\n ", - "\n // Parameters", - "\n PartnerRating = await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Partner);", - "\n CreditDefaultRates = await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.CreditRiskRating);", - "\n SingleDataNodeParametersByGoc = await workspace.LoadSingleDataNodeParametersAsync(args);", - "\n LockedInYieldCurve = await workspace.LoadLockedInYieldCurveAsync(args, allImportScopes.Select(dn => DataNodeDataBySystemName[dn]));", - "\n CurrentYieldCurve = await workspace.LoadCurrentYieldCurveAsync(args, allImportScopes.Select(dn => DataNodeDataBySystemName[dn])); //TODO Rename this variable", - "\n ", - "\n AocConfigurationByAocStep = await querySource.LoadAocStepConfigurationAsDictionaryAsync(args.Year, args.Month); ", - "\n aocStepByInputSource = ((InputSource[])Enum.GetValues(typeof(InputSource))).ToDictionary(x => x,", - "\n x => AocConfigurationByAocStep", - "\n .Where(kvp => kvp.Value.InputSource.Contains(x))", - "\n .Select(kvp => kvp.Key)", - "\n .ToHashSet());", - "\n ", - "\n //Previous Period", - "\n var openingRawVariables = Enumerable.Empty();", - "\n var openingIfrsVariables = Enumerable.Empty();", - "\n", - "\n if(allImportScopes.Select(dn => DataNodeDataBySystemName[dn]).Any(dnd => dnd.Year < args.Year)) {", - "\n PreviousPeriodPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", - "\n p.Year == PreviousReportingPeriod.Year &&", - "\n p.Month == PreviousReportingPeriod.Month &&", - "\n p.Scenario == null).ToArrayAsync()).Single().Id;", - "\n ", - "\n await querySource.Partition.SetAsync(PreviousPeriodPartition);", - "\n ", - "\n //Perform queries to previous Period", - "\n openingRawVariables = (await querySource.Query()", - "\n .Where(rv => rv.Partition == PreviousPeriodPartition && rv.AocType == AocTypes.CL)", - "\n .Where(v => primaryScope.Contains(v.DataNode))", - "\n .ToArrayAsync())", - "\n .Select(rv => rv with {AocType = AocTypes.BOP, Novelty = Novelties.I, Values = rv.Values.Skip(MonthInAYear).ToArray(), Partition = TargetPartition});", - "\n ", - "\n openingIfrsVariables = (await querySource.Query()", - "\n .Where(iv => iv.Partition == PreviousPeriodPartition && iv.AocType == AocTypes.EOP)", - "\n .Where(v => allImportScopes.Contains(v.DataNode))", - "\n .ToArrayAsync())", - "\n .Select(iv => iv with {AocType = AocTypes.BOP, Novelty = Novelties.I, Partition = TargetPartition});", - "\n ", - "\n // TODO: print error if ", - "\n //openingRawVariables.Select(x => x.DataNode).ToHashSet() != dataNodesWithPreviousPeriod", - "\n }", - "\n ", - "\n //SetPartition to current Period", - "\n await querySource.Partition.SetAsync(TargetPartition);", - "\n ", - "\n if(primaryScope.Select(dn => DataNodeDataBySystemName[dn]).Any(dnd => dnd.Year == args.Year) && ImportFormat != ImportFormats.Opening)", - "\n openingIfrsVariables = openingIfrsVariables.Concat(await querySource.Query()", - "\n .Where(iv => iv.Partition == TargetPartition && iv.AocType == AocTypes.BOP && iv.Novelty == Novelties.I)", - "\n .Where(iv => primaryScope.Contains(iv.DataNode) && EstimateTypesByImportFormat[InputSource.Opening.ToString()].Contains(iv.EstimateType) || secondaryScope.Contains(iv.DataNode))", - "\n .ToArrayAsync());", - "\n ", - "\n //Variables", - "\n var rawVariables = parsedRawVariables.Concat(openingRawVariables)", - "\n .Concat(await querySource.Query()", - "\n .Where(rv => rv.Partition == TargetPartition)", - "\n .Where(rv => primaryScopeFromLinkedReinsurance.Contains(rv.DataNode))", - "\n .ToArrayAsync());", - "\n RawVariablesByImportIdentity = (IDictionary>)rawVariables.ToDictionaryGrouped(v => v.DataNode, v => (ICollection)v.ToArray());", - "\n ", - "\n var ifrsVariables = parsedIfrsVariables.Concat(openingIfrsVariables)", - "\n .Concat(await querySource.Query()", - "\n .Where(iv => iv.Partition == TargetPartition && !(iv.AocType == AocTypes.BOP && iv.Novelty == Novelties.I))", - "\n .Where(iv => primaryScopeFromParsedVariables.Contains(iv.DataNode) && !EstimateTypesByImportFormat[ImportFormat].Contains(iv.EstimateType) ", - "\n || primaryScopeFromLinkedReinsurance.Contains(iv.DataNode) ", - "\n || secondaryScope.Contains(iv.DataNode))", - "\n .ToArrayAsync());", - "\n IfrsVariablesByImportIdentity = (IDictionary>)ifrsVariables.ToDictionaryGrouped(v => v.DataNode, v => (ICollection)v.ToArray());", - "\n }", - "\n ", - "\n //Getters", - "\n ", - "\n //Periods", - "\n public ValuationPeriod GetValuationPeriod(ImportIdentity id) => AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].ValuationPeriod;", - "\n public PeriodType GetYieldCurvePeriod(ImportIdentity id) => AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].YcPeriod;", - "\n public PeriodType GetCreditDefaultRiskPeriod(ImportIdentity id) => AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].CdrPeriod;", - "\n ", - "\n public IEnumerable GetAllAocSteps(InputSource source) => aocStepByInputSource[source];", - "\n public IEnumerable GetCalculatedTelescopicAocSteps() => AocConfigurationByAocStep.Where(kvp => kvp.Value.DataType == DataType.CalculatedTelescopic).Select(kvp => kvp.Key);", - "\n ", - "\n //YieldCurve", - "\n public double[] GetYearlyYieldCurve(ImportIdentity id, string economicBasis) {", - "\n var yc = GetYieldCurve(id, economicBasis);", - "\n return yc.Values.Skip(args.Year - yc.Year).ToArray(); //Check if the returned array is empty? Log Warning?", - "\n }", - "\n ", - "\n public YieldCurve GetYieldCurve(ImportIdentity id, string economicBasis) => (economicBasis, GetYieldCurvePeriod(id)) switch {", - "\n (EconomicBases.C, PeriodType.BeginningOfPeriod) => CurrentYieldCurve[DataNodeDataBySystemName[id.DataNode].ContractualCurrency][PreviousPeriod],", - "\n (EconomicBases.C, PeriodType.EndOfPeriod) => CurrentYieldCurve[DataNodeDataBySystemName[id.DataNode].ContractualCurrency][CurrentPeriod],", - "\n (EconomicBases.L, _ ) => LockedInYieldCurve[id.DataNode],", - "\n (_, PeriodType.NotApplicable) => (YieldCurve)ApplicationMessage.Log(Error.YieldCurvePeriodNotApplicable, id.AocType, id.Novelty),", - "\n (_, _) => (YieldCurve)ApplicationMessage.Log(Error.EconomicBasisNotFound, id.DataNode)", - "\n };", - "\n ", - "\n //int Identity.ProjectionPeriod ", - "\n public int GetProjectionCount() => ProjectionConfiguration.Count();", - "\n public int GetShift(int projectionPeriod) => ProjectionConfiguration[projectionPeriod].Shift;", - "\n public int GetTimeStep(int projectionPeriod) => ProjectionConfiguration[projectionPeriod].TimeStep;", - "\n ", - "\n public PeriodType GetPeriodType(string amountType, string calculationType) => ", - "\n amountType != null && AmountTypeDimension.TryGetValue(amountType, out var at) ", - "\n ? at.PeriodType", - "\n : calculationType != null && CalculationTypeDimension.TryGetValue(calculationType, out var ct) ", - "\n ? ct.PeriodType : PeriodType.EndOfPeriod;", - "\n", - "\n //Variables and Cashflows", - "\n public IEnumerable GetRawVariables(string dataNode) => RawVariablesByImportIdentity.TryGetValue(dataNode, out var variableCollection) ? variableCollection : Enumerable.Empty();", - "\n public IEnumerable GetIfrsVariables(string dataNode) => IfrsVariablesByImportIdentity.TryGetValue(dataNode, out var variableCollection) ? variableCollection : Enumerable.Empty();", - "\n ", - "\n public double[] GetValues(ImportIdentity id, Func whereClause) => GetRawVariables(id.DataNode).Where(v => (v.AocType, v.Novelty) == id.AocStep && whereClause(v)).Aggregate()?.Values ?? Enumerable.Empty().ToArray();", - "\n public double GetValue(ImportIdentity id, Func whereClause) => GetIfrsVariables(id.DataNode).Where(v => (v.AocType, v.Novelty) == id.AocStep && whereClause(v)).Aggregate()?.Value ?? 0;", - "\n ", - "\n public double[] GetValues(ImportIdentity id, string amountType, string calculationType, int? accidentYear) => GetValues(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.CalculationType == calculationType);", - "\n public double GetValue(ImportIdentity id, string amountType, string estimateType, int? accidentYear) => GetValue(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.EstimateType == estimateType);", - "\n public double GetValue(ImportIdentity id, string amountType, string estimateType, string economicBasis, int? accidentYear) => GetValue(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.EstimateType == estimateType && v.EconomicBasis == economicBasis);", - "\n ", - "\n //Novelty", - "\n private IEnumerable GetNoveltiesForAocType(string aocType, IEnumerable aocConfiguration) => aocConfiguration.Where(aocStep => aocStep.AocType == aocType).Select(aocStep => aocStep.Novelty);", - "\n public IEnumerable GetNovelties() => NoveltyDimension.Keys;", - "\n public IEnumerable GetNovelties(string aocType) => GetNoveltiesForAocType(aocType, AocConfigurationByAocStep.Keys);", - "\n public IEnumerable GetNovelties(string aocType, InputSource inputSource) => GetNoveltiesForAocType(aocType, aocStepByInputSource[inputSource]);", - "\n ", - "\n //Accident years", - "\n public IEnumerable GetAccidentYears(string dataNode) => AccidentYearsByDataNode.TryGetValue(dataNode, out var accidentYear) ? accidentYear : new int?[] { null };", - "\n ", - "\n // Parameters", - "\n public double GetNonPerformanceRiskRate (ImportIdentity identity) {", - "\n var period = GetCreditDefaultRiskPeriod(identity) == PeriodType.BeginningOfPeriod ? PreviousPeriod : CurrentPeriod;", - "\n ", - "\n if(!DataNodeDataBySystemName.TryGetValue(identity.DataNode, out var dataNodeData)) ApplicationMessage.Log(Error.DataNodeNotFound, identity.DataNode);", - "\n if(dataNodeData.Partner == null) ApplicationMessage.Log(Error.PartnerNotFound, identity.DataNode);", - "\n // if Partner == Internal then return 0;", - "\n if(!PartnerRating.TryGetValue(dataNodeData.Partner, out var rating)) ApplicationMessage.Log(Error.RatingNotFound, dataNodeData.Partner);", - "\n if(!CreditDefaultRates.TryGetValue(rating[period].CreditRiskRating, out var rate)) ApplicationMessage.Log(Error.CreditDefaultRateNotFound, rating[period].CreditRiskRating);", - "\n return rate[period].Values[0];", - "\n }", - "\n ", - "\n public double GetPremiumAllocationFactor(ImportIdentity id) => SingleDataNodeParametersByGoc.TryGetValue(id.DataNode, out var singleDataNodeParameter) ", - "\n ? singleDataNodeParameter[CurrentPeriod].PremiumAllocation : DefaultPremiumExperienceAdjustmentFactor;", - "\n ", - "\n // Data Node relationships", - "\n public IEnumerable GetUnderlyingGic(ImportIdentity id) => !InterDataNodeParametersByGoc.TryGetValue(id.DataNode, out var interDataNodeParameters)", - "\n ? Enumerable.Empty()", - "\n : interDataNodeParameters[CurrentPeriod].Select(x => x.DataNode != id.DataNode ? x.DataNode : x.LinkedDataNode).Where(goc => !DataNodeDataBySystemName[goc].IsReinsurance);", - "\n ", - "\n public double GetReinsuranceCoverage (ImportIdentity id, string gic) ", - "\n {", - "\n var targetPeriod = AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].RcPeriod == PeriodType.EndOfPeriod ? CurrentPeriod : PreviousPeriod;", - "\n return InterDataNodeParametersByGoc.TryGetValue(id.DataNode, out var interDataNodeParameters)", - "\n ? interDataNodeParameters[targetPeriod].FirstOrDefault(x => x.DataNode == gic || x.LinkedDataNode == gic).ReinsuranceCoverage", - "\n : (double)ApplicationMessage.Log(Error.ReinsuranceCoverage, id.DataNode);", - "\n }", - "\n ", - "\n // Import Scope", - "\n public bool IsPrimaryScope (string dataNode) => DataNodesByImportScope[ImportScope.Primary].Contains(dataNode);", - "\n public bool IsSecondaryScope (string dataNode) => DataNodesByImportScope[ImportScope.Secondary].Contains(dataNode);", - "\n ", - "\n // Other", - "\n public IEnumerable GetNonAttributableAmountType() => new string[]{AmountTypes.NE};", - "\n public IEnumerable GetAttributableExpenseAndCommissionAmountType() => new string[] {AmountTypes.ACA, AmountTypes.AEA}; //U+ specific", - "\n public IEnumerable GetInvestmentClaims() => hierarchyCache.Get(AmountTypes.ICO).Descendants(includeSelf : true).Select(x => x.SystemName);", - "\n public IEnumerable GetPremiums() => hierarchyCache.Get(AmountTypes.PR).Descendants(includeSelf : true).Select(x => x.SystemName);", - "\n public IEnumerable GetClaims() => hierarchyCache.Get(AmountTypes.CL).Descendants().Select(x => x.SystemName);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "AZV9Uq344ESUtVbb13Y6UA", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "", + "\n

Import Storage

", + "\n", + "\nThe Import Storage collects the following data upon import of a file:", + "\n", + "\n- Current Period (year, month)", + "\n- Previous Period", + "\n- [Partitions](../DataModel/DataStructure)", + "\n- [RawVariables](../DataModel/DataStructure)", + "\n- [IfrsVariables](../DataModel/DataStructure)", + "\n- [Projection Configuration](../DataModel/DataStructure)", + "\n- [YieldCurve](../DataModel/DataStructure)", + "\n- [AocType](../DataModel/DataStructure)", + "\n- [AmountType](../DataModel/DataStructure)", + "\n- [CalculationType](../DataModel/DataStructure)", + "\n- [DataNodes](../DataModel/DataStructure)", + "\n", + "\nSuch storage is then passed to calculations defined in the corresponding [Import Scopes](./ImportScopeCalculation)." + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Utils/UtilityMethods\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Storage" + ] + }, + { + "cell_type": "code", + "source": [ + "public class ImportStorage", + "\n{ ", + "\n private readonly IDataSource querySource; ", + "\n private readonly IWorkspace workspace;", + "\n private readonly Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache;", + "\n private readonly ImportArgs args;", + "\n ", + "\n // Constants", + "\n private static int periodicityInMonths => 3; // Revisit", + "\n ", + "\n //Format", + "\n public string ImportFormat => args.ImportFormat; ", + "\n ", + "\n //Time Periods ", + "\n public (int Year, int Month) CurrentReportingPeriod => (args.Year, args.Month);", + "\n public (int Year, int Month) PreviousReportingPeriod => (args.Year - 1, MonthInAYear); // YTD Logic", + "\n", + "\n //Partitions", + "\n public Guid PartitionByRn;", + "\n public Guid TargetPartition;", + "\n public Guid DefaultPartition;", + "\n public Guid PreviousPeriodPartition; ", + "\n", + "\n //Projections", + "\n private ProjectionConfiguration[] ProjectionConfiguration;", + "\n ", + "\n //DataNodes", + "\n public IDictionary DataNodeDataBySystemName { get; private set; }", + "\n public IDictionary> DataNodesByImportScope { get; private set; }", + "\n public IDictionary> AccidentYearsByDataNode { get; private set; }", + "\n //Variables", + "\n public IDictionary> RawVariablesByImportIdentity { get; private set; }", + "\n public IDictionary> IfrsVariablesByImportIdentity { get; private set; }", + "\n ", + "\n //Parameters", + "\n public Dictionary LockedInYieldCurve { get; private set; }", + "\n public Dictionary> CurrentYieldCurve { get; private set; }", + "\n public Dictionary> PartnerRating { get; private set; }", + "\n public Dictionary> CreditDefaultRates { get; private set; }", + "\n public Dictionary> SingleDataNodeParametersByGoc { get; private set; }", + "\n public Dictionary>> InterDataNodeParametersByGoc { get; private set; }", + "\n public Dictionary AocConfigurationByAocStep { get; private set; }", + "\n ", + "\n private Dictionary> aocStepByInputSource;", + "\n ", + "\n //Dimensions", + "\n public Dictionary AmountTypeDimension { get; private set; }", + "\n public Dictionary NoveltyDimension { get; private set; }", + "\n public Dictionary CalculationTypeDimension { get; private set; }", + "\n public Dictionary EstimateTypeDimension { get; private set; }", + "\n public Dictionary> EstimateTypesByImportFormat { get; private set; }", + "\n public Dictionary ExperienceAdjustEstimateTypeMapping { get; private set; } ", + "\n ", + "\n //Constructor", + "\n public ImportStorage(ImportArgs args, IDataSource querySource, IWorkspace workspace)", + "\n {", + "\n this.querySource = querySource;", + "\n this.workspace = workspace;", + "\n hierarchyCache = workspace.ToHierarchicalDimensionCache();", + "\n this.args = args;", + "\n }", + "\n ", + "\n //Initialize", + "\n public async Task InitializeAsync()", + "\n { ", + "\n //Dimensions", + "\n var estimateTypes = (await workspace.Query().ToArrayAsync());", + "\n ", + "\n EstimateTypeDimension = estimateTypes.ToDictionary(x => x.SystemName);", + "\n AmountTypeDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n NoveltyDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n CalculationTypeDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n ", + "\n ExperienceAdjustEstimateTypeMapping = new Dictionary{{EstimateTypes.A, EstimateTypes.APA}, {EstimateTypes.AA, EstimateTypes.AAPA}, {EstimateTypes.OA, EstimateTypes.OAPA}}; //TODO move this logic", + "\n ", + "\n //Hierarchy Cache", + "\n hierarchyCache.Initialize();", + "\n ", + "\n //EstimateType to load and to update", + "\n EstimateTypesByImportFormat = new InputSource[] { InputSource.Opening, InputSource.Actual, InputSource.Cashflow,}", + "\n .ToDictionary(x => x.ToString(), ", + "\n x => estimateTypes", + "\n .Where(et => et.InputSource.Contains(x))", + "\n .Select(et => et.SystemName)", + "\n .ToHashSet());", + "\n ", + "\n //ProjectionConfiguration : Current Period + projection for every Quarter End for current Year and next Years as in projectionConfiguration.csv", + "\n ProjectionConfiguration = (await workspace.Query()", + "\n .Where(x => x.Shift > 0 || x.TimeStep == args.Month || (x.TimeStep > args.Month && x.TimeStep % periodicityInMonths == 0))", + "\n .OrderBy(x => x.Shift).ThenBy(x => x.TimeStep).ToArrayAsync());", + "\n ", + "\n //Get Partitions", + "\n PartitionByRn = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode).ToArrayAsync()).Single().Id;", + "\n TargetPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", + "\n p.Year == CurrentReportingPeriod.Year &&", + "\n p.Month == CurrentReportingPeriod.Month &&", + "\n p.Scenario == args.Scenario).ToArrayAsync()).Single().Id;", + "\n DefaultPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", + "\n p.Year == CurrentReportingPeriod.Year &&", + "\n p.Month == CurrentReportingPeriod.Month &&", + "\n p.Scenario == null).ToArrayAsync()).Single().Id;", + "\n //Set Partitions", + "\n await querySource.Partition.SetAsync(PartitionByRn);", + "\n await workspace.Partition.SetAsync(PartitionByRn);", + "\n ", + "\n await querySource.Partition.SetAsync(TargetPartition);", + "\n await workspace.Partition.SetAsync(TargetPartition);", + "\n ", + "\n //Get data from Workspace (result of parsing)", + "\n var parsedRawVariables = await workspace.Query().ToArrayAsync();", + "\n var parsedIfrsVariables = await workspace.Query().ToArrayAsync();", + "\n ", + "\n //DataNodes", + "\n DataNodeDataBySystemName = await workspace.LoadDataNodesAsync(args);", + "\n ", + "\n //Accident Years", + "\n AccidentYearsByDataNode = (IDictionary>)", + "\n (ImportFormat == ImportFormats.Cashflow ? parsedRawVariables.Select(x => new {x.DataNode, x.AccidentYear}) : parsedIfrsVariables.Select(x => new {x.DataNode, x.AccidentYear}))", + "\n .ToDictionaryGrouped(x => x.DataNode, x => (ICollection)x.Select(y => y.AccidentYear).ToHashSet());", + "\n ", + "\n // Import Scopes and Data Node relationship parameters", + "\n InterDataNodeParametersByGoc = await workspace.LoadInterDataNodeParametersAsync(args);", + "\n ", + "\n var primaryScopeFromParsedVariables = (ImportFormat == ImportFormats.Cashflow ? parsedRawVariables.Select(x => x.DataNode) : parsedIfrsVariables.Select(x => x.DataNode)).ToHashSet();", + "\n var primaryScopeFromLinkedReinsurance = primaryScopeFromParsedVariables", + "\n .Where(goc => !DataNodeDataBySystemName[goc].IsReinsurance && DataNodeDataBySystemName[goc].LiabilityType == LiabilityTypes.LRC)", + "\n .SelectMany(goc => InterDataNodeParametersByGoc.TryGetValue(goc, out var interDataNodeParamByPeriod)", + "\n ? interDataNodeParamByPeriod[CurrentPeriod].Select(param => param.DataNode == goc ? param.LinkedDataNode : param.DataNode).Where(goc => !primaryScopeFromParsedVariables.Contains(goc))", + "\n : Enumerable.Empty())", + "\n .ToHashSet();", + "\n ", + "\n var primaryScope = primaryScopeFromParsedVariables.Concat(primaryScopeFromLinkedReinsurance).ToHashSet();", + "\n var secondaryScope = InterDataNodeParametersByGoc", + "\n .Where(kvp => primaryScope.Contains(kvp.Key))", + "\n .SelectMany(kvp => { var linkedGocs = kvp.Value[CurrentPeriod].Select(param => param.DataNode == kvp.Key ? param.LinkedDataNode : param.DataNode);", + "\n return linkedGocs.Where(goc => !primaryScope.Contains(goc));}).ToHashSet();", + "\n var allImportScopes = new HashSet(primaryScope.Concat(secondaryScope));", + "\n ", + "\n DataNodesByImportScope = new Dictionary> { { ImportScope.Primary, primaryScope }, { ImportScope.Secondary, secondaryScope } };", + "\n ", + "\n // Parameters", + "\n PartnerRating = await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Partner);", + "\n CreditDefaultRates = await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.CreditRiskRating);", + "\n SingleDataNodeParametersByGoc = await workspace.LoadSingleDataNodeParametersAsync(args);", + "\n LockedInYieldCurve = await workspace.LoadLockedInYieldCurveAsync(args, allImportScopes.Select(dn => DataNodeDataBySystemName[dn]));", + "\n CurrentYieldCurve = await workspace.LoadCurrentYieldCurveAsync(args, allImportScopes.Select(dn => DataNodeDataBySystemName[dn])); //TODO Rename this variable", + "\n ", + "\n AocConfigurationByAocStep = await querySource.LoadAocStepConfigurationAsDictionaryAsync(args.Year, args.Month); ", + "\n aocStepByInputSource = ((InputSource[])Enum.GetValues(typeof(InputSource))).ToDictionary(x => x,", + "\n x => AocConfigurationByAocStep", + "\n .Where(kvp => kvp.Value.InputSource.Contains(x))", + "\n .Select(kvp => kvp.Key)", + "\n .ToHashSet());", + "\n ", + "\n //Previous Period", + "\n var openingRawVariables = Enumerable.Empty();", + "\n var openingIfrsVariables = Enumerable.Empty();", + "\n", + "\n if(allImportScopes.Select(dn => DataNodeDataBySystemName[dn]).Any(dnd => dnd.Year < args.Year)) {", + "\n PreviousPeriodPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", + "\n p.Year == PreviousReportingPeriod.Year &&", + "\n p.Month == PreviousReportingPeriod.Month &&", + "\n p.Scenario == null).ToArrayAsync()).Single().Id;", + "\n ", + "\n await querySource.Partition.SetAsync(PreviousPeriodPartition);", + "\n ", + "\n //Perform queries to previous Period", + "\n openingRawVariables = (await querySource.Query()", + "\n .Where(rv => rv.Partition == PreviousPeriodPartition && rv.AocType == AocTypes.CL)", + "\n .Where(v => primaryScope.Contains(v.DataNode))", + "\n .ToArrayAsync())", + "\n .Select(rv => rv with {AocType = AocTypes.BOP, Novelty = Novelties.I, Values = rv.Values.Skip(MonthInAYear).ToArray(), Partition = TargetPartition});", + "\n ", + "\n openingIfrsVariables = (await querySource.Query()", + "\n .Where(iv => iv.Partition == PreviousPeriodPartition && iv.AocType == AocTypes.EOP)", + "\n .Where(v => allImportScopes.Contains(v.DataNode))", + "\n .ToArrayAsync())", + "\n .Select(iv => iv with {AocType = AocTypes.BOP, Novelty = Novelties.I, Partition = TargetPartition});", + "\n ", + "\n // TODO: print error if ", + "\n //openingRawVariables.Select(x => x.DataNode).ToHashSet() != dataNodesWithPreviousPeriod", + "\n }", + "\n ", + "\n //SetPartition to current Period", + "\n await querySource.Partition.SetAsync(TargetPartition);", + "\n ", + "\n if(primaryScope.Select(dn => DataNodeDataBySystemName[dn]).Any(dnd => dnd.Year == args.Year) && ImportFormat != ImportFormats.Opening)", + "\n openingIfrsVariables = openingIfrsVariables.Concat(await querySource.Query()", + "\n .Where(iv => iv.Partition == TargetPartition && iv.AocType == AocTypes.BOP && iv.Novelty == Novelties.I)", + "\n .Where(iv => primaryScope.Contains(iv.DataNode) && EstimateTypesByImportFormat[InputSource.Opening.ToString()].Contains(iv.EstimateType) || secondaryScope.Contains(iv.DataNode))", + "\n .ToArrayAsync());", + "\n ", + "\n //Variables", + "\n var rawVariables = parsedRawVariables.Concat(openingRawVariables)", + "\n .Concat(await querySource.Query()", + "\n .Where(rv => rv.Partition == TargetPartition)", + "\n .Where(rv => primaryScopeFromLinkedReinsurance.Contains(rv.DataNode))", + "\n .ToArrayAsync());", + "\n RawVariablesByImportIdentity = (IDictionary>)rawVariables.ToDictionaryGrouped(v => v.DataNode, v => (ICollection)v.ToArray());", + "\n ", + "\n var ifrsVariables = parsedIfrsVariables.Concat(openingIfrsVariables)", + "\n .Concat(await querySource.Query()", + "\n .Where(iv => iv.Partition == TargetPartition && !(iv.AocType == AocTypes.BOP && iv.Novelty == Novelties.I))", + "\n .Where(iv => primaryScopeFromParsedVariables.Contains(iv.DataNode) && !EstimateTypesByImportFormat[ImportFormat].Contains(iv.EstimateType) ", + "\n || primaryScopeFromLinkedReinsurance.Contains(iv.DataNode) ", + "\n || secondaryScope.Contains(iv.DataNode))", + "\n .ToArrayAsync());", + "\n IfrsVariablesByImportIdentity = (IDictionary>)ifrsVariables.ToDictionaryGrouped(v => v.DataNode, v => (ICollection)v.ToArray());", + "\n }", + "\n ", + "\n //Getters", + "\n ", + "\n //Periods", + "\n public ValuationPeriod GetValuationPeriod(ImportIdentity id) => AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].ValuationPeriod;", + "\n public PeriodType GetYieldCurvePeriod(ImportIdentity id) => AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].YcPeriod;", + "\n public PeriodType GetCreditDefaultRiskPeriod(ImportIdentity id) => AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].CdrPeriod;", + "\n ", + "\n public IEnumerable GetAllAocSteps(InputSource source) => aocStepByInputSource[source];", + "\n public IEnumerable GetCalculatedTelescopicAocSteps() => AocConfigurationByAocStep.Where(kvp => kvp.Value.DataType == DataType.CalculatedTelescopic).Select(kvp => kvp.Key);", + "\n ", + "\n //YieldCurve", + "\n public double[] GetYearlyYieldCurve(ImportIdentity id, string economicBasis) {", + "\n var yc = GetYieldCurve(id, economicBasis);", + "\n return yc.Values.Skip(args.Year - yc.Year).ToArray(); //Check if the returned array is empty? Log Warning?", + "\n }", + "\n ", + "\n public YieldCurve GetYieldCurve(ImportIdentity id, string economicBasis) => (economicBasis, GetYieldCurvePeriod(id)) switch {", + "\n (EconomicBases.C, PeriodType.BeginningOfPeriod) => CurrentYieldCurve[DataNodeDataBySystemName[id.DataNode].ContractualCurrency][PreviousPeriod],", + "\n (EconomicBases.C, PeriodType.EndOfPeriod) => CurrentYieldCurve[DataNodeDataBySystemName[id.DataNode].ContractualCurrency][CurrentPeriod],", + "\n (EconomicBases.L, _ ) => LockedInYieldCurve[id.DataNode],", + "\n (_, PeriodType.NotApplicable) => (YieldCurve)ApplicationMessage.Log(Error.YieldCurvePeriodNotApplicable, id.AocType, id.Novelty),", + "\n (_, _) => (YieldCurve)ApplicationMessage.Log(Error.EconomicBasisNotFound, id.DataNode)", + "\n };", + "\n ", + "\n //int Identity.ProjectionPeriod ", + "\n public int GetProjectionCount() => ProjectionConfiguration.Count();", + "\n public int GetShift(int projectionPeriod) => ProjectionConfiguration[projectionPeriod].Shift;", + "\n public int GetTimeStep(int projectionPeriod) => ProjectionConfiguration[projectionPeriod].TimeStep;", + "\n ", + "\n public PeriodType GetPeriodType(string amountType, string calculationType) => ", + "\n amountType != null && AmountTypeDimension.TryGetValue(amountType, out var at) ", + "\n ? at.PeriodType", + "\n : calculationType != null && CalculationTypeDimension.TryGetValue(calculationType, out var ct) ", + "\n ? ct.PeriodType : PeriodType.EndOfPeriod;", + "\n", + "\n //Variables and Cashflows", + "\n public IEnumerable GetRawVariables(string dataNode) => RawVariablesByImportIdentity.TryGetValue(dataNode, out var variableCollection) ? variableCollection : Enumerable.Empty();", + "\n public IEnumerable GetIfrsVariables(string dataNode) => IfrsVariablesByImportIdentity.TryGetValue(dataNode, out var variableCollection) ? variableCollection : Enumerable.Empty();", + "\n ", + "\n public double[] GetValues(ImportIdentity id, Func whereClause) => GetRawVariables(id.DataNode).Where(v => (v.AocType, v.Novelty) == id.AocStep && whereClause(v)).Aggregate()?.Values ?? Enumerable.Empty().ToArray();", + "\n public double GetValue(ImportIdentity id, Func whereClause) => GetIfrsVariables(id.DataNode).Where(v => (v.AocType, v.Novelty) == id.AocStep && whereClause(v)).Aggregate()?.Value ?? 0;", + "\n ", + "\n public double[] GetValues(ImportIdentity id, string amountType, string calculationType, int? accidentYear) => GetValues(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.CalculationType == calculationType);", + "\n public double GetValue(ImportIdentity id, string amountType, string estimateType, int? accidentYear) => GetValue(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.EstimateType == estimateType);", + "\n public double GetValue(ImportIdentity id, string amountType, string estimateType, string economicBasis, int? accidentYear) => GetValue(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.EstimateType == estimateType && v.EconomicBasis == economicBasis);", + "\n ", + "\n //Novelty", + "\n private IEnumerable GetNoveltiesForAocType(string aocType, IEnumerable aocConfiguration) => aocConfiguration.Where(aocStep => aocStep.AocType == aocType).Select(aocStep => aocStep.Novelty);", + "\n public IEnumerable GetNovelties() => NoveltyDimension.Keys;", + "\n public IEnumerable GetNovelties(string aocType) => GetNoveltiesForAocType(aocType, AocConfigurationByAocStep.Keys);", + "\n public IEnumerable GetNovelties(string aocType, InputSource inputSource) => GetNoveltiesForAocType(aocType, aocStepByInputSource[inputSource]);", + "\n ", + "\n //Accident years", + "\n public IEnumerable GetAccidentYears(string dataNode) => AccidentYearsByDataNode.TryGetValue(dataNode, out var accidentYear) ? accidentYear : new int?[] { null };", + "\n ", + "\n // Parameters", + "\n public double GetNonPerformanceRiskRate (ImportIdentity identity) {", + "\n var period = GetCreditDefaultRiskPeriod(identity) == PeriodType.BeginningOfPeriod ? PreviousPeriod : CurrentPeriod;", + "\n ", + "\n if(!DataNodeDataBySystemName.TryGetValue(identity.DataNode, out var dataNodeData)) ApplicationMessage.Log(Error.DataNodeNotFound, identity.DataNode);", + "\n if(dataNodeData.Partner == null) ApplicationMessage.Log(Error.PartnerNotFound, identity.DataNode);", + "\n // if Partner == Internal then return 0;", + "\n if(!PartnerRating.TryGetValue(dataNodeData.Partner, out var rating)) ApplicationMessage.Log(Error.RatingNotFound, dataNodeData.Partner);", + "\n if(!CreditDefaultRates.TryGetValue(rating[period].CreditRiskRating, out var rate)) ApplicationMessage.Log(Error.CreditDefaultRateNotFound, rating[period].CreditRiskRating);", + "\n return rate[period].Values[0];", + "\n }", + "\n ", + "\n public double GetPremiumAllocationFactor(ImportIdentity id) => SingleDataNodeParametersByGoc.TryGetValue(id.DataNode, out var singleDataNodeParameter) ", + "\n ? singleDataNodeParameter[CurrentPeriod].PremiumAllocation : DefaultPremiumExperienceAdjustmentFactor;", + "\n ", + "\n // Data Node relationships", + "\n public IEnumerable GetUnderlyingGic(ImportIdentity id) => !InterDataNodeParametersByGoc.TryGetValue(id.DataNode, out var interDataNodeParameters)", + "\n ? Enumerable.Empty()", + "\n : interDataNodeParameters[CurrentPeriod].Select(x => x.DataNode != id.DataNode ? x.DataNode : x.LinkedDataNode).Where(goc => !DataNodeDataBySystemName[goc].IsReinsurance);", + "\n ", + "\n public double GetReinsuranceCoverage (ImportIdentity id, string gic) ", + "\n {", + "\n var targetPeriod = AocConfigurationByAocStep[new AocStep(id.AocType, id.Novelty)].RcPeriod == PeriodType.EndOfPeriod ? CurrentPeriod : PreviousPeriod;", + "\n return InterDataNodeParametersByGoc.TryGetValue(id.DataNode, out var interDataNodeParameters)", + "\n ? interDataNodeParameters[targetPeriod].FirstOrDefault(x => x.DataNode == gic || x.LinkedDataNode == gic).ReinsuranceCoverage", + "\n : (double)ApplicationMessage.Log(Error.ReinsuranceCoverage, id.DataNode);", + "\n }", + "\n ", + "\n // Import Scope", + "\n public bool IsPrimaryScope (string dataNode) => DataNodesByImportScope[ImportScope.Primary].Contains(dataNode);", + "\n public bool IsSecondaryScope (string dataNode) => DataNodesByImportScope[ImportScope.Secondary].Contains(dataNode);", + "\n ", + "\n // Other", + "\n public IEnumerable GetNonAttributableAmountType() => new string[]{AmountTypes.NE};", + "\n public IEnumerable GetAttributableExpenseAndCommissionAmountType() => new string[] {AmountTypes.ACA, AmountTypes.AEA}; //U+ specific", + "\n public IEnumerable GetInvestmentClaims() => hierarchyCache.Get(AmountTypes.ICO).Descendants(includeSelf : true).Select(x => x.SystemName);", + "\n public IEnumerable GetPremiums() => hierarchyCache.Get(AmountTypes.PR).Descendants(includeSelf : true).Select(x => x.SystemName);", + "\n public IEnumerable GetClaims() => hierarchyCache.Get(AmountTypes.CL).Descendants().Select(x => x.SystemName);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Import/Importers.ipynb b/Import/Importers.ipynb index 843a7409..eb140724 100644 --- a/Import/Importers.ipynb +++ b/Import/Importers.ipynb @@ -1,1199 +1,1061 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "toc-showmarkdowntxt": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "atie2kRp5EK_Lok_1cKKnA", - "cell_type": "markdown", - "source": [ - "", - "\n

Importer Methods

", - "\n" - ], - "metadata": {} - }, - { - "id": "YHW5Ovles0y2T26fE8ZOLw", - "cell_type": "code", - "source": [ - "#!import \"ImportScopeCalculation\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Wraw7o21Pk2HmWk4UAqqsA", - "cell_type": "markdown", - "source": [ - "# Parsing Storage" - ], - "metadata": {} - }, - { - "id": "R427JwfBrEqXKnAMHrgizg", - "cell_type": "code", - "source": [ - "public class ParsingStorage", - "\n{", - "\n private readonly IDataSource dataSource;", - "\n private readonly IWorkspace workspace;", - "\n private readonly ImportArgs args;", - "\n ", - "\n //Hierarchy Cache", - "\n public Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache HierarchyCache;", - "\n ", - "\n public ReportingNode ReportingNode { get; protected set; }", - "\n ", - "\n public Dictionary DataNodeDataBySystemName;", - "\n ", - "\n // Dimensions", - "\n public Dictionary CalculationType;", - "\n public Dictionary PvAmountType; ", - "\n public HashSet AocTypeMap;", - "\n private HashSet estimateTypes;", - "\n private HashSet amountTypes;", - "\n private Dictionary> amountTypesByEstimateType => GetAmountTypesByEstimateType(HierarchyCache);", - "\n public HashSet TechnicalMarginEstimateTypes => GetTechnicalMarginEstimateType(); ", - "\n public Dictionary> DimensionsWithExternalId;", - "\n ", - "\n // Partitions", - "\n public PartitionByReportingNode TargetPartitionByReportingNode;", - "\n public PartitionByReportingNodeAndPeriod TargetPartitionByReportingNodeAndPeriod;", - "\n ", - "\n //Constructor", - "\n public ParsingStorage(ImportArgs args, IDataSource dataSource, IWorkspace workspace)", - "\n {", - "\n this.args = args;", - "\n this.dataSource = dataSource;", - "\n this.workspace = workspace;", - "\n }", - "\n ", - "\n // Initialize", - "\n public async Task InitializeAsync()", - "\n {", - "\n //Partition Workspace and DataSource", - "\n TargetPartitionByReportingNode = (await workspace.Query().Where(p => p.ReportingNode == args.ReportingNode).ToArrayAsync()).SingleOrDefault(); ", - "\n ", - "\n if(TargetPartitionByReportingNode == null) ", - "\n { ApplicationMessage.Log(Error.ParsedPartitionNotFound, args.ReportingNode); return; } ", - "\n ", - "\n await workspace.Partition.SetAsync(TargetPartitionByReportingNode.Id);", - "\n await dataSource.Partition.SetAsync(TargetPartitionByReportingNode.Id);", - "\n ", - "\n if(args.Year != default(int) && args.Month != default(int))", - "\n {", - "\n TargetPartitionByReportingNodeAndPeriod = (await workspace.Query()", - "\n .Where(p => p.ReportingNode == args.ReportingNode &&", - "\n p.Year == args.Year &&", - "\n p.Month == args.Month &&", - "\n p.Scenario == args.Scenario).ToArrayAsync()).SingleOrDefault();", - "\n ", - "\n if(TargetPartitionByReportingNodeAndPeriod == null) ", - "\n { ApplicationMessage.Log(Error.ParsedPartitionNotFound, args.ReportingNode, args.Year.ToString(), args.Month.ToString(), args.Scenario); return; } ", - "\n ", - "\n await workspace.Partition.SetAsync(TargetPartitionByReportingNodeAndPeriod.Id);", - "\n await dataSource.Partition.SetAsync(TargetPartitionByReportingNodeAndPeriod.Id);", - "\n ", - "\n //Clean up the workspace", - "\n await workspace.DeleteAsync( await workspace.Query().ToArrayAsync() );", - "\n await workspace.DeleteAsync( await workspace.Query().ToArrayAsync() );", - "\n }", - "\n ", - "\n ReportingNode = (await dataSource.Query().Where(x => x.SystemName == args.ReportingNode).ToArrayAsync()).First();", - "\n var aocConfigurationByAocStep = await dataSource.LoadAocStepConfigurationAsync(args.Year, args.Month);", - "\n AocTypeMap = args.ImportFormat switch {", - "\n ImportFormats.Cashflow => aocConfigurationByAocStep.Where(x => x.InputSource.Contains(InputSource.Cashflow) &&", - "\n !new DataType[]{DataType.Calculated, DataType.CalculatedTelescopic}.Contains(x.DataType) )", - "\n .GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).ToHashSet(),", - "\n ImportFormats.Actual => aocConfigurationByAocStep.Where(x => x.InputSource.Contains(InputSource.Actual) &&", - "\n !new DataType[]{DataType.Calculated, DataType.CalculatedTelescopic}.Contains(x.DataType) && ", - "\n new AocStep(x.AocType, x.Novelty) != new AocStep(AocTypes.BOP, Novelties.I))", - "\n .GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).ToHashSet(),", - "\n ImportFormats.Opening => aocConfigurationByAocStep.Where(x => x.InputSource.Contains(InputSource.Opening) && x.DataType == DataType.Optional).GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).ToHashSet(),", - "\n ImportFormats.SimpleValue => aocConfigurationByAocStep.GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).Concat((await dataSource.Query().ToArrayAsync())", - "\n .Select(vt => new AocStep(vt.SystemName,null))).ToHashSet(),", - "\n _ => Enumerable.Empty().ToHashSet(),", - "\n };", - "\n ", - "\n //DataNodes", - "\n DataNodeDataBySystemName = args.ImportFormat == ImportFormats.Opening ", - "\n ? (await LoadDataNodesAsync(dataSource, args)).Where(kvp => kvp.Value.Year == args.Year).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)", - "\n : await LoadDataNodesAsync(dataSource, args);", - "\n // Dimensions", - "\n CalculationType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", - "\n PvAmountType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", - "\n amountTypes = (await dataSource.Query().ToArrayAsync()).Select(at => at.SystemName).ToHashSet();", - "\n estimateTypes = args.ImportFormat switch {", - "\n ImportFormats.SimpleValue => (await dataSource.Query().ToArrayAsync()).Select(et => et.SystemName).ToHashSet(),", - "\n ImportFormats.Opening => (await dataSource.Query().Where(et => et.StructureType == StructureType.AoC).ToArrayAsync())", - "\n .Where(et => et.InputSource.Contains(InputSource.Opening)) //This Contains overload cannot be used in DB", - "\n .Select(et => et.SystemName).ToHashSet(),", - "\n _ => Enumerable.Empty().ToHashSet(),", - "\n };", - "\n ", - "\n ", - "\n // DimensionsWithExternalId", - "\n DimensionsWithExternalId = new Dictionary>()", - "\n {", - "\n { typeof(PvAmountType), await GetDimensionWithExternalIdDictionaryAsync() },", - "\n { typeof(EstimateType), await GetDimensionWithExternalIdDictionaryAsync() }", - "\n };", - "\n ", - "\n //Hierarchy Cache", - "\n HierarchyCache = workspace.ToHierarchicalDimensionCache();", - "\n HierarchyCache.Initialize();", - "\n }", - "\n ", - "\n public async Task> GetDimensionWithExternalIdDictionaryAsync () where T : KeyedOrderedDimension", - "\n {", - "\n var dict = new Dictionary();", - "\n var items = await dataSource.Query().ToArrayAsync();", - "\n foreach (var item in items) {", - "\n dict.TryAdd(item.SystemName, item.SystemName);", - "\n if(typeof(T).IsAssignableTo(typeof(KeyedOrderedDimensionWithExternalId))) {", - "\n var externalIds = (string[])(typeof(T).GetProperty(nameof(KeyedOrderedDimensionWithExternalId.ExternalId)).GetValue(item));", - "\n if(externalIds == null) continue;", - "\n foreach (var extId in externalIds) ", - "\n dict.TryAdd(extId, item.SystemName);", - "\n }", - "\n }", - "\n return dict;", - "\n }", - "\n ", - "\n // Getters", - "\n public bool IsDataNodeReinsurance(string goc) => DataNodeDataBySystemName[goc].IsReinsurance;", - "\n public bool IsValidDataNode(string goc) => DataNodeDataBySystemName.ContainsKey(goc);", - "\n ", - "\n // Validations", - "\n public string ValidateEstimateType(string et, string goc) {", - "\n var allowedEstimateTypes = estimateTypes;", - "\n if (DataNodeDataBySystemName.TryGetValue(goc, out var dataNodeData) && dataNodeData.LiabilityType == LiabilityTypes.LIC)", - "\n estimateTypes.ExceptWith(TechnicalMarginEstimateTypes);", - "\n if(!allowedEstimateTypes.Contains(et))", - "\n ApplicationMessage.Log(Error.EstimateTypeNotFound, et);", - "\n return et;", - "\n }", - "\n ", - "\n public string ValidateAmountType(string at) {", - "\n if (at != null && !amountTypes.Contains(at))", - "\n ApplicationMessage.Log(Error.AmountTypeNotFound, at);", - "\n return at;", - "\n }", - "\n ", - "\n public AocStep ValidateAocStep(AocStep aoc) {", - "\n if (!AocTypeMap.Contains(aoc))", - "\n ApplicationMessage.Log(Error.AocTypeMapNotFound, aoc.AocType, aoc.Novelty);", - "\n return aoc;", - "\n }", - "\n ", - "\n public string ValidateDataNode(string goc) {", - "\n if (!DataNodeDataBySystemName.ContainsKey(goc))", - "\n ApplicationMessage.Log(Error.InvalidDataNode, goc);", - "\n return goc;", - "\n }", - "\n ", - "\n public void ValidateEstimateTypeAndAmountType(string estimateType, string amountType){", - "\n if (amountTypesByEstimateType.TryGetValue(estimateType, out var ats) && ats.Any() && !ats.Contains(amountType))", - "\n ApplicationMessage.Log(Error.InvalidAmountTypeEstimateType, estimateType, amountType);", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jLFF7eOl8EKi-EoKn60NkA", - "cell_type": "markdown", - "source": [ - "# Basics" - ], - "metadata": {} - }, - { - "id": "LAqrzcPzfU-9EsHmiVfxOg", - "cell_type": "markdown", - "source": [ - "## Clean the Database" - ], - "metadata": {} - }, - { - "id": "USkMObKefk2vtLjT3OjqKQ", - "cell_type": "code", - "source": [ - "async public Task CleanDatabaseAsync (Expression> filter = null) where T : class", - "\n{", - "\n var loadData = await DataSource.Query().Where(filter?? (Expression>)(x => true)).ToListAsync();", - "\n await DataSource.DeleteAsync(loadData);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "mUaUxMr_ekW_ZKMYlwu6WQ", - "cell_type": "code", - "source": [ - "async public Task CleanDatabaseFromPartitionAsync (Guid partitionId, Func filter = null) where T : class, IPartitioned", - "\n{", - "\n var loadData = (await DataSource.Query().Where(x => x.Partition == partitionId).ToArrayAsync())", - "\n .Where(filter?? (Func)(x => true)).ToList();", - "\n await DataSource.DeleteAsync(loadData);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3CLQow7bjE67Fq14luFOrw", - "cell_type": "markdown", - "source": [ - "## Update the Database" - ], - "metadata": {} - }, - { - "id": "EQ--NVPYYEqya9DtvVVluw", - "cell_type": "code", - "source": [ - "async public Task CommitToDatabase (Guid partitionId, bool snapshot = true, Func filter = null) where T : class, IPartitioned", - "\n{", - "\n if(snapshot) await CleanDatabaseFromPartitionAsync(partitionId, filter);", - "\n await DataSource.UpdateAsync( await Workspace.Query().ToArrayAsync() );", - "\n await DataSource.CommitAsync();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "alZOFNV3nECY6mw1jPOg9g", - "cell_type": "markdown", - "source": [ - "## Data Node Factory" - ], - "metadata": {} - }, - { - "id": "x30peNSotU-F4HtmYwmRFg", - "cell_type": "code", - "source": [ - "// TODO: think of a better Factory to instantiate DataNode/State/Parameter simultaneously while avoiding public contructors (see Factory Patterns)", - "\n// ATTENTION: this Factory method provides default states and parameters so that it is not mandatory to import them (=> simpler calculation engine). ", - "\n// This method weakness is that these defaults aren't always replaced with the imported values, e,g, when Month > DefaultDataNodeActivationMonth.", - "\n// Therefore they will remain in the DataSource (hopefully without producing any harm).", - "\npublic async Task DataNodeFactoryAsync ()", - "\n{", - "\n var partition = (Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode));", - "\n var existingGroupOfContracts = await DataSource.Query().Where(x => x.Partition == partition).ToArrayAsync();", - "\n var importedGroupOfContracts = await Workspace.Query().ToArrayAsync();", - "\n var listOfPartitionsWithPeriod = new List();", - "\n ", - "\n foreach (var groupOfContract in importedGroupOfContracts)", - "\n {", - "\n var name = groupOfContract.SystemName;", - "\n if(!existingGroupOfContracts.Any(x => x.SystemName == name))", - "\n {", - "\n var state = new DataNodeState { DataNode = name, Year = groupOfContract.AnnualCohort, Partition = partition };", - "\n var parameter = new SingleDataNodeParameter { DataNode = name, Year = groupOfContract.AnnualCohort, Partition = partition };", - "\n await Workspace.UpdateAsync(state);", - "\n if(groupOfContract is GroupOfInsuranceContract) await Workspace.UpdateAsync(parameter);", - "\n }", - "\n }", - "\n ", - "\n await CommitToDatabase(partition);", - "\n await CommitToDatabase(partition);", - "\n await CommitToDatabase(partition);", - "\n await CommitToDatabase(partition);", - "\n //Hot fix: Disabling default as using Annual Cohort breakes Opening importer logic. ", - "\n //await CommitToDatabase(partition, snapshot: false);", - "\n //await CommitToDatabase(partition, snapshot: false);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "plZbdAKxhE2ZjyY7T43g-Q", - "cell_type": "markdown", - "source": [ - "# Importers" - ], - "metadata": {} - }, - { - "id": "6w4ObiZRmUaMLel1WMHQNA", - "cell_type": "markdown", - "source": [ - "## Parse and Upload: Dimensions" - ], - "metadata": {} - }, - { - "id": "hC50TsmYNkKo6cyJ1A0uRQ", - "cell_type": "code", - "source": [ - "public async Task UploadDimensionsAsync (string fileName) where T: class ", - "\n{", - "\n await CleanDatabaseAsync();", - "\n var importLog = await Import.FromFile(fileName).WithType().WithTarget(DataSource).ExecuteAsync();", - "\n return importLog;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zPGrABD22kCbEaJxlm9CYw", - "cell_type": "markdown", - "source": [ - "## Parse Main Tab and return Args" - ], - "metadata": {} - }, - { - "id": "l1JQnGEPfEylauUl-Y-Kqw", - "cell_type": "code", - "source": [ - "public async Task GetArgsFromMainAsync(string file)", - "\n{", - "\n var extension = System.IO.Path.GetExtension(file);", - "\n var stream = await Project.FileStorage.ReadAsync(file);", - "\n var mainTab = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).Tables[Main];", - "\n ", - "\n if(mainTab == null) ApplicationMessage.Log(Error.NoMainTab);", - "\n if(mainTab.Rows.Count() == 0) ApplicationMessage.Log(Error.IncompleteMainTab);", - "\n if(ApplicationMessage.HasErrors()) return null;", - "\n ", - "\n var main = mainTab.Rows.First();", - "\n var scenario = mainTab.Columns.Where(x => x.ColumnName == nameof(PartitionByReportingNode.Scenario)).Count() > 0? ", - "\n (string)main[nameof(PartitionByReportingNode.Scenario)] : default(string);", - "\n ", - "\n var partitionName = typeof(IPartition).Name switch ", - "\n {", - "\n nameof(PartitionByReportingNode) => new ImportArgs( (string)main[nameof(PartitionByReportingNode.ReportingNode)],", - "\n default(int),", - "\n default(int),", - "\n default(Periodicity),", - "\n scenario,", - "\n default(string)),", - "\n ", - "\n nameof(PartitionByReportingNodeAndPeriod) => new ImportArgs( (string)main[nameof(PartitionByReportingNodeAndPeriod.ReportingNode)], ", - "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Year)], typeof(int)),", - "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Month)], typeof(int)),", - "\n default(Periodicity),", - "\n scenario,", - "\n default(string)),", - "\n ", - "\n _ => null", - "\n };", - "\n ", - "\n if (partitionName == null) ApplicationMessage.Log(Error.PartitionTypeNotFound, typeof(IPartition).Name); ", - "\n return partitionName;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Nc8XqguDwEywNGHzIg3C4A", - "cell_type": "markdown", - "source": [ - "### Parse and Upload: Data Nodes" - ], - "metadata": {} - }, - { - "id": "TryM-sop6USTlvmWqP14CQ", - "cell_type": "markdown", - "source": [ - "### Portfolio and Group of contract" - ], - "metadata": {} - }, - { - "id": "XxwGlJ5PS02O5OtQsb1v8g", - "cell_type": "code", - "source": [ - "public async Task UploadDataNodesToWorkspaceAsync(string fileName)", - "\n{", - "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", - "\n Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization()", - "\n .DisableInitialization()", - "\n .DisableInitialization());", - "\n ", - "\n Activity.Start();", - "\n var args = await GetArgsFromMainAsync(fileName);", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n ", - "\n var storage = new ParsingStorage(args, DataSource, Workspace);", - "\n await storage.InitializeAsync();", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n ", - "\n var errors = new List();", - "\n var importLogPortfolios = await Import.FromFile(fileName)", - "\n .WithType((dataset, datarow) => new InsurancePortfolio {", - "\n SystemName = datarow.Field(nameof(DataNode.SystemName)),", - "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", - "\n Partition = storage.TargetPartitionByReportingNode.Id,", - "\n ContractualCurrency = datarow.Field(nameof(DataNode.ContractualCurrency)),", - "\n FunctionalCurrency = storage.ReportingNode.Currency,", - "\n LineOfBusiness = datarow.Field(nameof(DataNode.LineOfBusiness)),", - "\n ValuationApproach = datarow.Field(nameof(DataNode.ValuationApproach)),", - "\n OciType = datarow.Field(nameof(DataNode.OciType))", - "\n })", - "\n .WithType((dataset, datarow) =>new ReinsurancePortfolio {", - "\n SystemName = datarow.Field(nameof(DataNode.SystemName)),", - "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", - "\n Partition = storage.TargetPartitionByReportingNode.Id,", - "\n ContractualCurrency = datarow.Field(nameof(DataNode.ContractualCurrency)),", - "\n FunctionalCurrency = storage.ReportingNode.Currency,", - "\n LineOfBusiness = datarow.Field(nameof(DataNode.LineOfBusiness)),", - "\n ValuationApproach = datarow.Field(nameof(DataNode.ValuationApproach)),", - "\n OciType = datarow.Field(nameof(DataNode.OciType))", - "\n })", - "\n .WithTarget(Workspace)", - "\n .ExecuteAsync();", - "\n ", - "\n var portfolios = await Workspace.Query().ToDictionaryAsync(x => x.SystemName);", - "\n var importLogGroupOfContracts = await Import.FromFile(fileName)", - "\n .WithType((dataset, datarow) => {", - "\n var gicSystemName = datarow.Field(nameof(DataNode.SystemName));", - "\n var pf = datarow.Field(nameof(InsurancePortfolio));", - "\n if(!portfolios.TryGetValue(pf, out var portfolioData))", - "\n {", - "\n ApplicationMessage.Log(Error.PortfolioGicNotFound, pf, gicSystemName);", - "\n return null;", - "\n }", - "\n var gic = new GroupOfInsuranceContract {", - "\n SystemName = gicSystemName,", - "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", - "\n Partition = storage.TargetPartitionByReportingNode.Id,", - "\n ContractualCurrency = portfolioData.ContractualCurrency,", - "\n FunctionalCurrency = portfolioData.FunctionalCurrency,", - "\n LineOfBusiness = portfolioData.LineOfBusiness,", - "\n ValuationApproach = portfolioData.ValuationApproach,", - "\n OciType = portfolioData.OciType,", - "\n AnnualCohort = Convert.ToInt32(datarow.Field(nameof(GroupOfContract.AnnualCohort))),", - "\n LiabilityType = datarow.Field(nameof(GroupOfContract.LiabilityType)),", - "\n Profitability = datarow.Field(nameof(GroupOfContract.Profitability)),", - "\n Portfolio = pf", - "\n };", - "\n return ExtendGroupOfContract(gic, datarow);", - "\n })", - "\n .WithType((dataset, datarow) => {", - "\n var gricSystemName = datarow.Field(nameof(DataNode.SystemName));", - "\n var pf = datarow.Field(nameof(ReinsurancePortfolio));", - "\n if(!portfolios.TryGetValue(pf, out var portfolioData))", - "\n {", - "\n ApplicationMessage.Log(Error.PortfolioGicNotFound, pf, gricSystemName);", - "\n return null;", - "\n }", - "\n var gric = new GroupOfReinsuranceContract {", - "\n SystemName = gricSystemName,", - "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", - "\n Partition = storage.TargetPartitionByReportingNode.Id,", - "\n ContractualCurrency = portfolioData.ContractualCurrency,", - "\n FunctionalCurrency = portfolioData.FunctionalCurrency,", - "\n LineOfBusiness = portfolioData.LineOfBusiness,", - "\n ValuationApproach = portfolioData.ValuationApproach,", - "\n OciType = portfolioData.OciType,", - "\n AnnualCohort = Convert.ToInt32(datarow.Field(nameof(GroupOfContract.AnnualCohort))),", - "\n LiabilityType = datarow.Field(nameof(GroupOfContract.LiabilityType)),", - "\n Profitability = datarow.Field(nameof(GroupOfContract.Profitability)),", - "\n Portfolio = pf,", - "\n Partner = datarow.Field(nameof(GroupOfContract.Partner))", - "\n };", - "\n return ExtendGroupOfContract(gric, datarow);", - "\n })", - "\n .WithTarget(Workspace)", - "\n .ExecuteAsync();", - "\n ", - "\n return Activity.Finish().Merge(importLogPortfolios).Merge(importLogGroupOfContracts);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ek8lfAoNYUuv38Cg7Ld7UA", - "cell_type": "code", - "source": [ - "public async Task UploadDataNodesAsync(string fileName)", - "\n{", - "\n var log = await UploadDataNodesToWorkspaceAsync(fileName);", - "\n var partition = (Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode));", - "\n ", - "\n await DataNodeFactoryAsync(); ", - "\n return log;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "EWnSq0n9wkmoyganTsWoYw", - "cell_type": "markdown", - "source": [ - "### Data Node State" - ], - "metadata": {} - }, - { - "id": "GPjdrCFjTEiPfTQ_5EzELg", - "cell_type": "code", - "source": [ - "public async Task ValidateDataNodeStatesAsync(Dictionary persistentDataNodeByDataNode)", - "\n{", - "\n foreach(var importedDataNodeState in await Workspace.Query().ToArrayAsync())", - "\n {", - "\n if(persistentDataNodeByDataNode.TryGetValue(importedDataNodeState.DataNode, out var currentPersistentDataNode))", - "\n {", - "\n if(importedDataNodeState.State < currentPersistentDataNode.State)", - "\n ApplicationMessage.Log(Error.ChangeDataNodeState, importedDataNodeState.DataNode, ", - "\n currentPersistentDataNode.State.ToString(), ", - "\n importedDataNodeState.State.ToString());", - "\n", - "\n if(importedDataNodeState.State == currentPersistentDataNode.State)", - "\n await Workspace.DeleteAsync(importedDataNodeState);", - "\n }", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Onp_ZdRWQ0-oaDr1QwZdYg", - "cell_type": "code", - "source": [ - "public async Task UploadDataNodeStateToWorkspaceAsync(string fileName)", - "\n{", - "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", - "\n Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization()", - "\n .DisableInitialization());", - "\n ", - "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync() );", - "\n ", - "\n Activity.Start();", - "\n var args = await GetArgsFromMainAsync(fileName);", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n ", - "\n var storage = new ParsingStorage(args, DataSource, Workspace);", - "\n await storage.InitializeAsync();", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n", - "\n var importLog = await Import.FromFile(fileName).WithType(", - "\n (dataset, datarow) => new DataNodeState {", - "\n DataNode = datarow.Field(nameof(DataNodeState.DataNode)),", - "\n State = (State)Enum.Parse(typeof(State), datarow.Field(nameof(DataNodeState.State))),", - "\n Year = args.Year,", - "\n Month = args.Month,", - "\n Partition = storage.TargetPartitionByReportingNode.Id", - "\n }", - "\n ).WithTarget(Workspace).ExecuteAsync();", - "\n", - "\n await ValidateDataNodeStatesAsync(storage.DataNodeDataBySystemName);", - "\n return Activity.Finish().Merge(importLog);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LvFi94RVy0C36bUPNXZIuQ", - "cell_type": "code", - "source": [ - "public async Task UploadDataNodeStateAsync(string fileName)", - "\n{", - "\n var log = await UploadDataNodeStateToWorkspaceAsync(fileName);", - "\n await CommitToDatabase((Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode)), snapshot: false); ", - "\n return log;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "l1yjjsQ6P0OSf1PWW_AL8w", - "cell_type": "markdown", - "source": [ - "### DataNode Parameters" - ], - "metadata": {} - }, - { - "id": "Q5PAOqsi5kOktzneex2EZA", - "cell_type": "code", - "source": [ - "public async Task UploadDataNodeParameterToWorkspaceAsync(string fileName, Guid targetPartitionByReportingNodeId)", - "\n{", - "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", - "\n Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization()", - "\n .DisableInitialization());", - "\n ", - "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync() );", - "\n ", - "\n Activity.Start();", - "\n var args = await GetArgsFromMainAsync(fileName) with {ImportFormat = ImportFormats.DataNodeParameter};", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n", - "\n var storage = new ParsingStorage(args, DataSource, Workspace);", - "\n await storage.InitializeAsync();", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n", - "\n var singleDataNode = new List();", - "\n var interDataNode = new List<(string,string)>();", - "\n ", - "\n var importLog = await Import.FromFile(fileName)", - "\n .WithType( (dataset, datarow) => {", - "\n", - "\n //read and validate DataNodes", - "\n var dataNode = datarow.Field(nameof(DataNode));", - "\n if(!storage.IsValidDataNode(dataNode)) { ApplicationMessage.Log(Error.InvalidDataNode, dataNode); return null; }", - "\n", - "\n //check for duplicates", - "\n if(singleDataNode.Contains(dataNode)) { ApplicationMessage.Log(Error.DuplicateSingleDataNode, dataNode); return null; }", - "\n singleDataNode.Add(dataNode);", - "\n ", - "\n //Instantiate SingleDataNodeParameter", - "\n return new SingleDataNodeParameter {", - "\n Year = args.Year,", - "\n Month = args.Month,", - "\n Partition = storage.TargetPartitionByReportingNode.Id,", - "\n", - "\n DataNode = dataNode,", - "\n PremiumAllocation = (datarow.Field(nameof(SingleDataNodeParameter.PremiumAllocation)))", - "\n .ToString().CheckStringForExponentialAndConvertToDouble(),", - "\n };", - "\n })", - "\n .WithType( (dataset, datarow) => {", - "\n", - "\n //read and validate DataNodes", - "\n var dataNode = datarow.Field(nameof(InterDataNodeParameter.DataNode));", - "\n if(!storage.IsValidDataNode(dataNode)) { ApplicationMessage.Log(Error.InvalidDataNode, dataNode); return null; }", - "\n", - "\n var linkedDataNode = datarow.Field(nameof(InterDataNodeParameter.LinkedDataNode));", - "\n if(!storage.IsValidDataNode(linkedDataNode)) { ApplicationMessage.Log(Error.InvalidDataNode, linkedDataNode); return null; }", - "\n var dataNodes = new string[]{dataNode, linkedDataNode}.OrderBy(x => x).ToArray();", - "\n", - "\n //validate ReinsuranceGross Link", - "\n var isDn1Reinsurance = storage.IsDataNodeReinsurance(dataNodes[0]);", - "\n var isDn2Reinsurance = storage.IsDataNodeReinsurance(dataNodes[1]);", - "\n var isGrossReinsuranceLink = (isDn1Reinsurance && !isDn2Reinsurance) != (!isDn1Reinsurance && isDn2Reinsurance);", - "\n var reinsCov = (datarow.Field(nameof(InterDataNodeParameter.ReinsuranceCoverage)))", - "\n .ToString().CheckStringForExponentialAndConvertToDouble();", - "\n if(!isGrossReinsuranceLink && Math.Abs(reinsCov) > Precision )", - "\n ApplicationMessage.Log(Error.ReinsuranceCoverageDataNode, dataNodes[0], dataNodes[1]); // TODO: is this error or warning?", - "\n", - "\n //check for duplicates", - "\n if(interDataNode.Contains((dataNodes[0], dataNodes[1])) || interDataNode.Contains((dataNodes[1], dataNodes[0])))", - "\n ApplicationMessage.Log(Error.DuplicateInterDataNode, dataNodes[0], dataNodes[1]); // TODO: is this error or warning?", - "\n", - "\n interDataNode.Add((dataNodes[0], dataNodes[1])); ", - "\n //Instantiate InterDataNodeParameter", - "\n return new InterDataNodeParameter {", - "\n Year = args.Year,", - "\n Month = args.Month,", - "\n Partition = storage.TargetPartitionByReportingNode.Id,", - "\n DataNode = dataNodes[0],", - "\n LinkedDataNode = dataNodes[1],", - "\n ReinsuranceCoverage = reinsCov,", - "\n };", - "\n })", - "\n .WithTarget(Workspace)", - "\n .ExecuteAsync();", - "\n ", - "\n targetPartitionByReportingNodeId = storage.TargetPartitionByReportingNode.Id;", - "\n return Activity.Finish().Merge(importLog);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "FpMgj56nhUWiJDn-bke8XQ", - "cell_type": "code", - "source": [ - "public async Task UploadDataNodeParameterAsync(string fileName)", - "\n{", - "\n Guid partitionId = new Guid();", - "\n var log = await UploadDataNodeParameterToWorkspaceAsync(fileName, partitionId);", - "\n ", - "\n await CommitToDatabase(partitionId, snapshot: false);", - "\n await CommitToDatabase(partitionId, snapshot: false); ", - "\n ", - "\n return log;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "NayXrFB1fUCjVZsyuv3HCA", - "cell_type": "markdown", - "source": [ - "## Parse and Upload: Variables" - ], - "metadata": {} - }, - { - "id": "6nCpBsFe4kylRPgDYwMg9A", - "cell_type": "markdown", - "source": [ - "### Validation for Active Data Node States" - ], - "metadata": {} - }, - { - "id": "aVUxILOVD0WCQ3Kd9uMtaA", - "cell_type": "code", - "source": [ - "public async Task ValidateForDataNodeStateActiveAsync(Dictionary dataNodes) where T : BaseDataRecord", - "\n{ ", - "\n foreach(var item in (await Workspace.Query().ToArrayAsync()).GroupBy(x => x.DataNode))", - "\n if(!dataNodes.ContainsKey(item.First().DataNode))", - "\n ApplicationMessage.Log(Error.InactiveDataNodeState, item.First().DataNode);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WFAodnYhh0S4UQHkB4pFcQ", - "cell_type": "markdown", - "source": [ - "### Cashflow as Raw Variable and Ifrs Variable" - ], - "metadata": {} - }, - { - "id": "a2sXTTFuxk6by0RB9IyY5g", - "cell_type": "code", - "source": [ - "public async Task ParseCashflowsToWorkspaceAsync(string fileName, ImportArgs args)", - "\n{", - "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", - "\n Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization());", - "\n ", - "\n Activity.Start();", - "\n var parsingStorage = new ParsingStorage(args, DataSource, Workspace);", - "\n await parsingStorage.InitializeAsync();", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n ", - "\n var importLog = await Import.FromFile(fileName)", - "\n .WithType ( (dataset, datarow) => {", - "\n var aocType = datarow.Field(nameof(RawVariable.AocType));", - "\n var novelty = datarow.Field(nameof(RawVariable.Novelty));", - "\n var dataNode = datarow.Field(nameof(DataNode));", - "\n ", - "\n if(!parsingStorage.DataNodeDataBySystemName.TryGetValue(dataNode, out var dataNodeData)) {", - "\n ApplicationMessage.Log(Error.InvalidDataNode, dataNode);", - "\n return null;", - "\n }", - "\n ", - "\n // Error if AocType is not present in the mapping", - "\n if(!parsingStorage.AocTypeMap.Contains(new AocStep(aocType, novelty))) {", - "\n ApplicationMessage.Log(Error.AocTypeMapNotFound, aocType, novelty);", - "\n return null;", - "\n }", - "\n ", - "\n // Filter out cashflows for DataNode that were created in the past and are still active and come with AocType = BOPI", - "\n if(dataNodeData.Year < args.Year && aocType == AocTypes.BOP && novelty == Novelties.I) {", - "\n ApplicationMessage.Log(Warning.ActiveDataNodeWithCashflowBOPI);", - "\n return null;", - "\n }", - "\n ", - "\n var amountTypeFromFile = datarow.Field(nameof(RawVariable.AmountType));", - "\n var isCalculationType = parsingStorage.CalculationType.ContainsKey(amountTypeFromFile);", - "\n var amountType = isCalculationType ? null : amountTypeFromFile;", - "\n var calculationType = isCalculationType ? amountTypeFromFile : CalculationTypes.BE;", - "\n ", - "\n var values = datarow.Table.Columns.Where(c => c.ColumnName.StartsWith(nameof(RawVariable.Values))).OrderBy(c => c.ColumnName.Length).ThenBy(c => c.ColumnName)", - "\n .Select(x => datarow.Field(x.ColumnName).CheckStringForExponentialAndConvertToDouble()).Prune();", - "\n ", - "\n // Filter out empty raw variables for AocType != CL", - "\n if(values.Length == 0 && aocType != AocTypes.CL) return null; //TODO: extend this check for all mandatory step and not just for CL", - "\n ", - "\n var item = new RawVariable {", - "\n DataNode = dataNode,", - "\n AocType = aocType,", - "\n Novelty = novelty,", - "\n AmountType = amountType,", - "\n CalculationType = calculationType,", - "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(RawVariable.AccidentYear))), out var tempVal)? tempVal : (int?)null,", - "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", - "\n Values = Multiply(GetSign((aocType, amountType, calculationType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), values)", - "\n };", - "\n return item;", - "\n }, ImportFormats.Cashflow", - "\n ).WithTarget(Workspace).ExecuteAsync();", - "\n ", - "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", - "\n return Activity.Finish().Merge(importLog);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3iGcaiP12U-Jc2zU_pPCQw", - "cell_type": "code", - "source": [ - "public async Task UploadCashflowsAsync(string fileName)", - "\n{", - "\n Activity.Start();", - "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Cashflow};", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n ", - "\n var parsingLog = await ParseCashflowsToWorkspaceAsync(fileName, args);", - "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", - "\n ", - "\n var storage = new ImportStorage(args, DataSource, Workspace);", - "\n await storage.InitializeAsync();", - "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", - "\n ", - "\n var universe = Scopes.ForStorage(storage).ToScope();", - "\n var identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);", - "\n var ivs = universe.GetScopes(identities).SelectMany(x => x.CalculatedIfrsVariables);", - "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", - "\n ", - "\n await Workspace.UpdateAsync(ivs);", - "\n await CommitToDatabase(storage.TargetPartition, ", - "\n snapshot : true, ", - "\n filter : x => storage.EstimateTypesByImportFormat[ImportFormats.Cashflow].Contains(x.EstimateType) && ", - "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode)); ", - "\n await CommitToDatabase(storage.TargetPartition, ", - "\n snapshot : true,", - "\n filter : x => storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode));", - "\n", - "\n return Activity.Finish().Merge(parsingLog); ", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BzW1jMILIk-dXDuU0pbd3w", - "cell_type": "markdown", - "source": [ - "### Actuals as Ifrs Variable" - ], - "metadata": {} - }, - { - "id": "4CYHZInVJUOfrmoLQKbolQ", - "cell_type": "code", - "source": [ - "public async Task ParseActualsToWorkspaceAsync(string fileName, ImportArgs args)", - "\n{", - "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", - "\n Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization());", - "\n ", - "\n Activity.Start();", - "\n var parsingStorage = new ParsingStorage(args, DataSource, Workspace);", - "\n await parsingStorage.InitializeAsync();", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n", - "\n var importLog = await Import.FromFile(fileName)", - "\n .WithType ( (dataset, datarow) => {", - "\n var dataNode = datarow.Field(nameof(DataNode));", - "\n if(!parsingStorage.DataNodeDataBySystemName.TryGetValue(dataNode, out var dataNodeData)) {", - "\n ApplicationMessage.Log(Error.InvalidDataNode, dataNode);", - "\n return null;", - "\n }", - "\n ", - "\n var valueType = datarow.Field(ValueType);", - "\n if(valueType == null) { ", - "\n ApplicationMessage.Log(Error.ValueTypeNotFound); ", - "\n return null; ", - "\n }", - "\n ", - "\n var amountType = parsingStorage.DimensionsWithExternalId[typeof(PvAmountType)].TryGetValue(valueType, out var at)? at : null;", - "\n var isStdActual = parsingStorage.PvAmountType.ContainsKey(valueType);", - "\n var estimateType = isStdActual? EstimateTypes.A : parsingStorage.DimensionsWithExternalId[typeof(EstimateType)].TryGetValue(valueType, out var et)? et : null;", - "\n if(estimateType == null || amountType == null) { ", - "\n ApplicationMessage.Log(Error.ValueTypeNotValid, valueType);", - "\n return null;", - "\n }", - "\n ", - "\n var aocType = datarow.Field(nameof(IfrsVariable.AocType));", - "\n if((!isStdActual && aocType != AocTypes.CF && aocType != AocTypes.WO) || (isStdActual && aocType != AocTypes.CF) ) {", - "\n ApplicationMessage.Log(Error.AocTypeNotValid, aocType);", - "\n return null;", - "\n }", - "\n ", - "\n var item = new IfrsVariable {", - "\n DataNode = dataNode,", - "\n AocType = aocType,", - "\n Novelty = Novelties.C,", - "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(IfrsVariable.AccidentYear))), out var tempAccYear)? tempAccYear : (int?)null,", - "\n AmountType = amountType,", - "\n EstimateType = estimateType,", - "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", - "\n Value = Multiply(GetSign((aocType, amountType, estimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()),", - "\n };", - "\n return item;", - "\n }, ImportFormats.Actual", - "\n ).WithTarget(Workspace).ExecuteAsync();", - "\n ", - "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", - "\n return Activity.Finish().Merge(importLog);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xeJTsq8-HEqh4t1fxKDzcg", - "cell_type": "code", - "source": [ - "public async Task UploadActualAsync(string fileName)", - "\n{", - "\n Activity.Start();", - "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Actual};", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n", - "\n var parsingLog = await ParseActualsToWorkspaceAsync(fileName, args);", - "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", - "\n", - "\n var storage = new ImportStorage(args, DataSource, Workspace);", - "\n await storage.InitializeAsync();", - "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", - "\n", - "\n var universe = Scopes.ForStorage(storage).ToScope();", - "\n var identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);", - "\n var ivs = universe.GetScopes(identities).SelectMany(x => x.CalculatedIfrsVariables);", - "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", - "\n", - "\n await Workspace.UpdateAsync(ivs);", - "\n await CommitToDatabase(storage.TargetPartition, ", - "\n snapshot : true, ", - "\n filter : x => storage.EstimateTypesByImportFormat[ImportFormats.Actual].Contains(x.EstimateType) && ", - "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode));", - "\n", - "\n return Activity.Finish().Merge(parsingLog);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "GBB66l28v06C1ovuu7oKAA", - "cell_type": "markdown", - "source": [ - "# Simple Value Import" - ], - "metadata": {} - }, - { - "id": "0eUHQv8O1kSXjjquLKakNQ", - "cell_type": "markdown", - "source": [ - "## Simple Value to Workspace" - ], - "metadata": {} - }, - { - "id": "BdMAjdPmX0y00AXxMyx40w", - "cell_type": "code", - "source": [ - "public async Task ParseSimpleValueToWorkspaceAsync(string fileName, ImportArgs args, Guid targetPartitionByReportingNodeAndPeriodId)", - "\n{", - "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", - "\n Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization());", - "\n ", - "\n Activity.Start();", - "\n var importFormat = args.ImportFormat;", - "\n var parsingStorage = new ParsingStorage(args, DataSource, Workspace);", - "\n await parsingStorage.InitializeAsync();", - "\n if(Activity.HasErrors()) return Activity.Finish(); ", - "\n", - "\n var importLog = await Import.FromFile(fileName)", - "\n .WithType ( (dataset, datarow) => {", - "\n var dataNode = parsingStorage.ValidateDataNode(datarow.Field(nameof(DataNode)));", - "\n var amountType = parsingStorage.ValidateAmountType(datarow.Field(nameof(IfrsVariable.AmountType)));", - "\n var estimateType = parsingStorage.ValidateEstimateType(datarow.Field(nameof(IfrsVariable.EstimateType)), dataNode); //TODO LIC/LRC dependence", - "\n var aocStep = importFormat == ImportFormats.SimpleValue ", - "\n ? parsingStorage.ValidateAocStep(new AocStep (datarow.Field(nameof(IfrsVariable.AocType)), ", - "\n datarow.Field(nameof(IfrsVariable.Novelty))))", - "\n : new AocStep(AocTypes.BOP, Novelties.I);", - "\n var economicBasis = importFormat == ImportFormats.SimpleValue ", - "\n ? datarow.Field(nameof(IfrsVariable.EconomicBasis)) ", - "\n : null;", - "\n ", - "\n parsingStorage.ValidateEstimateTypeAndAmountType(estimateType, amountType);", - "\n ", - "\n var iv = new IfrsVariable {", - "\n DataNode = dataNode,", - "\n AocType = aocStep.AocType,", - "\n Novelty = aocStep.Novelty,", - "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(IfrsVariable.AccidentYear))), out var accidentYear) ? accidentYear : (int?)null,", - "\n AmountType = amountType,", - "\n EstimateType = estimateType,", - "\n EconomicBasis = economicBasis,", - "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", - "\n Value = GetSign((aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), parsingStorage.HierarchyCache)", - "\n * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()", - "\n };", - "\n return iv;", - "\n }, importFormat", - "\n ).WithTarget(Workspace).ExecuteAsync();", - "\n ", - "\n HashSet availableEstimateTypes = parsingStorage.TechnicalMarginEstimateTypes;", - "\n var multipleOp = await Workspace.Query().Where(iv => availableEstimateTypes.Contains(iv.EstimateType))", - "\n .GroupBy(iv => iv.DataNode)", - "\n .Where(g => g.Count() > 1).ToArrayAsync();", - "\n //.Select(g => ApplicationMessage.Log(Error.MultipleTechnicalMarginOpening, g.Key));", - "\n ", - "\n foreach (var op in multipleOp)", - "\n ApplicationMessage.Log(Error.MultipleTechnicalMarginOpening, op.Key);", - "\n ", - "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", - "\n targetPartitionByReportingNodeAndPeriodId = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id;", - "\n return Activity.Finish().Merge(importLog);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9OUXaxBq9UWnDfTVkzZWxQ", - "cell_type": "markdown", - "source": [ - "## Simple Value as IfrsVariable" - ], - "metadata": {} - }, - { - "id": "LQsJefixt0iCd-c5YpFk0A", - "cell_type": "code", - "source": [ - "public async Task UploadSimpleValueAsync(string fileName)", - "\n{", - "\n Activity.Start();", - "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.SimpleValue};", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n ", - "\n Guid partitionId = new Guid();", - "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(fileName, args, partitionId);", - "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", - "\n ", - "\n Workspace.Query().Select(v => new {v.DataNode, v.AccidentYear}).Distinct();", - "\n ", - "\n await CommitToDatabase(partitionId, ", - "\n snapshot : true,", - "\n filter : x => Workspace.Query().Select(v => v.DataNode).Distinct().Contains(x.DataNode));", - "\n ", - "\n return Activity.Finish().Merge(parsingLog);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tyyiqAeFX0Gc5OKA_lmSEw", - "cell_type": "markdown", - "source": [ - "## Openings as IfrsVariable" - ], - "metadata": {} - }, - { - "id": "bkCo7-z9F0-_18aRV7Upqw", - "cell_type": "code", - "source": [ - "public async Task UploadOpeningAsync(string fileName)", - "\n{", - "\n Activity.Start();", - "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Opening};", - "\n if(Activity.HasErrors()) return Activity.Finish();", - "\n ", - "\n Guid partitionId = new Guid();", - "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(fileName, args, partitionId);", - "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", - "\n ", - "\n var storage = new ImportStorage(args, DataSource, Workspace);", - "\n await storage.InitializeAsync();", - "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", - "\n ", - "\n var universe = Scopes.ForStorage(storage).ToScope();", - "\n var identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);", - "\n var ivs = universe.GetScopes(identities).SelectMany(x => x.CalculatedIfrsVariables);", - "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", - "\n", - "\n await Workspace.UpdateAsync(ivs);", - "\n await CommitToDatabase(storage.TargetPartition, ", - "\n snapshot : true,", - "\n filter : x => storage.EstimateTypesByImportFormat[ImportFormats.Opening].Contains(x.EstimateType) && ", - "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode ));", - "\n", - "\n return Activity.Finish().Merge(parsingLog);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YqhevtPH3EiTicAIQesk-g", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "", + "\n

Importer Methods

", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"ImportScopeCalculation\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Parsing Storage" + ] + }, + { + "cell_type": "code", + "source": [ + "public class ParsingStorage", + "\n{", + "\n private readonly IDataSource dataSource;", + "\n private readonly IWorkspace workspace;", + "\n private readonly ImportArgs args;", + "\n ", + "\n //Hierarchy Cache", + "\n public Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache HierarchyCache;", + "\n ", + "\n public ReportingNode ReportingNode { get; protected set; }", + "\n ", + "\n public Dictionary DataNodeDataBySystemName;", + "\n ", + "\n // Dimensions", + "\n public Dictionary CalculationType;", + "\n public Dictionary PvAmountType; ", + "\n public HashSet AocTypeMap;", + "\n private HashSet estimateTypes;", + "\n private HashSet amountTypes;", + "\n private Dictionary> amountTypesByEstimateType => GetAmountTypesByEstimateType(HierarchyCache);", + "\n public HashSet TechnicalMarginEstimateTypes => GetTechnicalMarginEstimateType(); ", + "\n public Dictionary> DimensionsWithExternalId;", + "\n ", + "\n // Partitions", + "\n public PartitionByReportingNode TargetPartitionByReportingNode;", + "\n public PartitionByReportingNodeAndPeriod TargetPartitionByReportingNodeAndPeriod;", + "\n ", + "\n //Constructor", + "\n public ParsingStorage(ImportArgs args, IDataSource dataSource, IWorkspace workspace)", + "\n {", + "\n this.args = args;", + "\n this.dataSource = dataSource;", + "\n this.workspace = workspace;", + "\n }", + "\n ", + "\n // Initialize", + "\n public async Task InitializeAsync()", + "\n {", + "\n //Partition Workspace and DataSource", + "\n TargetPartitionByReportingNode = (await workspace.Query().Where(p => p.ReportingNode == args.ReportingNode).ToArrayAsync()).SingleOrDefault(); ", + "\n ", + "\n if(TargetPartitionByReportingNode == null) ", + "\n { ApplicationMessage.Log(Error.ParsedPartitionNotFound, args.ReportingNode); return; } ", + "\n ", + "\n await workspace.Partition.SetAsync(TargetPartitionByReportingNode.Id);", + "\n await dataSource.Partition.SetAsync(TargetPartitionByReportingNode.Id);", + "\n ", + "\n if(args.Year != default(int) && args.Month != default(int))", + "\n {", + "\n TargetPartitionByReportingNodeAndPeriod = (await workspace.Query()", + "\n .Where(p => p.ReportingNode == args.ReportingNode &&", + "\n p.Year == args.Year &&", + "\n p.Month == args.Month &&", + "\n p.Scenario == args.Scenario).ToArrayAsync()).SingleOrDefault();", + "\n ", + "\n if(TargetPartitionByReportingNodeAndPeriod == null) ", + "\n { ApplicationMessage.Log(Error.ParsedPartitionNotFound, args.ReportingNode, args.Year.ToString(), args.Month.ToString(), args.Scenario); return; } ", + "\n ", + "\n await workspace.Partition.SetAsync(TargetPartitionByReportingNodeAndPeriod.Id);", + "\n await dataSource.Partition.SetAsync(TargetPartitionByReportingNodeAndPeriod.Id);", + "\n ", + "\n //Clean up the workspace", + "\n await workspace.DeleteAsync( await workspace.Query().ToArrayAsync() );", + "\n await workspace.DeleteAsync( await workspace.Query().ToArrayAsync() );", + "\n }", + "\n ", + "\n ReportingNode = (await dataSource.Query().Where(x => x.SystemName == args.ReportingNode).ToArrayAsync()).First();", + "\n var aocConfigurationByAocStep = await dataSource.LoadAocStepConfigurationAsync(args.Year, args.Month);", + "\n AocTypeMap = args.ImportFormat switch {", + "\n ImportFormats.Cashflow => aocConfigurationByAocStep.Where(x => x.InputSource.Contains(InputSource.Cashflow) &&", + "\n !new DataType[]{DataType.Calculated, DataType.CalculatedTelescopic}.Contains(x.DataType) )", + "\n .GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).ToHashSet(),", + "\n ImportFormats.Actual => aocConfigurationByAocStep.Where(x => x.InputSource.Contains(InputSource.Actual) &&", + "\n !new DataType[]{DataType.Calculated, DataType.CalculatedTelescopic}.Contains(x.DataType) && ", + "\n new AocStep(x.AocType, x.Novelty) != new AocStep(AocTypes.BOP, Novelties.I))", + "\n .GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).ToHashSet(),", + "\n ImportFormats.Opening => aocConfigurationByAocStep.Where(x => x.InputSource.Contains(InputSource.Opening) && x.DataType == DataType.Optional).GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).ToHashSet(),", + "\n ImportFormats.SimpleValue => aocConfigurationByAocStep.GroupBy(x => new AocStep(x.AocType, x.Novelty), (k,v) => k).Concat((await dataSource.Query().ToArrayAsync())", + "\n .Select(vt => new AocStep(vt.SystemName,null))).ToHashSet(),", + "\n _ => Enumerable.Empty().ToHashSet(),", + "\n };", + "\n ", + "\n //DataNodes", + "\n DataNodeDataBySystemName = args.ImportFormat == ImportFormats.Opening ", + "\n ? (await LoadDataNodesAsync(dataSource, args)).Where(kvp => kvp.Value.Year == args.Year).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)", + "\n : await LoadDataNodesAsync(dataSource, args);", + "\n // Dimensions", + "\n CalculationType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n PvAmountType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n amountTypes = (await dataSource.Query().ToArrayAsync()).Select(at => at.SystemName).ToHashSet();", + "\n estimateTypes = args.ImportFormat switch {", + "\n ImportFormats.SimpleValue => (await dataSource.Query().ToArrayAsync()).Select(et => et.SystemName).ToHashSet(),", + "\n ImportFormats.Opening => (await dataSource.Query().Where(et => et.StructureType == StructureType.AoC).ToArrayAsync())", + "\n .Where(et => et.InputSource.Contains(InputSource.Opening)) //This Contains overload cannot be used in DB", + "\n .Select(et => et.SystemName).ToHashSet(),", + "\n _ => Enumerable.Empty().ToHashSet(),", + "\n };", + "\n ", + "\n ", + "\n // DimensionsWithExternalId", + "\n DimensionsWithExternalId = new Dictionary>()", + "\n {", + "\n { typeof(PvAmountType), await GetDimensionWithExternalIdDictionaryAsync() },", + "\n { typeof(EstimateType), await GetDimensionWithExternalIdDictionaryAsync() }", + "\n };", + "\n ", + "\n //Hierarchy Cache", + "\n HierarchyCache = workspace.ToHierarchicalDimensionCache();", + "\n HierarchyCache.Initialize();", + "\n }", + "\n ", + "\n public async Task> GetDimensionWithExternalIdDictionaryAsync () where T : KeyedOrderedDimension", + "\n {", + "\n var dict = new Dictionary();", + "\n var items = await dataSource.Query().ToArrayAsync();", + "\n foreach (var item in items) {", + "\n dict.TryAdd(item.SystemName, item.SystemName);", + "\n if(typeof(T).IsAssignableTo(typeof(KeyedOrderedDimensionWithExternalId))) {", + "\n var externalIds = (string[])(typeof(T).GetProperty(nameof(KeyedOrderedDimensionWithExternalId.ExternalId)).GetValue(item));", + "\n if(externalIds == null) continue;", + "\n foreach (var extId in externalIds) ", + "\n dict.TryAdd(extId, item.SystemName);", + "\n }", + "\n }", + "\n return dict;", + "\n }", + "\n ", + "\n // Getters", + "\n public bool IsDataNodeReinsurance(string goc) => DataNodeDataBySystemName[goc].IsReinsurance;", + "\n public bool IsValidDataNode(string goc) => DataNodeDataBySystemName.ContainsKey(goc);", + "\n ", + "\n // Validations", + "\n public string ValidateEstimateType(string et, string goc) {", + "\n var allowedEstimateTypes = estimateTypes;", + "\n if (DataNodeDataBySystemName.TryGetValue(goc, out var dataNodeData) && dataNodeData.LiabilityType == LiabilityTypes.LIC)", + "\n estimateTypes.ExceptWith(TechnicalMarginEstimateTypes);", + "\n if(!allowedEstimateTypes.Contains(et))", + "\n ApplicationMessage.Log(Error.EstimateTypeNotFound, et);", + "\n return et;", + "\n }", + "\n ", + "\n public string ValidateAmountType(string at) {", + "\n if (at != null && !amountTypes.Contains(at))", + "\n ApplicationMessage.Log(Error.AmountTypeNotFound, at);", + "\n return at;", + "\n }", + "\n ", + "\n public AocStep ValidateAocStep(AocStep aoc) {", + "\n if (!AocTypeMap.Contains(aoc))", + "\n ApplicationMessage.Log(Error.AocTypeMapNotFound, aoc.AocType, aoc.Novelty);", + "\n return aoc;", + "\n }", + "\n ", + "\n public string ValidateDataNode(string goc) {", + "\n if (!DataNodeDataBySystemName.ContainsKey(goc))", + "\n ApplicationMessage.Log(Error.InvalidDataNode, goc);", + "\n return goc;", + "\n }", + "\n ", + "\n public void ValidateEstimateTypeAndAmountType(string estimateType, string amountType){", + "\n if (amountTypesByEstimateType.TryGetValue(estimateType, out var ats) && ats.Any() && !ats.Contains(amountType))", + "\n ApplicationMessage.Log(Error.InvalidAmountTypeEstimateType, estimateType, amountType);", + "\n }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Basics" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Clean the Database" + ] + }, + { + "cell_type": "code", + "source": [ + "async public Task CleanDatabaseAsync (Expression> filter = null) where T : class", + "\n{", + "\n var loadData = await DataSource.Query().Where(filter?? (Expression>)(x => true)).ToListAsync();", + "\n await DataSource.DeleteAsync(loadData);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "async public Task CleanDatabaseFromPartitionAsync (Guid partitionId, Func filter = null) where T : class, IPartitioned", + "\n{", + "\n var loadData = (await DataSource.Query().Where(x => x.Partition == partitionId).ToArrayAsync())", + "\n .Where(filter?? (Func)(x => true)).ToList();", + "\n await DataSource.DeleteAsync(loadData);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Update the Database" + ] + }, + { + "cell_type": "code", + "source": [ + "async public Task CommitToDatabase (Guid partitionId, bool snapshot = true, Func filter = null) where T : class, IPartitioned", + "\n{", + "\n if(snapshot) await CleanDatabaseFromPartitionAsync(partitionId, filter);", + "\n await DataSource.UpdateAsync( await Workspace.Query().ToArrayAsync() );", + "\n await DataSource.CommitAsync();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node Factory" + ] + }, + { + "cell_type": "code", + "source": [ + "// TODO: think of a better Factory to instantiate DataNode/State/Parameter simultaneously while avoiding public contructors (see Factory Patterns)", + "\n// ATTENTION: this Factory method provides default states and parameters so that it is not mandatory to import them (=> simpler calculation engine). ", + "\n// This method weakness is that these defaults aren't always replaced with the imported values, e,g, when Month > DefaultDataNodeActivationMonth.", + "\n// Therefore they will remain in the DataSource (hopefully without producing any harm).", + "\npublic async Task DataNodeFactoryAsync ()", + "\n{", + "\n var partition = (Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode));", + "\n var existingGroupOfContracts = await DataSource.Query().Where(x => x.Partition == partition).ToArrayAsync();", + "\n var importedGroupOfContracts = await Workspace.Query().ToArrayAsync();", + "\n var listOfPartitionsWithPeriod = new List();", + "\n ", + "\n foreach (var groupOfContract in importedGroupOfContracts)", + "\n {", + "\n var name = groupOfContract.SystemName;", + "\n if(!existingGroupOfContracts.Any(x => x.SystemName == name))", + "\n {", + "\n var state = new DataNodeState { DataNode = name, Year = groupOfContract.AnnualCohort, Partition = partition };", + "\n var parameter = new SingleDataNodeParameter { DataNode = name, Year = groupOfContract.AnnualCohort, Partition = partition };", + "\n await Workspace.UpdateAsync(state);", + "\n if(groupOfContract is GroupOfInsuranceContract) await Workspace.UpdateAsync(parameter);", + "\n }", + "\n }", + "\n ", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n //Hot fix: Disabling default as using Annual Cohort breakes Opening importer logic. ", + "\n //await CommitToDatabase(partition, snapshot: false);", + "\n //await CommitToDatabase(partition, snapshot: false);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Importers" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Parse and Upload: Dimensions" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadDimensionsAsync (string fileName) where T: class ", + "\n{", + "\n await CleanDatabaseAsync();", + "\n var importLog = await Import.FromFile(fileName).WithType().WithTarget(DataSource).ExecuteAsync();", + "\n return importLog;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Parse Main Tab and return Args" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task GetArgsFromMainAsync(string file)", + "\n{", + "\n var extension = System.IO.Path.GetExtension(file);", + "\n var stream = await Project.FileStorage.ReadAsync(file);", + "\n var mainTab = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).Tables[Main];", + "\n ", + "\n if(mainTab == null) ApplicationMessage.Log(Error.NoMainTab);", + "\n if(mainTab.Rows.Count() == 0) ApplicationMessage.Log(Error.IncompleteMainTab);", + "\n if(ApplicationMessage.HasErrors()) return null;", + "\n ", + "\n var main = mainTab.Rows.First();", + "\n var scenario = mainTab.Columns.Where(x => x.ColumnName == nameof(PartitionByReportingNode.Scenario)).Count() > 0? ", + "\n (string)main[nameof(PartitionByReportingNode.Scenario)] : default(string);", + "\n ", + "\n var partitionName = typeof(IPartition).Name switch ", + "\n {", + "\n nameof(PartitionByReportingNode) => new ImportArgs( (string)main[nameof(PartitionByReportingNode.ReportingNode)],", + "\n default(int),", + "\n default(int),", + "\n default(Periodicity),", + "\n scenario,", + "\n default(string)),", + "\n ", + "\n nameof(PartitionByReportingNodeAndPeriod) => new ImportArgs( (string)main[nameof(PartitionByReportingNodeAndPeriod.ReportingNode)], ", + "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Year)], typeof(int)),", + "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Month)], typeof(int)),", + "\n default(Periodicity),", + "\n scenario,", + "\n default(string)),", + "\n ", + "\n _ => null", + "\n };", + "\n ", + "\n if (partitionName == null) ApplicationMessage.Log(Error.PartitionTypeNotFound, typeof(IPartition).Name); ", + "\n return partitionName;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Parse and Upload: Data Nodes" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Portfolio and Group of contract" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadDataNodesToWorkspaceAsync(string fileName)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization()", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n Activity.Start();", + "\n var args = await GetArgsFromMainAsync(fileName);", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var storage = new ParsingStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var errors = new List();", + "\n var importLogPortfolios = await Import.FromFile(fileName)", + "\n .WithType((dataset, datarow) => new InsurancePortfolio {", + "\n SystemName = datarow.Field(nameof(DataNode.SystemName)),", + "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n ContractualCurrency = datarow.Field(nameof(DataNode.ContractualCurrency)),", + "\n FunctionalCurrency = storage.ReportingNode.Currency,", + "\n LineOfBusiness = datarow.Field(nameof(DataNode.LineOfBusiness)),", + "\n ValuationApproach = datarow.Field(nameof(DataNode.ValuationApproach)),", + "\n OciType = datarow.Field(nameof(DataNode.OciType))", + "\n })", + "\n .WithType((dataset, datarow) =>new ReinsurancePortfolio {", + "\n SystemName = datarow.Field(nameof(DataNode.SystemName)),", + "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n ContractualCurrency = datarow.Field(nameof(DataNode.ContractualCurrency)),", + "\n FunctionalCurrency = storage.ReportingNode.Currency,", + "\n LineOfBusiness = datarow.Field(nameof(DataNode.LineOfBusiness)),", + "\n ValuationApproach = datarow.Field(nameof(DataNode.ValuationApproach)),", + "\n OciType = datarow.Field(nameof(DataNode.OciType))", + "\n })", + "\n .WithTarget(Workspace)", + "\n .ExecuteAsync();", + "\n ", + "\n var portfolios = await Workspace.Query().ToDictionaryAsync(x => x.SystemName);", + "\n var importLogGroupOfContracts = await Import.FromFile(fileName)", + "\n .WithType((dataset, datarow) => {", + "\n var gicSystemName = datarow.Field(nameof(DataNode.SystemName));", + "\n var pf = datarow.Field(nameof(InsurancePortfolio));", + "\n if(!portfolios.TryGetValue(pf, out var portfolioData))", + "\n {", + "\n ApplicationMessage.Log(Error.PortfolioGicNotFound, pf, gicSystemName);", + "\n return null;", + "\n }", + "\n var gic = new GroupOfInsuranceContract {", + "\n SystemName = gicSystemName,", + "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n ContractualCurrency = portfolioData.ContractualCurrency,", + "\n FunctionalCurrency = portfolioData.FunctionalCurrency,", + "\n LineOfBusiness = portfolioData.LineOfBusiness,", + "\n ValuationApproach = portfolioData.ValuationApproach,", + "\n OciType = portfolioData.OciType,", + "\n AnnualCohort = Convert.ToInt32(datarow.Field(nameof(GroupOfContract.AnnualCohort))),", + "\n LiabilityType = datarow.Field(nameof(GroupOfContract.LiabilityType)),", + "\n Profitability = datarow.Field(nameof(GroupOfContract.Profitability)),", + "\n Portfolio = pf", + "\n };", + "\n return ExtendGroupOfContract(gic, datarow);", + "\n })", + "\n .WithType((dataset, datarow) => {", + "\n var gricSystemName = datarow.Field(nameof(DataNode.SystemName));", + "\n var pf = datarow.Field(nameof(ReinsurancePortfolio));", + "\n if(!portfolios.TryGetValue(pf, out var portfolioData))", + "\n {", + "\n ApplicationMessage.Log(Error.PortfolioGicNotFound, pf, gricSystemName);", + "\n return null;", + "\n }", + "\n var gric = new GroupOfReinsuranceContract {", + "\n SystemName = gricSystemName,", + "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n ContractualCurrency = portfolioData.ContractualCurrency,", + "\n FunctionalCurrency = portfolioData.FunctionalCurrency,", + "\n LineOfBusiness = portfolioData.LineOfBusiness,", + "\n ValuationApproach = portfolioData.ValuationApproach,", + "\n OciType = portfolioData.OciType,", + "\n AnnualCohort = Convert.ToInt32(datarow.Field(nameof(GroupOfContract.AnnualCohort))),", + "\n LiabilityType = datarow.Field(nameof(GroupOfContract.LiabilityType)),", + "\n Profitability = datarow.Field(nameof(GroupOfContract.Profitability)),", + "\n Portfolio = pf,", + "\n Partner = datarow.Field(nameof(GroupOfContract.Partner))", + "\n };", + "\n return ExtendGroupOfContract(gric, datarow);", + "\n })", + "\n .WithTarget(Workspace)", + "\n .ExecuteAsync();", + "\n ", + "\n return Activity.Finish().Merge(importLogPortfolios).Merge(importLogGroupOfContracts);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadDataNodesAsync(string fileName)", + "\n{", + "\n var log = await UploadDataNodesToWorkspaceAsync(fileName);", + "\n var partition = (Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode));", + "\n ", + "\n await DataNodeFactoryAsync(); ", + "\n return log;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Data Node State" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task ValidateDataNodeStatesAsync(Dictionary persistentDataNodeByDataNode)", + "\n{", + "\n foreach(var importedDataNodeState in await Workspace.Query().ToArrayAsync())", + "\n {", + "\n if(persistentDataNodeByDataNode.TryGetValue(importedDataNodeState.DataNode, out var currentPersistentDataNode))", + "\n {", + "\n if(importedDataNodeState.State < currentPersistentDataNode.State)", + "\n ApplicationMessage.Log(Error.ChangeDataNodeState, importedDataNodeState.DataNode, ", + "\n currentPersistentDataNode.State.ToString(), ", + "\n importedDataNodeState.State.ToString());", + "\n", + "\n if(importedDataNodeState.State == currentPersistentDataNode.State)", + "\n await Workspace.DeleteAsync(importedDataNodeState);", + "\n }", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadDataNodeStateToWorkspaceAsync(string fileName)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync() );", + "\n ", + "\n Activity.Start();", + "\n var args = await GetArgsFromMainAsync(fileName);", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var storage = new ParsingStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var importLog = await Import.FromFile(fileName).WithType(", + "\n (dataset, datarow) => new DataNodeState {", + "\n DataNode = datarow.Field(nameof(DataNodeState.DataNode)),", + "\n State = (State)Enum.Parse(typeof(State), datarow.Field(nameof(DataNodeState.State))),", + "\n Year = args.Year,", + "\n Month = args.Month,", + "\n Partition = storage.TargetPartitionByReportingNode.Id", + "\n }", + "\n ).WithTarget(Workspace).ExecuteAsync();", + "\n", + "\n await ValidateDataNodeStatesAsync(storage.DataNodeDataBySystemName);", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadDataNodeStateAsync(string fileName)", + "\n{", + "\n var log = await UploadDataNodeStateToWorkspaceAsync(fileName);", + "\n await CommitToDatabase((Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode)), snapshot: false); ", + "\n return log;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### DataNode Parameters" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadDataNodeParameterToWorkspaceAsync(string fileName, Guid targetPartitionByReportingNodeId)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync() );", + "\n ", + "\n Activity.Start();", + "\n var args = await GetArgsFromMainAsync(fileName) with {ImportFormat = ImportFormats.DataNodeParameter};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var storage = new ParsingStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var singleDataNode = new List();", + "\n var interDataNode = new List<(string,string)>();", + "\n ", + "\n var importLog = await Import.FromFile(fileName)", + "\n .WithType( (dataset, datarow) => {", + "\n", + "\n //read and validate DataNodes", + "\n var dataNode = datarow.Field(nameof(DataNode));", + "\n if(!storage.IsValidDataNode(dataNode)) { ApplicationMessage.Log(Error.InvalidDataNode, dataNode); return null; }", + "\n", + "\n //check for duplicates", + "\n if(singleDataNode.Contains(dataNode)) { ApplicationMessage.Log(Error.DuplicateSingleDataNode, dataNode); return null; }", + "\n singleDataNode.Add(dataNode);", + "\n ", + "\n //Instantiate SingleDataNodeParameter", + "\n return new SingleDataNodeParameter {", + "\n Year = args.Year,", + "\n Month = args.Month,", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n", + "\n DataNode = dataNode,", + "\n PremiumAllocation = (datarow.Field(nameof(SingleDataNodeParameter.PremiumAllocation)))", + "\n .ToString().CheckStringForExponentialAndConvertToDouble(),", + "\n };", + "\n })", + "\n .WithType( (dataset, datarow) => {", + "\n", + "\n //read and validate DataNodes", + "\n var dataNode = datarow.Field(nameof(InterDataNodeParameter.DataNode));", + "\n if(!storage.IsValidDataNode(dataNode)) { ApplicationMessage.Log(Error.InvalidDataNode, dataNode); return null; }", + "\n", + "\n var linkedDataNode = datarow.Field(nameof(InterDataNodeParameter.LinkedDataNode));", + "\n if(!storage.IsValidDataNode(linkedDataNode)) { ApplicationMessage.Log(Error.InvalidDataNode, linkedDataNode); return null; }", + "\n var dataNodes = new string[]{dataNode, linkedDataNode}.OrderBy(x => x).ToArray();", + "\n", + "\n //validate ReinsuranceGross Link", + "\n var isDn1Reinsurance = storage.IsDataNodeReinsurance(dataNodes[0]);", + "\n var isDn2Reinsurance = storage.IsDataNodeReinsurance(dataNodes[1]);", + "\n var isGrossReinsuranceLink = (isDn1Reinsurance && !isDn2Reinsurance) != (!isDn1Reinsurance && isDn2Reinsurance);", + "\n var reinsCov = (datarow.Field(nameof(InterDataNodeParameter.ReinsuranceCoverage)))", + "\n .ToString().CheckStringForExponentialAndConvertToDouble();", + "\n if(!isGrossReinsuranceLink && Math.Abs(reinsCov) > Precision )", + "\n ApplicationMessage.Log(Error.ReinsuranceCoverageDataNode, dataNodes[0], dataNodes[1]); // TODO: is this error or warning?", + "\n", + "\n //check for duplicates", + "\n if(interDataNode.Contains((dataNodes[0], dataNodes[1])) || interDataNode.Contains((dataNodes[1], dataNodes[0])))", + "\n ApplicationMessage.Log(Error.DuplicateInterDataNode, dataNodes[0], dataNodes[1]); // TODO: is this error or warning?", + "\n", + "\n interDataNode.Add((dataNodes[0], dataNodes[1])); ", + "\n //Instantiate InterDataNodeParameter", + "\n return new InterDataNodeParameter {", + "\n Year = args.Year,", + "\n Month = args.Month,", + "\n Partition = storage.TargetPartitionByReportingNode.Id,", + "\n DataNode = dataNodes[0],", + "\n LinkedDataNode = dataNodes[1],", + "\n ReinsuranceCoverage = reinsCov,", + "\n };", + "\n })", + "\n .WithTarget(Workspace)", + "\n .ExecuteAsync();", + "\n ", + "\n targetPartitionByReportingNodeId = storage.TargetPartitionByReportingNode.Id;", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadDataNodeParameterAsync(string fileName)", + "\n{", + "\n Guid partitionId = new Guid();", + "\n var log = await UploadDataNodeParameterToWorkspaceAsync(fileName, partitionId);", + "\n ", + "\n await CommitToDatabase(partitionId, snapshot: false);", + "\n await CommitToDatabase(partitionId, snapshot: false); ", + "\n ", + "\n return log;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Parse and Upload: Variables" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Validation for Active Data Node States" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task ValidateForDataNodeStateActiveAsync(Dictionary dataNodes) where T : BaseDataRecord", + "\n{ ", + "\n foreach(var item in (await Workspace.Query().ToArrayAsync()).GroupBy(x => x.DataNode))", + "\n if(!dataNodes.ContainsKey(item.First().DataNode))", + "\n ApplicationMessage.Log(Error.InactiveDataNodeState, item.First().DataNode);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Cashflow as Raw Variable and Ifrs Variable" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task ParseCashflowsToWorkspaceAsync(string fileName, ImportArgs args)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n Activity.Start();", + "\n var parsingStorage = new ParsingStorage(args, DataSource, Workspace);", + "\n await parsingStorage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var importLog = await Import.FromFile(fileName)", + "\n .WithType ( (dataset, datarow) => {", + "\n var aocType = datarow.Field(nameof(RawVariable.AocType));", + "\n var novelty = datarow.Field(nameof(RawVariable.Novelty));", + "\n var dataNode = datarow.Field(nameof(DataNode));", + "\n ", + "\n if(!parsingStorage.DataNodeDataBySystemName.TryGetValue(dataNode, out var dataNodeData)) {", + "\n ApplicationMessage.Log(Error.InvalidDataNode, dataNode);", + "\n return null;", + "\n }", + "\n ", + "\n // Error if AocType is not present in the mapping", + "\n if(!parsingStorage.AocTypeMap.Contains(new AocStep(aocType, novelty))) {", + "\n ApplicationMessage.Log(Error.AocTypeMapNotFound, aocType, novelty);", + "\n return null;", + "\n }", + "\n ", + "\n // Filter out cashflows for DataNode that were created in the past and are still active and come with AocType = BOPI", + "\n if(dataNodeData.Year < args.Year && aocType == AocTypes.BOP && novelty == Novelties.I) {", + "\n ApplicationMessage.Log(Warning.ActiveDataNodeWithCashflowBOPI);", + "\n return null;", + "\n }", + "\n ", + "\n var amountTypeFromFile = datarow.Field(nameof(RawVariable.AmountType));", + "\n var isCalculationType = parsingStorage.CalculationType.ContainsKey(amountTypeFromFile);", + "\n var amountType = isCalculationType ? null : amountTypeFromFile;", + "\n var calculationType = isCalculationType ? amountTypeFromFile : CalculationTypes.BE;", + "\n ", + "\n var values = datarow.Table.Columns.Where(c => c.ColumnName.StartsWith(nameof(RawVariable.Values))).OrderBy(c => c.ColumnName.Length).ThenBy(c => c.ColumnName)", + "\n .Select(x => datarow.Field(x.ColumnName).CheckStringForExponentialAndConvertToDouble()).Prune();", + "\n ", + "\n // Filter out empty raw variables for AocType != CL", + "\n if(values.Length == 0 && aocType != AocTypes.CL) return null; //TODO: extend this check for all mandatory step and not just for CL", + "\n ", + "\n var item = new RawVariable {", + "\n DataNode = dataNode,", + "\n AocType = aocType,", + "\n Novelty = novelty,", + "\n AmountType = amountType,", + "\n CalculationType = calculationType,", + "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(RawVariable.AccidentYear))), out var tempVal)? tempVal : (int?)null,", + "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", + "\n Values = Multiply(GetSign((aocType, amountType, calculationType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), values)", + "\n };", + "\n return item;", + "\n }, ImportFormats.Cashflow", + "\n ).WithTarget(Workspace).ExecuteAsync();", + "\n ", + "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadCashflowsAsync(string fileName)", + "\n{", + "\n Activity.Start();", + "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Cashflow};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n var parsingLog = await ParseCashflowsToWorkspaceAsync(fileName, args);", + "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n var storage = new ImportStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n var universe = Scopes.ForStorage(storage).ToScope();", + "\n var identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);", + "\n var ivs = universe.GetScopes(identities).SelectMany(x => x.CalculatedIfrsVariables);", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n await Workspace.UpdateAsync(ivs);", + "\n await CommitToDatabase(storage.TargetPartition, ", + "\n snapshot : true, ", + "\n filter : x => storage.EstimateTypesByImportFormat[ImportFormats.Cashflow].Contains(x.EstimateType) && ", + "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode)); ", + "\n await CommitToDatabase(storage.TargetPartition, ", + "\n snapshot : true,", + "\n filter : x => storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode));", + "\n", + "\n return Activity.Finish().Merge(parsingLog); ", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Actuals as Ifrs Variable" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task ParseActualsToWorkspaceAsync(string fileName, ImportArgs args)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n Activity.Start();", + "\n var parsingStorage = new ParsingStorage(args, DataSource, Workspace);", + "\n await parsingStorage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var importLog = await Import.FromFile(fileName)", + "\n .WithType ( (dataset, datarow) => {", + "\n var dataNode = datarow.Field(nameof(DataNode));", + "\n if(!parsingStorage.DataNodeDataBySystemName.TryGetValue(dataNode, out var dataNodeData)) {", + "\n ApplicationMessage.Log(Error.InvalidDataNode, dataNode);", + "\n return null;", + "\n }", + "\n ", + "\n var valueType = datarow.Field(ValueType);", + "\n if(valueType == null) { ", + "\n ApplicationMessage.Log(Error.ValueTypeNotFound); ", + "\n return null; ", + "\n }", + "\n ", + "\n var amountType = parsingStorage.DimensionsWithExternalId[typeof(PvAmountType)].TryGetValue(valueType, out var at)? at : null;", + "\n var isStdActual = parsingStorage.PvAmountType.ContainsKey(valueType);", + "\n var estimateType = isStdActual? EstimateTypes.A : parsingStorage.DimensionsWithExternalId[typeof(EstimateType)].TryGetValue(valueType, out var et)? et : null;", + "\n if(estimateType == null || amountType == null) { ", + "\n ApplicationMessage.Log(Error.ValueTypeNotValid, valueType);", + "\n return null;", + "\n }", + "\n ", + "\n var aocType = datarow.Field(nameof(IfrsVariable.AocType));", + "\n if((!isStdActual && aocType != AocTypes.CF && aocType != AocTypes.WO) || (isStdActual && aocType != AocTypes.CF) ) {", + "\n ApplicationMessage.Log(Error.AocTypeNotValid, aocType);", + "\n return null;", + "\n }", + "\n ", + "\n var item = new IfrsVariable {", + "\n DataNode = dataNode,", + "\n AocType = aocType,", + "\n Novelty = Novelties.C,", + "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(IfrsVariable.AccidentYear))), out var tempAccYear)? tempAccYear : (int?)null,", + "\n AmountType = amountType,", + "\n EstimateType = estimateType,", + "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", + "\n Value = Multiply(GetSign((aocType, amountType, estimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()),", + "\n };", + "\n return item;", + "\n }, ImportFormats.Actual", + "\n ).WithTarget(Workspace).ExecuteAsync();", + "\n ", + "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadActualAsync(string fileName)", + "\n{", + "\n Activity.Start();", + "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Actual};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n", + "\n var parsingLog = await ParseActualsToWorkspaceAsync(fileName, args);", + "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", + "\n", + "\n var storage = new ImportStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n", + "\n var universe = Scopes.ForStorage(storage).ToScope();", + "\n var identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);", + "\n var ivs = universe.GetScopes(identities).SelectMany(x => x.CalculatedIfrsVariables);", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n", + "\n await Workspace.UpdateAsync(ivs);", + "\n await CommitToDatabase(storage.TargetPartition, ", + "\n snapshot : true, ", + "\n filter : x => storage.EstimateTypesByImportFormat[ImportFormats.Actual].Contains(x.EstimateType) && ", + "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode));", + "\n", + "\n return Activity.Finish().Merge(parsingLog);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Simple Value Import" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Simple Value to Workspace" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task ParseSimpleValueToWorkspaceAsync(string fileName, ImportArgs args, Guid targetPartitionByReportingNodeAndPeriodId)", + "\n{", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n ", + "\n Activity.Start();", + "\n var importFormat = args.ImportFormat;", + "\n var parsingStorage = new ParsingStorage(args, DataSource, Workspace);", + "\n await parsingStorage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish(); ", + "\n", + "\n var importLog = await Import.FromFile(fileName)", + "\n .WithType ( (dataset, datarow) => {", + "\n var dataNode = parsingStorage.ValidateDataNode(datarow.Field(nameof(DataNode)));", + "\n var amountType = parsingStorage.ValidateAmountType(datarow.Field(nameof(IfrsVariable.AmountType)));", + "\n var estimateType = parsingStorage.ValidateEstimateType(datarow.Field(nameof(IfrsVariable.EstimateType)), dataNode); //TODO LIC/LRC dependence", + "\n var aocStep = importFormat == ImportFormats.SimpleValue ", + "\n ? parsingStorage.ValidateAocStep(new AocStep (datarow.Field(nameof(IfrsVariable.AocType)), ", + "\n datarow.Field(nameof(IfrsVariable.Novelty))))", + "\n : new AocStep(AocTypes.BOP, Novelties.I);", + "\n var economicBasis = importFormat == ImportFormats.SimpleValue ", + "\n ? datarow.Field(nameof(IfrsVariable.EconomicBasis)) ", + "\n : null;", + "\n ", + "\n parsingStorage.ValidateEstimateTypeAndAmountType(estimateType, amountType);", + "\n ", + "\n var iv = new IfrsVariable {", + "\n DataNode = dataNode,", + "\n AocType = aocStep.AocType,", + "\n Novelty = aocStep.Novelty,", + "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(IfrsVariable.AccidentYear))), out var accidentYear) ? accidentYear : (int?)null,", + "\n AmountType = amountType,", + "\n EstimateType = estimateType,", + "\n EconomicBasis = economicBasis,", + "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", + "\n Value = GetSign((aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), parsingStorage.HierarchyCache)", + "\n * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()", + "\n };", + "\n return iv;", + "\n }, importFormat", + "\n ).WithTarget(Workspace).ExecuteAsync();", + "\n ", + "\n HashSet availableEstimateTypes = parsingStorage.TechnicalMarginEstimateTypes;", + "\n var multipleOp = await Workspace.Query().Where(iv => availableEstimateTypes.Contains(iv.EstimateType))", + "\n .GroupBy(iv => iv.DataNode)", + "\n .Where(g => g.Count() > 1).ToArrayAsync();", + "\n //.Select(g => ApplicationMessage.Log(Error.MultipleTechnicalMarginOpening, g.Key));", + "\n ", + "\n foreach (var op in multipleOp)", + "\n ApplicationMessage.Log(Error.MultipleTechnicalMarginOpening, op.Key);", + "\n ", + "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", + "\n targetPartitionByReportingNodeAndPeriodId = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id;", + "\n return Activity.Finish().Merge(importLog);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Simple Value as IfrsVariable" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadSimpleValueAsync(string fileName)", + "\n{", + "\n Activity.Start();", + "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.SimpleValue};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n Guid partitionId = new Guid();", + "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(fileName, args, partitionId);", + "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n Workspace.Query().Select(v => new {v.DataNode, v.AccidentYear}).Distinct();", + "\n ", + "\n await CommitToDatabase(partitionId, ", + "\n snapshot : true,", + "\n filter : x => Workspace.Query().Select(v => v.DataNode).Distinct().Contains(x.DataNode));", + "\n ", + "\n return Activity.Finish().Merge(parsingLog);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Openings as IfrsVariable" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task UploadOpeningAsync(string fileName)", + "\n{", + "\n Activity.Start();", + "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Opening};", + "\n if(Activity.HasErrors()) return Activity.Finish();", + "\n ", + "\n Guid partitionId = new Guid();", + "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(fileName, args, partitionId);", + "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n var storage = new ImportStorage(args, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n ", + "\n var universe = Scopes.ForStorage(storage).ToScope();", + "\n var identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);", + "\n var ivs = universe.GetScopes(identities).SelectMany(x => x.CalculatedIfrsVariables);", + "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", + "\n", + "\n await Workspace.UpdateAsync(ivs);", + "\n await CommitToDatabase(storage.TargetPartition, ", + "\n snapshot : true,", + "\n filter : x => storage.EstimateTypesByImportFormat[ImportFormats.Opening].Contains(x.EstimateType) && ", + "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode ));", + "\n", + "\n return Activity.Finish().Merge(parsingLog);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Initialization/InitSystemorphBaseToMemory.ipynb b/Initialization/InitSystemorphBaseToMemory.ipynb index 25f07ab0..097ddb40 100644 --- a/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/Initialization/InitSystemorphBaseToMemory.ipynb @@ -1,268 +1,190 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "IsXau2AxIU6GrqDFBctd_g", - "cell_type": "markdown", - "source": [ - "

In Memory Initialization of unconfigured DataSource

", - "\n

Reference Data and DataNode

", - "\n", - "\n" - ], - "metadata": {} - }, - { - "id": "7UYbILtPnkuX3ekPtoWAWA", - "cell_type": "code", - "source": [ - "#!import \"../Import/Importers\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "X1GMcf7BW0mzdwq86kKuRQ", - "cell_type": "markdown", - "source": [ - "# Set default DataSource" - ], - "metadata": {} - }, - { - "id": "fVAqI420SkWAgNT6ijl6Fg", - "cell_type": "code", - "source": [ - "await DataSource.SetAsync();", - "\nDataSource.Reset(x => x.ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "82iGxa0-z0StnHV9TIuQDQ", - "cell_type": "markdown", - "source": [ - "# Initialize Workspace" - ], - "metadata": {} - }, - { - "id": "t74nFVf0AkOncugJ2F8jUQ", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "K898FO9wPUmvy-obSQrJ3Q", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QppbRvo4lUWN-7dYzi7zqw", - "cell_type": "markdown", - "source": [ - "# Import Dimensions, Partitions" - ], - "metadata": {} - }, - { - "id": "4T9Mtqgv8kuSz7Ro7CfcOw", - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithTarget(DataSource)", - "\n .ExecuteAsync()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "DCmPy2JDPEqrwPZceL6ncA", - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/300.ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "pg7FYVPT8E-V8CHNAvl1Wg", - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", - "\n .WithType()", - "\n .WithType()", - "\n .WithTarget(DataSource)", - "\n .ExecuteAsync()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RxTzyhca0kSB8pMpuzIcug", - "cell_type": "markdown", - "source": [ - "# Import Parameters" - ], - "metadata": {} - }, - { - "id": "zVvAMvAHzEWwm2mzvadTng", - "cell_type": "code", - "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/YieldCurve.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KdJRkfTVH0KUAXsSPQetHg", - "cell_type": "code", - "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/ExchangeRate.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "oxIQKMoo5UqjKAtjcdn32Q", - "cell_type": "code", - "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/PartnerRating.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4CDsZoshXE6BZbDJYoXD_w", - "cell_type": "code", - "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/CreditDefaultRate.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uu3vipnW30CDEQcLQ1ezyA", - "cell_type": "markdown", - "source": [ - "# Import DataNodes and DataNodeParameters" - ], - "metadata": {} - }, - { - "id": "DzfZozeHJk-8yJ_uH5jKUA", - "cell_type": "code", - "source": [ - "await UploadDataNodesAsync(\"../Files/700.DataNodes/DataNodes_CH.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "A8AUrboHqESmsdhkjXLh_Q", - "cell_type": "code", - "source": [ - "await UploadDataNodeStateAsync(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "p1m4aehU1kSmNpWDzIpE0A", - "cell_type": "code", - "source": [ - "await UploadDataNodeParameterAsync(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "pEqNN1RpCkSiVxiqryS-vQ", - "cell_type": "markdown", - "source": [ - "# Reset Workspace" - ], - "metadata": {} - }, - { - "id": "pqpb7AWAy06nubi3ydQCPA", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Uc9njlRC-kiAccvmjSF5xw", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

In Memory Initialization of unconfigured DataSource

", + "\n

Reference Data and DataNode

", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Import/Importers\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Set default DataSource" + ] + }, + { + "cell_type": "code", + "source": [ + "await DataSource.SetAsync();", + "\nDataSource.Reset(x => x.ResetCurrentPartitions());" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Initialize Workspace" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Dimensions, Partitions" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithTarget(DataSource)", + "\n .ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/300.ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "\n .WithType()", + "\n .WithType()", + "\n .WithTarget(DataSource)", + "\n .ExecuteAsync()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Parameters" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/YieldCurve.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/ExchangeRate.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/PartnerRating.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/CreditDefaultRate.csv\")" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import DataNodes and DataNodeParameters" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDataNodesAsync(\"../Files/700.DataNodes/DataNodes_CH.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDataNodeStateAsync(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDataNodeParameterAsync(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Reset Workspace" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Initialization/InitSystemorphToDatabase.ipynb b/Initialization/InitSystemorphToDatabase.ipynb index 862b85ef..8dba5617 100644 --- a/Initialization/InitSystemorphToDatabase.ipynb +++ b/Initialization/InitSystemorphToDatabase.ipynb @@ -1,314 +1,216 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "Cy8T4hrL4kO_Gfnm6Z5XTg", - "cell_type": "markdown", - "source": [ - "

Physical Database Initialization

" - ], - "metadata": {} - }, - { - "id": "TW3qAJFbN0GzvfZswIQD9g", - "cell_type": "code", - "source": [ - "#!import \"../Database/Configure\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WW6qYyWLN0CDzizR6oTSFw", - "cell_type": "code", - "source": [ - "#!import \"../Import/Importers\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MKwi685La0Shl61un7unGg", - "cell_type": "markdown", - "source": [ - "# Initialize Workspace" - ], - "metadata": {} - }, - { - "id": "19uyY1p_DEafziYCP4_ajg", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VaUXNeTpnkqp4qvlkZT1tA", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ujiYx54U70a1Lk7al17aNQ", - "cell_type": "markdown", - "source": [ - "# Import Dimensions, Partitions" - ], - "metadata": {} - }, - { - "id": "iHL9ANV_7EqKGUtvOzgh9A", - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithType()", - "\n .WithTarget(DataSource)", - "\n .ExecuteAsync()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WITsBPPMmkapIKK3ocjeCA", - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/300.ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "UBG4zPFBzEGM9I8BwyLHBg", - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", - "\n .WithType()", - "\n .WithType()", - "\n .WithTarget(DataSource)", - "\n .ExecuteAsync()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "x_FX7ZmdQkqPWJ_8inZXIg", - "cell_type": "markdown", - "source": [ - "# Import Parameters" - ], - "metadata": {} - }, - { - "id": "OecjLAV7AkiT3KhjiiJnog", - "cell_type": "code", - "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/YieldCurve.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Ii5PJHvCl0Cx2m89VaFSQg", - "cell_type": "code", - "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/ExchangeRate.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XRyJuiNql0mkE-hZETImsg", - "cell_type": "code", - "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/PartnerRating.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bGA-LWJqmUmMqydPlYBymQ", - "cell_type": "code", - "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/CreditDefaultRate.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "UzoF3kC3bkSV0tPlgFIH4Q", - "cell_type": "markdown", - "source": [ - "# Import DataNodes and DataNodeParameters" - ], - "metadata": {} - }, - { - "id": "7D_GmV2jsUa_BlNeRX202w", - "cell_type": "code", - "source": [ - "await UploadDataNodesAsync(\"../Files/700.DataNodes/DataNodes_CH.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BNrbXnwP-USpPbMvCQJkQw", - "cell_type": "code", - "source": [ - "await UploadDataNodeStateAsync(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Gbq1iNgL5ku27G-9ZCDgyw", - "cell_type": "code", - "source": [ - "await UploadDataNodeParameterAsync(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "mIAgGfevFkSw8FcNW7S_Dw", - "cell_type": "markdown", - "source": [ - "# Import Cashflow and Actuals" - ], - "metadata": {} - }, - { - "id": "Dx3T6KwOi0-h1_MxtEvu0Q", - "cell_type": "code", - "source": [ - "await UploadOpeningAsync(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "7rQXgufixki5Mr5wvIqvmg", - "cell_type": "code", - "source": [ - "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9teVf5xzQ0Gkra1zUNiPVw", - "cell_type": "code", - "source": [ - "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "teSj9-cIHEKxQBYlxrSUaw", - "cell_type": "code", - "source": [ - "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "eopo9jQQJECpkYPGIcToIg", - "cell_type": "code", - "source": [ - "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "I9rluX4YaE2AXRNtnwzghw", - "cell_type": "markdown", - "source": [ - "# Reset Workspace" - ], - "metadata": {} - }, - { - "id": "vjYLEV52S0yEzRX-hbQu5g", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CQDkkzwLSUi-ZedmBK9uVg", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Physical Database Initialization

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Database/Configure\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Import/Importers\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Initialize Workspace" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules());" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Dimensions, Partitions" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithType()", + "\n .WithTarget(DataSource)", + "\n .ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/300.ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "\n .WithType()", + "\n .WithType()", + "\n .WithTarget(DataSource)", + "\n .ExecuteAsync()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Parameters" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/YieldCurve.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/ExchangeRate.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/PartnerRating.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDimensionsAsync(\"../Files/800.Parameters/CreditDefaultRate.csv\")" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import DataNodes and DataNodeParameters" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDataNodesAsync(\"../Files/700.DataNodes/DataNodes_CH.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDataNodeStateAsync(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadDataNodeParameterAsync(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Cashflow and Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadOpeningAsync(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\")" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Reset Workspace" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Initialization/InitSystemorphToMemory.ipynb b/Initialization/InitSystemorphToMemory.ipynb index 211f88c1..80f655a5 100644 --- a/Initialization/InitSystemorphToMemory.ipynb +++ b/Initialization/InitSystemorphToMemory.ipynb @@ -1,147 +1,101 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "p3DIOKsMYUawUuOBORa9iQ", - "cell_type": "markdown", - "source": [ - "

In Memory Initialization of unconfigured DataSource

", - "\n", - "\n" - ], - "metadata": {} - }, - { - "id": "M0C3GJVwOkKVrGYTzCLVXw", - "cell_type": "code", - "source": [ - "#!eval-notebook \"InitSystemorphBaseToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ekrl841-jk6Qu-cUbOdg9g", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "55NcBpz1JU2BhAj8tZAtbg", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "oSjApvqd006sATOwdgj9fA", - "cell_type": "markdown", - "source": [ - "# Import of Transactional Data" - ], - "metadata": {} - }, - { - "id": "_44_VnWkr0KGvFIltkjYlw", - "cell_type": "code", - "source": [ - "await UploadOpeningAsync(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-lteFKun20qSXUvjgV0Rtw", - "cell_type": "code", - "source": [ - "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "eZ5TTE-VyEqMqe4FJhoSxw", - "cell_type": "code", - "source": [ - "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "wvXE8jKoiE6GQKf0u2Ja5g", - "cell_type": "code", - "source": [ - "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "y-vXTvD7pEuT7CEINzNlxg", - "cell_type": "code", - "source": [ - "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CFPyThMEyUSs9Z01gQRMXg", - "cell_type": "markdown", - "source": [ - "# Reset Workspace" - ], - "metadata": {} - }, - { - "id": "6BRncOutP0KF8VwCVa1jYw", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qQmhez-Ep0G2G01ULLKy-g", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

In Memory Initialization of unconfigured DataSource

", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import of Transactional Data" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadOpeningAsync(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\")" + ] + }, + { + "cell_type": "code", + "source": [ + "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\")" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Reset Workspace" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/InputFormatDescription.ipynb b/InputFormatDescription.ipynb index edb44e59..02152194 100644 --- a/InputFormatDescription.ipynb +++ b/InputFormatDescription.ipynb @@ -1,113 +1,101 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "l1JMz4NpDU2Lk2MWRSzYLA", - "cell_type": "markdown", - "source": [ - "

Structure of the Cashflows, Actuals and Openings Files

", - "\n", - "\nThis Notebook documents the structure of Cashflows, Actuals and Opening input files.", - "\n", - "\n", - "\n# The Cashflows File Structure ", - "\n", - "\n", - "\n
" - ], - "metadata": {} - }, - { - "id": "EHUOzfMOXkWnTeS5CUKVRg", - "cell_type": "markdown", - "source": [ - "A cashflow file is named **NominalCashflows** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Cashflow**.", - "\n", - "\nThe **Main** section contains information such as: Reporting Node, Year, Month and Scenario for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partitions) to which the data belongs.", - "\n", - "\nThe **Cashflow** section contains the cash flow data. Several pieces of information are required to characterize a cash flow correctly:", - "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- [AocType](./DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [Novelty](./DataModel/DataStructure#novelty) : entered with its SystemName,", - "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims.", - "\n", - "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](./DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", - "\n
The cash flow is entered in the columns named ValuesN where N goes from 0 to the lenght of cash flow. The Value0 corresponds to January of the Year entered in the **Main** section for every combination of AocType and Novelty. " - ], - "metadata": {} - }, - { - "id": "--aqUDIEv0Cij8PWGTssJg", - "cell_type": "markdown", - "source": [ - "", - "\n# The Actuals File Structure ", - "\n", - "\n", - "\n
" - ], - "metadata": {} - }, - { - "id": "auImDZLVDEy-rTLf8gfd_w", - "cell_type": "markdown", - "source": [ - "An Actuals file is named **Actuals** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Actual**.", - "\n", - "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partition) to which the data belong.", - "\n", - "\nThe **Actual** section contains the actuals data. Several pieces of information are required to to characterize an Actuals amount correctly:", - "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AocType](./DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [ValueType](./DataModel/DataStructure#amount-type) : corresponds to AmountType SystemName extended with the ExternalId,", - "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." - ], - "metadata": {} - }, - { - "id": "7spVD7c5bkejHCPT5UwVTQ", - "cell_type": "markdown", - "source": [ - "", - "\n# The Openings File Structure ", - "\n", - "\n", - "\n
" - ], - "metadata": {} - }, - { - "id": "xvO-5fBVq0CNPmlNpqDGsw", - "cell_type": "markdown", - "source": [ - "An Openings file is named **Openings** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Opening**. In an AoC for one period, we only need one file with the year/month combination of the beginning of the period. Some GICs do not need any entries in Openings.", - "\n", - "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partition) to which the data belong.", - "\n", - "\nThe **Opening** section contains values at opening of an analysis. Several pieces of information are required to to characterize an Opening amount correctly:", - "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [EstimateType](./DataModel/DataStructure#estimate-type) : entered with its SystemName,", - "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." - ], - "metadata": {} - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Structure of the Cashflows, Actuals and Openings Files

", + "\n", + "\nThis Notebook documents the structure of Cashflows, Actuals and Opening input files.", + "\n", + "\n", + "\n# The Cashflows File Structure ", + "\n", + "\n", + "\n
" + ] + }, + { + "cell_type": "markdown", + "source": [ + "A cashflow file is named **NominalCashflows** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Cashflow**.", + "\n", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month and Scenario for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partitions) to which the data belongs.", + "\n", + "\nThe **Cashflow** section contains the cash flow data. Several pieces of information are required to characterize a cash flow correctly:", + "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [AocType](./DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [Novelty](./DataModel/DataStructure#novelty) : entered with its SystemName,", + "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims.", + "\n", + "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](./DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", + "\n
The cash flow is entered in the columns named ValuesN where N goes from 0 to the lenght of cash flow. The Value0 corresponds to January of the Year entered in the **Main** section for every combination of AocType and Novelty. " + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# The Actuals File Structure ", + "\n", + "\n", + "\n
" + ] + }, + { + "cell_type": "markdown", + "source": [ + "An Actuals file is named **Actuals** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Actual**.", + "\n", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partition) to which the data belong.", + "\n", + "\nThe **Actual** section contains the actuals data. Several pieces of information are required to to characterize an Actuals amount correctly:", + "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AocType](./DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [ValueType](./DataModel/DataStructure#amount-type) : corresponds to AmountType SystemName extended with the ExternalId,", + "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# The Openings File Structure ", + "\n", + "\n", + "\n
" + ] + }, + { + "cell_type": "markdown", + "source": [ + "An Openings file is named **Openings** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Opening**. In an AoC for one period, we only need one file with the year/month combination of the beginning of the period. Some GICs do not need any entries in Openings.", + "\n", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partition) to which the data belong.", + "\n", + "\nThe **Opening** section contains values at opening of an analysis. Several pieces of information are required to to characterize an Opening amount correctly:", + "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [EstimateType](./DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." + ] + } + ] } \ No newline at end of file diff --git a/OverviewCalculationEngine.ipynb b/OverviewCalculationEngine.ipynb index 8fe93bea..db79df0c 100644 --- a/OverviewCalculationEngine.ipynb +++ b/OverviewCalculationEngine.ipynb @@ -1,258 +1,228 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "n-YC5c-J-Uq-NYiRZe6gCg", - "cell_type": "markdown", - "source": [ - "

IFRS17 Calculation Engine - an Overview

" - ], - "metadata": {} - }, - { - "id": "Z0Z4HkpVQUWm6q2GfAjRhg", - "cell_type": "markdown", - "source": [ - "Version of 01 Sep 2022" - ], - "metadata": {} - }, - { - "id": "YvapB2YH1029s0tnPiMdjg", - "cell_type": "markdown", - "source": [ - "# Introduction", - "\n", - "\nThe Systemorph's IFRS 17 Calculation Engine is a solution to conduct all the essential IFRS 17 calculations based on some key inpute: modeled future **cashflows** and actual amounts, for a **groups of insurance contracts** and other relevant parameters (Yield Curve, Fx, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", - "\n", - "\nThis notebook provides an **overview** of Systemorph's IFRS 17 Calculation Engine with brief introductions to all the main steps.", - "\n", - "\nThere are numerous **links** to several notebooks of the Calculation Engine. These notebooks contain specifications, code and also some detailed explanations with formulas in markdown blocks. The most important ones in this respect are [DataModel/DataStructure](./DataModel/DataStructure#data-structure), [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) and [ReportScopes](./Report/ReportScopes#report-scopes)." - ], - "metadata": {} - }, - { - "id": "3xZL2IO6zkqknoPSVOK6AA", - "cell_type": "markdown", - "source": [ - "", - "\n# IFRS 17", - "\n", - "\nIFRS 17 is a new accounting standard for insurance contracts. The previous standard IFRS 4, which is based on nominal accounting, is replaced by the economic accounting standard IFRS 17.", - "\n", - "\nExplanatory **videos** on **IFRS 17** and a **demo application** can be found on Systemorph's website. Some key points are repeated here briefly.", - "\n", - "\nIFRS 17 deals with insurance contracts which are on the liability side of the balance sheet. Other accounting standards deal with other parts of the business, primarily IFRS 9 for invested assets.", - "\n", - "\nInsurance policies need to be allocated to homogeneous groups of insurance contracts (GICs) according to high-level principles established by the IFRS 17 standard, such as contract type, line of business, annual cohort etc. Insurers have some degree of freedom to optmize those GICs, as long as they respect the high-level principles.", - "\n", - "\nInsurance contracts generate different types of cashflows. For example, **Amount Type** is a dimension refering to premiums, claims, expenses of different kinds, etc. for these cashflows. The Calculation Engine presented here expects input files of all the projected cashflows for each GIC, for different regular time points (quarterly or monthly, ...) and corresponding actual amounts observed for a given period. ", - "\n", - "\nEach cashflow is characterized by all the necessary attributes: business unit, start time, amount type, novelty of business etc. and projected cashflow amounts in a regular time grid until the final run-off of all contracts.", - "\n", - "\nIf the entered cashflows are nominal (the usual case), the the present value (PV) of each cashflow is computed using proper yield curves for discounting.", - "\n", - "\nA central element of IFRS 17 is the Analysis of Change (AoC). The present value of the business (future cashflows) changes from the beginning to the end of the accounting period due to different effects, each of them constituting a modeled AoC step.", - "\n", - "\nIn IFRS 17, the value of future profitable business has a component called the Contractual Service Margin (CSM), defined at GIC level. The profit measured as CSM is recognized slowly over time rather than immediately in financial performance statements. On the other hand, a GIC can be onerous and produce a Loss Component (LC) instead, which needs to be recognized immediately.", - "\n", - "\nSeveral reports on the valuation of cashflows, balance sheet and financial performance can be produced, each dealing with different aspects, such as", - "\n - Present Value of Future Cash Flows (PVFCF)", - "\n - Contractual Service Margin (CSM) and Loss Component (LC)", - "\n - Liability for Remaining Coverage (LRC)", - "\n - Liability for Incurred Claims (LIC)", - "\n - Financial Performance", - "\n - Accounting Events" - ], - "metadata": {} - }, - { - "id": "LcfKBqhuPEe9gyQfTle0Qg", - "cell_type": "markdown", - "source": [ - "", - "\n# Data Model, Data Input, Data Import", - "\n", - "\nThe IFRS 17 calculations are based on a well-defined **data model**. The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model.", - "\n", - "\nInput files as listed below are used to provide the necessary information on the business to be modeled. These files are part of the IFRS 17 Calculation Engine and can be used as templates for users intending to model their own business and adapt some files accordingly. ", - "\n", - "\nThe IFRS 17 calculations start by importing the data input files, and the more complex logic of the IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." - ], - "metadata": {} - }, - { - "id": "E1xdnYPKM0u0NqVxOjLBJw", - "cell_type": "markdown", - "source": [ - "", - "\n## Data Model", - "\n", - "\nThe data model includes the definition of reporting nodes and dimensions to be used, including identities, amount types, group of insurance contracts and many more.", - "\n", - "\nThe notebook [DataModel/DataStructure](./DataModel/DataStructure#data-structure) defines the data records, dimensions and interfaces of the data model. There is a long section on the many [dimensions](./DataModel/DataStructure#dimensions) used to characterize the business and its IFRS 17 model.", - "\n", - "\nThe [input files](#data-input-dim-nodes) ReportingNodes and especially DimensionsAndPartitions provide an overview of data structures actually used. Some dimensions are hierarchical, so some entries have parent entries.", - "\n", - "\nMany abbreviations and acronyms used later in the documentation and the code are the **system names**, where the corresponding display names can be found together with the attributes." - ], - "metadata": {} - }, - { - "id": "GGqaecTDuE6XUrAnYdsG-g", - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Reporting nodes, dimensions and partitions", - "\n", - "\nSee folders *Files* (DimensionsAndPartitions) and *Files/300.ReportingNodes* (ReportingNodes).", - "\n- **ReportingNodes**: List of business units, often per country, with system name and display name, currency and \"G\" for the whole group", - "\n- **DimensionsAndPartitions**: The many dimensions (21) required to characterize all of the data and results, with system names and display names. This information is quite stable, but some information related to partitions refers to the reporting nodes " - ], - "metadata": {} - }, - { - "id": "LhUX4L3Xc0C0rq4_Y9J6qQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Groups of insurance and reinsurance contracts", - "\n", - "\nSee folder Files/700.DataNodes. The information is about data nodes, that is Groups of Insurance Contracts (GICs) and Groups of Reinsurance Contracts (GRICs) and portfolios of these.", - "\n- **DataNodes**: List of all GICs and GRICs, each with several attributes and the portfolios to which they belong; an additional attribute of GRICs being the reinsurance partner", - "\n- **DataNodeParameters** *\\_* *\\_* *\\_*: List of those GICs and GRICs that are actually used for the given reporting node/year/month combination with few attributes; if needed, more such files may be added for other reporting node/year/month combinations", - "\n- **DataNodeStates** *\\_* *\\_* *\\_*: Switching data nodes on and off, the normal state is (\"Active\") for all the GICs and GRICs of the reporting node/year/month combination; if needed, more such files may be added for other reporting node/year/month combinations" - ], - "metadata": {} - }, - { - "id": "QMmg_-Sg9UOvWDKPIfPCqw", - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Parameters from financial markets", - "\n", - "\nSee folder Files/800.Parameters.", - "\n- **YieldCurve**: List of all yield curves to be used, for different currencies and as-of dates (year/month), using a yearly grid of interest rate maturities extending as far as needed", - "\n- **ExchangeRate**: List of exchange rates to be used, for different currencies and as-of dates (year/month), with a type (Spot/Average); defined as the value of 1 foreign unit expressed in the group currency of the insurance company ", - "\n- **CreditDefaultRate**: For relevant year/month combinations, each with a full list of all credit ratings in S&P notation with their default rate (= probabilty of default within 1 year)", - "\n- **PartnerRating**: For each reinsurance partner of a relevant GRIC, the rating in S&P notation with the as-of date (year/month)" - ], - "metadata": {} - }, - { - "id": "rVg0MlnQdkC77prbiq421A", - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Groups of insurance and reinsurance contracts", - "\n", - "\nSee folder Files/900.TransactionalData.", - "\n- **Actuals** *\\_* *\\_* *\\_*: List of all actual amounts for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types and other attributes; we need at least two such files for the two dates of the Analysis of Change", - "\n- **Openings** *\\_* *\\_* *\\_*: List of the opening amounts for some GICs that are used by the given reporting node. The year/month combination corresponds to the beginning of the planned Analysis of Change period, so only one such file is required. The entries are by EstimateType and AmountType.", - "\n- **NominalCashflows** *\\_* *\\_* *\\_*: List of all projected cash flows for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types, novelty types and other attributes, where the cash flow amounts are given in a regular sequence extending as far as needed; we need at least two such files for the two dates of the Analysis of Change", - "\n", - "\nThe structure of the [Actuals](./InputFormatDescription#actual), [Openings](./InputFormatDescription#opening) and [NominalCashflows](./InputFormatDescription#cashflow) files is explained in a special [notebook](./InputFormatDescription).", - "\n", - "\nThe less usual option of having discounted instead of nominal cash flows in the input is also supported." - ], - "metadata": {} - }, - { - "id": "JVl9TW0NJkS6zsxTFpcDXg", - "cell_type": "markdown", - "source": [ - "", - "\n## Data import and related calculations", - "\n", - "\nSeveral notebooks organize the data import. Methods for importing and accessing data are in the class [ImportStorage](./Import/ImportStorage#import-storage). Methods for further calculations to be done upon import are in [ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation).", - "\n", - "\nHowever, the import as such is conducted by other notebooks which use the methods of ImportStorage and ImportScopeCalculation in a chain of notebook imports:", - "\n", - "\nImportStorage --> ImportScopeCalculation --> [Importers](./Import/Importers#importers) --> [InitSystemorphBaseToMemory](./Initialization/InitSystemorphBaseToMemory#init-base-to-memory) --> [InitSystemorphToMemory](./Initialization/InitSystemorphToMemory#init-base-to-memory).", - "\n", - "\nThe latter two notebooks initialize and store the imported and derived data in memory for further usage. To store the data in a physical database, [InitSystemorphToDatabase](./Initialization/InitSystemorphToDatabase#init-to-database) can be employed.", - "\n", - "\nThe calculations of ImportScopeCalculation cover a large part of the IFRS 17 methodology and are explained in the section below." - ], - "metadata": {} - }, - { - "id": "oey1-V5ihE2fKiURTRNp1A", - "cell_type": "markdown", - "source": [ - "", - "\n# IFRS 17 Model Calculations", - "\n", - "\nThe notebook **[ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation)** has all the calculations to be executed upon data import. The methods used are explained there with formulas. The centerpiece is the Analysis of Change (AoC) of the insurance business over one period (here: quarter). The formulas often use acronyms (system names) as explained in the [section](#data-input-dim-nodes) on *DimensionsAndPartitions*.", - "\n", - "\nThe main concepts and parts of ImportScopeCalculation are listed here, with links.", - "\n- Structure and sequence of the **[Analysis of Change (AoC)](./Import/ImportScopeCalculation#aoc-step-structure)** steps for the given period", - "\n- **[Discounting](./Import/ImportScopeCalculation#discounting-calculation)** projected cash flows using [yield curves](#data-input-parameters) (current or locked in)", - "\n- **[Nominal](./Import/ImportScopeCalculation#nominal-values)** cash flow amounts per AoC step", - "\n- **[Present Values (PV)](./Import/ImportScopeCalculation#present-values)** of cash flow amounts for all AoC steps:", - "\n - [Cumulated discounted](./Import/ImportScopeCalculation#cumulated-discounted-cashflows) cash flow amounts for all AoC steps", - "\n - [Telescoping difference](./Import/ImportScopeCalculation#telescopic-difference) calculation of cumulated discounted cashflows per AoC step, where the total PV change over the period is the telescoping sum of all these differences", - "\n - [Present Value calculation](./Import/ImportScopeCalculation#present-value) at the beginning and end of the period, with its underlying [PV base](./Import/ImportScopeCalculation#present-value-base) calculations for different AoC types and for [current and locked-in](./Import/ImportScopeCalculation#current-and-locked) yield curves", - "\n - [Interest accretion](./Import/ImportScopeCalculation#interest-accretion) cash flow calculation (one of the AoC steps)", - "\n- **[Risk Adjustment (RA)](./Import/ImportScopeCalculation#risk-adjustment)** calculation, a requirement of the IFRS 17 standard", - "\n- **[Amortization](./Import/ImportScopeCalculation#amortization)**, the AoC step dealing with the reduction of the remaining exposure over the period:", - "\n - [Coverage Unit (CU)](./Import/ImportScopeCalculation#coverage-units), the quantity of services provided by a given GIC, considering one period (reflecting the run-off pattern of the GIC)", - "\n - [Amortization factor](./Import/ImportScopeCalculation#amortization-factor), the relative size of the amortization of a GIC, monthly and for a longer time interval", - "\n- **[Actuals](./Import/ImportScopeCalculation#actual-values)**, treatment of actual values per GIC or GRIC, distinguished according to by their Estimate Type: Ordinary Actuals, Advance Actuals, Overdue Actuals and Deferrable Actuals", - "\n - Calculation of [Actuals Base](./Import/ImportScopeCalculation#actual-base) values for a given GIC and per Estimate Type and Amount Type", - "\n - Different Estimate Types of Actuals and their calculations: Ordinary [Actuals](./Import/ImportScopeCalculation#actuals), [Advance Actuals](./Import/ImportScopeCalculation#advance-actuals) paid before the due date which is inside the AoC period, [Overdue Actuals](./Import/ImportScopeCalculation#overdue-actuals) paid after the AoC period, [Deferrable Actuals](./Import/ImportScopeCalculation#overdue-actuals) whose recognition is deferred (typically used for expenses of different kinds)", - "\n- **[Contractual Service Margin (CSM), Loss Component LC) and Loss Recovery Component (LRC)](./Import/ImportScopeCalculation#csm)**, modeling the treatment of unearned profits (CSM) and losses (LC, LRC) as required by the IFRS 17 standard, per GIC or GRIC:", - "\n - [Fulfillment Cashflow (FCF)](./Import/ImportScopeCalculation#fulfillment-cashflow), same as the aforementioned cumulated discounted cashflow, now adding the risk adjustment component as a basis for CSM and LC calculations", - "\n - [Technical Margin](./Import/ImportScopeCalculation#technical-margin), which is the FCF with special rules for different AoC steps including the Amortization step, also using and calculating the Interest Accretion Factor, Premiums, Deferrals and Investment Claims", - "\n - [Switch Logic for CSM and LC](./Import/ImportScopeCalculation#technical-margin), switching between CSM and LC for a given AoC step in the AoC period; one of the two is always zero depending on the sign of the Technical Margin; distinguishing the [gross case](./Import/ImportScopeCalculation#gross-case) (no reinsurance) from the [reinsurance case](./Import/ImportScopeCalculation#reinsurance-case) which applies reinsurance coverage weights" - ], - "metadata": {} - }, - { - "id": "BnM9Jki8OEedq18buCnW9A", - "cell_type": "markdown", - "source": [ - "", - "\n# Reports", - "\n", - "\nSeveral types of reports can be generated from the same model basis. The notebook **[ReportScopes](./Report/ReportScopes#report-scopes)** has many methods to produce different reports to be executed after the end of all data imports.", - "\n", - "\nThe reports are generated with the help of **DataCube**, a Systemorph tool that allows for the targeted retrieval of information from a large multi-dimensional (in-memory) database, selecting the desired categories, items and degrees of granularity and aggregation across different dimensions.", - "\n", - "\nSome reports of ReportScopes just present existing data from the database, namely the imported data and the results already calculated using the methods of [ImportScopes](#model-calc).", - "\n", - "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#financial-performance).", - "\n", - "\nWhile the ReportScopes notebook provides the calculation formulas for different reports, the production of reports is done by a notebook such as **[Reports](./Report/Reports#report-production)** which imports ReportScopes." - ], - "metadata": {} - }, - { - "id": "au5gK98z6EWDe-C7Wm3Img", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

IFRS17 Calculation Engine - an Overview

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Version of 01 Sep 2022" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Introduction", + "\n", + "\nThe Systemorph's IFRS 17 Calculation Engine is a solution to conduct all the essential IFRS 17 calculations based on some key inpute: modeled future **cashflows** and actual amounts, for a **groups of insurance contracts** and other relevant parameters (Yield Curve, Fx, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\n", + "\nThis notebook provides an **overview** of Systemorph's IFRS 17 Calculation Engine with brief introductions to all the main steps.", + "\n", + "\nThere are numerous **links** to several notebooks of the Calculation Engine. These notebooks contain specifications, code and also some detailed explanations with formulas in markdown blocks. The most important ones in this respect are [DataModel/DataStructure](./DataModel/DataStructure#data-structure), [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) and [ReportScopes](./Report/ReportScopes#report-scopes)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# IFRS 17", + "\n", + "\nIFRS 17 is a new accounting standard for insurance contracts. The previous standard IFRS 4, which is based on nominal accounting, is replaced by the economic accounting standard IFRS 17.", + "\n", + "\nExplanatory **videos** on **IFRS 17** and a **demo application** can be found on Systemorph's website. Some key points are repeated here briefly.", + "\n", + "\nIFRS 17 deals with insurance contracts which are on the liability side of the balance sheet. Other accounting standards deal with other parts of the business, primarily IFRS 9 for invested assets.", + "\n", + "\nInsurance policies need to be allocated to homogeneous groups of insurance contracts (GICs) according to high-level principles established by the IFRS 17 standard, such as contract type, line of business, annual cohort etc. Insurers have some degree of freedom to optmize those GICs, as long as they respect the high-level principles.", + "\n", + "\nInsurance contracts generate different types of cashflows. For example, **Amount Type** is a dimension refering to premiums, claims, expenses of different kinds, etc. for these cashflows. The Calculation Engine presented here expects input files of all the projected cashflows for each GIC, for different regular time points (quarterly or monthly, ...) and corresponding actual amounts observed for a given period. ", + "\n", + "\nEach cashflow is characterized by all the necessary attributes: business unit, start time, amount type, novelty of business etc. and projected cashflow amounts in a regular time grid until the final run-off of all contracts.", + "\n", + "\nIf the entered cashflows are nominal (the usual case), the the present value (PV) of each cashflow is computed using proper yield curves for discounting.", + "\n", + "\nA central element of IFRS 17 is the Analysis of Change (AoC). The present value of the business (future cashflows) changes from the beginning to the end of the accounting period due to different effects, each of them constituting a modeled AoC step.", + "\n", + "\nIn IFRS 17, the value of future profitable business has a component called the Contractual Service Margin (CSM), defined at GIC level. The profit measured as CSM is recognized slowly over time rather than immediately in financial performance statements. On the other hand, a GIC can be onerous and produce a Loss Component (LC) instead, which needs to be recognized immediately.", + "\n", + "\nSeveral reports on the valuation of cashflows, balance sheet and financial performance can be produced, each dealing with different aspects, such as", + "\n - Present Value of Future Cash Flows (PVFCF)", + "\n - Contractual Service Margin (CSM) and Loss Component (LC)", + "\n - Liability for Remaining Coverage (LRC)", + "\n - Liability for Incurred Claims (LIC)", + "\n - Financial Performance", + "\n - Accounting Events" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Data Model, Data Input, Data Import", + "\n", + "\nThe IFRS 17 calculations are based on a well-defined **data model**. The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model.", + "\n", + "\nInput files as listed below are used to provide the necessary information on the business to be modeled. These files are part of the IFRS 17 Calculation Engine and can be used as templates for users intending to model their own business and adapt some files accordingly. ", + "\n", + "\nThe IFRS 17 calculations start by importing the data input files, and the more complex logic of the IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data Model", + "\n", + "\nThe data model includes the definition of reporting nodes and dimensions to be used, including identities, amount types, group of insurance contracts and many more.", + "\n", + "\nThe notebook [DataModel/DataStructure](./DataModel/DataStructure#data-structure) defines the data records, dimensions and interfaces of the data model. There is a long section on the many [dimensions](./DataModel/DataStructure#dimensions) used to characterize the business and its IFRS 17 model.", + "\n", + "\nThe [input files](#data-input-dim-nodes) ReportingNodes and especially DimensionsAndPartitions provide an overview of data structures actually used. Some dimensions are hierarchical, so some entries have parent entries.", + "\n", + "\nMany abbreviations and acronyms used later in the documentation and the code are the **system names**, where the corresponding display names can be found together with the attributes." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Reporting nodes, dimensions and partitions", + "\n", + "\nSee folders *Files* (DimensionsAndPartitions) and *Files/300.ReportingNodes* (ReportingNodes).", + "\n- **ReportingNodes**: List of business units, often per country, with system name and display name, currency and \"G\" for the whole group", + "\n- **DimensionsAndPartitions**: The many dimensions (21) required to characterize all of the data and results, with system names and display names. This information is quite stable, but some information related to partitions refers to the reporting nodes " + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Groups of insurance and reinsurance contracts", + "\n", + "\nSee folder Files/700.DataNodes. The information is about data nodes, that is Groups of Insurance Contracts (GICs) and Groups of Reinsurance Contracts (GRICs) and portfolios of these.", + "\n- **DataNodes**: List of all GICs and GRICs, each with several attributes and the portfolios to which they belong; an additional attribute of GRICs being the reinsurance partner", + "\n- **DataNodeParameters** *\\_* *\\_* *\\_*: List of those GICs and GRICs that are actually used for the given reporting node/year/month combination with few attributes; if needed, more such files may be added for other reporting node/year/month combinations", + "\n- **DataNodeStates** *\\_* *\\_* *\\_*: Switching data nodes on and off, the normal state is (\"Active\") for all the GICs and GRICs of the reporting node/year/month combination; if needed, more such files may be added for other reporting node/year/month combinations" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Parameters from financial markets", + "\n", + "\nSee folder Files/800.Parameters.", + "\n- **YieldCurve**: List of all yield curves to be used, for different currencies and as-of dates (year/month), using a yearly grid of interest rate maturities extending as far as needed", + "\n- **ExchangeRate**: List of exchange rates to be used, for different currencies and as-of dates (year/month), with a type (Spot/Average); defined as the value of 1 foreign unit expressed in the group currency of the insurance company ", + "\n- **CreditDefaultRate**: For relevant year/month combinations, each with a full list of all credit ratings in S&P notation with their default rate (= probabilty of default within 1 year)", + "\n- **PartnerRating**: For each reinsurance partner of a relevant GRIC, the rating in S&P notation with the as-of date (year/month)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Groups of insurance and reinsurance contracts", + "\n", + "\nSee folder Files/900.TransactionalData.", + "\n- **Actuals** *\\_* *\\_* *\\_*: List of all actual amounts for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types and other attributes; we need at least two such files for the two dates of the Analysis of Change", + "\n- **Openings** *\\_* *\\_* *\\_*: List of the opening amounts for some GICs that are used by the given reporting node. The year/month combination corresponds to the beginning of the planned Analysis of Change period, so only one such file is required. The entries are by EstimateType and AmountType.", + "\n- **NominalCashflows** *\\_* *\\_* *\\_*: List of all projected cash flows for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types, novelty types and other attributes, where the cash flow amounts are given in a regular sequence extending as far as needed; we need at least two such files for the two dates of the Analysis of Change", + "\n", + "\nThe structure of the [Actuals](./InputFormatDescription#actual), [Openings](./InputFormatDescription#opening) and [NominalCashflows](./InputFormatDescription#cashflow) files is explained in a special [notebook](./InputFormatDescription).", + "\n", + "\nThe less usual option of having discounted instead of nominal cash flows in the input is also supported." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data import and related calculations", + "\n", + "\nSeveral notebooks organize the data import. Methods for importing and accessing data are in the class [ImportStorage](./Import/ImportStorage#import-storage). Methods for further calculations to be done upon import are in [ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation).", + "\n", + "\nHowever, the import as such is conducted by other notebooks which use the methods of ImportStorage and ImportScopeCalculation in a chain of notebook imports:", + "\n", + "\nImportStorage --> ImportScopeCalculation --> [Importers](./Import/Importers#importers) --> [InitSystemorphBaseToMemory](./Initialization/InitSystemorphBaseToMemory#init-base-to-memory) --> [InitSystemorphToMemory](./Initialization/InitSystemorphToMemory#init-base-to-memory).", + "\n", + "\nThe latter two notebooks initialize and store the imported and derived data in memory for further usage. To store the data in a physical database, [InitSystemorphToDatabase](./Initialization/InitSystemorphToDatabase#init-to-database) can be employed.", + "\n", + "\nThe calculations of ImportScopeCalculation cover a large part of the IFRS 17 methodology and are explained in the section below." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# IFRS 17 Model Calculations", + "\n", + "\nThe notebook **[ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation)** has all the calculations to be executed upon data import. The methods used are explained there with formulas. The centerpiece is the Analysis of Change (AoC) of the insurance business over one period (here: quarter). The formulas often use acronyms (system names) as explained in the [section](#data-input-dim-nodes) on *DimensionsAndPartitions*.", + "\n", + "\nThe main concepts and parts of ImportScopeCalculation are listed here, with links.", + "\n- Structure and sequence of the **[Analysis of Change (AoC)](./Import/ImportScopeCalculation#aoc-step-structure)** steps for the given period", + "\n- **[Discounting](./Import/ImportScopeCalculation#discounting-calculation)** projected cash flows using [yield curves](#data-input-parameters) (current or locked in)", + "\n- **[Nominal](./Import/ImportScopeCalculation#nominal-values)** cash flow amounts per AoC step", + "\n- **[Present Values (PV)](./Import/ImportScopeCalculation#present-values)** of cash flow amounts for all AoC steps:", + "\n - [Cumulated discounted](./Import/ImportScopeCalculation#cumulated-discounted-cashflows) cash flow amounts for all AoC steps", + "\n - [Telescoping difference](./Import/ImportScopeCalculation#telescopic-difference) calculation of cumulated discounted cashflows per AoC step, where the total PV change over the period is the telescoping sum of all these differences", + "\n - [Present Value calculation](./Import/ImportScopeCalculation#present-value) at the beginning and end of the period, with its underlying [PV base](./Import/ImportScopeCalculation#present-value-base) calculations for different AoC types and for [current and locked-in](./Import/ImportScopeCalculation#current-and-locked) yield curves", + "\n - [Interest accretion](./Import/ImportScopeCalculation#interest-accretion) cash flow calculation (one of the AoC steps)", + "\n- **[Risk Adjustment (RA)](./Import/ImportScopeCalculation#risk-adjustment)** calculation, a requirement of the IFRS 17 standard", + "\n- **[Amortization](./Import/ImportScopeCalculation#amortization)**, the AoC step dealing with the reduction of the remaining exposure over the period:", + "\n - [Coverage Unit (CU)](./Import/ImportScopeCalculation#coverage-units), the quantity of services provided by a given GIC, considering one period (reflecting the run-off pattern of the GIC)", + "\n - [Amortization factor](./Import/ImportScopeCalculation#amortization-factor), the relative size of the amortization of a GIC, monthly and for a longer time interval", + "\n- **[Actuals](./Import/ImportScopeCalculation#actual-values)**, treatment of actual values per GIC or GRIC, distinguished according to by their Estimate Type: Ordinary Actuals, Advance Actuals, Overdue Actuals and Deferrable Actuals", + "\n - Calculation of [Actuals Base](./Import/ImportScopeCalculation#actual-base) values for a given GIC and per Estimate Type and Amount Type", + "\n - Different Estimate Types of Actuals and their calculations: Ordinary [Actuals](./Import/ImportScopeCalculation#actuals), [Advance Actuals](./Import/ImportScopeCalculation#advance-actuals) paid before the due date which is inside the AoC period, [Overdue Actuals](./Import/ImportScopeCalculation#overdue-actuals) paid after the AoC period, [Deferrable Actuals](./Import/ImportScopeCalculation#overdue-actuals) whose recognition is deferred (typically used for expenses of different kinds)", + "\n- **[Contractual Service Margin (CSM), Loss Component LC) and Loss Recovery Component (LRC)](./Import/ImportScopeCalculation#csm)**, modeling the treatment of unearned profits (CSM) and losses (LC, LRC) as required by the IFRS 17 standard, per GIC or GRIC:", + "\n - [Fulfillment Cashflow (FCF)](./Import/ImportScopeCalculation#fulfillment-cashflow), same as the aforementioned cumulated discounted cashflow, now adding the risk adjustment component as a basis for CSM and LC calculations", + "\n - [Technical Margin](./Import/ImportScopeCalculation#technical-margin), which is the FCF with special rules for different AoC steps including the Amortization step, also using and calculating the Interest Accretion Factor, Premiums, Deferrals and Investment Claims", + "\n - [Switch Logic for CSM and LC](./Import/ImportScopeCalculation#technical-margin), switching between CSM and LC for a given AoC step in the AoC period; one of the two is always zero depending on the sign of the Technical Margin; distinguishing the [gross case](./Import/ImportScopeCalculation#gross-case) (no reinsurance) from the [reinsurance case](./Import/ImportScopeCalculation#reinsurance-case) which applies reinsurance coverage weights" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Reports", + "\n", + "\nSeveral types of reports can be generated from the same model basis. The notebook **[ReportScopes](./Report/ReportScopes#report-scopes)** has many methods to produce different reports to be executed after the end of all data imports.", + "\n", + "\nThe reports are generated with the help of **DataCube**, a Systemorph tool that allows for the targeted retrieval of information from a large multi-dimensional (in-memory) database, selecting the desired categories, items and degrees of granularity and aggregation across different dimensions.", + "\n", + "\nSome reports of ReportScopes just present existing data from the database, namely the imported data and the results already calculated using the methods of [ImportScopes](#model-calc).", + "\n", + "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#financial-performance).", + "\n", + "\nWhile the ReportScopes notebook provides the calculation formulas for different reports, the production of reports is done by a notebook such as **[Reports](./Report/Reports#report-production)** which imports ReportScopes." + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Report/ReportConfigurationAndUtils.ipynb b/Report/ReportConfigurationAndUtils.ipynb index 628b0f04..61e8193f 100644 --- a/Report/ReportConfigurationAndUtils.ipynb +++ b/Report/ReportConfigurationAndUtils.ipynb @@ -1,148 +1,126 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "RcqlbIqLC0GUIOHkkIM0fA", - "cell_type": "markdown", - "source": [ - "

Report Configuration And Utils

" - ], - "metadata": {} - }, - { - "id": "JWFelad9jEy9FfjxYAaBwA", - "cell_type": "code", - "source": [ - "#!import \"../Utils/UtilityMethods\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YyjCBXNsHk2Q8c-G2NlyIA", - "cell_type": "code", - "source": [ - "using Systemorph.Vertex.Pivot.Reporting.Builder;", - "\nusing System.Collections.Immutable;", - "\n", - "\npublic static DataCubeReportBuilder, TVariable, TVariable ,TVariable> ReportGridOptions(", - "\n this DataCubeReportBuilder, TVariable, TVariable, TVariable> reportBuilder,", - "\n int reportHeight = 700,", - "\n int valueColumnWidth = 250,", - "\n int headerColumnWidth = 250,", - "\n int groupDefaultExpanded = 2)", - "\n => reportBuilder.WithGridOptions(go => go", - "\n .WithColumns(cols => cols.Modify(\"Value\",c => c.WithWidth(valueColumnWidth).WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", - "\n .WithRows(rows => rows", - "\n .Where(r => !(r.RowGroup.Coordinates.Last() == \"NullGroup\"))", - "\n .Select(r => r with { RowGroup = r.RowGroup with { Coordinates = r.RowGroup.Coordinates.Where(c => c != \"NullGroup\").ToImmutableList() } })", - "\n .ToArray())", - "\n .WithAutoGroupColumn(c => c.WithWidth(headerColumnWidth) with { Pinned = \"left\" })", - "\n with { Height = reportHeight, GroupDefaultExpanded = groupDefaultExpanded, OnGridReady = null } );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "iBIqwkn9SUCQTW4I5tiVIg", - "cell_type": "code", - "source": [ - "public static string CurrencyGrouper(CurrencyType currencyType) => currencyType switch {", - "\n CurrencyType.Contractual => \"ContractualCurrency\",", - "\n CurrencyType.Functional => \"FunctionalCurrency\",", - "\n _ => string.Empty };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "M1TrAAwxbEaxJ2r5B3SSkw", - "cell_type": "markdown", - "source": [ - "# Queries" - ], - "metadata": {} - }, - { - "id": "K7EO5RzzdUq_sjJvMccxoA", - "cell_type": "markdown", - "source": [ - "## Query Report Variables" - ], - "metadata": {} - }, - { - "id": "bRSyLeKBd0KijXxUwm4o-w", - "cell_type": "code", - "source": [ - "public static async Task> QueryReportVariablesAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", - "\n ", - "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario });", - "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario, Year = args.Year, Month = args.Month });", - "\n ", - "\n return await workspace.Query()", - "\n .Join(workspace.Query(),", - "\n dn => dn.SystemName,", - "\n iv => iv.DataNode,", - "\n (dn, iv) => new ReportVariable {", - "\n // From Args/Inputs", - "\n ReportingNode = args.ReportingNode,", - "\n Scenario = args.Scenario,", - "\n ", - "\n // From Data Node", - "\n Portfolio = dn.Portfolio,", - "\n GroupOfContract = dn.SystemName,", - "\n ", - "\n FunctionalCurrency = dn.FunctionalCurrency,", - "\n ContractualCurrency = dn.ContractualCurrency,", - "\n ", - "\n ValuationApproach = dn.ValuationApproach,", - "\n OciType = dn.OciType,", - "\n InitialProfitability = dn.Profitability,", - "\n LiabilityType = dn.LiabilityType,", - "\n AnnualCohort = dn.AnnualCohort,", - "\n LineOfBusiness = dn.LineOfBusiness,", - "\n ", - "\n // Reinsurance", - "\n IsReinsurance = dn is GroupOfReinsuranceContract, ", - "\n Partner = dn.Partner,", - "\n ", - "\n // From Variable", - "\n EstimateType = iv.EstimateType,", - "\n VariableType = iv.AocType,", - "\n Novelty = iv.Novelty,", - "\n AmountType = iv.AmountType,", - "\n EconomicBasis = iv.EconomicBasis,", - "\n ", - "\n //LIC", - "\n AccidentYear = iv.AccidentYear == null ? default : (int)iv.AccidentYear,", - "\n ", - "\n Value = iv.Value })", - "\n .ToArrayAsync();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Report Configuration And Utils

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Utils/UtilityMethods\"" + ] + }, + { + "cell_type": "code", + "source": [ + "using Systemorph.Vertex.Pivot.Reporting.Builder;", + "\nusing System.Collections.Immutable;", + "\n", + "\npublic static DataCubeReportBuilder, TVariable, TVariable ,TVariable> ReportGridOptions(", + "\n this DataCubeReportBuilder, TVariable, TVariable, TVariable> reportBuilder,", + "\n int reportHeight = 700,", + "\n int valueColumnWidth = 250,", + "\n int headerColumnWidth = 250,", + "\n int groupDefaultExpanded = 2)", + "\n => reportBuilder.WithGridOptions(go => go", + "\n .WithColumns(cols => cols.Modify(\"Value\",c => c.WithWidth(valueColumnWidth).WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", + "\n .WithRows(rows => rows", + "\n .Where(r => !(r.RowGroup.Coordinates.Last() == \"NullGroup\"))", + "\n .Select(r => r with { RowGroup = r.RowGroup with { Coordinates = r.RowGroup.Coordinates.Where(c => c != \"NullGroup\").ToImmutableList() } })", + "\n .ToArray())", + "\n .WithAutoGroupColumn(c => c.WithWidth(headerColumnWidth) with { Pinned = \"left\" })", + "\n with { Height = reportHeight, GroupDefaultExpanded = groupDefaultExpanded, OnGridReady = null } );" + ] + }, + { + "cell_type": "code", + "source": [ + "public static string CurrencyGrouper(CurrencyType currencyType) => currencyType switch {", + "\n CurrencyType.Contractual => \"ContractualCurrency\",", + "\n CurrencyType.Functional => \"FunctionalCurrency\",", + "\n _ => string.Empty };" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Queries" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Query Report Variables" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> QueryReportVariablesAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", + "\n ", + "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario });", + "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario, Year = args.Year, Month = args.Month });", + "\n ", + "\n return await workspace.Query()", + "\n .Join(workspace.Query(),", + "\n dn => dn.SystemName,", + "\n iv => iv.DataNode,", + "\n (dn, iv) => new ReportVariable {", + "\n // From Args/Inputs", + "\n ReportingNode = args.ReportingNode,", + "\n Scenario = args.Scenario,", + "\n ", + "\n // From Data Node", + "\n Portfolio = dn.Portfolio,", + "\n GroupOfContract = dn.SystemName,", + "\n ", + "\n FunctionalCurrency = dn.FunctionalCurrency,", + "\n ContractualCurrency = dn.ContractualCurrency,", + "\n ", + "\n ValuationApproach = dn.ValuationApproach,", + "\n OciType = dn.OciType,", + "\n InitialProfitability = dn.Profitability,", + "\n LiabilityType = dn.LiabilityType,", + "\n AnnualCohort = dn.AnnualCohort,", + "\n LineOfBusiness = dn.LineOfBusiness,", + "\n ", + "\n // Reinsurance", + "\n IsReinsurance = dn is GroupOfReinsuranceContract, ", + "\n Partner = dn.Partner,", + "\n ", + "\n // From Variable", + "\n EstimateType = iv.EstimateType,", + "\n VariableType = iv.AocType,", + "\n Novelty = iv.Novelty,", + "\n AmountType = iv.AmountType,", + "\n EconomicBasis = iv.EconomicBasis,", + "\n ", + "\n //LIC", + "\n AccidentYear = iv.AccidentYear == null ? default : (int)iv.AccidentYear,", + "\n ", + "\n Value = iv.Value })", + "\n .ToArrayAsync();", + "\n}" + ] + } + ] } \ No newline at end of file diff --git a/Report/ReportScopes.ipynb b/Report/ReportScopes.ipynb index 534b3bc3..719b2f66 100644 --- a/Report/ReportScopes.ipynb +++ b/Report/ReportScopes.ipynb @@ -1,1038 +1,854 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "RC8Ga5S2p0C8yAmyjz_N-g", - "cell_type": "markdown", - "source": [ - "", - "\n

Report Scopes (IFRS17 Methodology Business Logic)

", - "\n", - "\nThis notebook contains the logic used to perform calculations upon reporting of data." - ], - "metadata": {} - }, - { - "id": "LVx2yOMaFE6N2gnro5w9Qg", - "cell_type": "markdown", - "source": [ - "# References", - "\nLibraries and other notebooks which are needed for this notebook are imported below." - ], - "metadata": {} - }, - { - "id": "9AZzZxEXwkCvLIoKhmBQlQ", - "cell_type": "markdown", - "source": [ - "## Notebooks" - ], - "metadata": {} - }, - { - "id": "MTpy2cXeG0GmCbe_aOWmBw", - "cell_type": "code", - "source": [ - "#!import \"ReportStorage\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "upikmN8zjU-hYfL_NTHY1A", - "cell_type": "markdown", - "source": [ - "# Scopes" - ], - "metadata": {} - }, - { - "id": "Zs3wCzFnZ0mgnoovzVtI4g", - "cell_type": "markdown", - "source": [ - "## Helper Scopes" - ], - "metadata": {} - }, - { - "id": "kMmCRDkymECPHAt_8qMONw", - "cell_type": "markdown", - "source": [ - "### Universe" - ], - "metadata": {} - }, - { - "id": "09cKY7l-c0WdVsk5Eqhscw", - "cell_type": "code", - "source": [ - "public interface IUniverse: IScopeWithStorage {}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KadX2iXWl02PhqX5WatT_A", - "cell_type": "markdown", - "source": [ - "## Data Transformation" - ], - "metadata": {} - }, - { - "id": "syVjSAh1tEazuQzXYkPajw", - "cell_type": "markdown", - "source": [ - "### Retrieve Raw Data" - ], - "metadata": {} - }, - { - "id": "MRPDIFQlykKNky6h_5dzzg", - "cell_type": "code", - "source": [ - "public interface Data: IScope<(ReportIdentity ReportIdentity, string EstimateType), ReportStorage>, IDataCube {", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().EstimateTypesWithoutAoc.Contains(x.Identity.EstimateType)));", - "\n ", - "\n protected IDataCube RawData => GetStorage().GetVariables(Identity.ReportIdentity, Identity.EstimateType);", - "\n", - "\n private IDataCube RawEops => RawData.Filter((\"VariableType\", AocTypes.EOP));", - "\n private IDataCube NotEopsNotCls => RawData.Filter((\"VariableType\", \"!EOP\"),(\"VariableType\", \"!CL\")); // TODO negation must be hardcoded (also to avoid string concatenation)", - "\n ", - "\n private IDataCube CalculatedCl => (RawEops - NotEopsNotCls)", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = AocTypes.CL });", - "\n ", - "\n private IDataCube CalculatedEops => (NotEopsNotCls + CalculatedCl)", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(x => x with { VariableType = AocTypes.EOP, Novelty = Novelties.C });", - "\n ", - "\n IDataCube Data => NotEopsNotCls + CalculatedCl + CalculatedEops;", - "\n}", - "\npublic interface DataWrittenActual: Data {", - "\n IDataCube Data.Data => RawData;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yus8OX8BukyLFOjUwOQLLA", - "cell_type": "markdown", - "source": [ - "### Foreign Exchange (FX) Rates" - ], - "metadata": {} - }, - { - "id": "cJq9jrxRrEitDC2cNGnQLg", - "cell_type": "code", - "source": [ - "public interface Fx: IScope<(string ContractualCurrency, string FunctionalCurrency, FxPeriod FxPeriod, (int, int) Period, CurrencyType CurrencyType), ReportStorage> { ", - "\n private double groupFxRate => Identity.CurrencyType switch {", - "\n CurrencyType.Group => GetStorage().GetFx(Identity.Period, Identity.FunctionalCurrency, GroupCurrency, FxPeriod.Average),", - "\n _ => 1", - "\n };", - "\n ", - "\n private double GetFunctionalFxRate(FxPeriod fxPeriod) => Identity.CurrencyType switch {", - "\n CurrencyType.Contractual => 1,", - "\n _ => GetStorage().GetFx(Identity.Period, Identity.ContractualCurrency, Identity.FunctionalCurrency, fxPeriod)", - "\n };", - "\n ", - "\n double Fx => GetFunctionalFxRate(Identity.FxPeriod) * groupFxRate;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "sFdrnO2l-kaXQVOwaTfu4Q", - "cell_type": "code", - "source": [ - "public interface FxData: IScope<(ReportIdentity ReportIdentity, CurrencyType CurrencyType, string EstimateType), ReportStorage>, IDataCube {", - "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().EstimateTypesWithoutAoc.Contains(x.Identity.EstimateType)));", - "\n ", - "\n protected IDataCube Data => GetScope((Identity.ReportIdentity, Identity.EstimateType)).Data", - "\n .SelectToDataCube(x => GetScope((Identity.ReportIdentity.ContractualCurrency, ", - "\n Identity.ReportIdentity.FunctionalCurrency, ", - "\n GetStorage().GetFxPeriod(GetStorage().Args.Period, x.VariableType, x.Novelty),", - "\n (Identity.ReportIdentity.Year, Identity.ReportIdentity.Month),", - "\n Identity.CurrencyType", - "\n )).Fx * x);", - "\n ", - "\n private IDataCube Eops => Data.Filter((\"VariableType\", AocTypes.EOP));", - "\n private IDataCube NotEops => Data.Filter((\"VariableType\", \"!EOP\")); // TODO negation must be hardcoded (also to avoid string concatenation)", - "\n ", - "\n private IDataCube Fx => (Eops - NotEops)", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = AocTypes.FX });", - "\n ", - "\n IDataCube FxData => Data + Fx;", - "\n}", - "\n", - "\npublic interface FxDataWrittenActual: FxData {", - "\n IDataCube FxData.FxData => Data;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "c-y9Rq20yU-c1k-zkJbtZA", - "cell_type": "markdown", - "source": [ - "## Present Value" - ], - "metadata": {} - }, - { - "id": "uD97mWuNn0i7IDWGmZcNvQ", - "cell_type": "markdown", - "source": [ - "", - "\n### Best Estimate", - "\n", - "\nBest Estimate of Present Value (PV) report includes contributions from the [Present Value](../Import/ImportScopeCalculation#current-and-locked) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." - ], - "metadata": {} - }, - { - "id": "JgpSiRtFuEmUmFnBtZdTRA", - "cell_type": "code", - "source": [ - "public interface BestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube BestEstimate => Identity.Id switch {", - "\n { ValuationApproach: ValuationApproaches.BBA, IsOci: true } => GetScope(Identity).LockedBestEstimate,", - "\n _ => GetScope(Identity).CurrentBestEstimate };", - "\n}", - "\n", - "\npublic interface LockedBestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube LockedBestEstimate => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BE)).FxData", - "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.L));", - "\n}", - "\n", - "\npublic interface CurrentBestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube CurrentBestEstimate => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BE)).FxData", - "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.C));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "o4YOxEue9U2IsUWtpQRwNg", - "cell_type": "markdown", - "source": [ - "", - "\n### Risk Adjustment", - "\n", - "\nRisk Adjustment (RA) report includes contributions from the [Risk Adjustment](../Import/ImportScopeCalculation#risk-adjustment) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." - ], - "metadata": {} - }, - { - "id": "j6tStuZslUWvsTYy34vFCQ", - "cell_type": "code", - "source": [ - "public interface RiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube RiskAdjustment => Identity.Id switch {", - "\n { ValuationApproach: ValuationApproaches.BBA, IsOci: true } => GetScope(Identity).LockedRiskAdjustment,", - "\n _ => GetScope(Identity).CurrentRiskAdjustment };", - "\n}", - "\n", - "\npublic interface LockedRiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube LockedRiskAdjustment => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.RA)).FxData", - "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.L));", - "\n}", - "\n", - "\npublic interface CurrentRiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube CurrentRiskAdjustment => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.RA)).FxData", - "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.C));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "P-vfX_L3rkW_9Lmf31RxpA", - "cell_type": "markdown", - "source": [ - "", - "\n## Fulfillment Cashflows", - "\nFulfillment Cashflows (FCF) report includes contributions from the [Best Estimate](#best-estimate) of Present Value and [Risk Adjustment](#risk-adjustment) Present Value." - ], - "metadata": {} - }, - { - "id": "KK0mF25Mf0aFBgqRlpZL9g", - "cell_type": "code", - "source": [ - "public interface Fcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube BestEstimate => GetScope(Identity).BestEstimate;", - "\n private IDataCube RiskAdjustment => GetScope(Identity).RiskAdjustment;", - "\n ", - "\n IDataCube Fcf => BestEstimate + RiskAdjustment;", - "\n}", - "\n", - "\npublic interface CurrentFcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube { ", - "\n private IDataCube BestEstimate => GetScope(Identity).CurrentBestEstimate;", - "\n private IDataCube RiskAdjustment => GetScope(Identity).CurrentRiskAdjustment;", - "\n ", - "\n IDataCube CurrentFcf => BestEstimate + RiskAdjustment;", - "\n}", - "\n", - "\npublic interface LockedFcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube { ", - "\n private IDataCube BestEstimate => GetScope(Identity).LockedBestEstimate;", - "\n private IDataCube RiskAdjustment => GetScope(Identity).LockedRiskAdjustment;", - "\n ", - "\n IDataCube LockedFcf => BestEstimate + RiskAdjustment;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BnSosIcbCUqw1lbDI0LxPw", - "cell_type": "markdown", - "source": [ - "", - "\n## LRC Technical Margin: CSM, LC, LoReCo", - "\n", - "\nContractual Service Margin (CSM), Loss Component (LC), Loss Recovery Component (LoReCo) reports of the Liability for Remaining Coverage (LRC) include contributions from the calculation of [CSM](../Import/ImportScopeCalculation#csm), [LC](../Import/ImportScopeCalculation#csm), and [LoReCo](../Import/ImportScopeCalculation#csm), respectively." - ], - "metadata": {} - }, - { - "id": "ZPTctq2WjkinG6niMamqoA", - "cell_type": "code", - "source": [ - "public interface Csm: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube Csm => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.C)).FxData;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "cG4TSd1LZ0iIWMjgLaB7iA", - "cell_type": "code", - "source": [ - "public interface Lc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube Lc => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.L)).FxData;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2pNl3ECznUOsfhcu-OWIPQ", - "cell_type": "code", - "source": [ - "public interface Loreco: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube Loreco => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.LR)).FxData;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "t2D8_dXH90uK90VYE8I_Fg", - "cell_type": "code", - "source": [ - "public interface LrcTechnicalMargin: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube Csm => GetScope(Identity).Csm;", - "\n private IDataCube Lc => GetScope(Identity).Lc;", - "\n private IDataCube Loreco => GetScope(Identity).Loreco;", - "\n ", - "\n IDataCube LrcTechnicalMargin => Lc + Loreco - 1 * Csm;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QXA-wNeyfkStz-eabLqYkw", - "cell_type": "markdown", - "source": [ - "", - "\n## Written, Accruals and Deferrals ", - "\n", - "\nWritten Actual (Actual) report includes contributions from the [Actual](../Import/ImportScopeCalculation#actuals) import. ", - "\n
Accrual Actuals (Advance, Overdue Actual) report includes contributions from the [Advance](../Import/ImportScopeCalculation#advance-actuals) and [Overdue](../Import/ImportScopeCalculation#overdue-actuals) Actual calculation.", - "\n
Deferral (Deferral Actual) report includes contributions from the calculation of [Deferral](../Import/ImportScopeCalculation#deferrable-actuals) Actual." - ], - "metadata": {} - }, - { - "id": "6oQzlalJiEKtr4FVgbf30g", - "cell_type": "code", - "source": [ - "public interface WrittenAndAccruals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube Written => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.A)).FxData;", - "\n IDataCube Advance => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.AA)).FxData;", - "\n IDataCube Overdue => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.OA)).FxData;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ezZf5dedgUuHkuUp-bBDDg", - "cell_type": "code", - "source": [ - "public interface Deferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube Deferrals => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.DA)).FxData;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "FSsDY7cH70S2Lu3yXeXw3w", - "cell_type": "markdown", - "source": [ - "## Experience Adjustment", - "\n", - "\nExperience Adjustment (EA) report includes contributions from the [Written](#written-accrual-deferral) Actual report and the [Best Estimate](#best-estimate) of Present Value report (only the *Cash flow* AocStep). " - ], - "metadata": {} - }, - { - "id": "JRn9_o5AL06364MC1z7Fkg", - "cell_type": "code", - "source": [ - "public interface ExperienceAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube WrittenCashflow => GetScope(Identity).Written", - "\n .Filter((\"VariableType\", AocTypes.CF));", - "\n ", - "\n private IDataCube BestEstimateCashflow => GetScope(Identity).BestEstimate", - "\n .Filter((\"VariableType\", AocTypes.CF))", - "\n .SelectToDataCube(rv => rv with { EconomicBasis = null, Novelty = Novelties.C });", - "\n", - "\n IDataCube ActuarialExperienceAdjustment => WrittenCashflow - BestEstimateCashflow;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9YDqvT60sUuBmJmZL-tF7w", - "cell_type": "markdown", - "source": [ - "", - "\n## LIC Actuarial (Actuarial Liability for Incurred Claims)", - "\n", - "\nLiability of Incurred Claims (LIC Actuarial) report includes the contributions from [Fulfillment cashflow](#fulfillment-cashflows)." - ], - "metadata": {} - }, - { - "id": "N9PQzPef10meQscdc39AtQ", - "cell_type": "code", - "source": [ - "public interface LicActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n IDataCube LicActuarial => GetScope(Identity).CurrentFcf.Filter((\"LiabilityType\", LiabilityTypes.LIC));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BWNVgJ7kVUuivi0spCqfcw", - "cell_type": "markdown", - "source": [ - "## LIC (Liability for Incurred Claims)", - "\n", - "\nLiability of Incurred Claims (LIC) report includes the contributions from [Lic Actuarial](#lic-actuarial) (Fullfilment Cashflow), [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." - ], - "metadata": {} - }, - { - "id": "TDQUKQ-ZLEuPyI1q0ZU9yg", - "cell_type": "code", - "source": [ - "public interface Lic: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube licActuarial => GetScope(Identity).LicActuarial;", - "\n private IDataCube accrual => GetScope(Identity).Advance.Filter((\"LiabilityType\", LiabilityTypes.LIC)) + ", - "\n GetScope(Identity).Overdue.Filter((\"LiabilityType\", LiabilityTypes.LIC));", - "\n private IDataCube licData => licActuarial + accrual;", - "\n ", - "\n private IDataCube bop => licData.Filter((\"VariableType\", AocTypes.BOP));", - "\n private IDataCube delta => licData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\"))", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = \"D\" });", - "\n private IDataCube eop => licData.Filter((\"VariableType\",AocTypes.EOP));", - "\n ", - "\n IDataCube Lic => bop + delta + eop;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jFBlyVq-A0G7tmw5YdUm2Q", - "cell_type": "markdown", - "source": [ - "", - "\n## LRC Actuarial (Actuarial Liability for Remaining Coverage)", - "\n", - "\nLiability for Remaining Coverage (LRC) report includes all the contributions from [Fulfillment cashflow](#fulfillment-cashflows), [Contructual Sevice Margin](#technical-margin), [Loss Component](#technical-margin), and [Loss Recovery Component](#technical-margin)." - ], - "metadata": {} - }, - { - "id": "Nh6Na96xYkGFXBLGuTXAWQ", - "cell_type": "code", - "source": [ - "public interface LrcActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube Fcf => GetScope(Identity).CurrentFcf.Filter((\"LiabilityType\", LiabilityTypes.LRC));", - "\n private IDataCube Csm => GetScope(Identity).Csm;", - "\n private IDataCube Loreco => GetScope(Identity).Loreco;", - "\n ", - "\n IDataCube LrcActuarial => Fcf + Csm + Loreco;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ivAB2SOatESuXm7mpgcW5w", - "cell_type": "markdown", - "source": [ - "## LRC (Liability for Remaining Coverage)", - "\n", - "\nLiability for Remaining Coverage (LRC) report includes all the contributions from [LRC Actuarial](#lrc-actuarial) (Fulfillment Cashflow, Contructual Sevice Margin, Loss Component, Loss Recovery Component) and, [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." - ], - "metadata": {} - }, - { - "id": "G1fG1yC8kEyGuJfovw39HA", - "cell_type": "code", - "source": [ - "public interface Lrc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube lrcActuarial => GetScope(Identity).LrcActuarial;", - "\n private IDataCube accrual => GetScope(Identity).Advance.Filter((\"LiabilityType\", LiabilityTypes.LRC)) + ", - "\n GetScope(Identity).Overdue.Filter((\"LiabilityType\", LiabilityTypes.LRC));", - "\n private IDataCube lrcData => lrcActuarial + accrual;", - "\n ", - "\n private IDataCube bop => lrcData.Filter((\"VariableType\",AocTypes.BOP));", - "\n private IDataCube delta => lrcData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\"))", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = \"D\" });", - "\n private IDataCube eop => lrcData.Filter((\"VariableType\",AocTypes.EOP));", - "\n ", - "\n IDataCube Lrc => bop + delta + eop;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "q-X5STJu20-7PdTNWxysqg", - "cell_type": "markdown", - "source": [ - "", - "\n# IFRS 17 Financial Performance" - ], - "metadata": {} - }, - { - "id": "_F85lUYI8USa7GLuh0CFYA", - "cell_type": "markdown", - "source": [ - "The IFRS 17 Financial Performance aims at disclosing the deltas (i.e. difference between EoP and BoP, or the Change in Estimate) of the IFRS 17 Balance Sheet items (LRC, LIC) and the relevant incurred cashflows (Premiums, Claims, Expenses, etc...) for the given period.", - "\n", - "\nIn addition, the IFRS 17 Financial Performance must split the results into at least 4 distinct sections:", - "\n - Insurance Revenue ($IR$)", - "\n - Insurance Service Expense ($ISE$)", - "\n - Insurance Finance Income/Expense ($IFIE$)", - "\n - Other Comprehensive Income ($OCI$)", - "\n", - "\nThese can be structured in a hierarchy, such that aggregation and intermediate results can be shown separately.", - "\nAlso the granularity for some relevant items (e.g. Gross LRC vs Reinsurance LRC) must be split into the different sections, as the notion of Insurance Revenue and Insurance Service Expense must be consistent.", - "\n", - "\nThe overall formulas for each of the sections above are as follows:", - "\n$$", - "\n\\begin{array}{rl}", - "\nIR =& -\\Delta \\text{ Gross Non-Financial LRC } - \\text{ Incurred Incoming Cashflows } - \\text{ Claims Investment Component } + \\text{ Amortization of the Insurance Acquisition Cashflows} - \\text{ Experience Adjustment On Premium }", - "\n\\\\", - "\nISE =& -\\Delta \\text{ Reinsurance Non-Financial LRC } - \\Delta \\text{ Non-Financial LIC } - \\Delta \\text{ Loss Component } - \\text{ Incurred Outgoing Cashflows } - \\text{ Amortization of the Insurance Acquisition Cashflows}", - "\n\\\\", - "\nIFIE =& -\\Delta \\text{ Financial LRC } - \\Delta \\text{ Financial LIC }", - "\n\\\\", - "\nOCI =& \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Valuation Rates } + \\Delta \\text{ LIC at Valuation Rates } - \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Current Rates } - \\Delta \\text{ LIC at Current Rates }", - "\n\\end{array}", - "\n$$", - "\n", - "\nFor CSM, LC and LoReCo (and implicit Amortization Factors / Coverage Units), the yield curve used is according to the methodology choice (e.g. BBA uses Locked-In rates). ", - "\n", - "\nThe Fulfillment Cashflows components for LIC and LRC are discounted using the appropriate yield curve (Locked-In or Current) according to the choice of the OCI option and methodology. We can distinguish 2 cases for the Building Block approach (BBA):", - "\n - BBA, OCI option ***disabled***: FCF computed using Current rates", - "\n - BBA, OCI option ***enabled***: FCF computed using Locked-In rates", - "\n", - "\nIn the case when the OCI option is disabled, the OCI contribution is zero. Otherwise, we have:", - "\n", - "\n$$", - "\n\\begin{array}{rl}", - "\nOCI =& \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Locked-In Rates } + \\Delta \\text{ LIC at Locked-In Rates } - \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Current Rates } - \\Delta \\text{ LIC at Current Rates }", - "\n\\end{array}", - "\n$$", - "\n", - "\nUsually, some more details on the items above are desired (e.g. separating the LRC into its components FCF, RA, CSM/LC or explicitly showing the CSM Amortization vs. other financial/non-financial adjustments to the CSM estimation). These are specific to each implementation and depend on the data granularity (e.g. how the Amount Types, AoC steps are detailed and structured). This level of detail is omitted from the generic documentation presented here, but are implicit to the way each item above is calculated. Nevertheless, this extra granularity is available when the reports are generated and sliced by the corresponding dimensions. " - ], - "metadata": {} - }, - { - "id": "yUjR-vS6yUm5Enx3ZvkzIA", - "cell_type": "markdown", - "source": [ - "## Fulfillment Cashflows (excluding the Loss Component)" - ], - "metadata": {} - }, - { - "id": "y-_vkbeDdk-drcNsqFxKgw", - "cell_type": "markdown", - "source": [ - "Let us first describe the Balance Sheet items, where we need to disclose the Changes in Estimate in the Financial Performance.", - "\nAs mentioned, often the LRC and LIC contributions are broken down into smaller parts for disclosure and reconciliation purposes.", - "\n", - "\nThe Fulfillment Cashflows (which may include onerous contributions in some interpretations when a Loss Component is defined) contributions to the Financial Performance (Insurance Result and OCI) are detailed below.", - "\nThe main requisite is to ensure the right mapping of its non-financial and financial components into the appropriate sections of the Financial Performance.", - "\n", - "\nFurthermore, we also need to distinguish the Reinsurance contributions to the LRC, as they are considered to be expenses and not revenue.", - "\nThe OCI contribution is also performed here, as the only contributions to the OCI come from the FCF under the current methodology assumptions.", - "\nTo all contributions a sign flip is applied. ", - "\n", - "\nIn particular: ", - "\n- Financial component includes the AocType Interest Accreation, Yield Curve Update, and Credit Risk Update,", - "\n- Non-Financial component includes all the remaining AocTypes.", - "\n- Oci component includes the difference between the movement occured in the period computed applying the discounting with the current yield curve and the discounting with the locked-in yield curve.", - "\n", - "\nThe Financial contributions are reported in 'Financial LIC Changes' for a Group of Contract with Liability Type LIC and to 'Financial LRC Changes' for a Group of Contract with Liability Type LRC.", - "\n
The Non Financial contributions are reported in 'Non Financial LIC Changes' for a Group of Contract with Liability Type LIC. For a Group of Contract with Liability Type LRC, they are reported in 'Non-Financial LRC Changes (Exc. CSM Amortization)' for a Group of Insurance Contract and in 'Non-Financial Reinsurance LRC Changes (Exc. LC/LoReCo)' for a Group of Reinsurance Contract.", - "\n
The Oci contributions are reported in the 'Other Comprehensive Income' section under 'Financial LIC Changes' or a Group of Contract with Liability Type LIC and to 'Financial LRC Changes' for a Group of Contract with Liability Type LRC." - ], - "metadata": {} - }, - { - "id": "WkhNSKUFjkaCCaIOupDs4w", - "cell_type": "code", - "source": [ - "public interface FcfChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube FcfDeltas => GetScope(Identity).Fcf.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n GetScope(Identity).Fcf.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", - "\n ", - "\n private IDataCube CurrentFcfDeltas => GetScope(Identity).CurrentFcf.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n GetScope(Identity).CurrentFcf.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", - "\n", - "\n // Non-Financial Fp", - "\n private string variableTypeNonFinancial => Identity.Id switch {", - "\n { LiabilityType: LiabilityTypes.LRC, IsReinsurance: false } => \"IR5\",", - "\n { LiabilityType: LiabilityTypes.LRC, IsReinsurance: true } => \"ISE10\",", - "\n { LiabilityType: LiabilityTypes.LIC } => \"ISE12\"", - "\n };", - "\n ", - "\n private IDataCube NonFinancialFcfDeltas => FcfDeltas", - "\n .Filter((\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")); ", - "\n ", - "\n IDataCube FpNonFinancial => -1 * NonFinancialFcfDeltas", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeNonFinancial }); ", - "\n ", - "\n // Financial Fp", - "\n private string variableTypeFpFinancial => Identity.Id switch {", - "\n { LiabilityType: LiabilityTypes.LRC } => \"IFIE1\",", - "\n { LiabilityType: LiabilityTypes.LIC } => \"IFIE2\",", - "\n };", - "\n ", - "\n // OCI ", - "\n private string variableTypeOciFinancial => Identity.Id switch {", - "\n { LiabilityType: LiabilityTypes.LRC } => \"OCI1\",", - "\n { LiabilityType: LiabilityTypes.LIC } => \"OCI2\",", - "\n };", - "\n ", - "\n private IDataCube FinancialFcfDeltas => FcfDeltas.Filter((\"VariableType\", AocTypes.IA)) + ", - "\n FcfDeltas.Filter((\"VariableType\", AocTypes.YCU)) +", - "\n FcfDeltas.Filter((\"VariableType\", AocTypes.CRU));", - "\n ", - "\n IDataCube FpFinancial => -1 * FinancialFcfDeltas", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeFpFinancial});", - "\n", - "\n IDataCube OciFinancial => (FcfDeltas - CurrentFcfDeltas)", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeOciFinancial});", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MlJhmth_qkiiKsC8XSxAdw", - "cell_type": "markdown", - "source": [ - "Subsequently, the Contractual Service Margin (CSM), Loss Component (LC) and Loss Recovery Component (LoReCo) are also divided into non-financial and financial components. In addition the corresponding amortization/releases (CSM Amortization, LC Release and LoReCo Release) are also explicitly shown." - ], - "metadata": {} - }, - { - "id": "yqLNUINQEk2fACiFnKzGhg", - "cell_type": "markdown", - "source": [ - "## Contractual Service Margin (CSM)", - "\n", - "\nCsm contributes to the 'Insurance Revenue' in the case of a Group of Insurance Contract and to the 'Insurance Service Expense' in the case of a Group of Reinsurance Contract and to the 'Insurance Finance Income/Expense'. To all contributions a sign flip is applied. ", - "\nIn particular, the CSM figures are separated in three cathegories: ", - "\n- Amortization (including to AocType Amortization),", - "\n- Financial contributions (including the AocTypes Interest Accreation, Yield Curve Update, and Credit Risk Update),", - "\n- Non Financial contributions (including all the remaining AocTypes).", - "\n", - "\n
The Amortization contribution is reported in 'Insurance Revenue' under 'CSM Amortization' or in 'Insurance Service Expense' under 'Reinsurance CSM Amortization' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively. ", - "\n
The Financial contributions are reported in 'Financial LRC Changes'.", - "\n
The Non Financial contributions are reported in 'Non-Financial LRC Changes (Exc. CSM Amortization)' and 'Non-Financial Reinsurance LRC Changes (Exc. LC/LoReCo)' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively. " - ], - "metadata": {} - }, - { - "id": "JZhM9-mDEUKaqcD8QoIvCg", - "cell_type": "code", - "source": [ - "public interface CsmChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n ", - "\n private (string amortization, string nonFinancial) variableType => Identity.Id switch {", - "\n { IsReinsurance: false} => (\"IR3\", \"IR5\"),", - "\n { IsReinsurance: true } => (\"ISE7\", \"ISE10\")", - "\n };", - "\n ", - "\n private IDataCube Csm => GetScope(Identity).Csm.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n GetScope(Identity).Csm.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", - "\n ", - "\n IDataCube Amortization => -1 * Csm.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = variableType.amortization });", - "\n ", - "\n IDataCube NonFinancialChanges => -1 * Csm", - "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = variableType.nonFinancial });", - "\n ", - "\n IDataCube FinancialChanges => -1 * (Csm.Filter((\"VariableType\", AocTypes.IA)) +", - "\n Csm.Filter((\"VariableType\", AocTypes.YCU)) +", - "\n Csm.Filter((\"VariableType\", AocTypes.CRU)) )", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yylNI472I0u4OuR1Bllheg", - "cell_type": "markdown", - "source": [ - "## Loss Component (LC)", - "\n", - "\nLC contributes to the 'Insurance Service Expense' and to the 'Insurance Finance Income/Expense'. To all contributions a sign flip is applied. ", - "\nIn particular, the LC figures are separated in three cathegories: ", - "\n- Amortization (including to AocType Amortization),", - "\n- Financial contributions (including the AocTypes Interest Accreation, Yield Curve Update, and Credit Risk Update),", - "\n- Non Financial contributions (including all the remaining AocTypes).", - "\n", - "\n
The Amortization contribution is reported in 'Loss Component Release'.", - "\n
The Financial contributions are reported in 'Financial LRC Changes'.", - "\n
The Non Financial contributions are reported in 'Loss Component / LoReCo Changes (Exc. Releases)'." - ], - "metadata": {} - }, - { - "id": "52YpETmY1kmKN_CcZj4cpw", - "cell_type": "code", - "source": [ - "public interface LcChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n ", - "\n private IDataCube Lc => GetScope(Identity).Lc.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n GetScope(Identity).Lc.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", - "\n ", - "\n IDataCube Amortization => -1 * Lc.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = \"ISE9\" });", - "\n ", - "\n IDataCube NonFinancialChanges => -1 * Lc", - "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE11\" });", - "\n ", - "\n IDataCube FinancialChanges => -1 * (Lc.Filter((\"VariableType\", AocTypes.IA)) +", - "\n Lc.Filter((\"VariableType\", AocTypes.YCU)) +", - "\n Lc.Filter((\"VariableType\", AocTypes.CRU)) )", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1-0UxQCxX0-LKLJ0MCCYUw", - "cell_type": "markdown", - "source": [ - "## Loss Recovery Component (LoReCo)", - "\n", - "\nLoReCo contributes to the 'Insurance Service Expense' and to the 'Insurance Finance Income/Expense'. To all contributions a sign flip is applied. ", - "\nIn particular, the LoReCo figures are separated in three cathegories: ", - "\n- Amortization (including to AocType Amortization),", - "\n- Financial contributions (including the AocTypes Interest Accreation, Yield Curve Update, and Credit Risk Update),", - "\n- Non Financial contributions (including all the remaining AocTypes).", - "\n", - "\n
The Amortization contribution is reported in 'LoReCo Release'.", - "\n
The Financial contributions are reported in 'Financial LRC Changes'.", - "\n
The Non Financial contributions are reported in 'Loss Component / LoReCo Changes (Exc. Releases)'." - ], - "metadata": {} - }, - { - "id": "d6UE4RWht0uRmVVVLSV2VA", - "cell_type": "code", - "source": [ - "public interface LorecoChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n ", - "\n private IDataCube Loreco => GetScope(Identity).Loreco.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n GetScope(Identity).Loreco.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", - "\n ", - "\n IDataCube Amortization => -1 * Loreco.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = \"ISE8\" });", - "\n ", - "\n IDataCube NonFinancialChanges => -1 * Loreco", - "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE11\" });", - "\n ", - "\n IDataCube FinancialChanges => -1 * (Loreco.Filter((\"VariableType\", AocTypes.IA)) +", - "\n Loreco.Filter((\"VariableType\", AocTypes.YCU)) +", - "\n Loreco.Filter((\"VariableType\", AocTypes.CRU)) )", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Ugt3GrQOf0Or0r17sFKx6Q", - "cell_type": "markdown", - "source": [ - "## Incurred Actuals" - ], - "metadata": {} - }, - { - "id": "zhrluPCsVUSl09Ib5324jA", - "cell_type": "markdown", - "source": [ - "After the main Balance Sheet items, we need to disclose the Incurred Cashflows (i.e. Actuals) for the period in the Financial Performance (which includes the effect of Advance and Overdue Accruals, but Write-Off amounts are not taken into account).", - "\nAs another requirement, we exclude any investment components explicitly.", - "\n", - "\nThese contributions are splitted by Amount Type to the following sections:", - "\n- Premiums contributions are reported under 'Insurance Revenue' in 'Premiums' section or in 'Insurance Service Expense' under 'Reinsurance Premiums' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively,", - "\n- Claims Non-Investment Component contributions are reported under 'Insurance Revenue' in 'Claims' section,", - "\n- Claims Investment Component contributions are reported under 'Insurance Service Expense' in 'Acquisition Expenses' section and under 'Insurance Revenue' in 'Exc. Investment Components' section with a sign change,", - "\n- Expenses contributions are reported under 'Insurance Service Expense' in 'Expenses' section,", - "\n- Commissions contributions are reported under 'Insurance Service Expense' in 'Commissions' section." - ], - "metadata": {} - }, - { - "id": "UfES8juT2kSi22gODGLDCw", - "cell_type": "code", - "source": [ - "public interface IncurredActuals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube WrittenAndAccruals => GetScope(Identity).Filter((\"VariableType\", \"CF\"));", - "\n ", - "\n private string premiumsVariableType => Identity.Id switch {", - "\n { IsReinsurance: false} => \"IR1\",", - "\n { IsReinsurance: true } => \"ISE1\"", - "\n }; ", - "\n ", - "\n IDataCube Premiums => WrittenAndAccruals", - "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.PR))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = premiumsVariableType });", - "\n ", - "\n IDataCube ClaimsNic => WrittenAndAccruals", - "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.NIC))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE2\" });", - "\n ", - "\n private IEnumerable ClaimsIco => WrittenAndAccruals", - "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.ICO));", - "\n ", - "\n IDataCube ClaimsIcoToIr => ClaimsIco.SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR2\" });", - "\n IDataCube ClaimsIcoToIse => (-1 * ClaimsIco).SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE5\" });", - "\n ", - "\n IDataCube Expenses => WrittenAndAccruals", - "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.AE))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE3\" });", - "\n", - "\n IDataCube Commissions => WrittenAndAccruals", - "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.AC))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE4\" });", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LwsvN0yOSkCOVRXLN381JQ", - "cell_type": "markdown", - "source": [ - "## Incurred Deferrals and Acquisition Expenses" - ], - "metadata": {} - }, - { - "id": "wiPCBpKmKUq9k5vGf5XfNg", - "cell_type": "markdown", - "source": [ - "The next item are the Deferrals, where the Amortization is the only contribution explicitly shown, but these do not have any direct impact on the Financial Performance under the current methodology assumptions. The Amortization contribution is here considered with its sign changed. This contribution is allocated under 'Insurance Service Expense' in 'Acquisition Expenses' section and under 'Insurance Revenue' in 'Acquistion Expenses Amortization' section with a sign change. " - ], - "metadata": {} - }, - { - "id": "aSfW_K2sMkiui5Kyu0MiDA", - "cell_type": "code", - "source": [ - "public interface IncurredDeferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube Deferrals => GetScope(Identity).Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\"));", - "\n ", - "\n private IDataCube Amortization => -1 * Deferrals", - "\n .Filter((\"VariableType\", AocTypes.AM));", - "\n ", - "\n IDataCube AmortizationToIr => (-1 * Amortization).SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR4\" });", - "\n IDataCube AmortizationToIse => Amortization.SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE6\" });", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "SOtkVo0ffEKckF0hH2Q6YQ", - "cell_type": "markdown", - "source": [ - "## Experience Adjustment on Premium (allocation to CSM vs P&L recognition)" - ], - "metadata": {} - }, - { - "id": "Pgc61JA6rU6RdoGTvHFhIQ", - "cell_type": "markdown", - "source": [ - "The figures disclosed in the Financial Performance as described above consider full Premiums for past, current and future services (for Best Estimate and Actuals).", - "\nHowever, we applied the Premium Allocation factor in the CSM computations to adjust for the experience. To correct this, we need to exclude the Experience Adjustment on Premium part in the Financial Performance to avoid double counting and it is allocated under 'Insurance Revenue' in the 'Exc. Experience Adjustment on Premiums' section." - ], - "metadata": {} - }, - { - "id": "3rmklNkYPkSHioMl14xxiw", - "cell_type": "code", - "source": [ - "public interface ExperienceAdjustmentOnPremium: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube WrittenPremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.APA)).FxData;", - "\n private IDataCube AdvancePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.AAPA)).FxData;", - "\n private IDataCube OverduePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.OAPA)).FxData;", - "\n private IDataCube BestEstimatePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BEPA)).FxData;", - "\n ", - "\n IDataCube ExperienceAdjustmentOnPremium => (WrittenPremiumToCsm + AdvancePremiumToCsm + OverduePremiumToCsm - BestEstimatePremiumToCsm)", - "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", - "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR6\" });", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zr-GVPs8uUWdzPGwaINBrQ", - "cell_type": "markdown", - "source": [ - "## Financial Performance" - ], - "metadata": {} - }, - { - "id": "-aWqJjLyD0qw69pCfTydUg", - "cell_type": "markdown", - "source": [ - "As the last step, all the contributions above are calculated and combined into the Financial Performance, which will be used to generate the final report." - ], - "metadata": {} - }, - { - "id": "3eqY3uzwA0aCp5NOV-TpWw", - "cell_type": "code", - "source": [ - "public interface FinancialPerformance: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n ", - "\n private IDataCube FcfChangeInEstimate => GetScope(Identity);", - "\n private IDataCube CsmChangeInEstimate => GetScope(Identity);", - "\n private IDataCube LcChangeInEstimate => GetScope(Identity);", - "\n private IDataCube LorecoChangeInEstimate => GetScope(Identity);", - "\n private IDataCube IncurredActuals => GetScope(Identity);", - "\n private IDataCube IncurredDeferrals => GetScope(Identity);", - "\n private IDataCube ExperienceAdjustmentOnPremium => GetScope(Identity);", - "\n ", - "\n IDataCube FinancialPerformance => FcfChangeInEstimate + CsmChangeInEstimate + LcChangeInEstimate + LorecoChangeInEstimate + IncurredActuals + IncurredDeferrals + ExperienceAdjustmentOnPremium;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xgem_L0voUyElSD53tj9BQ", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "", + "\n

Report Scopes (IFRS17 Methodology Business Logic)

", + "\n", + "\nThis notebook contains the logic used to perform calculations upon reporting of data." + ] + }, + { + "cell_type": "markdown", + "source": [ + "# References", + "\nLibraries and other notebooks which are needed for this notebook are imported below." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Notebooks" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"ReportStorage\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Scopes" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Helper Scopes" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Universe" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IUniverse: IScopeWithStorage {}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Transformation" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Retrieve Raw Data" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Data: IScope<(ReportIdentity ReportIdentity, string EstimateType), ReportStorage>, IDataCube {", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().EstimateTypesWithoutAoc.Contains(x.Identity.EstimateType)));", + "\n ", + "\n protected IDataCube RawData => GetStorage().GetVariables(Identity.ReportIdentity, Identity.EstimateType);", + "\n", + "\n private IDataCube RawEops => RawData.Filter((\"VariableType\", AocTypes.EOP));", + "\n private IDataCube NotEopsNotCls => RawData.Filter((\"VariableType\", \"!EOP\"),(\"VariableType\", \"!CL\")); // TODO negation must be hardcoded (also to avoid string concatenation)", + "\n ", + "\n private IDataCube CalculatedCl => (RawEops - NotEopsNotCls)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = AocTypes.CL });", + "\n ", + "\n private IDataCube CalculatedEops => (NotEopsNotCls + CalculatedCl)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => x with { VariableType = AocTypes.EOP, Novelty = Novelties.C });", + "\n ", + "\n IDataCube Data => NotEopsNotCls + CalculatedCl + CalculatedEops;", + "\n}", + "\npublic interface DataWrittenActual: Data {", + "\n IDataCube Data.Data => RawData;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Foreign Exchange (FX) Rates" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Fx: IScope<(string ContractualCurrency, string FunctionalCurrency, FxPeriod FxPeriod, (int, int) Period, CurrencyType CurrencyType), ReportStorage> { ", + "\n private double groupFxRate => Identity.CurrencyType switch {", + "\n CurrencyType.Group => GetStorage().GetFx(Identity.Period, Identity.FunctionalCurrency, GroupCurrency, FxPeriod.Average),", + "\n _ => 1", + "\n };", + "\n ", + "\n private double GetFunctionalFxRate(FxPeriod fxPeriod) => Identity.CurrencyType switch {", + "\n CurrencyType.Contractual => 1,", + "\n _ => GetStorage().GetFx(Identity.Period, Identity.ContractualCurrency, Identity.FunctionalCurrency, fxPeriod)", + "\n };", + "\n ", + "\n double Fx => GetFunctionalFxRate(Identity.FxPeriod) * groupFxRate;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface FxData: IScope<(ReportIdentity ReportIdentity, CurrencyType CurrencyType, string EstimateType), ReportStorage>, IDataCube {", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().EstimateTypesWithoutAoc.Contains(x.Identity.EstimateType)));", + "\n ", + "\n protected IDataCube Data => GetScope((Identity.ReportIdentity, Identity.EstimateType)).Data", + "\n .SelectToDataCube(x => GetScope((Identity.ReportIdentity.ContractualCurrency, ", + "\n Identity.ReportIdentity.FunctionalCurrency, ", + "\n GetStorage().GetFxPeriod(GetStorage().Args.Period, x.VariableType, x.Novelty),", + "\n (Identity.ReportIdentity.Year, Identity.ReportIdentity.Month),", + "\n Identity.CurrencyType", + "\n )).Fx * x);", + "\n ", + "\n private IDataCube Eops => Data.Filter((\"VariableType\", AocTypes.EOP));", + "\n private IDataCube NotEops => Data.Filter((\"VariableType\", \"!EOP\")); // TODO negation must be hardcoded (also to avoid string concatenation)", + "\n ", + "\n private IDataCube Fx => (Eops - NotEops)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = AocTypes.FX });", + "\n ", + "\n IDataCube FxData => Data + Fx;", + "\n}", + "\n", + "\npublic interface FxDataWrittenActual: FxData {", + "\n IDataCube FxData.FxData => Data;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Present Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Best Estimate", + "\n", + "\nBest Estimate of Present Value (PV) report includes contributions from the [Present Value](../Import/ImportScopeCalculation#current-and-locked) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface BestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube BestEstimate => Identity.Id switch {", + "\n { ValuationApproach: ValuationApproaches.BBA, IsOci: true } => GetScope(Identity).LockedBestEstimate,", + "\n _ => GetScope(Identity).CurrentBestEstimate };", + "\n}", + "\n", + "\npublic interface LockedBestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube LockedBestEstimate => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BE)).FxData", + "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.L));", + "\n}", + "\n", + "\npublic interface CurrentBestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube CurrentBestEstimate => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BE)).FxData", + "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.C));", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Risk Adjustment", + "\n", + "\nRisk Adjustment (RA) report includes contributions from the [Risk Adjustment](../Import/ImportScopeCalculation#risk-adjustment) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface RiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube RiskAdjustment => Identity.Id switch {", + "\n { ValuationApproach: ValuationApproaches.BBA, IsOci: true } => GetScope(Identity).LockedRiskAdjustment,", + "\n _ => GetScope(Identity).CurrentRiskAdjustment };", + "\n}", + "\n", + "\npublic interface LockedRiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube LockedRiskAdjustment => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.RA)).FxData", + "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.L));", + "\n}", + "\n", + "\npublic interface CurrentRiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube CurrentRiskAdjustment => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.RA)).FxData", + "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.C));", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Fulfillment Cashflows", + "\nFulfillment Cashflows (FCF) report includes contributions from the [Best Estimate](#best-estimate) of Present Value and [Risk Adjustment](#risk-adjustment) Present Value." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Fcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube BestEstimate => GetScope(Identity).BestEstimate;", + "\n private IDataCube RiskAdjustment => GetScope(Identity).RiskAdjustment;", + "\n ", + "\n IDataCube Fcf => BestEstimate + RiskAdjustment;", + "\n}", + "\n", + "\npublic interface CurrentFcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube { ", + "\n private IDataCube BestEstimate => GetScope(Identity).CurrentBestEstimate;", + "\n private IDataCube RiskAdjustment => GetScope(Identity).CurrentRiskAdjustment;", + "\n ", + "\n IDataCube CurrentFcf => BestEstimate + RiskAdjustment;", + "\n}", + "\n", + "\npublic interface LockedFcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube { ", + "\n private IDataCube BestEstimate => GetScope(Identity).LockedBestEstimate;", + "\n private IDataCube RiskAdjustment => GetScope(Identity).LockedRiskAdjustment;", + "\n ", + "\n IDataCube LockedFcf => BestEstimate + RiskAdjustment;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## LRC Technical Margin: CSM, LC, LoReCo", + "\n", + "\nContractual Service Margin (CSM), Loss Component (LC), Loss Recovery Component (LoReCo) reports of the Liability for Remaining Coverage (LRC) include contributions from the calculation of [CSM](../Import/ImportScopeCalculation#csm), [LC](../Import/ImportScopeCalculation#csm), and [LoReCo](../Import/ImportScopeCalculation#csm), respectively." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Csm: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Csm => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.C)).FxData;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Lc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Lc => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.L)).FxData;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Loreco: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Loreco => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.LR)).FxData;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface LrcTechnicalMargin: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube Csm => GetScope(Identity).Csm;", + "\n private IDataCube Lc => GetScope(Identity).Lc;", + "\n private IDataCube Loreco => GetScope(Identity).Loreco;", + "\n ", + "\n IDataCube LrcTechnicalMargin => Lc + Loreco - 1 * Csm;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Written, Accruals and Deferrals ", + "\n", + "\nWritten Actual (Actual) report includes contributions from the [Actual](../Import/ImportScopeCalculation#actuals) import. ", + "\n
Accrual Actuals (Advance, Overdue Actual) report includes contributions from the [Advance](../Import/ImportScopeCalculation#advance-actuals) and [Overdue](../Import/ImportScopeCalculation#overdue-actuals) Actual calculation.", + "\n
Deferral (Deferral Actual) report includes contributions from the calculation of [Deferral](../Import/ImportScopeCalculation#deferrable-actuals) Actual." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface WrittenAndAccruals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Written => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.A)).FxData;", + "\n IDataCube Advance => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.AA)).FxData;", + "\n IDataCube Overdue => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.OA)).FxData;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Deferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube Deferrals => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.DA)).FxData;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Experience Adjustment", + "\n", + "\nExperience Adjustment (EA) report includes contributions from the [Written](#written-accrual-deferral) Actual report and the [Best Estimate](#best-estimate) of Present Value report (only the *Cash flow* AocStep). " + ] + }, + { + "cell_type": "code", + "source": [ + "public interface ExperienceAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube WrittenCashflow => GetScope(Identity).Written", + "\n .Filter((\"VariableType\", AocTypes.CF));", + "\n ", + "\n private IDataCube BestEstimateCashflow => GetScope(Identity).BestEstimate", + "\n .Filter((\"VariableType\", AocTypes.CF))", + "\n .SelectToDataCube(rv => rv with { EconomicBasis = null, Novelty = Novelties.C });", + "\n", + "\n IDataCube ActuarialExperienceAdjustment => WrittenCashflow - BestEstimateCashflow;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## LIC Actuarial (Actuarial Liability for Incurred Claims)", + "\n", + "\nLiability of Incurred Claims (LIC Actuarial) report includes the contributions from [Fulfillment cashflow](#fulfillment-cashflows)." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface LicActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n IDataCube LicActuarial => GetScope(Identity).CurrentFcf.Filter((\"LiabilityType\", LiabilityTypes.LIC));", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## LIC (Liability for Incurred Claims)", + "\n", + "\nLiability of Incurred Claims (LIC) report includes the contributions from [Lic Actuarial](#lic-actuarial) (Fullfilment Cashflow), [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Lic: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube licActuarial => GetScope(Identity).LicActuarial;", + "\n private IDataCube accrual => GetScope(Identity).Advance.Filter((\"LiabilityType\", LiabilityTypes.LIC)) + ", + "\n GetScope(Identity).Overdue.Filter((\"LiabilityType\", LiabilityTypes.LIC));", + "\n private IDataCube licData => licActuarial + accrual;", + "\n ", + "\n private IDataCube bop => licData.Filter((\"VariableType\", AocTypes.BOP));", + "\n private IDataCube delta => licData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = \"D\" });", + "\n private IDataCube eop => licData.Filter((\"VariableType\",AocTypes.EOP));", + "\n ", + "\n IDataCube Lic => bop + delta + eop;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## LRC Actuarial (Actuarial Liability for Remaining Coverage)", + "\n", + "\nLiability for Remaining Coverage (LRC) report includes all the contributions from [Fulfillment cashflow](#fulfillment-cashflows), [Contructual Sevice Margin](#technical-margin), [Loss Component](#technical-margin), and [Loss Recovery Component](#technical-margin)." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface LrcActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube Fcf => GetScope(Identity).CurrentFcf.Filter((\"LiabilityType\", LiabilityTypes.LRC));", + "\n private IDataCube Csm => GetScope(Identity).Csm;", + "\n private IDataCube Loreco => GetScope(Identity).Loreco;", + "\n ", + "\n IDataCube LrcActuarial => Fcf + Csm + Loreco;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## LRC (Liability for Remaining Coverage)", + "\n", + "\nLiability for Remaining Coverage (LRC) report includes all the contributions from [LRC Actuarial](#lrc-actuarial) (Fulfillment Cashflow, Contructual Sevice Margin, Loss Component, Loss Recovery Component) and, [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Lrc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube lrcActuarial => GetScope(Identity).LrcActuarial;", + "\n private IDataCube accrual => GetScope(Identity).Advance.Filter((\"LiabilityType\", LiabilityTypes.LRC)) + ", + "\n GetScope(Identity).Overdue.Filter((\"LiabilityType\", LiabilityTypes.LRC));", + "\n private IDataCube lrcData => lrcActuarial + accrual;", + "\n ", + "\n private IDataCube bop => lrcData.Filter((\"VariableType\",AocTypes.BOP));", + "\n private IDataCube delta => lrcData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = \"D\" });", + "\n private IDataCube eop => lrcData.Filter((\"VariableType\",AocTypes.EOP));", + "\n ", + "\n IDataCube Lrc => bop + delta + eop;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# IFRS 17 Financial Performance" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The IFRS 17 Financial Performance aims at disclosing the deltas (i.e. difference between EoP and BoP, or the Change in Estimate) of the IFRS 17 Balance Sheet items (LRC, LIC) and the relevant incurred cashflows (Premiums, Claims, Expenses, etc...) for the given period.", + "\n", + "\nIn addition, the IFRS 17 Financial Performance must split the results into at least 4 distinct sections:", + "\n - Insurance Revenue ($IR$)", + "\n - Insurance Service Expense ($ISE$)", + "\n - Insurance Finance Income/Expense ($IFIE$)", + "\n - Other Comprehensive Income ($OCI$)", + "\n", + "\nThese can be structured in a hierarchy, such that aggregation and intermediate results can be shown separately.", + "\nAlso the granularity for some relevant items (e.g. Gross LRC vs Reinsurance LRC) must be split into the different sections, as the notion of Insurance Revenue and Insurance Service Expense must be consistent.", + "\n", + "\nThe overall formulas for each of the sections above are as follows:", + "\n$$", + "\n\\begin{array}{rl}", + "\nIR =& -\\Delta \\text{ Gross Non-Financial LRC } - \\text{ Incurred Incoming Cashflows } - \\text{ Claims Investment Component } + \\text{ Amortization of the Insurance Acquisition Cashflows} - \\text{ Experience Adjustment On Premium }", + "\n\\\\", + "\nISE =& -\\Delta \\text{ Reinsurance Non-Financial LRC } - \\Delta \\text{ Non-Financial LIC } - \\Delta \\text{ Loss Component } - \\text{ Incurred Outgoing Cashflows } - \\text{ Amortization of the Insurance Acquisition Cashflows}", + "\n\\\\", + "\nIFIE =& -\\Delta \\text{ Financial LRC } - \\Delta \\text{ Financial LIC }", + "\n\\\\", + "\nOCI =& \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Valuation Rates } + \\Delta \\text{ LIC at Valuation Rates } - \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Current Rates } - \\Delta \\text{ LIC at Current Rates }", + "\n\\end{array}", + "\n$$", + "\n", + "\nFor CSM, LC and LoReCo (and implicit Amortization Factors / Coverage Units), the yield curve used is according to the methodology choice (e.g. BBA uses Locked-In rates). ", + "\n", + "\nThe Fulfillment Cashflows components for LIC and LRC are discounted using the appropriate yield curve (Locked-In or Current) according to the choice of the OCI option and methodology. We can distinguish 2 cases for the Building Block approach (BBA):", + "\n - BBA, OCI option ***disabled***: FCF computed using Current rates", + "\n - BBA, OCI option ***enabled***: FCF computed using Locked-In rates", + "\n", + "\nIn the case when the OCI option is disabled, the OCI contribution is zero. Otherwise, we have:", + "\n", + "\n$$", + "\n\\begin{array}{rl}", + "\nOCI =& \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Locked-In Rates } + \\Delta \\text{ LIC at Locked-In Rates } - \\Delta \\text{ LRC excl. CSM/LC/LoReCo at Current Rates } - \\Delta \\text{ LIC at Current Rates }", + "\n\\end{array}", + "\n$$", + "\n", + "\nUsually, some more details on the items above are desired (e.g. separating the LRC into its components FCF, RA, CSM/LC or explicitly showing the CSM Amortization vs. other financial/non-financial adjustments to the CSM estimation). These are specific to each implementation and depend on the data granularity (e.g. how the Amount Types, AoC steps are detailed and structured). This level of detail is omitted from the generic documentation presented here, but are implicit to the way each item above is calculated. Nevertheless, this extra granularity is available when the reports are generated and sliced by the corresponding dimensions. " + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Fulfillment Cashflows (excluding the Loss Component)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Let us first describe the Balance Sheet items, where we need to disclose the Changes in Estimate in the Financial Performance.", + "\nAs mentioned, often the LRC and LIC contributions are broken down into smaller parts for disclosure and reconciliation purposes.", + "\n", + "\nThe Fulfillment Cashflows (which may include onerous contributions in some interpretations when a Loss Component is defined) contributions to the Financial Performance (Insurance Result and OCI) are detailed below.", + "\nThe main requisite is to ensure the right mapping of its non-financial and financial components into the appropriate sections of the Financial Performance.", + "\n", + "\nFurthermore, we also need to distinguish the Reinsurance contributions to the LRC, as they are considered to be expenses and not revenue.", + "\nThe OCI contribution is also performed here, as the only contributions to the OCI come from the FCF under the current methodology assumptions.", + "\nTo all contributions a sign flip is applied. ", + "\n", + "\nIn particular: ", + "\n- Financial component includes the AocType Interest Accreation, Yield Curve Update, and Credit Risk Update,", + "\n- Non-Financial component includes all the remaining AocTypes.", + "\n- Oci component includes the difference between the movement occured in the period computed applying the discounting with the current yield curve and the discounting with the locked-in yield curve.", + "\n", + "\nThe Financial contributions are reported in 'Financial LIC Changes' for a Group of Contract with Liability Type LIC and to 'Financial LRC Changes' for a Group of Contract with Liability Type LRC.", + "\n
The Non Financial contributions are reported in 'Non Financial LIC Changes' for a Group of Contract with Liability Type LIC. For a Group of Contract with Liability Type LRC, they are reported in 'Non-Financial LRC Changes (Exc. CSM Amortization)' for a Group of Insurance Contract and in 'Non-Financial Reinsurance LRC Changes (Exc. LC/LoReCo)' for a Group of Reinsurance Contract.", + "\n
The Oci contributions are reported in the 'Other Comprehensive Income' section under 'Financial LIC Changes' or a Group of Contract with Liability Type LIC and to 'Financial LRC Changes' for a Group of Contract with Liability Type LRC." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface FcfChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube FcfDeltas => GetScope(Identity).Fcf.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).Fcf.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n ", + "\n private IDataCube CurrentFcfDeltas => GetScope(Identity).CurrentFcf.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).CurrentFcf.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n", + "\n // Non-Financial Fp", + "\n private string variableTypeNonFinancial => Identity.Id switch {", + "\n { LiabilityType: LiabilityTypes.LRC, IsReinsurance: false } => \"IR5\",", + "\n { LiabilityType: LiabilityTypes.LRC, IsReinsurance: true } => \"ISE10\",", + "\n { LiabilityType: LiabilityTypes.LIC } => \"ISE12\"", + "\n };", + "\n ", + "\n private IDataCube NonFinancialFcfDeltas => FcfDeltas", + "\n .Filter((\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")); ", + "\n ", + "\n IDataCube FpNonFinancial => -1 * NonFinancialFcfDeltas", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeNonFinancial }); ", + "\n ", + "\n // Financial Fp", + "\n private string variableTypeFpFinancial => Identity.Id switch {", + "\n { LiabilityType: LiabilityTypes.LRC } => \"IFIE1\",", + "\n { LiabilityType: LiabilityTypes.LIC } => \"IFIE2\",", + "\n };", + "\n ", + "\n // OCI ", + "\n private string variableTypeOciFinancial => Identity.Id switch {", + "\n { LiabilityType: LiabilityTypes.LRC } => \"OCI1\",", + "\n { LiabilityType: LiabilityTypes.LIC } => \"OCI2\",", + "\n };", + "\n ", + "\n private IDataCube FinancialFcfDeltas => FcfDeltas.Filter((\"VariableType\", AocTypes.IA)) + ", + "\n FcfDeltas.Filter((\"VariableType\", AocTypes.YCU)) +", + "\n FcfDeltas.Filter((\"VariableType\", AocTypes.CRU));", + "\n ", + "\n IDataCube FpFinancial => -1 * FinancialFcfDeltas", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeFpFinancial});", + "\n", + "\n IDataCube OciFinancial => (FcfDeltas - CurrentFcfDeltas)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeOciFinancial});", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Subsequently, the Contractual Service Margin (CSM), Loss Component (LC) and Loss Recovery Component (LoReCo) are also divided into non-financial and financial components. In addition the corresponding amortization/releases (CSM Amortization, LC Release and LoReCo Release) are also explicitly shown." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Contractual Service Margin (CSM)", + "\n", + "\nCsm contributes to the 'Insurance Revenue' in the case of a Group of Insurance Contract and to the 'Insurance Service Expense' in the case of a Group of Reinsurance Contract and to the 'Insurance Finance Income/Expense'. To all contributions a sign flip is applied. ", + "\nIn particular, the CSM figures are separated in three cathegories: ", + "\n- Amortization (including to AocType Amortization),", + "\n- Financial contributions (including the AocTypes Interest Accreation, Yield Curve Update, and Credit Risk Update),", + "\n- Non Financial contributions (including all the remaining AocTypes).", + "\n", + "\n
The Amortization contribution is reported in 'Insurance Revenue' under 'CSM Amortization' or in 'Insurance Service Expense' under 'Reinsurance CSM Amortization' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively. ", + "\n
The Financial contributions are reported in 'Financial LRC Changes'.", + "\n
The Non Financial contributions are reported in 'Non-Financial LRC Changes (Exc. CSM Amortization)' and 'Non-Financial Reinsurance LRC Changes (Exc. LC/LoReCo)' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively. " + ] + }, + { + "cell_type": "code", + "source": [ + "public interface CsmChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n ", + "\n private (string amortization, string nonFinancial) variableType => Identity.Id switch {", + "\n { IsReinsurance: false} => (\"IR3\", \"IR5\"),", + "\n { IsReinsurance: true } => (\"ISE7\", \"ISE10\")", + "\n };", + "\n ", + "\n private IDataCube Csm => GetScope(Identity).Csm.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).Csm.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n ", + "\n IDataCube Amortization => -1 * Csm.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = variableType.amortization });", + "\n ", + "\n IDataCube NonFinancialChanges => -1 * Csm", + "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = variableType.nonFinancial });", + "\n ", + "\n IDataCube FinancialChanges => -1 * (Csm.Filter((\"VariableType\", AocTypes.IA)) +", + "\n Csm.Filter((\"VariableType\", AocTypes.YCU)) +", + "\n Csm.Filter((\"VariableType\", AocTypes.CRU)) )", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Loss Component (LC)", + "\n", + "\nLC contributes to the 'Insurance Service Expense' and to the 'Insurance Finance Income/Expense'. To all contributions a sign flip is applied. ", + "\nIn particular, the LC figures are separated in three cathegories: ", + "\n- Amortization (including to AocType Amortization),", + "\n- Financial contributions (including the AocTypes Interest Accreation, Yield Curve Update, and Credit Risk Update),", + "\n- Non Financial contributions (including all the remaining AocTypes).", + "\n", + "\n
The Amortization contribution is reported in 'Loss Component Release'.", + "\n
The Financial contributions are reported in 'Financial LRC Changes'.", + "\n
The Non Financial contributions are reported in 'Loss Component / LoReCo Changes (Exc. Releases)'." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface LcChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n ", + "\n private IDataCube Lc => GetScope(Identity).Lc.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).Lc.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n ", + "\n IDataCube Amortization => -1 * Lc.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = \"ISE9\" });", + "\n ", + "\n IDataCube NonFinancialChanges => -1 * Lc", + "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE11\" });", + "\n ", + "\n IDataCube FinancialChanges => -1 * (Lc.Filter((\"VariableType\", AocTypes.IA)) +", + "\n Lc.Filter((\"VariableType\", AocTypes.YCU)) +", + "\n Lc.Filter((\"VariableType\", AocTypes.CRU)) )", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Loss Recovery Component (LoReCo)", + "\n", + "\nLoReCo contributes to the 'Insurance Service Expense' and to the 'Insurance Finance Income/Expense'. To all contributions a sign flip is applied. ", + "\nIn particular, the LoReCo figures are separated in three cathegories: ", + "\n- Amortization (including to AocType Amortization),", + "\n- Financial contributions (including the AocTypes Interest Accreation, Yield Curve Update, and Credit Risk Update),", + "\n- Non Financial contributions (including all the remaining AocTypes).", + "\n", + "\n
The Amortization contribution is reported in 'LoReCo Release'.", + "\n
The Financial contributions are reported in 'Financial LRC Changes'.", + "\n
The Non Financial contributions are reported in 'Loss Component / LoReCo Changes (Exc. Releases)'." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface LorecoChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n ", + "\n private IDataCube Loreco => GetScope(Identity).Loreco.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n GetScope(Identity).Loreco.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));", + "\n ", + "\n IDataCube Amortization => -1 * Loreco.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = \"ISE8\" });", + "\n ", + "\n IDataCube NonFinancialChanges => -1 * Loreco", + "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE11\" });", + "\n ", + "\n IDataCube FinancialChanges => -1 * (Loreco.Filter((\"VariableType\", AocTypes.IA)) +", + "\n Loreco.Filter((\"VariableType\", AocTypes.YCU)) +", + "\n Loreco.Filter((\"VariableType\", AocTypes.CRU)) )", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Incurred Actuals" + ] + }, + { + "cell_type": "markdown", + "source": [ + "After the main Balance Sheet items, we need to disclose the Incurred Cashflows (i.e. Actuals) for the period in the Financial Performance (which includes the effect of Advance and Overdue Accruals, but Write-Off amounts are not taken into account).", + "\nAs another requirement, we exclude any investment components explicitly.", + "\n", + "\nThese contributions are splitted by Amount Type to the following sections:", + "\n- Premiums contributions are reported under 'Insurance Revenue' in 'Premiums' section or in 'Insurance Service Expense' under 'Reinsurance Premiums' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively,", + "\n- Claims Non-Investment Component contributions are reported under 'Insurance Revenue' in 'Claims' section,", + "\n- Claims Investment Component contributions are reported under 'Insurance Service Expense' in 'Acquisition Expenses' section and under 'Insurance Revenue' in 'Exc. Investment Components' section with a sign change,", + "\n- Expenses contributions are reported under 'Insurance Service Expense' in 'Expenses' section,", + "\n- Commissions contributions are reported under 'Insurance Service Expense' in 'Commissions' section." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IncurredActuals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube WrittenAndAccruals => GetScope(Identity).Filter((\"VariableType\", \"CF\"));", + "\n ", + "\n private string premiumsVariableType => Identity.Id switch {", + "\n { IsReinsurance: false} => \"IR1\",", + "\n { IsReinsurance: true } => \"ISE1\"", + "\n }; ", + "\n ", + "\n IDataCube Premiums => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.PR))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = premiumsVariableType });", + "\n ", + "\n IDataCube ClaimsNic => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.NIC))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE2\" });", + "\n ", + "\n private IEnumerable ClaimsIco => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.ICO));", + "\n ", + "\n IDataCube ClaimsIcoToIr => ClaimsIco.SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR2\" });", + "\n IDataCube ClaimsIcoToIse => (-1 * ClaimsIco).SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE5\" });", + "\n ", + "\n IDataCube Expenses => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.AE))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE3\" });", + "\n", + "\n IDataCube Commissions => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.AC))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE4\" });", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Incurred Deferrals and Acquisition Expenses" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The next item are the Deferrals, where the Amortization is the only contribution explicitly shown, but these do not have any direct impact on the Financial Performance under the current methodology assumptions. The Amortization contribution is here considered with its sign changed. This contribution is allocated under 'Insurance Service Expense' in 'Acquisition Expenses' section and under 'Insurance Revenue' in 'Acquistion Expenses Amortization' section with a sign change. " + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IncurredDeferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube Deferrals => GetScope(Identity).Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\"));", + "\n ", + "\n private IDataCube Amortization => -1 * Deferrals", + "\n .Filter((\"VariableType\", AocTypes.AM));", + "\n ", + "\n IDataCube AmortizationToIr => (-1 * Amortization).SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR4\" });", + "\n IDataCube AmortizationToIse => Amortization.SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE6\" });", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Experience Adjustment on Premium (allocation to CSM vs P&L recognition)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The figures disclosed in the Financial Performance as described above consider full Premiums for past, current and future services (for Best Estimate and Actuals).", + "\nHowever, we applied the Premium Allocation factor in the CSM computations to adjust for the experience. To correct this, we need to exclude the Experience Adjustment on Premium part in the Financial Performance to avoid double counting and it is allocated under 'Insurance Revenue' in the 'Exc. Experience Adjustment on Premiums' section." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface ExperienceAdjustmentOnPremium: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n private IDataCube WrittenPremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.APA)).FxData;", + "\n private IDataCube AdvancePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.AAPA)).FxData;", + "\n private IDataCube OverduePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.OAPA)).FxData;", + "\n private IDataCube BestEstimatePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BEPA)).FxData;", + "\n ", + "\n IDataCube ExperienceAdjustmentOnPremium => (WrittenPremiumToCsm + AdvancePremiumToCsm + OverduePremiumToCsm - BestEstimatePremiumToCsm)", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR6\" });", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Financial Performance" + ] + }, + { + "cell_type": "markdown", + "source": [ + "As the last step, all the contributions above are calculated and combined into the Financial Performance, which will be used to generate the final report." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface FinancialPerformance: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", + "\n ", + "\n private IDataCube FcfChangeInEstimate => GetScope(Identity);", + "\n private IDataCube CsmChangeInEstimate => GetScope(Identity);", + "\n private IDataCube LcChangeInEstimate => GetScope(Identity);", + "\n private IDataCube LorecoChangeInEstimate => GetScope(Identity);", + "\n private IDataCube IncurredActuals => GetScope(Identity);", + "\n private IDataCube IncurredDeferrals => GetScope(Identity);", + "\n private IDataCube ExperienceAdjustmentOnPremium => GetScope(Identity);", + "\n ", + "\n IDataCube FinancialPerformance => FcfChangeInEstimate + CsmChangeInEstimate + LcChangeInEstimate + LorecoChangeInEstimate + IncurredActuals + IncurredDeferrals + ExperienceAdjustmentOnPremium;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Report/ReportStorage.ipynb b/Report/ReportStorage.ipynb index 7eea19f9..477fc0bb 100644 --- a/Report/ReportStorage.ipynb +++ b/Report/ReportStorage.ipynb @@ -1,241 +1,219 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "HEuASoWo4UGVdx8dGf6u_A", - "cell_type": "markdown", - "source": [ - "", - "\n

Report Storage and Identity

", - "\n", - "\nThe Report Identity is a record collecting all information needed to define the granularity in which the calculation are performed.", - "\n", - "\nThe Report Storage collects the required data and parameters used in the calculations.", - "\n", - "\nBoth Storage and Identity are defined to support the calculations defined in the corresponding [Report Scopes](./ReportScopes)." - ], - "metadata": {} - }, - { - "id": "lH7xWMjez0q8ciCz4Qykww", - "cell_type": "code", - "source": [ - "#!import \"ReportConfigurationAndUtils\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2dj3bWBcRkGx9h4euZjMZA", - "cell_type": "markdown", - "source": [ - "# Report Identity" - ], - "metadata": {} - }, - { - "id": "XYiuv9tTxk218jeGK45wwg", - "cell_type": "code", - "source": [ - "[IdentityAggregationBehaviour(IdentityAggregationBehaviour.Aggregate)]", - "\npublic record ReportIdentity {", - "\n ", - "\n [Dimension(typeof(int), nameof(Year))]", - "\n public int Year { get; init; }", - "\n", - "\n [Dimension(typeof(int), nameof(Month))]", - "\n public int Month { get; init; }", - "\n", - "\n [Dimension(typeof(ReportingNode))]", - "\n public string ReportingNode { get; init; }", - "\n ", - "\n [Dimension(typeof(Scenario))]", - "\n public string Scenario { get; init; }", - "\n", - "\n [Dimension(typeof(Currency), nameof(ContractualCurrency))]", - "\n public string ContractualCurrency { get; init; }", - "\n ", - "\n [Dimension(typeof(Currency), nameof(FunctionalCurrency))]", - "\n public string FunctionalCurrency { get; init; }", - "\n", - "\n [NotAggregated]", - "\n [Dimension(typeof(int), nameof(Projection))]", - "\n public int Projection { get; init; }", - "\n", - "\n [Dimension(typeof(LiabilityType))]", - "\n public string LiabilityType { get; init; }", - "\n ", - "\n [Dimension(typeof(ValuationApproach))]", - "\n public string ValuationApproach { get; init; }", - "\n ", - "\n public bool IsReinsurance { get; init; } //TODO use ReinsuranceType", - "\n ", - "\n public bool IsOci { get; init; } ", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Xp1yqkllkEeactK1U1Wfbw", - "cell_type": "markdown", - "source": [ - "# Report Storage" - ], - "metadata": {} - }, - { - "id": "vXC3nuN1jUaN-35vvZ9pWA", - "cell_type": "code", - "source": [ - "public class ReportStorage {", - "\n protected readonly IWorkspace workspace;", - "\n private readonly Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchicalDimensionCache;", - "\n private readonly Systemorph.Vertex.Pivot.Reporting.IReportFactory reportFactory;", - "\n ", - "\n // Current Storage Settings", - "\n public ((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args {get; private set;}", - "\n ", - "\n // Cache for Aux Data ", - "\n private Dictionary<(int year, int month), Dictionary>> exchangeRatesByCurrencyByFxTypeAndPeriod = new(); // Fx Rates", - "\n private Dictionary<(int year, int month), Dictionary> fxPeriodsByAocStepAndPeriod = new(); // FxParameter", - "\n ", - "\n public HashSet EstimateTypesWithoutAoc {get; private set;}", - "\n ", - "\n // Cache for Variables and Parameters", - "\n private Dictionary<((int year, int month) period, string reportingNode, string scenario), Dictionary>>> variablesDictionary = new();", - "\n ", - "\n // Constructor", - "\n public ReportStorage(IWorkspace workspace, Systemorph.Vertex.Pivot.Reporting.IReportFactory reportFactory) {", - "\n this.workspace = workspace;", - "\n this.hierarchicalDimensionCache = workspace.ToHierarchicalDimensionCache();", - "\n this.reportFactory = reportFactory;", - "\n }", - "\n ", - "\n // Initializers", - "\n public async Task InitializeReportIndependentCacheAsync() {", - "\n // Hierarchical Dimensions", - "\n hierarchicalDimensionCache.Initialize();", - "\n hierarchicalDimensionCache.Initialize(); ", - "\n hierarchicalDimensionCache.Initialize();", - "\n hierarchicalDimensionCache.Initialize();", - "\n }", - "\n ", - "\n public async Task InitializeAsync((int year, int month) period, string reportingNode, string scenario, CurrencyType currencyType) {", - "\n // Report Dependent Cache", - "\n", - "\n // Setting the Args --> Temp for the moment", - "\n Args = (period, reportingNode, scenario, currencyType);", - "\n ", - "\n EstimateTypesWithoutAoc = (await workspace.Query().Where(x => x.StructureType != StructureType.AoC).Select(x => x.SystemName).ToArrayAsync()).ToHashSet();", - "\n ", - "\n // FX && Fx Parameters", - "\n if(!exchangeRatesByCurrencyByFxTypeAndPeriod.TryGetValue(period, out var exchangeRatesByCurrencyByFxType) || !fxPeriodsByAocStepAndPeriod.TryGetValue(period, out var fxPeriodsByAocStep)) {", - "\n exchangeRatesByCurrencyByFxType = await workspace.GetExchangeRatesDictionaryAsync(period.year, period.month);", - "\n exchangeRatesByCurrencyByFxTypeAndPeriod.Add(period, exchangeRatesByCurrencyByFxType);", - "\n fxPeriodsByAocStep = (await workspace.LoadAocStepConfigurationAsync(period.year, period.month)).Where(x => x.FxPeriod != FxPeriod.NotApplicable).ToDictionary(x => new AocStep(x.AocType, x.Novelty), x => (FxPeriod)x.FxPeriod);", - "\n fxPeriodsByAocStepAndPeriod.Add(period, fxPeriodsByAocStep);", - "\n }", - "\n ", - "\n // Variables", - "\n foreach(var rn in GetLeaves(reportingNode)) { ", - "\n if(!variablesDictionary.TryGetValue((period, rn, scenario), out var variablesByIdentity)) {", - "\n variablesByIdentity = (await workspace.QueryReportVariablesAsync((period.year, period.month, rn, scenario)))", - "\n .ToDictionaryGrouped(x => new ReportIdentity {", - "\n Year = period.year,", - "\n Month = period.month,", - "\n ReportingNode = x.ReportingNode,", - "\n Scenario = x.Scenario,", - "\n Projection = x.Projection,", - "\n ContractualCurrency = x.ContractualCurrency,", - "\n FunctionalCurrency = x.FunctionalCurrency,", - "\n ValuationApproach = x.ValuationApproach,", - "\n LiabilityType = x.LiabilityType,", - "\n IsReinsurance = x.IsReinsurance,", - "\n IsOci = !string.IsNullOrWhiteSpace(x.OciType) },", - "\n x => x.ToDictionaryGrouped(y => y.EstimateType,", - "\n y => y.ToArray().ToDataCube()));", - "\n ", - "\n variablesDictionary.Add((period, rn, scenario), variablesByIdentity);", - "\n }", - "\n }", - "\n }", - "\n ", - "\n // Getters for Data", - "\n public IDataCube GetVariables(ReportIdentity reportIdentity, params string[] estimateTypes)", - "\n => (!variablesDictionary.TryGetValue(((reportIdentity.Year, reportIdentity.Month), reportIdentity.ReportingNode, reportIdentity.Scenario), out var variablesByIdentity) || !variablesByIdentity.TryGetValue(reportIdentity, out var variablesByEstimateType))", - "\n ? Enumerable.Empty().ToDataCube()", - "\n : estimateTypes.Length switch {", - "\n 0 => variablesByEstimateType.SelectMany(x => x.Value).ToDataCube(),", - "\n 1 => variablesByEstimateType.TryGetValue(estimateTypes.First(), out var variables)", - "\n ? variables.ToDataCube()", - "\n : Enumerable.Empty().ToDataCube(),", - "\n _ => estimateTypes.Select(et => variablesByEstimateType.TryGetValue(et, out var variables)", - "\n ? variables.ToDataCube()", - "\n : Enumerable.Empty())", - "\n .Aggregate((x, y) => x.Concat(y))", - "\n .ToDataCube()", - "\n };", - "\n ", - "\n // Other getters", - "\n public IWorkspace Workspace => workspace;", - "\n public Systemorph.Vertex.Pivot.Reporting.IReportFactory Report => reportFactory;", - "\n", - "\n public Systemorph.Vertex.Hierarchies.IHierarchy GetHierarchy() where T : class, IHierarchicalDimension => hierarchicalDimensionCache.Get();", - "\n ", - "\n public HashSet<(ReportIdentity, CurrencyType)> GetIdentities((int year, int month) period, string reportingNode, string scenario, CurrencyType currencyType)", - "\n => GetLeaves(reportingNode)", - "\n .SelectMany(rn => variablesDictionary.TryGetValue((period, rn, scenario), out var inner) ? inner.Keys.Select(x => (x, currencyType)) : Enumerable.Empty<(ReportIdentity, CurrencyType)>())", - "\n .ToHashSet();", - "\n ", - "\n public double GetFx((int year, int month) period, string currentCurrency, string targetCurrency, FxPeriod fxPeriod) {", - "\n if (currentCurrency == targetCurrency) return 1;", - "\n if(!exchangeRatesByCurrencyByFxTypeAndPeriod.TryGetValue(period, out var exchangeRatesByCurrencyByFxType))", - "\n throw new Exception ($\"No exchange rates for Period {period} were found.\");", - "\n return GetCurrencyToGroupFx(exchangeRatesByCurrencyByFxType, currentCurrency, fxPeriod, GroupCurrency)", - "\n / GetCurrencyToGroupFx(exchangeRatesByCurrencyByFxType, targetCurrency, fxPeriod, GroupCurrency);", - "\n }", - "\n ", - "\n public FxPeriod GetFxPeriod((int year, int month) period, string aocType, string novelty) => fxPeriodsByAocStepAndPeriod[period][new AocStep(aocType, novelty)];", - "\n ", - "\n // Helpers", - "\n public HashSet GetLeaves(string systemName) where T : class, IHierarchicalDimension {", - "\n var descendants = hierarchicalDimensionCache.Get(systemName).Descendants(includeSelf: true);", - "\n return descendants.Where(x => !descendants.Select(y => y.Parent).Contains(x.SystemName)).Select(x => x.SystemName).ToHashSet();", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Gl9OQV-72kGG19Hx1igOHw", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "", + "\n

Report Storage and Identity

", + "\n", + "\nThe Report Identity is a record collecting all information needed to define the granularity in which the calculation are performed.", + "\n", + "\nThe Report Storage collects the required data and parameters used in the calculations.", + "\n", + "\nBoth Storage and Identity are defined to support the calculations defined in the corresponding [Report Scopes](./ReportScopes)." + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"ReportConfigurationAndUtils\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Report Identity" + ] + }, + { + "cell_type": "code", + "source": [ + "[IdentityAggregationBehaviour(IdentityAggregationBehaviour.Aggregate)]", + "\npublic record ReportIdentity {", + "\n ", + "\n [Dimension(typeof(int), nameof(Year))]", + "\n public int Year { get; init; }", + "\n", + "\n [Dimension(typeof(int), nameof(Month))]", + "\n public int Month { get; init; }", + "\n", + "\n [Dimension(typeof(ReportingNode))]", + "\n public string ReportingNode { get; init; }", + "\n ", + "\n [Dimension(typeof(Scenario))]", + "\n public string Scenario { get; init; }", + "\n", + "\n [Dimension(typeof(Currency), nameof(ContractualCurrency))]", + "\n public string ContractualCurrency { get; init; }", + "\n ", + "\n [Dimension(typeof(Currency), nameof(FunctionalCurrency))]", + "\n public string FunctionalCurrency { get; init; }", + "\n", + "\n [NotAggregated]", + "\n [Dimension(typeof(int), nameof(Projection))]", + "\n public int Projection { get; init; }", + "\n", + "\n [Dimension(typeof(LiabilityType))]", + "\n public string LiabilityType { get; init; }", + "\n ", + "\n [Dimension(typeof(ValuationApproach))]", + "\n public string ValuationApproach { get; init; }", + "\n ", + "\n public bool IsReinsurance { get; init; } //TODO use ReinsuranceType", + "\n ", + "\n public bool IsOci { get; init; } ", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Report Storage" + ] + }, + { + "cell_type": "code", + "source": [ + "public class ReportStorage {", + "\n protected readonly IWorkspace workspace;", + "\n private readonly Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchicalDimensionCache;", + "\n private readonly Systemorph.Vertex.Pivot.Reporting.IReportFactory reportFactory;", + "\n ", + "\n // Current Storage Settings", + "\n public ((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args {get; private set;}", + "\n ", + "\n // Cache for Aux Data ", + "\n private Dictionary<(int year, int month), Dictionary>> exchangeRatesByCurrencyByFxTypeAndPeriod = new(); // Fx Rates", + "\n private Dictionary<(int year, int month), Dictionary> fxPeriodsByAocStepAndPeriod = new(); // FxParameter", + "\n ", + "\n public HashSet EstimateTypesWithoutAoc {get; private set;}", + "\n ", + "\n // Cache for Variables and Parameters", + "\n private Dictionary<((int year, int month) period, string reportingNode, string scenario), Dictionary>>> variablesDictionary = new();", + "\n ", + "\n // Constructor", + "\n public ReportStorage(IWorkspace workspace, Systemorph.Vertex.Pivot.Reporting.IReportFactory reportFactory) {", + "\n this.workspace = workspace;", + "\n this.hierarchicalDimensionCache = workspace.ToHierarchicalDimensionCache();", + "\n this.reportFactory = reportFactory;", + "\n }", + "\n ", + "\n // Initializers", + "\n public async Task InitializeReportIndependentCacheAsync() {", + "\n // Hierarchical Dimensions", + "\n hierarchicalDimensionCache.Initialize();", + "\n hierarchicalDimensionCache.Initialize(); ", + "\n hierarchicalDimensionCache.Initialize();", + "\n hierarchicalDimensionCache.Initialize();", + "\n }", + "\n ", + "\n public async Task InitializeAsync((int year, int month) period, string reportingNode, string scenario, CurrencyType currencyType) {", + "\n // Report Dependent Cache", + "\n", + "\n // Setting the Args --> Temp for the moment", + "\n Args = (period, reportingNode, scenario, currencyType);", + "\n ", + "\n EstimateTypesWithoutAoc = (await workspace.Query().Where(x => x.StructureType != StructureType.AoC).Select(x => x.SystemName).ToArrayAsync()).ToHashSet();", + "\n ", + "\n // FX && Fx Parameters", + "\n if(!exchangeRatesByCurrencyByFxTypeAndPeriod.TryGetValue(period, out var exchangeRatesByCurrencyByFxType) || !fxPeriodsByAocStepAndPeriod.TryGetValue(period, out var fxPeriodsByAocStep)) {", + "\n exchangeRatesByCurrencyByFxType = await workspace.GetExchangeRatesDictionaryAsync(period.year, period.month);", + "\n exchangeRatesByCurrencyByFxTypeAndPeriod.Add(period, exchangeRatesByCurrencyByFxType);", + "\n fxPeriodsByAocStep = (await workspace.LoadAocStepConfigurationAsync(period.year, period.month)).Where(x => x.FxPeriod != FxPeriod.NotApplicable).ToDictionary(x => new AocStep(x.AocType, x.Novelty), x => (FxPeriod)x.FxPeriod);", + "\n fxPeriodsByAocStepAndPeriod.Add(period, fxPeriodsByAocStep);", + "\n }", + "\n ", + "\n // Variables", + "\n foreach(var rn in GetLeaves(reportingNode)) { ", + "\n if(!variablesDictionary.TryGetValue((period, rn, scenario), out var variablesByIdentity)) {", + "\n variablesByIdentity = (await workspace.QueryReportVariablesAsync((period.year, period.month, rn, scenario)))", + "\n .ToDictionaryGrouped(x => new ReportIdentity {", + "\n Year = period.year,", + "\n Month = period.month,", + "\n ReportingNode = x.ReportingNode,", + "\n Scenario = x.Scenario,", + "\n Projection = x.Projection,", + "\n ContractualCurrency = x.ContractualCurrency,", + "\n FunctionalCurrency = x.FunctionalCurrency,", + "\n ValuationApproach = x.ValuationApproach,", + "\n LiabilityType = x.LiabilityType,", + "\n IsReinsurance = x.IsReinsurance,", + "\n IsOci = !string.IsNullOrWhiteSpace(x.OciType) },", + "\n x => x.ToDictionaryGrouped(y => y.EstimateType,", + "\n y => y.ToArray().ToDataCube()));", + "\n ", + "\n variablesDictionary.Add((period, rn, scenario), variablesByIdentity);", + "\n }", + "\n }", + "\n }", + "\n ", + "\n // Getters for Data", + "\n public IDataCube GetVariables(ReportIdentity reportIdentity, params string[] estimateTypes)", + "\n => (!variablesDictionary.TryGetValue(((reportIdentity.Year, reportIdentity.Month), reportIdentity.ReportingNode, reportIdentity.Scenario), out var variablesByIdentity) || !variablesByIdentity.TryGetValue(reportIdentity, out var variablesByEstimateType))", + "\n ? Enumerable.Empty().ToDataCube()", + "\n : estimateTypes.Length switch {", + "\n 0 => variablesByEstimateType.SelectMany(x => x.Value).ToDataCube(),", + "\n 1 => variablesByEstimateType.TryGetValue(estimateTypes.First(), out var variables)", + "\n ? variables.ToDataCube()", + "\n : Enumerable.Empty().ToDataCube(),", + "\n _ => estimateTypes.Select(et => variablesByEstimateType.TryGetValue(et, out var variables)", + "\n ? variables.ToDataCube()", + "\n : Enumerable.Empty())", + "\n .Aggregate((x, y) => x.Concat(y))", + "\n .ToDataCube()", + "\n };", + "\n ", + "\n // Other getters", + "\n public IWorkspace Workspace => workspace;", + "\n public Systemorph.Vertex.Pivot.Reporting.IReportFactory Report => reportFactory;", + "\n", + "\n public Systemorph.Vertex.Hierarchies.IHierarchy GetHierarchy() where T : class, IHierarchicalDimension => hierarchicalDimensionCache.Get();", + "\n ", + "\n public HashSet<(ReportIdentity, CurrencyType)> GetIdentities((int year, int month) period, string reportingNode, string scenario, CurrencyType currencyType)", + "\n => GetLeaves(reportingNode)", + "\n .SelectMany(rn => variablesDictionary.TryGetValue((period, rn, scenario), out var inner) ? inner.Keys.Select(x => (x, currencyType)) : Enumerable.Empty<(ReportIdentity, CurrencyType)>())", + "\n .ToHashSet();", + "\n ", + "\n public double GetFx((int year, int month) period, string currentCurrency, string targetCurrency, FxPeriod fxPeriod) {", + "\n if (currentCurrency == targetCurrency) return 1;", + "\n if(!exchangeRatesByCurrencyByFxTypeAndPeriod.TryGetValue(period, out var exchangeRatesByCurrencyByFxType))", + "\n throw new Exception ($\"No exchange rates for Period {period} were found.\");", + "\n return GetCurrencyToGroupFx(exchangeRatesByCurrencyByFxType, currentCurrency, fxPeriod, GroupCurrency)", + "\n / GetCurrencyToGroupFx(exchangeRatesByCurrencyByFxType, targetCurrency, fxPeriod, GroupCurrency);", + "\n }", + "\n ", + "\n public FxPeriod GetFxPeriod((int year, int month) period, string aocType, string novelty) => fxPeriodsByAocStepAndPeriod[period][new AocStep(aocType, novelty)];", + "\n ", + "\n // Helpers", + "\n public HashSet GetLeaves(string systemName) where T : class, IHierarchicalDimension {", + "\n var descendants = hierarchicalDimensionCache.Get(systemName).Descendants(includeSelf: true);", + "\n return descendants.Where(x => !descendants.Select(y => y.Parent).Contains(x.SystemName)).Select(x => x.SystemName).ToHashSet();", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Report/Reports.ipynb b/Report/Reports.ipynb index 99f0a490..a79b4e9a 100644 --- a/Report/Reports.ipynb +++ b/Report/Reports.ipynb @@ -1,516 +1,388 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "1U3-hU_f80qwkFwNsbnfIQ", - "cell_type": "markdown", - "source": [ - "

Reports

", - "\n", - "\n" - ], - "metadata": {} - }, - { - "id": "me2hD-9UBkqUzPChAMdGSA", - "cell_type": "markdown", - "source": [ - "# Infrastructure and Configuration" - ], - "metadata": {} - }, - { - "id": "u0H8pAlgYkS1PDtJ2VPLCw", - "cell_type": "markdown", - "source": [ - "## Initialize data" - ], - "metadata": {} - }, - { - "id": "uGtbh5xjQkit56ozbyiS5g", - "cell_type": "code", - "source": [ - "/* DataSource is configured and connected to real database */", - "\n//#!eval-notebook \"../Database/Configure\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TDC5BXyEaEeRJ3z9MmQClw", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jZ-XCFkJ2kqGHwxkU5vMWA", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QyUqnd2bSkOLW_SKU1cJBw", - "cell_type": "markdown", - "source": [ - "## Imports and Configurations" - ], - "metadata": {} - }, - { - "id": "I99Rcm-9LUmvvSjstjY9Hw", - "cell_type": "code", - "source": [ - "#!import \"ReportScopes\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LpptbT8Q_ESVOFAw3M1HQg", - "cell_type": "code", - "source": [ - "var reportStorage = new ReportStorage(Workspace, Report);", - "\nawait reportStorage.InitializeReportIndependentCacheAsync();", - "\nvar mostRecentPartition = (await Workspace.Query().Where(x => x.Scenario == null).OrderBy(x => x.Year).ThenBy(x => x.Month).ToArrayAsync()).Last();", - "\nvar reportingNodeRoot = (await Workspace.Query().Where(x => x.Parent == null).ToArrayAsync()).First().SystemName;", - "\nawait reportStorage.InitializeAsync((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);", - "\nvar identities = reportStorage.GetIdentities((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "COjZVjOdgkSk8q3E6JHEgg", - "cell_type": "markdown", - "source": [ - "## Calling Scope" - ], - "metadata": {} - }, - { - "id": "SMyYdCikXUua1hdjbI4OmA", - "cell_type": "code", - "source": [ - "var universe = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "538kYx9ba0GWU4_h7XqOqA", - "cell_type": "markdown", - "source": [ - "# Report Settings and Storage Update" - ], - "metadata": {} - }, - { - "id": "UuYESB0ub0-pmUPR8T6jIQ", - "cell_type": "code", - "source": [ - "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args =", - "\n //((2020, 12), reportingNodeRoot, null,CurrencyType.Contractual)", - "\n ((2021, 3), reportingNodeRoot, null,CurrencyType.Contractual)", - "\n //((2021, 12), reportingNodeRoot, null,CurrencyType.Contractual)", - "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Functional)", - "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Group)", - "\n ;", - "\n", - "\nawait reportStorage.InitializeAsync(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);", - "\nidentities = reportStorage.GetIdentities(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "spXqsA5i2k-QnXdIiPiN8g", - "cell_type": "markdown", - "source": [ - "# Present Value" - ], - "metadata": {} - }, - { - "id": "D2Y8VUl5EkSZ6EaxxjHxQw", - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedBestEstimate + universe.GetScopes(identities).Aggregate().CurrentBestEstimate)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "IB3NvnT2k0uFqLZP9EBMAw", - "cell_type": "markdown", - "source": [ - "# Risk Adjustment" - ], - "metadata": {} - }, - { - "id": "Vx4bYAkCsE2OfLFbPg380w", - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedRiskAdjustment + universe.GetScopes(identities).Aggregate().CurrentRiskAdjustment)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"EconomicBasis\", \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ncU2iZ7tvEy2fxjWmU3Iqg", - "cell_type": "markdown", - "source": [ - "# Actuals" - ], - "metadata": {} - }, - { - "id": "lUNkYQ-KvUqVSA4cxDP-cg", - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Written", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"AmountType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 450)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5p79FR5-wUKCtkk4E1UKsQ", - "cell_type": "markdown", - "source": [ - "## Advance, Overdue Actuals" - ], - "metadata": {} - }, - { - "id": "9xxC0nELUk6ZaH6064_mqw", - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Advance + universe.GetScopes(identities).Aggregate().Overdue)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EstimateType\")", - "\n .ReportGridOptions(reportHeight: 400)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5wuvd2c6O02jxhFkFp49GA", - "cell_type": "markdown", - "source": [ - "## Deferrable Actuals" - ], - "metadata": {} - }, - { - "id": "FlZFgvuEikyv4qcH6xvZYw", - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Deferrals", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 400)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MAO2KskzTEeZSNhRJLd0Zg", - "cell_type": "markdown", - "source": [ - "# Fulfilment Cashflow" - ], - "metadata": {} - }, - { - "id": "yQAAlgUfUkuF5u60nLLPcw", - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Fcf ", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")//, \"EstimateType\")//, \"AmountType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uF8DY0mc7UqiiYqQ6l6uxQ", - "cell_type": "markdown", - "source": [ - "# Actuarial Experience Adjustment" - ], - "metadata": {} - }, - { - "id": "HhH_UKImy0CsdcsI6-f6NA", - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().ActuarialExperienceAdjustment", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"EstimateType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"AmountType\" )//\"LiabilityType\", \"EstimateType\")", - "\n .ReportGridOptions(reportHeight: 300, headerColumnWidth: 300)", - "\n .ToReport() " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4P1Lq_n2rkC67MsvbYyLeg", - "cell_type": "markdown", - "source": [ - "# LRC Technical Margin" - ], - "metadata": {} - }, - { - "id": "2qHsCZAs806CvGJgBNEVVQ", - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().LrcTechnicalMargin", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 600)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3F3PhlQxqkWBa0AnU5W6mA", - "cell_type": "markdown", - "source": [ - "# Contractual Service Margin / Loss Component / Loss Recovery Component" - ], - "metadata": {} - }, - { - "id": "gs0gMZiNAk2Jx8IKLuVcvA", - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Csm + universe.GetScopes(identities).Aggregate().Lc + universe.GetScopes(identities).Aggregate().Loreco)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"EstimateType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "39j6UxhSA0uSJNFLzSMRYg", - "cell_type": "markdown", - "source": [ - "# LRC Actuarial" - ], - "metadata": {} - }, - { - "id": "4kG8l2FHpkCjcnv-q5Rwkw", - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LrcActuarial)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"LiabilityType\",\"GroupOfContract\",*/ \"EstimateType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Igfu5McpcUa4ORph4McI6g", - "cell_type": "markdown", - "source": [ - "# LRC" - ], - "metadata": {} - }, - { - "id": "jQtxFjgD9U2imsZ5CiVx2g", - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lrc)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType),\"GroupOfContract\", \"EstimateType\")", - "\n .ReportGridOptions(300)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dZ8KVTA4WkuJZdxC09iuiQ", - "cell_type": "markdown", - "source": [ - "# LIC Actuarial" - ], - "metadata": {} - }, - { - "id": "CAXoAvfKdk6VKSgwRZplgA", - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LicActuarial)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "q1RxJxSTCk2zVjInVNdAzg", - "cell_type": "markdown", - "source": [ - "# LIC" - ], - "metadata": {} - }, - { - "id": "rc1o2W9lvUOBLnbn-MxRRw", - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lic)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", - "\n .ReportGridOptions(300)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dI-BtkhyEkOSQkwJRxs0dQ", - "cell_type": "markdown", - "source": [ - "# Financial Performance" - ], - "metadata": {} - }, - { - "id": "e7jpS8lNhE2913hj-FXjxw", - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().FinancialPerformance", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CIY_4o8vO0KJafPttQEQcA", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Reports

", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Infrastructure and Configuration" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Initialize data" + ] + }, + { + "cell_type": "code", + "source": [ + "/* DataSource is configured and connected to real database */", + "\n//#!eval-notebook \"../Database/Configure\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Imports and Configurations" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"ReportScopes\"" + ] + }, + { + "cell_type": "code", + "source": [ + "var reportStorage = new ReportStorage(Workspace, Report);", + "\nawait reportStorage.InitializeReportIndependentCacheAsync();", + "\nvar mostRecentPartition = (await Workspace.Query().Where(x => x.Scenario == null).OrderBy(x => x.Year).ThenBy(x => x.Month).ToArrayAsync()).Last();", + "\nvar reportingNodeRoot = (await Workspace.Query().Where(x => x.Parent == null).ToArrayAsync()).First().SystemName;", + "\nawait reportStorage.InitializeAsync((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);", + "\nvar identities = reportStorage.GetIdentities((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Calling Scope" + ] + }, + { + "cell_type": "code", + "source": [ + "var universe = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Report Settings and Storage Update" + ] + }, + { + "cell_type": "code", + "source": [ + "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args =", + "\n //((2020, 12), reportingNodeRoot, null,CurrencyType.Contractual)", + "\n ((2021, 3), reportingNodeRoot, null,CurrencyType.Contractual)", + "\n //((2021, 12), reportingNodeRoot, null,CurrencyType.Contractual)", + "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Functional)", + "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Group)", + "\n ;", + "\n", + "\nawait reportStorage.InitializeAsync(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);", + "\nidentities = reportStorage.GetIdentities(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Present Value" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedBestEstimate + universe.GetScopes(identities).Aggregate().CurrentBestEstimate)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Risk Adjustment" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedRiskAdjustment + universe.GetScopes(identities).Aggregate().CurrentRiskAdjustment)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"EconomicBasis\", \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Written", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"AmountType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 450)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Advance, Overdue Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Advance + universe.GetScopes(identities).Aggregate().Overdue)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EstimateType\")", + "\n .ReportGridOptions(reportHeight: 400)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Deferrable Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Deferrals", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 400)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Fulfilment Cashflow" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Fcf ", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")//, \"EstimateType\")//, \"AmountType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Actuarial Experience Adjustment" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().ActuarialExperienceAdjustment", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"EstimateType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"AmountType\" )//\"LiabilityType\", \"EstimateType\")", + "\n .ReportGridOptions(reportHeight: 300, headerColumnWidth: 300)", + "\n .ToReport() " + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LRC Technical Margin" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().LrcTechnicalMargin", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 600)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Contractual Service Margin / Loss Component / Loss Recovery Component" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Csm + universe.GetScopes(identities).Aggregate().Lc + universe.GetScopes(identities).Aggregate().Loreco)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"EstimateType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LRC Actuarial" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LrcActuarial)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"LiabilityType\",\"GroupOfContract\",*/ \"EstimateType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LRC" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lrc)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType),\"GroupOfContract\", \"EstimateType\")", + "\n .ReportGridOptions(300)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LIC Actuarial" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LicActuarial)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LIC" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lic)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", + "\n .ReportGridOptions(300)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Financial Performance" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().FinancialPerformance", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", + "\n .ToReport()" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/AocStructureTest.ipynb b/Test/AocStructureTest.ipynb index b2411ca2..e0b1a671 100644 --- a/Test/AocStructureTest.ipynb +++ b/Test/AocStructureTest.ipynb @@ -1,704 +1,568 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "htuauFORRUW_vpe-m5qdCw", - "cell_type": "markdown", - "source": [ - "

Test Aoc Management

" - ], - "metadata": {} - }, - { - "id": "PeSv4LBGr0qLd08ewzJ6WA", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6hiubyTezEuZjfp-gctWmw", - "cell_type": "markdown", - "source": [ - "# Workspace Initialization " - ], - "metadata": {} - }, - { - "id": "54oSWDPLHEuTAVk-tNUBfA", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "JNf9Tz4s4UG65OvUoirk8Q", - "cell_type": "markdown", - "source": [ - "# Test" - ], - "metadata": {} - }, - { - "id": "LYX1kYxLHEyxrah6NZumRA", - "cell_type": "code", - "source": [ - "var args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Cashflow);", - "\nvar partition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", - "\n x.Month == args.Month && x.Scenario == args.Scenario);", - "\nif(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MfcAgK-1_ECiXK9qP48R_Q", - "cell_type": "code", - "source": [ - "public async Task CheckAocStepStructureAsync(IEnumerable inputVariables, ", - "\n Dictionary> parentBm, ", - "\n Dictionary referenceBm, ", - "\n Dictionary> fullAocBm,", - "\n Dictionary> parentBmCdr = null)", - "\n{", - "\n //Save test input data", - "\n var importFormat = ImportFormats.Cashflow;", - "\n var inputSource = InputSource.Cashflow;", - "\n if (inputVariables.First() is RawVariable)", - "\n {", - "\n await Workspace.UpdateAsync(inputVariables.Cast());", - "\n }", - "\n if (inputVariables.First() is IfrsVariable)", - "\n {", - "\n await Workspace.UpdateAsync(inputVariables.Cast());", - "\n importFormat = ImportFormats.Actual;", - "\n inputSource = InputSource.Actual;", - "\n }", - "\n ", - "\n var newArgs = args with {ImportFormat = importFormat };", - "\n //Set up import storage and test universe", - "\n var testStorage = new ImportStorage(newArgs, DataSource, Workspace);", - "\n await testStorage.InitializeAsync();", - "\n var isReinsurance = testStorage.DataNodeDataBySystemName[inputVariables.First().DataNode].IsReinsurance;", - "\n var testUniverse = Scopes.ForStorage(testStorage).ToScope();", - "\n //Clean up Workspace", - "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", - "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", - "\n ", - "\n var errors = new List();", - "\n ", - "\n var goc = inputVariables.First().DataNode;", - "\n var identities = testUniverse.GetScopes(testStorage.DataNodesByImportScope[ImportScope.Primary].Where(dn => dn == goc)).SelectMany(s => s.Identities);", - "\n ", - "\n //Assert Parents", - "\n if (importFormat != ImportFormats.Actual)", - "\n {", - "\n var parents = testUniverse.GetScopes(identities.Select(id => (object)(id, \"PR\")), o => o.WithStorage(testStorage)).Where(x => x.Values != Enumerable.Empty()).ToArray();", - "\n if (parentBm.Count() != parents.Count()) ", - "\n {", - "\n var computedIds = parents.Select(s => $\"AocType:{s.Identity.Id.AocType}, Novelty:{s.Identity.Id.Novelty}\");", - "\n var expectedIds = parentBm.Keys.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", - "\n errors.Add( $\"Parent count does not match expected: \\n Computed {parents.Count()} \\n {string.Join(\"\\n\", computedIds)} \\n Expected {parentBm.Count()} \\n {string.Join(\"\\n\", expectedIds)}.\" );", - "\n }", - "\n ", - "\n foreach(var kvp in parentBm)", - "\n {", - "\n var scopeParents = parents.Where(y => y.Identity.Id.AocType == kvp.Key.AocType && y.Identity.Id.Novelty == kvp.Key.Novelty);", - "\n if(scopeParents.Count() != 1)", - "\n errors.Add( $\"Parent not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");", - "\n else{", - "\n var scopeParent = scopeParents.First();", - "\n if( kvp.Value.Intersect(scopeParent.Values).Count() != kvp.Value.Count() ||", - "\n kvp.Value.Intersect(scopeParent.Values).Count() != scopeParent.Values.Count()){", - "\n var computedAocSteps = scopeParent.Values.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", - "\n var expectedAocSteps = kvp.Value.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\"); ", - "\n errors.Add( $\"Parents of {kvp.Key.AocType}, {kvp.Key.Novelty} do not match expected value: \\n Computed: \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected: \\n {string.Join(\"\\n\", expectedAocSteps)}.\" );", - "\n }", - "\n }", - "\n }", - "\n ", - "\n //Parents for CDR", - "\n if(isReinsurance)", - "\n {", - "\n var parentsCdr = testUniverse.GetScopes(identities.Select(id => (object)(id, AmountTypes.CDR)), o => o.WithStorage(testStorage));", - "\n ", - "\n var countP = parentsCdr.Where(x => x.Values != Enumerable.Empty()).Count();", - "\n if (parentBmCdr.Count() != countP) ", - "\n errors.Add( $\"Parent count for AmountType CDR does not match expected: \\n Computed {countP} \\n Expected {parentBm.Count()}.\" );", - "\n ", - "\n foreach(var kvp in parentBmCdr)", - "\n {", - "\n var scopeParents = parentsCdr.Where(y => y.Identity.Id.AocType == kvp.Key.AocType && y.Identity.Id.Novelty == kvp.Key.Novelty);", - "\n if(scopeParents.Count() != 1)", - "\n errors.Add( $\"Parent for CDR not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");", - "\n else{", - "\n var scopeParent = scopeParents.First();", - "\n if( kvp.Value.Intersect(scopeParent.Values).Count() != kvp.Value.Count() || ", - "\n kvp.Value.Intersect(scopeParent.Values).Count() != scopeParent.Values.Count() ){", - "\n var computedAocSteps = scopeParent.Values.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", - "\n var expectedAocSteps = kvp.Value.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\"); ", - "\n errors.Add( $\"Parents of {kvp.Key.AocType}, {kvp.Key.Novelty} for AmountType CDR do not match expected value: \\n Computed: \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected: \\n {string.Join(\"\\n\", expectedAocSteps)}.\" );", - "\n }", - "\n }", - "\n } ", - "\n }", - "\n }", - "\n ", - "\n //Assert Reference", - "\n if (importFormat != ImportFormats.Actual)", - "\n {", - "\n var reference = testUniverse.GetScopes(identities, o => o.WithStorage(testStorage)).ToArray();", - "\n var countR = reference.Select(x => x.Value).Count();", - "\n if (referenceBm.Count() != countR) ", - "\n errors.Add( $\"Reference count does not match expected: \\n Computed {countR} \\n Expected {referenceBm.Count()}.\" );", - "\n ", - "\n foreach(var kvp in referenceBm)", - "\n {", - "\n var scopeReferences = reference.Where(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", - "\n if(scopeReferences.Count() != 1)", - "\n errors.Add( $\"Reference not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");", - "\n else{", - "\n var scopeReference = scopeReferences.First();", - "\n if( kvp.Value.AocType != scopeReference.Value.AocType || kvp.Value.Novelty != scopeReference.Value.Novelty )", - "\n errors.Add( $\"Reference of {kvp.Key.AocType}, {kvp.Key.Novelty} do not match expected value: \\n Computed {scopeReference.Value} \\n Expected {kvp.Value}.\" );", - "\n }", - "\n }", - "\n }", - "\n ", - "\n //Assert FullAoc", - "\n var fullAoc = testUniverse.GetScopes(identities.Select(id => (object)(id, inputSource)), o => o.WithStorage(testStorage)).Where(s => s.Values.Any());", - "\n var count = fullAoc.Count();", - "\n if (fullAocBm.Count() != count)", - "\n {", - "\n var computedAocSteps = fullAoc.Select(x => $\"AocType:{x.Identity.Id.AocType}, Novelty:{x.Identity.Id.Novelty}\");", - "\n var benchmarkKeys = fullAocBm.Keys.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", - "\n errors.Add( $\"Full Aoc count does not match expected: \\n Computed {count} \\n Expected {fullAocBm.Count()}.\" ); ", - "\n errors.Add( $\"In particular, \\n Computed Identities \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected \\n {string.Join(\"\\n\", benchmarkKeys)}.\" ); ", - "\n }", - "\n ", - "\n foreach(var kvp in fullAocBm)", - "\n {", - "\n var scopeAocFulls = fullAoc.Where(y => y.Identity.Id.AocType == kvp.Key.AocType && y.Identity.Id.Novelty == kvp.Key.Novelty);", - "\n if(scopeAocFulls.Count() != 1){", - "\n errors.Add( $\"Full AocStep not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");}", - "\n else{", - "\n var scopeAocFull = scopeAocFulls.First();", - "\n if( kvp.Value.Intersect(scopeAocFull.Values).Count() != kvp.Value.Count() || ", - "\n kvp.Value.Intersect(scopeAocFull.Values).Count() != scopeAocFull.Values.Count() ){", - "\n var computedAocSteps = scopeAocFull.Values.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", - "\n var expectedAocSteps = kvp.Value.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\"); ", - "\n errors.Add( $\"AocFull for {kvp.Key.AocType}, {kvp.Key.Novelty} do not match expected value: \\n Computed \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected: \\n {string.Join(\"\\n\", expectedAocSteps)}.\" );", - "\n }", - "\n }", - "\n }", - "\n ", - "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", - "\n}", - "\n" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "sEcSO-bqzkGlpQkC24-htw", - "cell_type": "markdown", - "source": [ - "# Use Cases" - ], - "metadata": {} - }, - { - "id": "sFPFk32D7kKGHRGhl37IyA", - "cell_type": "markdown", - "source": [ - "## Gross Cashflow: InForce, NewBusiness, and Combined" - ], - "metadata": {} - }, - { - "id": "_X2FswBBHkucp_w7bEqyxQ", - "cell_type": "code", - "source": [ - "var groupOfContract = \"DT1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6ZmdltQ8CUOJk6c8XSMxMg", - "cell_type": "code", - "source": [ - "var inputRawVariables = new RawVariable[]{", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "EMS3W2YP1EqkmV577yS3hg", - "cell_type": "code", - "source": [ - "var parentBm = new Dictionary>()", - "\n {", - "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", - "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", - "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "cgrcf9GgL0qpSZnalLTzEw", - "cell_type": "code", - "source": [ - "var referenceBm = new Dictionary()", - "\n {", - "\n {new AocStep(\"BOP\",\"I\"), new AocStep(\"BOP\",\"I\")},", - "\n {new AocStep(\"MC\",\"I\"), new AocStep(\"MC\",\"I\")},", - "\n {new AocStep(\"CF\",\"I\"), new AocStep(\"MC\",\"I\")},", - "\n {new AocStep(\"IA\",\"I\"), new AocStep(\"MC\",\"I\")},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", - "\n {new AocStep(\"BOP\",\"N\"), new AocStep(\"BOP\",\"N\")},", - "\n {new AocStep(\"CF\",\"N\"), new AocStep(\"BOP\",\"N\")},", - "\n {new AocStep(\"IA\",\"N\"), new AocStep(\"BOP\",\"N\")},", - "\n {new AocStep(\"EV\",\"N\"), new AocStep(\"EV\",\"N\")},", - "\n {new AocStep(\"CL\",\"C\"), new AocStep(\"CL\",\"C\")},", - "\n {new AocStep(\"EA\",\"C\"), new AocStep(\"CF\",\"C\")},", - "\n {new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\")},", - "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", - "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Wpd4fY5nQkmaPPkyvSEzSQ", - "cell_type": "code", - "source": [ - "var fullAocBm = new Dictionary>()", - "\n {", - "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", - "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", - "\n {new AocStep(\"CF\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", - "\n {new AocStep(\"IA\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"IA\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", - "\n //{new AocStep(\"BOP\",\"N\"), Enumerable.Empty()},", - "\n {new AocStep(\"CF\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", - "\n {new AocStep(\"IA\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\")}},", - "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\")}},", - "\n ", - "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", - "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"),", - "\n }},", - "\n {new AocStep(\"EA\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), ", - "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", - "\n new AocStep(\"CL\",\"C\"),", - "\n }},", - "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", - "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", - "\n new AocStep(\"EA\",\"C\"), new AocStep(\"CL\",\"C\"),", - "\n }},", - "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", - "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", - "\n new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\"),", - "\n }},", - "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", - "\n ", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "oYv6SIpvrU6FXuQerivFwg", - "cell_type": "code", - "source": [ - "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zbuVbeynlkiuaJciPMHc-A", - "cell_type": "markdown", - "source": [ - "## Reinsurance Cashflow: InForce, NewBusiness, and Combined" - ], - "metadata": {} - }, - { - "id": "lEAJ2MIIVkKmGnzEBLjE5g", - "cell_type": "code", - "source": [ - "groupOfContract = \"DTR1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jeehsZ9rD0uLhdYDkJo9sQ", - "cell_type": "code", - "source": [ - "inputRawVariables = new RawVariable[]{", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2Oou9pdvEU65Hdaz4jGLnw", - "cell_type": "code", - "source": [ - "parentBm = new Dictionary>()", - "\n {", - "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}},", - "\n {new AocStep(\"CRU\",\"I\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}}, ", - "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", - "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "fd9Sd0Ya9kSZbiDpI3tpJw", - "cell_type": "code", - "source": [ - "var parentBm_CDR = new Dictionary>()", - "\n {", - "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", - "\n {new AocStep(\"CRU\",\"I\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}}, ", - "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", - "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"CRU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "naCBsHzkPk60cOaBsv40Fg", - "cell_type": "code", - "source": [ - "referenceBm = new Dictionary()", - "\n {", - "\n {new AocStep(\"BOP\",\"I\"), new AocStep(\"BOP\",\"I\")},", - "\n {new AocStep(\"MC\",\"I\"), new AocStep(\"MC\",\"I\")},", - "\n {new AocStep(\"RCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", - "\n {new AocStep(\"CF\",\"I\"), new AocStep(\"MC\",\"I\")},", - "\n {new AocStep(\"IA\",\"I\"), new AocStep(\"MC\",\"I\")},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", - "\n {new AocStep(\"CRU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", - "\n {new AocStep(\"BOP\",\"N\"), new AocStep(\"BOP\",\"N\")},", - "\n {new AocStep(\"CF\",\"N\"), new AocStep(\"BOP\",\"N\")},", - "\n {new AocStep(\"IA\",\"N\"), new AocStep(\"BOP\",\"N\")},", - "\n {new AocStep(\"EV\",\"N\"), new AocStep(\"EV\",\"N\")},", - "\n {new AocStep(\"CL\",\"C\"), new AocStep(\"CL\",\"C\")},", - "\n {new AocStep(\"EA\",\"C\"), new AocStep(\"CF\",\"C\")},", - "\n {new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\")},", - "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", - "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "A_BMNMYCE0irAqOEzK1Beg", - "cell_type": "code", - "source": [ - "fullAocBm = new Dictionary>()", - "\n {", - "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", - "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", - "\n {new AocStep(\"RCU\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", - "\n {new AocStep(\"CF\",\"I\"), new AocStep[]{new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", - "\n {new AocStep(\"IA\",\"I\"), new AocStep[]{new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"IA\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", - "\n {new AocStep(\"CRU\",\"I\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", - "\n //{new AocStep(\"BOP\",\"N\"), Enumerable.Empty()},", - "\n {new AocStep(\"CF\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", - "\n {new AocStep(\"IA\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\")}},", - "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\")}},", - "\n ", - "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", - "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"),", - "\n }},", - "\n {new AocStep(\"EA\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", - "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", - "\n new AocStep(\"CL\",\"C\"),", - "\n }},", - "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", - "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", - "\n new AocStep(\"EA\",\"C\"), new AocStep(\"CL\",\"C\"),", - "\n }},", - "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", - "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", - "\n new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\"),", - "\n }},", - "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", - "\n ", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ThWShXVvcUeceCGqOsJthQ", - "cell_type": "code", - "source": [ - "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm, parentBm_CDR)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8u10a9u8l0yb0XI7eilD8A", - "cell_type": "markdown", - "source": [ - "## Cashflow: InForce, and Combined" - ], - "metadata": {} - }, - { - "id": "BCk5iXiD6UiLl7KNQkQ1-Q", - "cell_type": "code", - "source": [ - "var groupOfContract = \"DT1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_XL2aS8gh02VveW4LpykZQ", - "cell_type": "code", - "source": [ - "inputRawVariables = new RawVariable[]{", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Qd3QDM8xY0WrVZsN4inIDg", - "cell_type": "code", - "source": [ - "parentBm = new Dictionary>()", - "\n {", - "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", - "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}},", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "lf7sWYGVQEijVikbiCG9oQ", - "cell_type": "code", - "source": [ - "referenceBm = new Dictionary()", - "\n {", - "\n {new AocStep(\"BOP\",\"I\"), new AocStep(\"BOP\",\"I\")},", - "\n {new AocStep(\"MC\",\"I\"), new AocStep(\"MC\",\"I\")},", - "\n {new AocStep(\"CF\",\"I\"), new AocStep(\"MC\",\"I\")},", - "\n {new AocStep(\"IA\",\"I\"), new AocStep(\"MC\",\"I\")},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", - "\n {new AocStep(\"CL\",\"C\"), new AocStep(\"CL\",\"C\")},", - "\n {new AocStep(\"EA\",\"C\"), new AocStep(\"CF\",\"C\")},", - "\n {new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\")},", - "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", - "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "B6t0lIf3ik-YHWgWpyX0YQ", - "cell_type": "code", - "source": [ - "fullAocBm = new Dictionary>()", - "\n {", - "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", - "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", - "\n {new AocStep(\"CF\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", - "\n {new AocStep(\"IA\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", - "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\")}},", - "\n ", - "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"), ", - "\n }},", - "\n ", - "\n {new AocStep(\"EA\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", - "\n new AocStep(\"CL\",\"C\"),}},", - "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", - "\n new AocStep(\"CL\",\"C\"), new AocStep(\"EA\",\"C\"),}},", - "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", - "\n new AocStep(\"CL\",\"C\"), new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"),}},", - "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qceSk87wOEOmawmXy5Vdag", - "cell_type": "code", - "source": [ - "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "lo7SItfxOEOhFjgPs9KTHQ", - "cell_type": "markdown", - "source": [ - "## Actual" - ], - "metadata": {} - }, - { - "id": "LLQgmrk5cUamp-TV5Bw0MA", - "cell_type": "code", - "source": [ - "var groupOfContract = \"DT1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HHKnGuczVE-EGxdD1vi1JQ", - "cell_type": "code", - "source": [ - "var inputIfrsVariables = new IfrsVariable[]{", - "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"AA\"},", - "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"CF\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"AA\"},", - "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"CF\", Novelty = \"C\", AccidentYear = null, AmountType = \"ACA\", EstimateType = \"A\"},", - "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"WO\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"OA\"},", - "\n};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yv06kc8H40iji3wgMDEmEg", - "cell_type": "code", - "source": [ - "parentBm = null;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "E62fDv7kNkeH__lCPrFn8g", - "cell_type": "code", - "source": [ - "referenceBm = null;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xNjIoqwi4kqov8CpJoZu5A", - "cell_type": "code", - "source": [ - "fullAocBm = new Dictionary>()", - "\n {", - "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", - "\n {new AocStep(\"CF\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"),}},", - "\n {new AocStep(\"WO\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"),}},", - "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"), new AocStep(\"WO\",\"C\"),}},", - "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"), new AocStep(\"WO\",\"C\"), new AocStep(\"AM\",\"C\"),}},", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "cokUNY_q6Eai_BLP8RbvEA", - "cell_type": "code", - "source": [ - "await CheckAocStepStructureAsync(inputIfrsVariables, parentBm, referenceBm, fullAocBm)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QwRsslb8LE-OzVKMQJyfJQ", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Test Aoc Management

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Workspace Initialization " + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Cashflow);", + "\nvar partition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", + "\n x.Month == args.Month && x.Scenario == args.Scenario);", + "\nif(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckAocStepStructureAsync(IEnumerable inputVariables, ", + "\n Dictionary> parentBm, ", + "\n Dictionary referenceBm, ", + "\n Dictionary> fullAocBm,", + "\n Dictionary> parentBmCdr = null)", + "\n{", + "\n //Save test input data", + "\n var importFormat = ImportFormats.Cashflow;", + "\n var inputSource = InputSource.Cashflow;", + "\n if (inputVariables.First() is RawVariable)", + "\n {", + "\n await Workspace.UpdateAsync(inputVariables.Cast());", + "\n }", + "\n if (inputVariables.First() is IfrsVariable)", + "\n {", + "\n await Workspace.UpdateAsync(inputVariables.Cast());", + "\n importFormat = ImportFormats.Actual;", + "\n inputSource = InputSource.Actual;", + "\n }", + "\n ", + "\n var newArgs = args with {ImportFormat = importFormat };", + "\n //Set up import storage and test universe", + "\n var testStorage = new ImportStorage(newArgs, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n var isReinsurance = testStorage.DataNodeDataBySystemName[inputVariables.First().DataNode].IsReinsurance;", + "\n var testUniverse = Scopes.ForStorage(testStorage).ToScope();", + "\n //Clean up Workspace", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", + "\n ", + "\n var errors = new List();", + "\n ", + "\n var goc = inputVariables.First().DataNode;", + "\n var identities = testUniverse.GetScopes(testStorage.DataNodesByImportScope[ImportScope.Primary].Where(dn => dn == goc)).SelectMany(s => s.Identities);", + "\n ", + "\n //Assert Parents", + "\n if (importFormat != ImportFormats.Actual)", + "\n {", + "\n var parents = testUniverse.GetScopes(identities.Select(id => (object)(id, \"PR\")), o => o.WithStorage(testStorage)).Where(x => x.Values != Enumerable.Empty()).ToArray();", + "\n if (parentBm.Count() != parents.Count()) ", + "\n {", + "\n var computedIds = parents.Select(s => $\"AocType:{s.Identity.Id.AocType}, Novelty:{s.Identity.Id.Novelty}\");", + "\n var expectedIds = parentBm.Keys.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n errors.Add( $\"Parent count does not match expected: \\n Computed {parents.Count()} \\n {string.Join(\"\\n\", computedIds)} \\n Expected {parentBm.Count()} \\n {string.Join(\"\\n\", expectedIds)}.\" );", + "\n }", + "\n ", + "\n foreach(var kvp in parentBm)", + "\n {", + "\n var scopeParents = parents.Where(y => y.Identity.Id.AocType == kvp.Key.AocType && y.Identity.Id.Novelty == kvp.Key.Novelty);", + "\n if(scopeParents.Count() != 1)", + "\n errors.Add( $\"Parent not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");", + "\n else{", + "\n var scopeParent = scopeParents.First();", + "\n if( kvp.Value.Intersect(scopeParent.Values).Count() != kvp.Value.Count() ||", + "\n kvp.Value.Intersect(scopeParent.Values).Count() != scopeParent.Values.Count()){", + "\n var computedAocSteps = scopeParent.Values.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n var expectedAocSteps = kvp.Value.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\"); ", + "\n errors.Add( $\"Parents of {kvp.Key.AocType}, {kvp.Key.Novelty} do not match expected value: \\n Computed: \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected: \\n {string.Join(\"\\n\", expectedAocSteps)}.\" );", + "\n }", + "\n }", + "\n }", + "\n ", + "\n //Parents for CDR", + "\n if(isReinsurance)", + "\n {", + "\n var parentsCdr = testUniverse.GetScopes(identities.Select(id => (object)(id, AmountTypes.CDR)), o => o.WithStorage(testStorage));", + "\n ", + "\n var countP = parentsCdr.Where(x => x.Values != Enumerable.Empty()).Count();", + "\n if (parentBmCdr.Count() != countP) ", + "\n errors.Add( $\"Parent count for AmountType CDR does not match expected: \\n Computed {countP} \\n Expected {parentBm.Count()}.\" );", + "\n ", + "\n foreach(var kvp in parentBmCdr)", + "\n {", + "\n var scopeParents = parentsCdr.Where(y => y.Identity.Id.AocType == kvp.Key.AocType && y.Identity.Id.Novelty == kvp.Key.Novelty);", + "\n if(scopeParents.Count() != 1)", + "\n errors.Add( $\"Parent for CDR not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");", + "\n else{", + "\n var scopeParent = scopeParents.First();", + "\n if( kvp.Value.Intersect(scopeParent.Values).Count() != kvp.Value.Count() || ", + "\n kvp.Value.Intersect(scopeParent.Values).Count() != scopeParent.Values.Count() ){", + "\n var computedAocSteps = scopeParent.Values.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n var expectedAocSteps = kvp.Value.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\"); ", + "\n errors.Add( $\"Parents of {kvp.Key.AocType}, {kvp.Key.Novelty} for AmountType CDR do not match expected value: \\n Computed: \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected: \\n {string.Join(\"\\n\", expectedAocSteps)}.\" );", + "\n }", + "\n }", + "\n } ", + "\n }", + "\n }", + "\n ", + "\n //Assert Reference", + "\n if (importFormat != ImportFormats.Actual)", + "\n {", + "\n var reference = testUniverse.GetScopes(identities, o => o.WithStorage(testStorage)).ToArray();", + "\n var countR = reference.Select(x => x.Value).Count();", + "\n if (referenceBm.Count() != countR) ", + "\n errors.Add( $\"Reference count does not match expected: \\n Computed {countR} \\n Expected {referenceBm.Count()}.\" );", + "\n ", + "\n foreach(var kvp in referenceBm)", + "\n {", + "\n var scopeReferences = reference.Where(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", + "\n if(scopeReferences.Count() != 1)", + "\n errors.Add( $\"Reference not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");", + "\n else{", + "\n var scopeReference = scopeReferences.First();", + "\n if( kvp.Value.AocType != scopeReference.Value.AocType || kvp.Value.Novelty != scopeReference.Value.Novelty )", + "\n errors.Add( $\"Reference of {kvp.Key.AocType}, {kvp.Key.Novelty} do not match expected value: \\n Computed {scopeReference.Value} \\n Expected {kvp.Value}.\" );", + "\n }", + "\n }", + "\n }", + "\n ", + "\n //Assert FullAoc", + "\n var fullAoc = testUniverse.GetScopes(identities.Select(id => (object)(id, inputSource)), o => o.WithStorage(testStorage)).Where(s => s.Values.Any());", + "\n var count = fullAoc.Count();", + "\n if (fullAocBm.Count() != count)", + "\n {", + "\n var computedAocSteps = fullAoc.Select(x => $\"AocType:{x.Identity.Id.AocType}, Novelty:{x.Identity.Id.Novelty}\");", + "\n var benchmarkKeys = fullAocBm.Keys.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n errors.Add( $\"Full Aoc count does not match expected: \\n Computed {count} \\n Expected {fullAocBm.Count()}.\" ); ", + "\n errors.Add( $\"In particular, \\n Computed Identities \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected \\n {string.Join(\"\\n\", benchmarkKeys)}.\" ); ", + "\n }", + "\n ", + "\n foreach(var kvp in fullAocBm)", + "\n {", + "\n var scopeAocFulls = fullAoc.Where(y => y.Identity.Id.AocType == kvp.Key.AocType && y.Identity.Id.Novelty == kvp.Key.Novelty);", + "\n if(scopeAocFulls.Count() != 1){", + "\n errors.Add( $\"Full AocStep not found for AocStep: {kvp.Key.AocType}, {kvp.Key.Novelty}.\");}", + "\n else{", + "\n var scopeAocFull = scopeAocFulls.First();", + "\n if( kvp.Value.Intersect(scopeAocFull.Values).Count() != kvp.Value.Count() || ", + "\n kvp.Value.Intersect(scopeAocFull.Values).Count() != scopeAocFull.Values.Count() ){", + "\n var computedAocSteps = scopeAocFull.Values.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\");", + "\n var expectedAocSteps = kvp.Value.Select(aoc => $\"AocType:{aoc.AocType}, Novelty:{aoc.Novelty}\"); ", + "\n errors.Add( $\"AocFull for {kvp.Key.AocType}, {kvp.Key.Novelty} do not match expected value: \\n Computed \\n {string.Join(\"\\n\", computedAocSteps)} \\n Expected: \\n {string.Join(\"\\n\", expectedAocSteps)}.\" );", + "\n }", + "\n }", + "\n }", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Use Cases" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Gross Cashflow: InForce, NewBusiness, and Combined" + ] + }, + { + "cell_type": "code", + "source": [ + "var groupOfContract = \"DT1.1\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputRawVariables = new RawVariable[]{", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n};" + ] + }, + { + "cell_type": "code", + "source": [ + "var parentBm = new Dictionary>()", + "\n {", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "var referenceBm = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"I\"), new AocStep(\"BOP\",\"I\")},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"BOP\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"CF\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"IA\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"EV\",\"N\"), new AocStep(\"EV\",\"N\")},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "var fullAocBm = new Dictionary>()", + "\n {", + "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"IA\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n //{new AocStep(\"BOP\",\"N\"), Enumerable.Empty()},", + "\n {new AocStep(\"CF\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"IA\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\")}},", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\")}},", + "\n ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"),", + "\n }},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), ", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"EA\",\"C\"), new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", + "\n ", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Reinsurance Cashflow: InForce, NewBusiness, and Combined" + ] + }, + { + "cell_type": "code", + "source": [ + "groupOfContract = \"DTR1.1\";" + ] + }, + { + "cell_type": "code", + "source": [ + "inputRawVariables = new RawVariable[]{", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n};" + ] + }, + { + "cell_type": "code", + "source": [ + "parentBm = new Dictionary>()", + "\n {", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"CRU\",\"I\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}}, ", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "var parentBm_CDR = new Dictionary>()", + "\n {", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", + "\n {new AocStep(\"CRU\",\"I\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}}, ", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"CRU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "referenceBm = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"I\"), new AocStep(\"BOP\",\"I\")},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"RCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"CF\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"CRU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"BOP\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"CF\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"IA\",\"N\"), new AocStep(\"BOP\",\"N\")},", + "\n {new AocStep(\"EV\",\"N\"), new AocStep(\"EV\",\"N\")},", + "\n {new AocStep(\"CL\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "fullAocBm = new Dictionary>()", + "\n {", + "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"RCU\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep[]{new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep[]{new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"IA\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n {new AocStep(\"CRU\",\"I\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n //{new AocStep(\"BOP\",\"N\"), Enumerable.Empty()},", + "\n {new AocStep(\"CF\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", + "\n {new AocStep(\"IA\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\")}},", + "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\")}},", + "\n ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"),", + "\n }},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"EA\",\"C\"), new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"RCU\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"),new AocStep(\"YCU\",\"I\"), new AocStep(\"CRU\",\"I\"),", + "\n new AocStep(\"BOP\",\"N\"), new AocStep(\"CF\",\"N\"), new AocStep(\"IA\",\"N\"), new AocStep(\"EV\",\"N\"), ", + "\n new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\"),", + "\n }},", + "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", + "\n ", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm, parentBm_CDR)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Cashflow: InForce, and Combined" + ] + }, + { + "cell_type": "code", + "source": [ + "var groupOfContract = \"DT1.1\";" + ] + }, + { + "cell_type": "code", + "source": [ + "inputRawVariables = new RawVariable[]{", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n};" + ] + }, + { + "cell_type": "code", + "source": [ + "parentBm = new Dictionary>()", + "\n {", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}},", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "referenceBm = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"I\"), new AocStep(\"BOP\",\"I\")},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep(\"MC\",\"I\")},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep(\"MC\",\"I\")}, ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EA\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", + "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "fullAocBm = new Dictionary>()", + "\n {", + "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", + "\n {new AocStep(\"MC\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\")}},", + "\n {new AocStep(\"CF\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\")}},", + "\n {new AocStep(\"IA\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\")}},", + "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\")}},", + "\n ", + "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"), new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"), ", + "\n }},", + "\n ", + "\n {new AocStep(\"EA\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"CL\",\"C\"),}},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"CL\",\"C\"), new AocStep(\"EA\",\"C\"),}},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"MC\",\"I\"),new AocStep(\"CF\",\"I\"), new AocStep(\"IA\",\"I\"), new AocStep(\"YCU\",\"I\"),", + "\n new AocStep(\"CL\",\"C\"), new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"),}},", + "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Actual" + ] + }, + { + "cell_type": "code", + "source": [ + "var groupOfContract = \"DT1.1\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputIfrsVariables = new IfrsVariable[]{", + "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"AA\"},", + "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"CF\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"AA\"},", + "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"CF\", Novelty = \"C\", AccidentYear = null, AmountType = \"ACA\", EstimateType = \"A\"},", + "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"WO\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"OA\"},", + "\n};" + ] + }, + { + "cell_type": "code", + "source": [ + "parentBm = null;" + ] + }, + { + "cell_type": "code", + "source": [ + "referenceBm = null;" + ] + }, + { + "cell_type": "code", + "source": [ + "fullAocBm = new Dictionary>()", + "\n {", + "\n //{new AocStep(\"BOP\",\"I\"), Enumerable.Empty()},", + "\n {new AocStep(\"CF\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"),}},", + "\n {new AocStep(\"WO\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"),}},", + "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"), new AocStep(\"WO\",\"C\"),}},", + "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"), new AocStep(\"WO\",\"C\"), new AocStep(\"AM\",\"C\"),}},", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "await CheckAocStepStructureAsync(inputIfrsVariables, parentBm, referenceBm, fullAocBm)" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/ExportIfrsVariable.ipynb b/Test/ExportIfrsVariable.ipynb index 21cad454..bdd3aa38 100644 --- a/Test/ExportIfrsVariable.ipynb +++ b/Test/ExportIfrsVariable.ipynb @@ -1,124 +1,96 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "1fnxMsytI0SV8h59pqZxDQ", - "cell_type": "markdown", - "source": [ - "

Test Reports

" - ], - "metadata": {} - }, - { - "id": "sY2AQGDoZUaMYR5JiSxcjQ", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-xiQumLe30mD77Pvhijxtw", - "cell_type": "markdown", - "source": [ - "# BenchMarks" - ], - "metadata": {} - }, - { - "id": "jOHCgtzBxke3Wk8c8QC1Ug", - "cell_type": "code", - "source": [ - "var pathToBm = \"./Data/ReportBenchmarks/\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LvvPQ9tBmU-4pDW_tCG-1g", - "cell_type": "code", - "source": [ - "var argsArray = new ImportArgs[]{", - "\n new ImportArgs (\"CH\", 2020, 12, Periodicity.Quarterly, null, null),", - "\n new ImportArgs (\"CH\", 2021, 3, Periodicity.Quarterly, null, null)", - "\n };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CnPCEWt_aUe8ts0COdm3ZA", - "cell_type": "code", - "source": [ - "public async Task ExportBenchmarks(ImportArgs args)", - "\n{", - "\n await DataSource.Partition.SetAsync(new {ReportingNode = args.ReportingNode, Year= args.Year, Month = args.Month, Scenario = args.Scenario});", - "\n var computedVariables = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());", - "\n", - "\n foreach (var estimateType in computedVariables.Keys)", - "\n {", - "\n await Export.ToCsv(pathToBm+\"BM_\"+args.ReportingNode+\"_\"+args.Year.ToString()+\"_\"+args.Month.ToString()+\"_\"+estimateType)", - "\n .WithTable(tableConfig => tableConfig", - "\n .AtBeginning()", - "\n .WithName(Main)", - "\n .WithSource(source => args.RepeatOnce().AsQueryable())", - "\n .WithColumn(x => x.Periodicity, x => x.Delete())", - "\n .WithColumn(x => x.ImportFormat, x => x.Delete())", - "\n )", - "\n .WithTable(tableConfig => tableConfig", - "\n .WithSource(source => computedVariables[estimateType].AsQueryable())", - "\n .WithName(estimateType)", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.Id, x => x.Delete())", - "\n )", - "\n .ExecuteAsync();", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "aa_A6kszrU67Ghv0nf-m_g", - "cell_type": "code", - "source": [ - "foreach (var args in argsArray)", - "\n await ExportBenchmarks(args);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "snRElFsmF0OjFLQvRzQNhA", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Test Reports

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# BenchMarks" + ] + }, + { + "cell_type": "code", + "source": [ + "var pathToBm = \"./Data/ReportBenchmarks/\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var argsArray = new ImportArgs[]{", + "\n new ImportArgs (\"CH\", 2020, 12, Periodicity.Quarterly, null, null),", + "\n new ImportArgs (\"CH\", 2021, 3, Periodicity.Quarterly, null, null)", + "\n };" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task ExportBenchmarks(ImportArgs args)", + "\n{", + "\n await DataSource.Partition.SetAsync(new {ReportingNode = args.ReportingNode, Year= args.Year, Month = args.Month, Scenario = args.Scenario});", + "\n var computedVariables = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());", + "\n", + "\n foreach (var estimateType in computedVariables.Keys)", + "\n {", + "\n await Export.ToCsv(pathToBm+\"BM_\"+args.ReportingNode+\"_\"+args.Year.ToString()+\"_\"+args.Month.ToString()+\"_\"+estimateType)", + "\n .WithTable(tableConfig => tableConfig", + "\n .AtBeginning()", + "\n .WithName(Main)", + "\n .WithSource(source => args.RepeatOnce().AsQueryable())", + "\n .WithColumn(x => x.Periodicity, x => x.Delete())", + "\n .WithColumn(x => x.ImportFormat, x => x.Delete())", + "\n )", + "\n .WithTable(tableConfig => tableConfig", + "\n .WithSource(source => computedVariables[estimateType].AsQueryable())", + "\n .WithName(estimateType)", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n )", + "\n .ExecuteAsync();", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "foreach (var args in argsArray)", + "\n await ExportBenchmarks(args);" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/ExportReportVariables.ipynb b/Test/ExportReportVariables.ipynb index a8002ecb..a079be72 100644 --- a/Test/ExportReportVariables.ipynb +++ b/Test/ExportReportVariables.ipynb @@ -1,186 +1,136 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "TG_x9dWCM0usAoORaJW0wA", - "cell_type": "markdown", - "source": [ - "

Report Variable Exporter

" - ], - "metadata": {} - }, - { - "id": "Y25XYadyL0aU_Fzz5elNMQ", - "cell_type": "markdown", - "source": [ - "# Infrastructure and Configuration" - ], - "metadata": {} - }, - { - "id": "cfjgktx4p0-NVKhru0UtHg", - "cell_type": "markdown", - "source": [ - "## Initialize Workspace" - ], - "metadata": {} - }, - { - "id": "LsMvspLNjUSjzwV8dPfvYA", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1HOdfKtqgEyoCXzmZfFBXw", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_REnUbsBBkCMFwqQyGWg5Q", - "cell_type": "markdown", - "source": [ - "## Imports and Configurations" - ], - "metadata": {} - }, - { - "id": "txVLamtljU-DLHzCcz9PnQ", - "cell_type": "code", - "source": [ - "#!import \"ReportVariablesTestBase\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zzDardBj_kKdArEdeDsDNQ", - "cell_type": "markdown", - "source": [ - "## Storage" - ], - "metadata": {} - }, - { - "id": "37AwAO8feEOU3Vi9qBbP4Q", - "cell_type": "code", - "source": [ - "var reportStorage = new ReportStorage(Workspace, Report);", - "\nawait reportStorage.InitializeReportIndependentCacheAsync();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "iFTfudfp-EetHuW8yU6YCg", - "cell_type": "markdown", - "source": [ - "## Configurations" - ], - "metadata": {} - }, - { - "id": "2qOI8dJxZ0WPMJf28ue31g", - "cell_type": "code", - "source": [ - "var path = \"./Data/ReportVariableBenchmarks/\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kXndb4zG_UO9VKIhnleT1A", - "cell_type": "markdown", - "source": [ - "# Defining Scope for the Reports and Tests" - ], - "metadata": {} - }, - { - "id": "ZC_lDkxtFEeOujJtQdnaUg", - "cell_type": "markdown", - "source": [ - "### Defining the Period and Reporting Node (...) for the Reports" - ], - "metadata": {} - }, - { - "id": "JIbgXj_2n0K5dfj-X2RJ5A", - "cell_type": "code", - "source": [ - "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType)[] exportScope = {", - "\n ((2020, 12), \"CH\", null, CurrencyType.Contractual),", - "\n// ((2020, 12), \"CH\", null, CurrencyType.Functional),", - "\n// ((2020, 12), \"CH\", null, CurrencyType.Group),", - "\n ", - "\n ((2021, 3), \"CH\", null, CurrencyType.Contractual),", - "\n// ((2021, 3), \"CH\", null, CurrencyType.Functional),", - "\n// ((2021, 3), \"CH\", null, CurrencyType.Group),", - "\n};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "OJE_pdhJBEKChAxri8wv9A", - "cell_type": "markdown", - "source": [ - "# Export" - ], - "metadata": {} - }, - { - "id": "hYzcfGQt4kGKYbKgl9vmqw", - "cell_type": "code", - "source": [ - "foreach(var args in exportScope){", - "\n var scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", - "\n var bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";", - "\n await Export.ToCsv(path + bmFileName).WithTable(tableConfig => tableConfig.WithSource(source => scopesData.AsQueryable())).ExecuteAsync(); ", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "plmvGTRjsU60fGgbLWHM3g", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Report Variable Exporter

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Infrastructure and Configuration" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Initialize Workspace" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Imports and Configurations" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"ReportVariablesTestBase\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Storage" + ] + }, + { + "cell_type": "code", + "source": [ + "var reportStorage = new ReportStorage(Workspace, Report);", + "\nawait reportStorage.InitializeReportIndependentCacheAsync();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Configurations" + ] + }, + { + "cell_type": "code", + "source": [ + "var path = \"./Data/ReportVariableBenchmarks/\";" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Defining Scope for the Reports and Tests" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Defining the Period and Reporting Node (...) for the Reports" + ] + }, + { + "cell_type": "code", + "source": [ + "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType)[] exportScope = {", + "\n ((2020, 12), \"CH\", null, CurrencyType.Contractual),", + "\n// ((2020, 12), \"CH\", null, CurrencyType.Functional),", + "\n// ((2020, 12), \"CH\", null, CurrencyType.Group),", + "\n ", + "\n ((2021, 3), \"CH\", null, CurrencyType.Contractual),", + "\n// ((2021, 3), \"CH\", null, CurrencyType.Functional),", + "\n// ((2021, 3), \"CH\", null, CurrencyType.Group),", + "\n};" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Export" + ] + }, + { + "cell_type": "code", + "source": [ + "foreach(var args in exportScope){", + "\n var scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", + "\n var bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";", + "\n await Export.ToCsv(path + bmFileName).WithTable(tableConfig => tableConfig.WithSource(source => scopesData.AsQueryable())).ExecuteAsync(); ", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/IfrsVariablesTest.ipynb b/Test/IfrsVariablesTest.ipynb index 7046979f..ab282217 100644 --- a/Test/IfrsVariablesTest.ipynb +++ b/Test/IfrsVariablesTest.ipynb @@ -1,327 +1,271 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "kqZuH1dEnke7hR4QHKoNog", - "cell_type": "markdown", - "source": [ - "

Ifrs Variable

" - ], - "metadata": {} - }, - { - "id": "LjWUwb9UEkuNT2p5nWP59g", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3aLFpM2sG0yzvGW-O9CBrA", - "cell_type": "markdown", - "source": [ - "# BenchMarks" - ], - "metadata": {} - }, - { - "id": "wHzw3mkXwUaee_GWJCqXKA", - "cell_type": "code", - "source": [ - "var pathToBm = \"./Data/IfrsVariableBenchmarks/\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "A-1s2TjE8U2lTB5-1UldnA", - "cell_type": "code", - "source": [ - "public record BenchmarkMetadata(string FileName, string ReportingNode, int Year, int Month){} " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "efhvDjD2pU6uboXYUAfYxw", - "cell_type": "code", - "source": [ - "var bmFiles = new BenchmarkMetadata[]{", - "\n //2020 Q4", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_A.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_AA.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_APA.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_BE.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_BEPA.csv\", \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_C.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_DA.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_F.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_OA.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_RA.csv\" , \"CH\", 2020, 12),", - "\n //2021 Q1", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_A.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AAPA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_APA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_BE.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_BEPA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_C.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_DA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_F.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_L.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_LR.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OAPA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_RA.csv\" , \"CH\", 2021, 3),", - "\n};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Q7pARj6RR0K30yyk_I3omg", - "cell_type": "markdown", - "source": [ - "# Functions" - ], - "metadata": {} - }, - { - "id": "iHhg-4yNYEGh4h62o8W5zA", - "cell_type": "code", - "source": [ - "public static NumberStyles AllowedNumberStyles = NumberStyles.Float | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowLeadingSign | NumberStyles.AllowTrailingSign | NumberStyles.AllowDecimalPoint;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jMFEw9p2r0iOR_Ru9wkGmg", - "cell_type": "code", - "source": [ - "public IfrsVariable CreateVariable (IDataRow row, Guid partition)", - "\n{", - "\n if (!double.TryParse(row[nameof(IfrsVariable.Value)]?.ToString(), AllowedNumberStyles, CultureInfo.InvariantCulture, out var doubleValue))", - "\n throw new Exception(\"Value cannot be parsed.\");", - "\n ", - "\n return new IfrsVariable(){AocType = row.Field(nameof(IfrsVariable.AocType)),", - "\n Partition = partition,", - "\n Novelty = row.Field(nameof(IfrsVariable.Novelty)),", - "\n DataNode = row.Field(nameof(IfrsVariable.DataNode)),", - "\n EstimateType = row.Field(nameof(IfrsVariable.EstimateType)),", - "\n AmountType = row.Field(nameof(IfrsVariable.AmountType)),", - "\n AccidentYear = Int32.TryParse((row.Field(nameof(IfrsVariable.AccidentYear))), out var accidentYear) ? accidentYear : (int?)null,", - "\n EconomicBasis = row.Field(nameof(IfrsVariable.EconomicBasis)),", - "\n Value = (-1.0) * doubleValue,", - "\n };", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nLcASZMlEEmL_nI0yYamvw", - "cell_type": "code", - "source": [ - "public class BenchmarkTestResult", - "\n{", - "\n public string ErrorMessage {get; set;}", - "\n public double ExpectedValue {get; set;}", - "\n public double ComputedValue {get; set;}", - "\n public BenchmarkTestResult (string message)", - "\n {", - "\n ErrorMessage = message;", - "\n }", - "\n public BenchmarkTestResult (string message, double expValue, double compValue)", - "\n {", - "\n ErrorMessage = message;", - "\n ExpectedValue = expValue;", - "\n ComputedValue = compValue; ", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LEHT1hqQo0W96ERHvf4L3A", - "cell_type": "code", - "source": [ - "public List CompareAgainstBm (List errors, IEnumerable expected, IEnumerable computed)", - "\n{", - "\n var expectedNotComputed = expected.Where(x => Math.Abs(x.Value) > BenchmarkPrecision).Select(x => x.ToIdentityString()).Except(computed.Select(x => x.ToIdentityString()));", - "\n var computedNotExpected = computed.Where(x => Math.Abs(x.Value) > BenchmarkPrecision).Select(x => x.ToIdentityString()).Except(expected.Select(x => x.ToIdentityString()));", - "\n if (expectedNotComputed.Any())", - "\n {", - "\n foreach (var error in expectedNotComputed)", - "\n {", - "\n var message = error.ToIdentityString();", - "\n errors.Add(new BenchmarkTestResult(\"Extra expected variable for: \"+ message));", - "\n }", - "\n }", - "\n if (computedNotExpected.Any())", - "\n {", - "\n foreach (var error in computedNotExpected)", - "\n {", - "\n var message = error.ToIdentityString();", - "\n errors.Add(new BenchmarkTestResult(\"Extra computed variable for: \"+ message));", - "\n }", - "\n }", - "\n ", - "\n var misMatchedVariables = expected.Concat(computed).AggregateOver().Where(x => Math.Abs(x.Value) > BenchmarkPrecision);", - "\n if (misMatchedVariables.Any())", - "\n {", - "\n foreach (var variable in misMatchedVariables)", - "\n {", - "\n var message = variable.ToIdentityString();", - "\n var bmValue = expected.FirstOrDefault(x => x.AocType == variable.AocType && ", - "\n x.Novelty == variable.Novelty &&", - "\n x.DataNode == variable.DataNode && ", - "\n x.EstimateType == variable.EstimateType && ", - "\n x.AmountType == variable.AmountType && ", - "\n x.EconomicBasis == variable.EconomicBasis && ", - "\n x.AccidentYear == variable.AccidentYear", - "\n )?.Value ?? 0.0d;", - "\n var computedValue = computed.FirstOrDefault(x => x.AocType == variable.AocType && ", - "\n x.Novelty == variable.Novelty &&", - "\n x.DataNode == variable.DataNode && ", - "\n x.EstimateType == variable.EstimateType && ", - "\n x.AmountType == variable.AmountType && ", - "\n x.EconomicBasis == variable.EconomicBasis && ", - "\n x.AccidentYear == variable.AccidentYear", - "\n )?.Value ?? 0.0d;", - "\n errors.Add(new BenchmarkTestResult(\"Value does not match for Variable: \" + message, -bmValue, computedValue));", - "\n }", - "\n }", - "\n return errors;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_OGAdCYiJ0WN7EbtgA4faQ", - "cell_type": "markdown", - "source": [ - "# Test Runner" - ], - "metadata": {} - }, - { - "id": "a5OzvwT_d0Gm2H4gGqcvEA", - "cell_type": "code", - "source": [ - "public bool ValidateMainTab(IDataRow mainRow, string reportingNode, int year, int month)", - "\n{", - "\n if (!int.TryParse(mainRow[nameof(PartitionByReportingNodeAndPeriod.Year)]?.ToString(), NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite , CultureInfo.InvariantCulture, out var mainYear))", - "\n throw new Exception(\"Value Year cannot be parsed.\"); ", - "\n if (!int.TryParse(mainRow[nameof(PartitionByReportingNodeAndPeriod.Month)]?.ToString(), NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite , CultureInfo.InvariantCulture, out var mainMonth))", - "\n throw new Exception(\"Value Month cannot be parsed.\"); ", - "\n var mainReportingNode = mainRow[nameof(PartitionByReportingNodeAndPeriod.ReportingNode)].ToString();", - "\n ", - "\n return reportingNode == mainReportingNode && year == mainYear && month == mainMonth;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HeqY0awSAUWsxllqn3M_AQ", - "cell_type": "code", - "source": [ - "var errorList = new List();", - "\n", - "\nforeach (var g in bmFiles.GroupBy(x => (ReportingNode: x.ReportingNode, Year: x.Year, Month: x.Month)))", - "\n{", - "\n var reportingNode = g.Key.ReportingNode;", - "\n var year = g.Key.Year;", - "\n var month = g.Key.Month;", - "\n string scenario = null;", - "\n ", - "\n //Set up Args and storage", - "\n await DataSource.Partition.SetAsync(new {ReportingNode = reportingNode, ", - "\n Year= year, ", - "\n Month = month, ", - "\n Scenario = scenario});", - "\n var partition = (await DataSource.Query().ToArrayAsync())", - "\n .SingleOrDefault(x => x.ReportingNode == reportingNode && x.Year== year && x.Month == month && x.Scenario == scenario)?.Id ?? new Guid();", - "\n ", - "\n var computedVariablesByEstimateType = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());", - "\n", - "\n foreach (var bmfile in g)", - "\n {", - "\n var extension = System.IO.Path.GetExtension(bmfile.FileName);", - "\n var stream = await Project.FileStorage.ReadAsync(bmfile.FileName);", - "\n //Read Bm csv", - "\n var bmDataTable = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync());", - "\n", - "\n var mainTab = bmDataTable.Tables[Main].Rows.First();", - "\n if(!ValidateMainTab(mainTab, reportingNode, year, month))", - "\n throw new Exception(\"Metadata and main tab of the Benchmark are different.\");", - "\n ", - "\n var bmTableName = bmDataTable.Tables.Single(x => x.TableName != Main).TableName;", - "\n var bmVariables = bmDataTable.Tables[bmTableName].Rows.Select(x => CreateVariable(x, partition));", - "\n ", - "\n //Get the computed Data", - "\n var computedVariables = computedVariablesByEstimateType.TryGetValue(bmTableName, out var ret) ? ret : Enumerable.Empty();", - "\n ", - "\n //CompareAgainstBm", - "\n if (bmVariables.Any() || computedVariables.Any()) //TODO we are adding duplicates here", - "\n errorList = errorList.Concat(CompareAgainstBm(errorList, bmVariables, computedVariables)).ToList();", - "\n }", - "\n}", - "\nerrorList = errorList.Distinct().ToList();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9p0HZCWtX0SPrElo9W915Q", - "cell_type": "code", - "source": [ - "errorList.Count().Should().Be(0)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "EBnAVHo3qEK4kPd1D8kPOw", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Ifrs Variable

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# BenchMarks" + ] + }, + { + "cell_type": "code", + "source": [ + "var pathToBm = \"./Data/IfrsVariableBenchmarks/\";" + ] + }, + { + "cell_type": "code", + "source": [ + "public record BenchmarkMetadata(string FileName, string ReportingNode, int Year, int Month){} " + ] + }, + { + "cell_type": "code", + "source": [ + "var bmFiles = new BenchmarkMetadata[]{", + "\n //2020 Q4", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_A.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_AA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_APA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_BE.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_BEPA.csv\", \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_C.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_DA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_F.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_OA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_RA.csv\" , \"CH\", 2020, 12),", + "\n //2021 Q1", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_A.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AAPA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_APA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_BE.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_BEPA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_C.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_DA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_F.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_L.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_LR.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OAPA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_RA.csv\" , \"CH\", 2021, 3),", + "\n};" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Functions" + ] + }, + { + "cell_type": "code", + "source": [ + "public static NumberStyles AllowedNumberStyles = NumberStyles.Float | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowLeadingSign | NumberStyles.AllowTrailingSign | NumberStyles.AllowDecimalPoint;" + ] + }, + { + "cell_type": "code", + "source": [ + "public IfrsVariable CreateVariable (IDataRow row, Guid partition)", + "\n{", + "\n if (!double.TryParse(row[nameof(IfrsVariable.Value)]?.ToString(), AllowedNumberStyles, CultureInfo.InvariantCulture, out var doubleValue))", + "\n throw new Exception(\"Value cannot be parsed.\");", + "\n ", + "\n return new IfrsVariable(){AocType = row.Field(nameof(IfrsVariable.AocType)),", + "\n Partition = partition,", + "\n Novelty = row.Field(nameof(IfrsVariable.Novelty)),", + "\n DataNode = row.Field(nameof(IfrsVariable.DataNode)),", + "\n EstimateType = row.Field(nameof(IfrsVariable.EstimateType)),", + "\n AmountType = row.Field(nameof(IfrsVariable.AmountType)),", + "\n AccidentYear = Int32.TryParse((row.Field(nameof(IfrsVariable.AccidentYear))), out var accidentYear) ? accidentYear : (int?)null,", + "\n EconomicBasis = row.Field(nameof(IfrsVariable.EconomicBasis)),", + "\n Value = (-1.0) * doubleValue,", + "\n };", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public class BenchmarkTestResult", + "\n{", + "\n public string ErrorMessage {get; set;}", + "\n public double ExpectedValue {get; set;}", + "\n public double ComputedValue {get; set;}", + "\n public BenchmarkTestResult (string message)", + "\n {", + "\n ErrorMessage = message;", + "\n }", + "\n public BenchmarkTestResult (string message, double expValue, double compValue)", + "\n {", + "\n ErrorMessage = message;", + "\n ExpectedValue = expValue;", + "\n ComputedValue = compValue; ", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public List CompareAgainstBm (List errors, IEnumerable expected, IEnumerable computed)", + "\n{", + "\n var expectedNotComputed = expected.Where(x => Math.Abs(x.Value) > BenchmarkPrecision).Select(x => x.ToIdentityString()).Except(computed.Select(x => x.ToIdentityString()));", + "\n var computedNotExpected = computed.Where(x => Math.Abs(x.Value) > BenchmarkPrecision).Select(x => x.ToIdentityString()).Except(expected.Select(x => x.ToIdentityString()));", + "\n if (expectedNotComputed.Any())", + "\n {", + "\n foreach (var error in expectedNotComputed)", + "\n {", + "\n var message = error.ToIdentityString();", + "\n errors.Add(new BenchmarkTestResult(\"Extra expected variable for: \"+ message));", + "\n }", + "\n }", + "\n if (computedNotExpected.Any())", + "\n {", + "\n foreach (var error in computedNotExpected)", + "\n {", + "\n var message = error.ToIdentityString();", + "\n errors.Add(new BenchmarkTestResult(\"Extra computed variable for: \"+ message));", + "\n }", + "\n }", + "\n ", + "\n var misMatchedVariables = expected.Concat(computed).AggregateOver().Where(x => Math.Abs(x.Value) > BenchmarkPrecision);", + "\n if (misMatchedVariables.Any())", + "\n {", + "\n foreach (var variable in misMatchedVariables)", + "\n {", + "\n var message = variable.ToIdentityString();", + "\n var bmValue = expected.FirstOrDefault(x => x.AocType == variable.AocType && ", + "\n x.Novelty == variable.Novelty &&", + "\n x.DataNode == variable.DataNode && ", + "\n x.EstimateType == variable.EstimateType && ", + "\n x.AmountType == variable.AmountType && ", + "\n x.EconomicBasis == variable.EconomicBasis && ", + "\n x.AccidentYear == variable.AccidentYear", + "\n )?.Value ?? 0.0d;", + "\n var computedValue = computed.FirstOrDefault(x => x.AocType == variable.AocType && ", + "\n x.Novelty == variable.Novelty &&", + "\n x.DataNode == variable.DataNode && ", + "\n x.EstimateType == variable.EstimateType && ", + "\n x.AmountType == variable.AmountType && ", + "\n x.EconomicBasis == variable.EconomicBasis && ", + "\n x.AccidentYear == variable.AccidentYear", + "\n )?.Value ?? 0.0d;", + "\n errors.Add(new BenchmarkTestResult(\"Value does not match for Variable: \" + message, -bmValue, computedValue));", + "\n }", + "\n }", + "\n return errors;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Runner" + ] + }, + { + "cell_type": "code", + "source": [ + "public bool ValidateMainTab(IDataRow mainRow, string reportingNode, int year, int month)", + "\n{", + "\n if (!int.TryParse(mainRow[nameof(PartitionByReportingNodeAndPeriod.Year)]?.ToString(), NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite , CultureInfo.InvariantCulture, out var mainYear))", + "\n throw new Exception(\"Value Year cannot be parsed.\"); ", + "\n if (!int.TryParse(mainRow[nameof(PartitionByReportingNodeAndPeriod.Month)]?.ToString(), NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite , CultureInfo.InvariantCulture, out var mainMonth))", + "\n throw new Exception(\"Value Month cannot be parsed.\"); ", + "\n var mainReportingNode = mainRow[nameof(PartitionByReportingNodeAndPeriod.ReportingNode)].ToString();", + "\n ", + "\n return reportingNode == mainReportingNode && year == mainYear && month == mainMonth;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var errorList = new List();", + "\n", + "\nforeach (var g in bmFiles.GroupBy(x => (ReportingNode: x.ReportingNode, Year: x.Year, Month: x.Month)))", + "\n{", + "\n var reportingNode = g.Key.ReportingNode;", + "\n var year = g.Key.Year;", + "\n var month = g.Key.Month;", + "\n string scenario = null;", + "\n ", + "\n //Set up Args and storage", + "\n await DataSource.Partition.SetAsync(new {ReportingNode = reportingNode, ", + "\n Year= year, ", + "\n Month = month, ", + "\n Scenario = scenario});", + "\n var partition = (await DataSource.Query().ToArrayAsync())", + "\n .SingleOrDefault(x => x.ReportingNode == reportingNode && x.Year== year && x.Month == month && x.Scenario == scenario)?.Id ?? new Guid();", + "\n ", + "\n var computedVariablesByEstimateType = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());", + "\n", + "\n foreach (var bmfile in g)", + "\n {", + "\n var extension = System.IO.Path.GetExtension(bmfile.FileName);", + "\n var stream = await Project.FileStorage.ReadAsync(bmfile.FileName);", + "\n //Read Bm csv", + "\n var bmDataTable = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync());", + "\n", + "\n var mainTab = bmDataTable.Tables[Main].Rows.First();", + "\n if(!ValidateMainTab(mainTab, reportingNode, year, month))", + "\n throw new Exception(\"Metadata and main tab of the Benchmark are different.\");", + "\n ", + "\n var bmTableName = bmDataTable.Tables.Single(x => x.TableName != Main).TableName;", + "\n var bmVariables = bmDataTable.Tables[bmTableName].Rows.Select(x => CreateVariable(x, partition));", + "\n ", + "\n //Get the computed Data", + "\n var computedVariables = computedVariablesByEstimateType.TryGetValue(bmTableName, out var ret) ? ret : Enumerable.Empty();", + "\n ", + "\n //CompareAgainstBm", + "\n if (bmVariables.Any() || computedVariables.Any()) //TODO we are adding duplicates here", + "\n errorList = errorList.Concat(CompareAgainstBm(errorList, bmVariables, computedVariables)).ToList();", + "\n }", + "\n}", + "\nerrorList = errorList.Distinct().ToList();" + ] + }, + { + "cell_type": "code", + "source": [ + "errorList.Count().Should().Be(0)" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/ImportStorageTest.ipynb b/Test/ImportStorageTest.ipynb index 93d24cd9..8f9d5663 100644 --- a/Test/ImportStorageTest.ipynb +++ b/Test/ImportStorageTest.ipynb @@ -1,707 +1,595 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "hKqEq5tZqUm8XFAYsSBT8A", - "cell_type": "markdown", - "source": [ - "

Import Storage Test

" - ], - "metadata": {} - }, - { - "id": "a__Hz48NY0-0cWKJL87Vzg", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hLZ53C2rWEanpIfkyRA2Rg", - "cell_type": "markdown", - "source": [ - "# Workspace Initialization " - ], - "metadata": {} - }, - { - "id": "8-W8hpcYnEm17E9gRTCLnQ", - "cell_type": "code", - "source": [ - "Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Dpy4U4VA5U-HxqmmZfHkmw", - "cell_type": "markdown", - "source": [ - "# Test IfrsVariables Query" - ], - "metadata": {} - }, - { - "id": "irUVLmmRJEyCsUkl3sPquQ", - "cell_type": "code", - "source": [ - "var gic = \"DT1.1\";", - "\nvar gric = \"DTR1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dihIAZaujUK6GuXDUo7Y_A", - "cell_type": "code", - "source": [ - "//Define partition", - "\nvar args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Actual);", - "\nvar partition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", - "\n x.Month == args.Month && x.Scenario == args.Scenario);", - "\nif(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);", - "\n", - "\nvar previousPeriodPartition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year - 1 && ", - "\n x.Month == MonthInAYear && x.Scenario == args.Scenario);", - "\nif(previousPeriodPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "N8Yf6JjnRU6Q4jUFGmqn3Q", - "cell_type": "code", - "source": [ - "public async Task CheckIfrsVariablesFromImportStorageAsync(string importFormat, IEnumerable inputDataSetForWorkspace, IEnumerable inputDataSetForDataSource, IEnumerable ivsBenchmark)", - "\n{", - "\n //Prepare Workspace and DataSource", - "\n await Workspace.UpdateAsync(inputDataSetForWorkspace);", - "\n await DataSource.UpdateAsync(inputDataSetForDataSource);", - "\n ", - "\n //Set up import storage and test universe", - "\n var testStorage = new ImportStorage(args with {ImportFormat = importFormat}, DataSource, Workspace);", - "\n await testStorage.InitializeAsync();", - "\n ", - "\n var ivs = testStorage.IfrsVariablesByImportIdentity.SelectMany(x => x.Value);", - "\n ", - "\n //Clean up Workspace", - "\n //Workspace.Reset(); ", - "\n await Workspace.DeleteAsync(inputDataSetForWorkspace); ", - "\n await DataSource.DeleteAsync(inputDataSetForDataSource); ", - "\n ", - "\n var errors = new List();", - "\n ", - "\n var extraVariablesInStorage = ivs.Except(ivsBenchmark).Select(x => x.ToIdentityString()).ToArray();", - "\n if(extraVariablesInStorage.Any()) errors.Add( $\"IfrsVariables in the storage contain the following items that are not present in the benchmark:\\n{string.Join(\"\\n\",extraVariablesInStorage)}.\" );", - "\n ", - "\n var extraVariablesInBenchmark = ivsBenchmark.Except(ivs).Select(x => x.ToIdentityString()).ToArray();", - "\n if(extraVariablesInBenchmark.Count() > 0) errors.Add( $\"IfrsVariables in the benchmark contain the following items that are not present in the storage:\\n{string.Join(\"\\n\",extraVariablesInBenchmark)}.\" );", - "\n ", - "\n //find duplicates in storage", - "\n var ivsByIdentityString = ivs.GroupBy(x => x.ToIdentityString()).Where(x => x.Count() > 1).Select(x => x.Key);", - "\n if(ivsByIdentityString.Any()) errors.Add($\"IfrsVariables in the storage have duplicated items for:\\n{string.Join(\"\\n\",ivsByIdentityString)}.\");", - "\n ", - "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bcPOId_540aVhl-n5wKQCA", - "cell_type": "code", - "source": [ - "//There is a previous year, and it's the first time Actuals are imported for the current year", - "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", - "\nvar inputDataSetForDataSource = new IfrsVariable[]{", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n };", - "\n", - "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", - "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", - "\n };", - "\n", - "\nvar ivsBenchmark = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", - "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", - "\n };", - "\n", - "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BqLp5tAfAUO_fcHJmxq2_A", - "cell_type": "code", - "source": [ - "//There is a previous year, and it's the second time Actuals are imported for the current year (reimport)", - "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", - "\nvar inputDataSetForDataSource = new IfrsVariable[]{", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = 150.0},", - "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 200.0},", - "\n basicIfrsVariable with {AocType = AocTypes.EOP, Value = 450.0},", - "\n };", - "\n", - "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", - "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", - "\n };", - "\n", - "\nvar ivsBenchmark = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", - "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", - "\n };", - "\n", - "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1RKRtwQOPkKisKG03fEbnQ", - "cell_type": "code", - "source": [ - "//There is a previous year, Cashflows were already imported and Actuals are imported for the first time", - "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.I, EstimateType = EstimateTypes.BE};", - "\nvar inputDataSetForDataSource = new IfrsVariable[]{", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = 100.0},", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 1000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", - "\n basicIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", - "\n };", - "\n", - "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = AocTypes.CF, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -15.0},", - "\n basicIfrsVariable with {AocType = AocTypes.WO, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -20.0},", - "\n };", - "\n", - "\nvar ivsBenchmark = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", - "\n basicIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.AA, Value = 100.0},", - "\n basicIfrsVariable with {AocType = AocTypes.CF, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -15.0},", - "\n basicIfrsVariable with {AocType = AocTypes.WO, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -20.0},", - "\n };", - "\n", - "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jxo0gCLAhUWGDdD50PTpxA", - "cell_type": "code", - "source": [ - "//There is a previous year, Cashflows and Actuals were already imported and Actuals are imported again", - "\nvar basicAdvanceActualIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", - "\nvar basicBeIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.I, EstimateType = EstimateTypes.BE};", - "\nvar inputDataSetForDataSource = new IfrsVariable[]{", - "\n basicBeIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 1000.0},", - "\n basicBeIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", - "\n basicBeIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", - "\n basicBeIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", - "\n basicBeIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", - "\n basicAdvanceActualIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", - "\n basicAdvanceActualIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.CF, Value = 150.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.WO, Value = 200.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.EOP, Value = 450.0},", - "\n };", - "\n", - "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", - "\n };", - "\n", - "\nvar ivsBenchmark = new IfrsVariable[]{", - "\n basicBeIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", - "\n basicBeIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", - "\n basicBeIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", - "\n basicBeIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", - "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", - "\n };", - "\n", - "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0BeFF1dpdEmZVGTCvBJgaw", - "cell_type": "code", - "source": [ - "//There is a previous year for Primary Scope (GRIC10) ", - "\n//There is a previous and current year for Secondary Scope (GIC10), ", - "\n//It's the first time Actuals are imported for the current year", - "\n", - "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gric, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", - "\nvar inputDataSetForDataSource = new IfrsVariable[]{", - "\n //Year", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, DataNode = gic, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.C, Value = 1000.0},", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.CL, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.C, Value = 666.0},", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 1000.0},", - "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.CL, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 666.0},", - "\n //Year -1", - "\n basicIfrsVariable with {AocType = AocTypes.IA, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", - "\n };", - "\n", - "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", - "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", - "\n };", - "\n", - "\nvar ivsBenchmark = new IfrsVariable[]{", - "\n //From previous Period", - "\n //Actuals", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.DA, Value = 1000.0},", - "\n //Cashflow", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 1000.0},", - "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.C, Value = 1000.0},", - "\n ", - "\n //From current Period", - "\n //from DB", - "\n basicIfrsVariable with {AocType = AocTypes.IA, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", - "\n ", - "\n //from workspace", - "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", - "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", - "\n };", - "\n", - "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XRCB3ZClf0-ZJpfkzljWUg", - "cell_type": "markdown", - "source": [ - "# Data Node Parameter related logic" - ], - "metadata": {} - }, - { - "id": "JbLy2z9stkeeonRZwUG3yQ", - "cell_type": "markdown", - "source": [ - "## Data Preparation" - ], - "metadata": {} - }, - { - "id": "RjbciW5_FECXbQhnQZ4DwQ", - "cell_type": "code", - "source": [ - "//Define partition", - "\nvar args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Cashflow);", - "\n", - "\nvar reportingNodePartition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Scenario == args.Scenario);", - "\nif(reportingNodePartition == null) ApplicationMessage.Log(Error.PartitionNotFound);", - "\n", - "\n", - "\nvar currentPartition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", - "\n x.Month == args.Month && x.Scenario == args.Scenario);", - "\nif(currentPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);", - "\n", - "\n", - "\nvar previousPeriodPartition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year - 1 && ", - "\n x.Month == MonthInAYear && x.Scenario == args.Scenario);", - "\nif(previousPeriodPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "E09b-uWxcUa8abPa94ONVA", - "cell_type": "code", - "source": [ - "var sampleGic = new GroupOfInsuranceContract(){Portfolio = \"P1\"};", - "\nvar inputDataGic = new GroupOfInsuranceContract[]{ sampleGic with {SystemName = \"Gross1\", LiabilityType = LiabilityTypes.LRC},", - "\n sampleGic with {SystemName = \"Gross2\", LiabilityType = LiabilityTypes.LRC},", - "\n sampleGic with {SystemName = \"Gross3\", LiabilityType = LiabilityTypes.LRC},", - "\n };", - "\n", - "\nvar sampleGric = new GroupOfReinsuranceContract(){Portfolio = \"ReP1\"};", - "\nvar inputDataGric = new GroupOfReinsuranceContract[]{ sampleGric with {SystemName = \"Reins1\", LiabilityType = LiabilityTypes.LRC},", - "\n sampleGric with {SystemName = \"Reins2\", LiabilityType = LiabilityTypes.LRC},", - "\n sampleGric with {SystemName = \"Reins3\", LiabilityType = LiabilityTypes.LRC},", - "\n };", - "\nvar sampleDnState = new DataNodeState {Partition = reportingNodePartition.Id, Year = args.Year, Month = args.Month, State = State.Active};", - "\nvar inputDataState = new DataNodeState[]{ sampleDnState with {DataNode = \"Gross1\"} ,", - "\n sampleDnState with {DataNode = \"Gross2\"} ,", - "\n sampleDnState with {DataNode = \"Gross3\"} ,", - "\n sampleDnState with {DataNode = \"Reins1\"} ,", - "\n sampleDnState with {DataNode = \"Reins2\"} ,", - "\n sampleDnState with {DataNode = \"Reins3\"} ,", - "\n };", - "\n", - "\nvar samplePreviousDnParam = new InterDataNodeParameter {Partition = reportingNodePartition.Id, ReinsuranceCoverage = 1, Year = args.Year -1, Month = args.Month};", - "\nvar sampleCurrentDnParam = new InterDataNodeParameter {Partition = reportingNodePartition.Id, ReinsuranceCoverage = 1, Year = args.Year, Month = args.Month};", - "\nvar inputDataParameter = new InterDataNodeParameter[]{", - "\n samplePreviousDnParam with {DataNode = \"Gross3\", LinkedDataNode = \"Reins3\", ReinsuranceCoverage = 1},", - "\n samplePreviousDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins1\", ReinsuranceCoverage = 0.1},", - "\n samplePreviousDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.2},", - "\n samplePreviousDnParam with {DataNode = \"Gross2\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.3},", - "\n sampleCurrentDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins1\", ReinsuranceCoverage = 0.5},", - "\n sampleCurrentDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.6},", - "\n sampleCurrentDnParam with {DataNode = \"Gross2\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.7},", - "\n sampleCurrentDnParam with {DataNode = \"Gross3\", LinkedDataNode = \"Reins3\", ReinsuranceCoverage = 1.0},", - "\n };", - "\n", - "\nvar sampleRawVar = new RawVariable{AmountType = AmountTypes.PR, AocType = AocTypes.CL, Novelty = Novelties.C, Partition = currentPartition.Id};" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "o8JTuDpfTkGmD7Wt0jogsQ", - "cell_type": "code", - "source": [ - "public async Task PrepareWorkspaceDataNodes()", - "\n{", - "\n await Workspace.UpdateAsync(inputDataGic);", - "\n await Workspace.UpdateAsync(inputDataGric);", - "\n await Workspace.UpdateAsync(inputDataState);", - "\n await Workspace.UpdateAsync(inputDataParameter);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Ozbv22ctukacRUyws-K7bw", - "cell_type": "code", - "source": [ - "public async Task CleanWorkspaceDataNodes()", - "\n{", - "\n await Workspace.DeleteAsync(inputDataGic);", - "\n await Workspace.DeleteAsync(inputDataGric);", - "\n await Workspace.DeleteAsync(inputDataState);", - "\n await Workspace.DeleteAsync(inputDataParameter);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZYnBpUzNEkWsk0zRWkUu-g", - "cell_type": "markdown", - "source": [ - "## Get Underlying Gic" - ], - "metadata": {} - }, - { - "id": "P-7XAjZPD0i7yEALKAwsnA", - "cell_type": "code", - "source": [ - "public async Task CheckGetUnderlyingGicsAsync(RawVariable[] inputDataVariable, Dictionary> underlyingGicBm)", - "\n{", - "\n var errors = new List();", - "\n ", - "\n await PrepareWorkspaceDataNodes();", - "\n await Workspace.UpdateAsync(inputDataVariable);", - "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", - "\n await testStorage.InitializeAsync();", - "\n ", - "\n var primaryScopeDn = testStorage.DataNodesByImportScope[ImportScope.Primary];", - "\n ", - "\n foreach (var dn in primaryScopeDn)", - "\n {", - "\n var id = new ImportIdentity(){DataNode = dn};", - "\n if ( underlyingGicBm[dn].Except(testStorage.GetUnderlyingGic(id)).Count() != 0 )", - "\n errors.Add( $\"Underlying Gics for DataNode {dn} not matching with BM. Computed: \\n{string.Join(\"\\n\",testStorage.GetUnderlyingGic(id))} \\n Expected : \\n{string.Join(\"\\n\",underlyingGicBm[dn])}\" );", - "\n }", - "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query());", - "\n await CleanWorkspaceDataNodes();", - "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gr9n4fPaC0-7JF_Wv00Nzw", - "cell_type": "code", - "source": [ - "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", - "\n sampleRawVar with {DataNode = \"Reins2\"},", - "\n };", - "\nvar underlyingGicBm = new Dictionary>(){", - "\n {\"Reins1\",new string[]{\"Gross1\"}},", - "\n {\"Reins2\",new string[]{\"Gross1\",\"Gross2\"}},", - "\n};", - "\n", - "\nawait CheckGetUnderlyingGicsAsync(inputDataVariable, underlyingGicBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "z4P2iM4Dwk2p49Y6p3nVKw", - "cell_type": "code", - "source": [ - "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins2\"},", - "\n };", - "\nvar underlyingGicBm = new Dictionary>(){", - "\n {\"Reins2\",new string[]{\"Gross1\",\"Gross2\"}},", - "\n};", - "\n", - "\nawait CheckGetUnderlyingGicsAsync(inputDataVariable, underlyingGicBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-L7jFDaEmkyVlAyPPIHFHQ", - "cell_type": "markdown", - "source": [ - "## Get Reinsurance Coverage" - ], - "metadata": {} - }, - { - "id": "YwMf2AGd8kWzNmNK5TaXeA", - "cell_type": "code", - "source": [ - "public async Task CheckGetReinsuranceCoverageAsync(RawVariable[] inputDataVariable, ", - "\n Dictionary<(string, string),double> reinsCovBoPBm, ", - "\n Dictionary<(string, string),double> reinsCovEoPBm)", - "\n{", - "\n var errors = new List();", - "\n", - "\n await PrepareWorkspaceDataNodes();", - "\n await Workspace.UpdateAsync(inputDataVariable);", - "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", - "\n await testStorage.InitializeAsync();", - "\n ", - "\n var primaryScopeDn = testStorage.DataNodesByImportScope[ImportScope.Primary];", - "\n ", - "\n foreach (var dn in primaryScopeDn)", - "\n {", - "\n var aocTypes = new AocStep[]{ new AocStep(AocTypes.BOP, Novelties.I), new AocStep(AocTypes.RCU, Novelties.I) };", - "\n foreach (var aoc in aocTypes)", - "\n {", - "\n var bm = aoc.AocType == AocTypes.BOP ? reinsCovBoPBm : reinsCovEoPBm;", - "\n var id = new ImportIdentity(){DataNode = dn, AocType = aoc.AocType, Novelty = aoc.Novelty};", - "\n ", - "\n var computedReinsCov = testStorage.GetUnderlyingGic(id)", - "\n .Select(gic => (g: gic, value: testStorage.GetReinsuranceCoverage(id, gic)))", - "\n .ToDictionary(x => (dn,x.g), x => x.value);", - "\n ", - "\n if( bm.Keys.Where(x => x.Item1 == dn).Except(computedReinsCov.Keys).Count() != 0)", - "\n errors.Add( $\"Gric-Gic links not matching with BM for DataNode {dn} and AocType {aoc.AocType}. \\n Computed: \\n{string.Join(\"\\n\",computedReinsCov.Keys)} \\n Expected: \\n{string.Join(\"\\n\",bm.Keys)}\" );", - "\n ", - "\n foreach (var reinsCov in computedReinsCov)", - "\n {", - "\n var bmKvp = bm.Single(x => x.Key.Item1 == reinsCov.Key.Item1 && x.Key.Item2 == reinsCov.Key.Item2); ", - "\n if( Math.Abs(bmKvp.Value - reinsCov.Value) > Precision )", - "\n errors.Add( $\"{dn}-{reinsCov.Key.Item2} Reinsurance Coverage not matching with BM for AocType {aoc.AocType}: \\n Computed: {reinsCov.Value} \\n Expected: {bmKvp.Value}\");", - "\n }", - "\n }", - "\n }", - "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query());", - "\n await CleanWorkspaceDataNodes();", - "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bVG2ah0oSUimPFlFmvkYwg", - "cell_type": "code", - "source": [ - "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", - "\n sampleRawVar with {DataNode = \"Reins2\"},", - "\n };", - "\nvar reinsCovBoPBm = new Dictionary<(string, string),double>(){", - "\n {(\"Reins1\",\"Gross1\"),0.1},", - "\n {(\"Reins2\",\"Gross1\"),0.2},", - "\n {(\"Reins2\",\"Gross2\"),0.3},", - "\n};", - "\n", - "\nvar reinsCovEoPBm = new Dictionary<(string, string),double>(){", - "\n {(\"Reins1\",\"Gross1\"),0.5},", - "\n {(\"Reins2\",\"Gross1\"),0.6},", - "\n {(\"Reins2\",\"Gross2\"),0.7},", - "\n};", - "\n", - "\nawait CheckGetReinsuranceCoverageAsync(inputDataVariable, reinsCovBoPBm, reinsCovEoPBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2DHkaQC6A0eHln9BqSBrLA", - "cell_type": "markdown", - "source": [ - "## Primary and Secondary Scope" - ], - "metadata": {} - }, - { - "id": "QxMSzO5gJU2IlukS0y4uIg", - "cell_type": "code", - "source": [ - "public async Task CheckSecondaryScopeAsync(RawVariable[] inputDataVariable, string[] primaryScopeBm, string[] secondaryScopeBm)", - "\n{", - "\n var errors = new List();", - "\n ", - "\n await PrepareWorkspaceDataNodes();", - "\n await Workspace.UpdateAsync(inputDataVariable);", - "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", - "\n await testStorage.InitializeAsync();", - "\n ", - "\n var activeDn = (await Workspace.Query().ToArrayAsync()).Select(x => x.DataNode);", - "\n ", - "\n var primaryScopeDn = testStorage.DataNodesByImportScope[ImportScope.Primary];", - "\n ", - "\n foreach (var dn in activeDn)", - "\n {", - "\n //PrimaryScope", - "\n if ( primaryScopeBm.Contains(dn) && !primaryScopeDn.Contains(dn))", - "\n errors.Add( $\"DataNode {dn} is not added to the primary scope.\" );", - "\n if( !primaryScopeBm.Contains(dn) && primaryScopeDn.Contains(dn))", - "\n errors.Add( $\"DataNode {dn} is added to the primary scope but should have not.\" );", - "\n ", - "\n //SecondaryScope", - "\n if ( secondaryScopeBm.Contains(dn) && !testStorage.IsSecondaryScope(dn))", - "\n errors.Add( $\"DataNode {dn} is not added to the secondary scope.\" );", - "\n if( !secondaryScopeBm.Contains(dn) && testStorage.IsSecondaryScope(dn))", - "\n errors.Add( $\"DataNode {dn} is added to the secondary scope but should have not.\" );", - "\n }", - "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query());", - "\n await CleanWorkspaceDataNodes();", - "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ky7k1tjYZkuJI5AN4f01_g", - "cell_type": "code", - "source": [ - "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", - "\n sampleRawVar with {DataNode = \"Reins2\"},", - "\n };", - "\nvar primaryScopeBm = new string[]{\"Reins1\", \"Reins2\"};", - "\nvar secondaryScopeBm = new string[]{\"Gross1\", \"Gross2\"};", - "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Q7y5fkIm8Em2WkXn5-f3XA", - "cell_type": "code", - "source": [ - "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", - "\n };", - "\nvar primaryScopeBm = new string[]{\"Reins1\"};", - "\nvar secondaryScopeBm = new string[]{\"Gross1\"};", - "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kwq8FSvW2EOvmcWpP4NtmA", - "cell_type": "code", - "source": [ - "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", - "\n sampleRawVar with {DataNode = \"Gross1\"},", - "\n };", - "\nvar primaryScopeBm = new string[]{\"Reins1\",\"Gross1\",\"Reins2\"};", - "\nvar secondaryScopeBm = new string[]{\"Gross2\"};", - "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "DXx87fO500-tCJcptCKJTw", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Import Storage Test

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Workspace Initialization " + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test IfrsVariables Query" + ] + }, + { + "cell_type": "code", + "source": [ + "var gic = \"DT1.1\";", + "\nvar gric = \"DTR1.1\";" + ] + }, + { + "cell_type": "code", + "source": [ + "//Define partition", + "\nvar args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Actual);", + "\nvar partition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", + "\n x.Month == args.Month && x.Scenario == args.Scenario);", + "\nif(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);", + "\n", + "\nvar previousPeriodPartition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year - 1 && ", + "\n x.Month == MonthInAYear && x.Scenario == args.Scenario);", + "\nif(previousPeriodPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckIfrsVariablesFromImportStorageAsync(string importFormat, IEnumerable inputDataSetForWorkspace, IEnumerable inputDataSetForDataSource, IEnumerable ivsBenchmark)", + "\n{", + "\n //Prepare Workspace and DataSource", + "\n await Workspace.UpdateAsync(inputDataSetForWorkspace);", + "\n await DataSource.UpdateAsync(inputDataSetForDataSource);", + "\n ", + "\n //Set up import storage and test universe", + "\n var testStorage = new ImportStorage(args with {ImportFormat = importFormat}, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n ", + "\n var ivs = testStorage.IfrsVariablesByImportIdentity.SelectMany(x => x.Value);", + "\n ", + "\n //Clean up Workspace", + "\n //Workspace.Reset(); ", + "\n await Workspace.DeleteAsync(inputDataSetForWorkspace); ", + "\n await DataSource.DeleteAsync(inputDataSetForDataSource); ", + "\n ", + "\n var errors = new List();", + "\n ", + "\n var extraVariablesInStorage = ivs.Except(ivsBenchmark).Select(x => x.ToIdentityString()).ToArray();", + "\n if(extraVariablesInStorage.Any()) errors.Add( $\"IfrsVariables in the storage contain the following items that are not present in the benchmark:\\n{string.Join(\"\\n\",extraVariablesInStorage)}.\" );", + "\n ", + "\n var extraVariablesInBenchmark = ivsBenchmark.Except(ivs).Select(x => x.ToIdentityString()).ToArray();", + "\n if(extraVariablesInBenchmark.Count() > 0) errors.Add( $\"IfrsVariables in the benchmark contain the following items that are not present in the storage:\\n{string.Join(\"\\n\",extraVariablesInBenchmark)}.\" );", + "\n ", + "\n //find duplicates in storage", + "\n var ivsByIdentityString = ivs.GroupBy(x => x.ToIdentityString()).Where(x => x.Count() > 1).Select(x => x.Key);", + "\n if(ivsByIdentityString.Any()) errors.Add($\"IfrsVariables in the storage have duplicated items for:\\n{string.Join(\"\\n\",ivsByIdentityString)}.\");", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "//There is a previous year, and it's the first time Actuals are imported for the current year", + "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ] + }, + { + "cell_type": "code", + "source": [ + "//There is a previous year, and it's the second time Actuals are imported for the current year (reimport)", + "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = 150.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 200.0},", + "\n basicIfrsVariable with {AocType = AocTypes.EOP, Value = 450.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ] + }, + { + "cell_type": "code", + "source": [ + "//There is a previous year, Cashflows were already imported and Actuals are imported for the first time", + "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.I, EstimateType = EstimateTypes.BE};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = 100.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", + "\n basicIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.CF, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -15.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -20.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", + "\n basicIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.AA, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -15.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, EstimateType = EstimateTypes.AA, Novelty = Novelties.C, Value = -20.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ] + }, + { + "cell_type": "code", + "source": [ + "//There is a previous year, Cashflows and Actuals were already imported and Actuals are imported again", + "\nvar basicAdvanceActualIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", + "\nvar basicBeIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gic, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.I, EstimateType = EstimateTypes.BE};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n basicBeIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 1000.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", + "\n basicAdvanceActualIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", + "\n basicAdvanceActualIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.CF, Value = 150.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.WO, Value = 200.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.EOP, Value = 450.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n basicBeIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 1000.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.IA, Value = 1500.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.CF, Value = 2500.0},", + "\n basicBeIfrsVariable with {AocType = AocTypes.EOP, Value = 5000.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.CF, Value = -15.0},", + "\n basicAdvanceActualIfrsVariable with {AocType = AocTypes.WO, Value = -20.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ] + }, + { + "cell_type": "code", + "source": [ + "//There is a previous year for Primary Scope (GRIC10) ", + "\n//There is a previous and current year for Secondary Scope (GIC10), ", + "\n//It's the first time Actuals are imported for the current year", + "\n", + "\nvar basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = gric, AccidentYear = null, AmountType = AmountTypes.PR, Novelty = Novelties.C, EstimateType = EstimateTypes.AA};", + "\nvar inputDataSetForDataSource = new IfrsVariable[]{", + "\n //Year", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, Value = 100.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, DataNode = gic, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.C, Value = 1000.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.CL, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.C, Value = 666.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.EOP, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 1000.0},", + "\n basicIfrsVariable with {Partition = previousPeriodPartition.Id, AocType = AocTypes.CL, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 666.0},", + "\n //Year -1", + "\n basicIfrsVariable with {AocType = AocTypes.IA, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", + "\n };", + "\n", + "\nvar inputDataSetForWorkspace = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", + "\n };", + "\n", + "\nvar ivsBenchmark = new IfrsVariable[]{", + "\n //From previous Period", + "\n //Actuals", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, Value = 100.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.DA, Value = 1000.0},", + "\n //Cashflow", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 1000.0},", + "\n basicIfrsVariable with {AocType = AocTypes.BOP, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.C, Value = 1000.0},", + "\n ", + "\n //From current Period", + "\n //from DB", + "\n basicIfrsVariable with {AocType = AocTypes.IA, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Novelty = Novelties.I, DataNode = gic, EstimateType = EstimateTypes.BE, EconomicBasis = EconomicBases.L, Value = 10.0},", + "\n ", + "\n //from workspace", + "\n basicIfrsVariable with {AocType = AocTypes.CF, Value = -10.0},", + "\n basicIfrsVariable with {AocType = AocTypes.WO, Value = 15.0},", + "\n };", + "\n", + "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Data Node Parameter related logic" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Preparation" + ] + }, + { + "cell_type": "code", + "source": [ + "//Define partition", + "\nvar args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Cashflow);", + "\n", + "\nvar reportingNodePartition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Scenario == args.Scenario);", + "\nif(reportingNodePartition == null) ApplicationMessage.Log(Error.PartitionNotFound);", + "\n", + "\n", + "\nvar currentPartition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", + "\n x.Month == args.Month && x.Scenario == args.Scenario);", + "\nif(currentPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);", + "\n", + "\n", + "\nvar previousPeriodPartition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year - 1 && ", + "\n x.Month == MonthInAYear && x.Scenario == args.Scenario);", + "\nif(previousPeriodPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + ] + }, + { + "cell_type": "code", + "source": [ + "var sampleGic = new GroupOfInsuranceContract(){Portfolio = \"P1\"};", + "\nvar inputDataGic = new GroupOfInsuranceContract[]{ sampleGic with {SystemName = \"Gross1\", LiabilityType = LiabilityTypes.LRC},", + "\n sampleGic with {SystemName = \"Gross2\", LiabilityType = LiabilityTypes.LRC},", + "\n sampleGic with {SystemName = \"Gross3\", LiabilityType = LiabilityTypes.LRC},", + "\n };", + "\n", + "\nvar sampleGric = new GroupOfReinsuranceContract(){Portfolio = \"ReP1\"};", + "\nvar inputDataGric = new GroupOfReinsuranceContract[]{ sampleGric with {SystemName = \"Reins1\", LiabilityType = LiabilityTypes.LRC},", + "\n sampleGric with {SystemName = \"Reins2\", LiabilityType = LiabilityTypes.LRC},", + "\n sampleGric with {SystemName = \"Reins3\", LiabilityType = LiabilityTypes.LRC},", + "\n };", + "\nvar sampleDnState = new DataNodeState {Partition = reportingNodePartition.Id, Year = args.Year, Month = args.Month, State = State.Active};", + "\nvar inputDataState = new DataNodeState[]{ sampleDnState with {DataNode = \"Gross1\"} ,", + "\n sampleDnState with {DataNode = \"Gross2\"} ,", + "\n sampleDnState with {DataNode = \"Gross3\"} ,", + "\n sampleDnState with {DataNode = \"Reins1\"} ,", + "\n sampleDnState with {DataNode = \"Reins2\"} ,", + "\n sampleDnState with {DataNode = \"Reins3\"} ,", + "\n };", + "\n", + "\nvar samplePreviousDnParam = new InterDataNodeParameter {Partition = reportingNodePartition.Id, ReinsuranceCoverage = 1, Year = args.Year -1, Month = args.Month};", + "\nvar sampleCurrentDnParam = new InterDataNodeParameter {Partition = reportingNodePartition.Id, ReinsuranceCoverage = 1, Year = args.Year, Month = args.Month};", + "\nvar inputDataParameter = new InterDataNodeParameter[]{", + "\n samplePreviousDnParam with {DataNode = \"Gross3\", LinkedDataNode = \"Reins3\", ReinsuranceCoverage = 1},", + "\n samplePreviousDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins1\", ReinsuranceCoverage = 0.1},", + "\n samplePreviousDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.2},", + "\n samplePreviousDnParam with {DataNode = \"Gross2\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.3},", + "\n sampleCurrentDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins1\", ReinsuranceCoverage = 0.5},", + "\n sampleCurrentDnParam with {DataNode = \"Gross1\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.6},", + "\n sampleCurrentDnParam with {DataNode = \"Gross2\", LinkedDataNode = \"Reins2\", ReinsuranceCoverage = 0.7},", + "\n sampleCurrentDnParam with {DataNode = \"Gross3\", LinkedDataNode = \"Reins3\", ReinsuranceCoverage = 1.0},", + "\n };", + "\n", + "\nvar sampleRawVar = new RawVariable{AmountType = AmountTypes.PR, AocType = AocTypes.CL, Novelty = Novelties.C, Partition = currentPartition.Id};" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task PrepareWorkspaceDataNodes()", + "\n{", + "\n await Workspace.UpdateAsync(inputDataGic);", + "\n await Workspace.UpdateAsync(inputDataGric);", + "\n await Workspace.UpdateAsync(inputDataState);", + "\n await Workspace.UpdateAsync(inputDataParameter);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CleanWorkspaceDataNodes()", + "\n{", + "\n await Workspace.DeleteAsync(inputDataGic);", + "\n await Workspace.DeleteAsync(inputDataGric);", + "\n await Workspace.DeleteAsync(inputDataState);", + "\n await Workspace.DeleteAsync(inputDataParameter);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Get Underlying Gic" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckGetUnderlyingGicsAsync(RawVariable[] inputDataVariable, Dictionary> underlyingGicBm)", + "\n{", + "\n var errors = new List();", + "\n ", + "\n await PrepareWorkspaceDataNodes();", + "\n await Workspace.UpdateAsync(inputDataVariable);", + "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n ", + "\n var primaryScopeDn = testStorage.DataNodesByImportScope[ImportScope.Primary];", + "\n ", + "\n foreach (var dn in primaryScopeDn)", + "\n {", + "\n var id = new ImportIdentity(){DataNode = dn};", + "\n if ( underlyingGicBm[dn].Except(testStorage.GetUnderlyingGic(id)).Count() != 0 )", + "\n errors.Add( $\"Underlying Gics for DataNode {dn} not matching with BM. Computed: \\n{string.Join(\"\\n\",testStorage.GetUnderlyingGic(id))} \\n Expected : \\n{string.Join(\"\\n\",underlyingGicBm[dn])}\" );", + "\n }", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query());", + "\n await CleanWorkspaceDataNodes();", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n sampleRawVar with {DataNode = \"Reins2\"},", + "\n };", + "\nvar underlyingGicBm = new Dictionary>(){", + "\n {\"Reins1\",new string[]{\"Gross1\"}},", + "\n {\"Reins2\",new string[]{\"Gross1\",\"Gross2\"}},", + "\n};", + "\n", + "\nawait CheckGetUnderlyingGicsAsync(inputDataVariable, underlyingGicBm);" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins2\"},", + "\n };", + "\nvar underlyingGicBm = new Dictionary>(){", + "\n {\"Reins2\",new string[]{\"Gross1\",\"Gross2\"}},", + "\n};", + "\n", + "\nawait CheckGetUnderlyingGicsAsync(inputDataVariable, underlyingGicBm);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Get Reinsurance Coverage" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckGetReinsuranceCoverageAsync(RawVariable[] inputDataVariable, ", + "\n Dictionary<(string, string),double> reinsCovBoPBm, ", + "\n Dictionary<(string, string),double> reinsCovEoPBm)", + "\n{", + "\n var errors = new List();", + "\n", + "\n await PrepareWorkspaceDataNodes();", + "\n await Workspace.UpdateAsync(inputDataVariable);", + "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n ", + "\n var primaryScopeDn = testStorage.DataNodesByImportScope[ImportScope.Primary];", + "\n ", + "\n foreach (var dn in primaryScopeDn)", + "\n {", + "\n var aocTypes = new AocStep[]{ new AocStep(AocTypes.BOP, Novelties.I), new AocStep(AocTypes.RCU, Novelties.I) };", + "\n foreach (var aoc in aocTypes)", + "\n {", + "\n var bm = aoc.AocType == AocTypes.BOP ? reinsCovBoPBm : reinsCovEoPBm;", + "\n var id = new ImportIdentity(){DataNode = dn, AocType = aoc.AocType, Novelty = aoc.Novelty};", + "\n ", + "\n var computedReinsCov = testStorage.GetUnderlyingGic(id)", + "\n .Select(gic => (g: gic, value: testStorage.GetReinsuranceCoverage(id, gic)))", + "\n .ToDictionary(x => (dn,x.g), x => x.value);", + "\n ", + "\n if( bm.Keys.Where(x => x.Item1 == dn).Except(computedReinsCov.Keys).Count() != 0)", + "\n errors.Add( $\"Gric-Gic links not matching with BM for DataNode {dn} and AocType {aoc.AocType}. \\n Computed: \\n{string.Join(\"\\n\",computedReinsCov.Keys)} \\n Expected: \\n{string.Join(\"\\n\",bm.Keys)}\" );", + "\n ", + "\n foreach (var reinsCov in computedReinsCov)", + "\n {", + "\n var bmKvp = bm.Single(x => x.Key.Item1 == reinsCov.Key.Item1 && x.Key.Item2 == reinsCov.Key.Item2); ", + "\n if( Math.Abs(bmKvp.Value - reinsCov.Value) > Precision )", + "\n errors.Add( $\"{dn}-{reinsCov.Key.Item2} Reinsurance Coverage not matching with BM for AocType {aoc.AocType}: \\n Computed: {reinsCov.Value} \\n Expected: {bmKvp.Value}\");", + "\n }", + "\n }", + "\n }", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query());", + "\n await CleanWorkspaceDataNodes();", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n sampleRawVar with {DataNode = \"Reins2\"},", + "\n };", + "\nvar reinsCovBoPBm = new Dictionary<(string, string),double>(){", + "\n {(\"Reins1\",\"Gross1\"),0.1},", + "\n {(\"Reins2\",\"Gross1\"),0.2},", + "\n {(\"Reins2\",\"Gross2\"),0.3},", + "\n};", + "\n", + "\nvar reinsCovEoPBm = new Dictionary<(string, string),double>(){", + "\n {(\"Reins1\",\"Gross1\"),0.5},", + "\n {(\"Reins2\",\"Gross1\"),0.6},", + "\n {(\"Reins2\",\"Gross2\"),0.7},", + "\n};", + "\n", + "\nawait CheckGetReinsuranceCoverageAsync(inputDataVariable, reinsCovBoPBm, reinsCovEoPBm);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Primary and Secondary Scope" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckSecondaryScopeAsync(RawVariable[] inputDataVariable, string[] primaryScopeBm, string[] secondaryScopeBm)", + "\n{", + "\n var errors = new List();", + "\n ", + "\n await PrepareWorkspaceDataNodes();", + "\n await Workspace.UpdateAsync(inputDataVariable);", + "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n ", + "\n var activeDn = (await Workspace.Query().ToArrayAsync()).Select(x => x.DataNode);", + "\n ", + "\n var primaryScopeDn = testStorage.DataNodesByImportScope[ImportScope.Primary];", + "\n ", + "\n foreach (var dn in activeDn)", + "\n {", + "\n //PrimaryScope", + "\n if ( primaryScopeBm.Contains(dn) && !primaryScopeDn.Contains(dn))", + "\n errors.Add( $\"DataNode {dn} is not added to the primary scope.\" );", + "\n if( !primaryScopeBm.Contains(dn) && primaryScopeDn.Contains(dn))", + "\n errors.Add( $\"DataNode {dn} is added to the primary scope but should have not.\" );", + "\n ", + "\n //SecondaryScope", + "\n if ( secondaryScopeBm.Contains(dn) && !testStorage.IsSecondaryScope(dn))", + "\n errors.Add( $\"DataNode {dn} is not added to the secondary scope.\" );", + "\n if( !secondaryScopeBm.Contains(dn) && testStorage.IsSecondaryScope(dn))", + "\n errors.Add( $\"DataNode {dn} is added to the secondary scope but should have not.\" );", + "\n }", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query());", + "\n await CleanWorkspaceDataNodes();", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n sampleRawVar with {DataNode = \"Reins2\"},", + "\n };", + "\nvar primaryScopeBm = new string[]{\"Reins1\", \"Reins2\"};", + "\nvar secondaryScopeBm = new string[]{\"Gross1\", \"Gross2\"};", + "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n };", + "\nvar primaryScopeBm = new string[]{\"Reins1\"};", + "\nvar secondaryScopeBm = new string[]{\"Gross1\"};", + "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", + "\n sampleRawVar with {DataNode = \"Gross1\"},", + "\n };", + "\nvar primaryScopeBm = new string[]{\"Reins1\",\"Gross1\",\"Reins2\"};", + "\nvar secondaryScopeBm = new string[]{\"Gross2\"};", + "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/MapTemplateAndImportTest.ipynb b/Test/MapTemplateAndImportTest.ipynb index faec8763..e7837a9f 100644 --- a/Test/MapTemplateAndImportTest.ipynb +++ b/Test/MapTemplateAndImportTest.ipynb @@ -1,564 +1,440 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "wmh8VD39zE-Ey7EfKLRdmQ", - "cell_type": "markdown", - "source": [ - "

Test Map Template Export and Import

" - ], - "metadata": {} - }, - { - "id": "Eo2BObmmzkiC0vc1-cdonA", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Utils/UtilityMethods\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vtn0keYdmU6rEcmTON0UwQ", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CQ_YlVaPK0qoXE3iHNGsUg", - "cell_type": "markdown", - "source": [ - "# Test Empty Database" - ], - "metadata": {} - }, - { - "id": "DGQyghJ1AEyT_RB_hXzB1Q", - "cell_type": "code", - "source": [ - "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "7R24zOJDXk2KI7i6-FH_2g", - "cell_type": "code", - "source": [ - "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "q9WzUZfKq06UWRvmoF38IA", - "cell_type": "code", - "source": [ - "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "U3QNuXi7wECZryFP8aqCyw", - "cell_type": "code", - "source": [ - "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LBo4BnS_u02vMgAJhq45-Q", - "cell_type": "code", - "source": [ - "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1eQBRJgPu0ei17Q9Re_f5g", - "cell_type": "code", - "source": [ - "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4uAB9H_tcEq0wQ9u2feWZw", - "cell_type": "code", - "source": [ - "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_I6QcbDYvEW7cP4LqHyMDQ", - "cell_type": "code", - "source": [ - "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3o3EdNofI0Sb7P0VjQv3TA", - "cell_type": "code", - "source": [ - "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6EGAGpWhukuN5vjCcTs51Q", - "cell_type": "markdown", - "source": [ - "# Test Map Template" - ], - "metadata": {} - }, - { - "id": "9s3hXWWbyU-1iykcDAJ-XA", - "cell_type": "markdown", - "source": [ - "## Data Node" - ], - "metadata": {} - }, - { - "id": "m6tebAPzHkaRzelYIbeZOg", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);", - "\n", - "\nstatic var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };", - "\nstatic var filename = \"TestMapTemplateDataNode\";", - "\n", - "\nWorkspace.InitializeFrom(DataSource);", - "\nawait Workspace.Partition.SetAsync( partition );", - "\n", - "\nvar ips = Workspace.Query().ToArray();", - "\nvar rps = Workspace.Query().ToArray();", - "\nvar gics = Workspace.Query().ToArray();", - "\nvar grics = Workspace.Query().ToArray();", - "\n", - "\nvar exportResult = await Export.ToExcel(filename)", - "\n .WithSource(Workspace)", - "\n .PortfolioConfiguration()", - "\n .PortfolioConfiguration()", - "\n .GroupofContractConfiguration(typeof(ReinsurancePortfolio))", - "\n .GroupofContractConfiguration(typeof(InsurancePortfolio))", - "\n .MainTabConfigurationWoScenario(partition)", - "\n.ExecuteAsync();", - "\n", - "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", - "\n", - "\n// check that exporter generates only the desired columns ", - "\nvar extension = \".xlsx\";", - "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", - "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", - "\nvar mainCols = new[]{nameof(PartitionByReportingNode.ReportingNode)};", - "\nvar portfolioCols = new[]{nameof(Portfolio.SystemName),nameof(Portfolio.DisplayName),nameof(Portfolio.ContractualCurrency),", - "\n nameof(Portfolio.LineOfBusiness),nameof(Portfolio.OciType),nameof(Portfolio.ValuationApproach)};", - "\nvar gicCols = new[]{nameof(GroupOfContract.SystemName),nameof(GroupOfContract.DisplayName),nameof(GroupOfContract.AnnualCohort),", - "\n nameof(GroupOfContract.LiabilityType),nameof(InsurancePortfolio),nameof(GroupOfContract.Profitability)};", - "\nvar gricCols = new[]{nameof(GroupOfContract.SystemName),nameof(GroupOfContract.DisplayName),nameof(GroupOfContract.AnnualCohort),", - "\n nameof(GroupOfContract.LiabilityType),nameof(ReinsurancePortfolio),nameof(GroupOfContract.Profitability),nameof(GroupOfContract.Partner)};", - "\n", - "\nmainCols.Intersect(tables.Tables[Main].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(mainCols.Length);", - "\nportfolioCols.Intersect(tables.Tables[nameof(InsurancePortfolio)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(portfolioCols.Length); ", - "\nportfolioCols.Intersect(tables.Tables[nameof(ReinsurancePortfolio)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(portfolioCols.Length); ", - "\ngicCols.Intersect(tables.Tables[nameof(GroupOfInsuranceContract)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(gicCols.Length); ", - "\ngricCols.Intersect(tables.Tables[nameof(GroupOfReinsuranceContract)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(gricCols.Length); ", - "\n", - "\n// check that imported data matches the exported data", - "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", - "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", - "\nawait storage.InitializeAsync();", - "\n", - "\nawait UploadDataNodesToWorkspaceAsync(filename+\".xlsx\");", - "\nUtils.EqualityComparer(ips, Workspace.Query().ToArray());", - "\nUtils.EqualityComparer(rps, Workspace.Query().ToArray());", - "\nUtils.EqualityComparer(gics, Workspace.Query().ToArray());", - "\nUtils.EqualityComparer(grics, Workspace.Query().ToArray());", - "\n", - "\n" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zOGhxg1IhESG_D1THv63sA", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nRI-ZaELKE6ClMkV4BLEUg", - "cell_type": "markdown", - "source": [ - "## Data Node State" - ], - "metadata": {} - }, - { - "id": "CrT3UgfIWEucISLJOkDARA", - "cell_type": "code", - "source": [ - "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2021, Month = 3 };", - "\nstatic var filename = \"TestMapTemplateDataNodeState\";", - "\n", - "\nWorkspace.InitializeFrom(DataSource);", - "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );", - "\nawait Workspace.Partition.SetAsync( partition );", - "\n", - "\nvar dataNodeStates = await Workspace.Query()", - "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year)", - "\n .GroupBy(x => x.DataNode)", - "\n .Select(x => x.OrderByDescending(y => y.Year).ThenByDescending(y => y.Month))", - "\n .Select(x => x.Last())", - "\n .ToArrayAsync();", - "\n", - "\nvar exportResult = await Export.ToExcel(filename)", - "\n .WithSource(Workspace)", - "\n .StateEnumConfiguration() ", - "\n .DataNodeStateConfiguration(dataNodeStates)", - "\n .MainTabConfigurationWoScenario(partition)", - "\n.ExecuteAsync();", - "\n", - "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", - "\n", - "\n// check that exporter generates only the desired columns ", - "\nvar extension = \".xlsx\";", - "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", - "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", - "\nvar mainCols = new[]{nameof(PartitionByReportingNodeAndPeriod.ReportingNode),", - "\n nameof(PartitionByReportingNodeAndPeriod.Year),", - "\n nameof(PartitionByReportingNodeAndPeriod.Month)};", - "\nvar dataNodeStateCols = new[]{nameof(DataNodeState.DataNode),nameof(DataNodeState.State)};", - "\nmainCols.Intersect(tables.Tables[Main].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(mainCols.Length);", - "\ndataNodeStateCols.Intersect(tables.Tables[\"DataNodeState\"].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(dataNodeStateCols.Length);", - "\n", - "\n// check that imported data matches the exported data ", - "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", - "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", - "\nawait storage.InitializeAsync();", - "\n", - "\nawait UploadDataNodeStateToWorkspaceAsync(filename+\".xlsx\");", - "\n", - "\n// Workspace is empty because ValidateDataNodeStatesAsync removes the entry, since this is already present in the DataSource.", - "\nWorkspace.Query().ToArray().Should().BeEmpty();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QNDCIM7e2UWjQM13S1JZ8A", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WVvsogjgCkGlxke3IAGi_g", - "cell_type": "markdown", - "source": [ - "## DataNodeParameter" - ], - "metadata": {} - }, - { - "id": "4U2oeNzYEEKxoH98EmjOxg", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);", - "\nstatic var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", - "\nvar partitionByReportingNode = (await DataSource.Query().Where(x => x.ReportingNode == partition.ReportingNode).ToArrayAsync()).Single();", - "\nstatic var filename = \"TestMapTemplateDataNodeParameter\";", - "\nvar singleDataNodeParamBm = await DataSource.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month && x.Partition == partitionByReportingNode.Id ).ToArrayAsync();", - "\nvar interDataNodeParamBm = await DataSource.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month && x.Partition == partitionByReportingNode.Id ).ToArrayAsync();", - "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );", - "\nawait Workspace.Partition.SetAsync( partition );", - "\n//--------------------Export Map Template--------------------------", - "\n//--------------------From MapTemplate NB--------------------------", - "\nvar dataNodeParameters = (await Workspace.Query()", - "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year).ToArrayAsync())", - "\n .GroupBy(x => x.GetType().Name)", - "\n .ToDictionary(x => x.Key, ", - "\n x => x.GroupBy(y => y.DataNode)", - "\n .Select(y => y.OrderByDescending(z => z.Year).ThenByDescending(z => z.Month))", - "\n .Select(y => y.First())", - "\n .ToArray() );", - "\nvar exportResult = await Export.ToExcel(filename)", - "\n .WithSource(Workspace)", - "\n .DataNodeParameterConfiguration(dataNodeParameters)", - "\n .MainTabConfiguration(partition)", - "\n.ExecuteAsync();", - "\n", - "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", - "\n//-----------------------------------------------------------------", - "\n// check that exporter generates only the desired columns ", - "\nvar extension = \".xlsx\";", - "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", - "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", - "\nvar mainCols = new[]{nameof(PartitionByReportingNodeAndPeriod.ReportingNode),", - "\n nameof(PartitionByReportingNodeAndPeriod.Year),", - "\n nameof(PartitionByReportingNodeAndPeriod.Month),", - "\n nameof(PartitionByReportingNodeAndPeriod.Scenario)};", - "\nvar singleDataNodeParamCols = new[]{nameof(DataNode),", - "\n nameof(SingleDataNodeParameter.PremiumAllocation)};", - "\nvar interDataNodeParamCols = new[]{nameof(DataNodeParameter.DataNode),", - "\n nameof(InterDataNodeParameter.LinkedDataNode),", - "\n nameof(InterDataNodeParameter.ReinsuranceCoverage)};", - "\nmainCols.Intersect(tables.Tables[Main].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(mainCols.Length);", - "\nsingleDataNodeParamCols.Intersect(tables.Tables[nameof(SingleDataNodeParameter)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(singleDataNodeParamCols.Length);", - "\ninterDataNodeParamCols.Intersect(tables.Tables[nameof(InterDataNodeParameter)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(interDataNodeParamCols.Length);", - "\n// check that imported data matches the exported data ", - "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", - "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", - "\nvar targetPartitionByReportingNodeId = new Guid();", - "\nawait storage.InitializeAsync();", - "\nawait UploadDataNodeParameterToWorkspaceAsync(filename+\".xlsx\", targetPartitionByReportingNodeId);", - "\nvar expectedSingleDataNodeParamBm = Workspace.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month).ToArray();", - "\nvar expectedInterDataNodeParamBm = Workspace.Query().ToArray();", - "\nUtils.EqualityComparer(singleDataNodeParamBm, expectedSingleDataNodeParamBm);", - "\nUtils.EqualityComparer(interDataNodeParamBm, expectedInterDataNodeParamBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "va-MijisUkepqmVMOLJj1Q", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "x-al4I6dSk6STwc4oylwCg", - "cell_type": "markdown", - "source": [ - "# Test Import Validation" - ], - "metadata": {} - }, - { - "id": "LG8H5pXCv0iU38uHNCvxEA", - "cell_type": "markdown", - "source": [ - "## Data Node State: entries cannot be imported which change status from Inactive to Active" - ], - "metadata": {} - }, - { - "id": "nmuP0vEnLEqamwIsJpCSfQ", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);", - "\nvar partition = Workspace.Query().Where(x => x.ReportingNode == \"CH\").ToArray().FirstOrDefault();", - "\nawait Workspace.Partition.SetAsync(partition);", - "\n", - "\nvar itemInactive = new DataNodeState { Year = 2022, Month = 9, DataNode = \"GIC1\", State = State.Inactive, Partition = partition.Id };", - "\nvar itemActive = new DataNodeState { Year = 2022, Month = 9, DataNode = \"GIC1\", State = State.Active, Partition = partition.Id };", - "\n", - "\n// Define GIC1 State as Inactive", - "\nvar persistentDataNodeDataByDataNode = new Dictionary ", - "\n{", - "\n [\"GIC1\"] = new DataNodeData() {DataNode = \"GIC1\", State = itemInactive.State, Year = itemInactive.Year, Month = itemInactive.Month},", - "\n};", - "\n", - "\n// Set GIC1 from Inactive into Active", - "\nawait Workspace.DeleteAsync(Workspace.Query().ToArray());", - "\nawait Workspace.UpdateAsync(itemActive);", - "\n", - "\n// Test Validation", - "\nActivity.Start();", - "\nawait ValidateDataNodeStatesAsync(persistentDataNodeDataByDataNode);", - "\nActivity.HasErrors().Should().Be(true);", - "\nvar log = Activity.Finish().Errors.First().ToString().Substring(40);", - "\n(log.Substring(0,log.Length-2) == Get(Error.ChangeDataNodeState, \"GIC1\")).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "i9-3PyG3uEW-g1CBte_ePA", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "19OZTLJqEkywyseKKCm4Uw", - "cell_type": "markdown", - "source": [ - "## Data Node State: Validation removes the entry when the DataSource already contains a previous version " - ], - "metadata": {} - }, - { - "id": "_ezSKNws4E-nHzlCVI0fIg", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);", - "\nvar partition = Workspace.Query().Where(x => x.ReportingNode == \"CH\").ToArray().FirstOrDefault();", - "\nawait Workspace.Partition.SetAsync(partition);", - "\n", - "\nvar itemPrevious = new DataNodeState { Year = 2022, Month = 3, DataNode = \"GIC1\", State = State.Active, Partition = partition.Id };", - "\nvar itemImport = new DataNodeState { Year = 2022, Month = 9, DataNode = \"GIC1\", State = State.Active, Partition = partition.Id };", - "\n", - "\n// Define persisted Data Node State", - "\nvar persistentDataNodeDataByDataNode = new Dictionary", - "\n{", - "\n [\"GIC1\"] = new DataNodeData() {DataNode = itemPrevious.DataNode, State = itemPrevious.State, Year = itemPrevious.Year, Month = itemPrevious.Month},", - "\n};", - "\n", - "\n// Reimport Data Node State for GIC1 with State unchanged", - "\nawait Workspace.DeleteAsync(Workspace.Query().ToArray());", - "\nawait Workspace.UpdateAsync(itemImport);", - "\n", - "\nawait ValidateDataNodeStatesAsync(persistentDataNodeDataByDataNode);", - "\n", - "\n// Check that the new redundant State is removed from the Workspace", - "\nWorkspace.Query().ToArray().Should().BeEmpty();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Pou7Chyva0qd3qanB75kiQ", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KyDTS_jfUkOIkYt3INVPtA", - "cell_type": "markdown", - "source": [ - "## Data Node Parameters : Validations" - ], - "metadata": {} - }, - { - "id": "vkBb3hOe3UuG2RuMIIoUfg", - "cell_type": "code", - "source": [ - "public async Task CheckErrors(string inputFileName, List errorBms)", - "\n{", - "\n var partitionId = new Guid();", - "\n var log = await UploadDataNodeParameterToWorkspaceAsync(inputFileName, partitionId);", - "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", - "\n errorBms.Intersect(log.Errors.Select(x => x.ToString().Substring(0,x.ToString().Length-2).Substring(40)).ToArray()).Count().Should().Be(errorBms.Count());", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZSI2-sVTMkuZTg61UVXucg", - "cell_type": "code", - "source": [ - "var inputFileName = \"Data/DataNodeParameter_InvalidDataNode.csv\";", - "\nvar errorsBm = new List(){Get(Error.InvalidDataNode, \"DataNodeInvalid0\"),", - "\n Get(Error.InvalidDataNode, \"DataNodeInvalid1\"),", - "\n Get(Error.InvalidDataNode, \"DataNodeInvalid2\")};", - "\nawait CheckErrors(inputFileName, errorsBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2unWYjVwA0mJbyzeVCVg8A", - "cell_type": "code", - "source": [ - "var inputFileName = \"Data/DataNodeParameter_Duplicate.csv\";", - "\nvar errorsBm = new List(){Get(Error.DuplicateSingleDataNode, \"DT1.1\"),", - "\n Get(Error.DuplicateInterDataNode, \"DT1.1\",\"DTR1.1\"),};", - "\nawait CheckErrors(inputFileName, errorsBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uH8Fn9T2-EGO0hSWBk1Yxg", - "cell_type": "code", - "source": [ - "var inputFileName = \"Data/DataNodeParameter_InvalidReinsCov.csv\";", - "\nvar errorsBm = new List(){Get(Error.ReinsuranceCoverageDataNode, \"DT1.1\",\"DT1.1\")};", - "\nawait CheckErrors(inputFileName, errorsBm);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "lkXchyRo9U6x7lnhcliuTg", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Test Map Template Export and Import

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Utils/UtilityMethods\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Empty Database" + ] + }, + { + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Map Template" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);", + "\n", + "\nstatic var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };", + "\nstatic var filename = \"TestMapTemplateDataNode\";", + "\n", + "\nWorkspace.InitializeFrom(DataSource);", + "\nawait Workspace.Partition.SetAsync( partition );", + "\n", + "\nvar ips = Workspace.Query().ToArray();", + "\nvar rps = Workspace.Query().ToArray();", + "\nvar gics = Workspace.Query().ToArray();", + "\nvar grics = Workspace.Query().ToArray();", + "\n", + "\nvar exportResult = await Export.ToExcel(filename)", + "\n .WithSource(Workspace)", + "\n .PortfolioConfiguration()", + "\n .PortfolioConfiguration()", + "\n .GroupofContractConfiguration(typeof(ReinsurancePortfolio))", + "\n .GroupofContractConfiguration(typeof(InsurancePortfolio))", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync();", + "\n", + "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", + "\n", + "\n// check that exporter generates only the desired columns ", + "\nvar extension = \".xlsx\";", + "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", + "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", + "\nvar mainCols = new[]{nameof(PartitionByReportingNode.ReportingNode)};", + "\nvar portfolioCols = new[]{nameof(Portfolio.SystemName),nameof(Portfolio.DisplayName),nameof(Portfolio.ContractualCurrency),", + "\n nameof(Portfolio.LineOfBusiness),nameof(Portfolio.OciType),nameof(Portfolio.ValuationApproach)};", + "\nvar gicCols = new[]{nameof(GroupOfContract.SystemName),nameof(GroupOfContract.DisplayName),nameof(GroupOfContract.AnnualCohort),", + "\n nameof(GroupOfContract.LiabilityType),nameof(InsurancePortfolio),nameof(GroupOfContract.Profitability)};", + "\nvar gricCols = new[]{nameof(GroupOfContract.SystemName),nameof(GroupOfContract.DisplayName),nameof(GroupOfContract.AnnualCohort),", + "\n nameof(GroupOfContract.LiabilityType),nameof(ReinsurancePortfolio),nameof(GroupOfContract.Profitability),nameof(GroupOfContract.Partner)};", + "\n", + "\nmainCols.Intersect(tables.Tables[Main].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(mainCols.Length);", + "\nportfolioCols.Intersect(tables.Tables[nameof(InsurancePortfolio)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(portfolioCols.Length); ", + "\nportfolioCols.Intersect(tables.Tables[nameof(ReinsurancePortfolio)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(portfolioCols.Length); ", + "\ngicCols.Intersect(tables.Tables[nameof(GroupOfInsuranceContract)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(gicCols.Length); ", + "\ngricCols.Intersect(tables.Tables[nameof(GroupOfReinsuranceContract)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(gricCols.Length); ", + "\n", + "\n// check that imported data matches the exported data", + "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", + "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", + "\nawait storage.InitializeAsync();", + "\n", + "\nawait UploadDataNodesToWorkspaceAsync(filename+\".xlsx\");", + "\nUtils.EqualityComparer(ips, Workspace.Query().ToArray());", + "\nUtils.EqualityComparer(rps, Workspace.Query().ToArray());", + "\nUtils.EqualityComparer(gics, Workspace.Query().ToArray());", + "\nUtils.EqualityComparer(grics, Workspace.Query().ToArray());", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node State" + ] + }, + { + "cell_type": "code", + "source": [ + "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2021, Month = 3 };", + "\nstatic var filename = \"TestMapTemplateDataNodeState\";", + "\n", + "\nWorkspace.InitializeFrom(DataSource);", + "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );", + "\nawait Workspace.Partition.SetAsync( partition );", + "\n", + "\nvar dataNodeStates = await Workspace.Query()", + "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year)", + "\n .GroupBy(x => x.DataNode)", + "\n .Select(x => x.OrderByDescending(y => y.Year).ThenByDescending(y => y.Month))", + "\n .Select(x => x.Last())", + "\n .ToArrayAsync();", + "\n", + "\nvar exportResult = await Export.ToExcel(filename)", + "\n .WithSource(Workspace)", + "\n .StateEnumConfiguration() ", + "\n .DataNodeStateConfiguration(dataNodeStates)", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync();", + "\n", + "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", + "\n", + "\n// check that exporter generates only the desired columns ", + "\nvar extension = \".xlsx\";", + "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", + "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", + "\nvar mainCols = new[]{nameof(PartitionByReportingNodeAndPeriod.ReportingNode),", + "\n nameof(PartitionByReportingNodeAndPeriod.Year),", + "\n nameof(PartitionByReportingNodeAndPeriod.Month)};", + "\nvar dataNodeStateCols = new[]{nameof(DataNodeState.DataNode),nameof(DataNodeState.State)};", + "\nmainCols.Intersect(tables.Tables[Main].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(mainCols.Length);", + "\ndataNodeStateCols.Intersect(tables.Tables[\"DataNodeState\"].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(dataNodeStateCols.Length);", + "\n", + "\n// check that imported data matches the exported data ", + "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", + "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", + "\nawait storage.InitializeAsync();", + "\n", + "\nawait UploadDataNodeStateToWorkspaceAsync(filename+\".xlsx\");", + "\n", + "\n// Workspace is empty because ValidateDataNodeStatesAsync removes the entry, since this is already present in the DataSource.", + "\nWorkspace.Query().ToArray().Should().BeEmpty();" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## DataNodeParameter" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);", + "\nstatic var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", + "\nvar partitionByReportingNode = (await DataSource.Query().Where(x => x.ReportingNode == partition.ReportingNode).ToArrayAsync()).Single();", + "\nstatic var filename = \"TestMapTemplateDataNodeParameter\";", + "\nvar singleDataNodeParamBm = await DataSource.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month && x.Partition == partitionByReportingNode.Id ).ToArrayAsync();", + "\nvar interDataNodeParamBm = await DataSource.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month && x.Partition == partitionByReportingNode.Id ).ToArrayAsync();", + "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );", + "\nawait Workspace.Partition.SetAsync( partition );", + "\n//--------------------Export Map Template--------------------------", + "\n//--------------------From MapTemplate NB--------------------------", + "\nvar dataNodeParameters = (await Workspace.Query()", + "\n .Where(x => (x.Year == partition.Year && x.Month <= partition.Month) || x.Year < partition.Year).ToArrayAsync())", + "\n .GroupBy(x => x.GetType().Name)", + "\n .ToDictionary(x => x.Key, ", + "\n x => x.GroupBy(y => y.DataNode)", + "\n .Select(y => y.OrderByDescending(z => z.Year).ThenByDescending(z => z.Month))", + "\n .Select(y => y.First())", + "\n .ToArray() );", + "\nvar exportResult = await Export.ToExcel(filename)", + "\n .WithSource(Workspace)", + "\n .DataNodeParameterConfiguration(dataNodeParameters)", + "\n .MainTabConfiguration(partition)", + "\n.ExecuteAsync();", + "\n", + "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", + "\n//-----------------------------------------------------------------", + "\n// check that exporter generates only the desired columns ", + "\nvar extension = \".xlsx\";", + "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", + "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", + "\nvar mainCols = new[]{nameof(PartitionByReportingNodeAndPeriod.ReportingNode),", + "\n nameof(PartitionByReportingNodeAndPeriod.Year),", + "\n nameof(PartitionByReportingNodeAndPeriod.Month),", + "\n nameof(PartitionByReportingNodeAndPeriod.Scenario)};", + "\nvar singleDataNodeParamCols = new[]{nameof(DataNode),", + "\n nameof(SingleDataNodeParameter.PremiumAllocation)};", + "\nvar interDataNodeParamCols = new[]{nameof(DataNodeParameter.DataNode),", + "\n nameof(InterDataNodeParameter.LinkedDataNode),", + "\n nameof(InterDataNodeParameter.ReinsuranceCoverage)};", + "\nmainCols.Intersect(tables.Tables[Main].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(mainCols.Length);", + "\nsingleDataNodeParamCols.Intersect(tables.Tables[nameof(SingleDataNodeParameter)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(singleDataNodeParamCols.Length);", + "\ninterDataNodeParamCols.Intersect(tables.Tables[nameof(InterDataNodeParameter)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(interDataNodeParamCols.Length);", + "\n// check that imported data matches the exported data ", + "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", + "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", + "\nvar targetPartitionByReportingNodeId = new Guid();", + "\nawait storage.InitializeAsync();", + "\nawait UploadDataNodeParameterToWorkspaceAsync(filename+\".xlsx\", targetPartitionByReportingNodeId);", + "\nvar expectedSingleDataNodeParamBm = Workspace.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month).ToArray();", + "\nvar expectedInterDataNodeParamBm = Workspace.Query().ToArray();", + "\nUtils.EqualityComparer(singleDataNodeParamBm, expectedSingleDataNodeParamBm);", + "\nUtils.EqualityComparer(interDataNodeParamBm, expectedInterDataNodeParamBm);" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Import Validation" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node State: entries cannot be imported which change status from Inactive to Active" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);", + "\nvar partition = Workspace.Query().Where(x => x.ReportingNode == \"CH\").ToArray().FirstOrDefault();", + "\nawait Workspace.Partition.SetAsync(partition);", + "\n", + "\nvar itemInactive = new DataNodeState { Year = 2022, Month = 9, DataNode = \"GIC1\", State = State.Inactive, Partition = partition.Id };", + "\nvar itemActive = new DataNodeState { Year = 2022, Month = 9, DataNode = \"GIC1\", State = State.Active, Partition = partition.Id };", + "\n", + "\n// Define GIC1 State as Inactive", + "\nvar persistentDataNodeDataByDataNode = new Dictionary ", + "\n{", + "\n [\"GIC1\"] = new DataNodeData() {DataNode = \"GIC1\", State = itemInactive.State, Year = itemInactive.Year, Month = itemInactive.Month},", + "\n};", + "\n", + "\n// Set GIC1 from Inactive into Active", + "\nawait Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\nawait Workspace.UpdateAsync(itemActive);", + "\n", + "\n// Test Validation", + "\nActivity.Start();", + "\nawait ValidateDataNodeStatesAsync(persistentDataNodeDataByDataNode);", + "\nActivity.HasErrors().Should().Be(true);", + "\nvar log = Activity.Finish().Errors.First().ToString().Substring(40);", + "\n(log.Substring(0,log.Length-2) == Get(Error.ChangeDataNodeState, \"GIC1\")).Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node State: Validation removes the entry when the DataSource already contains a previous version " + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);", + "\nvar partition = Workspace.Query().Where(x => x.ReportingNode == \"CH\").ToArray().FirstOrDefault();", + "\nawait Workspace.Partition.SetAsync(partition);", + "\n", + "\nvar itemPrevious = new DataNodeState { Year = 2022, Month = 3, DataNode = \"GIC1\", State = State.Active, Partition = partition.Id };", + "\nvar itemImport = new DataNodeState { Year = 2022, Month = 9, DataNode = \"GIC1\", State = State.Active, Partition = partition.Id };", + "\n", + "\n// Define persisted Data Node State", + "\nvar persistentDataNodeDataByDataNode = new Dictionary", + "\n{", + "\n [\"GIC1\"] = new DataNodeData() {DataNode = itemPrevious.DataNode, State = itemPrevious.State, Year = itemPrevious.Year, Month = itemPrevious.Month},", + "\n};", + "\n", + "\n// Reimport Data Node State for GIC1 with State unchanged", + "\nawait Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\nawait Workspace.UpdateAsync(itemImport);", + "\n", + "\nawait ValidateDataNodeStatesAsync(persistentDataNodeDataByDataNode);", + "\n", + "\n// Check that the new redundant State is removed from the Workspace", + "\nWorkspace.Query().ToArray().Should().BeEmpty();" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node Parameters : Validations" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckErrors(string inputFileName, List errorBms)", + "\n{", + "\n var partitionId = new Guid();", + "\n var log = await UploadDataNodeParameterToWorkspaceAsync(inputFileName, partitionId);", + "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\n errorBms.Intersect(log.Errors.Select(x => x.ToString().Substring(0,x.ToString().Length-2).Substring(40)).ToArray()).Count().Should().Be(errorBms.Count());", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputFileName = \"Data/DataNodeParameter_InvalidDataNode.csv\";", + "\nvar errorsBm = new List(){Get(Error.InvalidDataNode, \"DataNodeInvalid0\"),", + "\n Get(Error.InvalidDataNode, \"DataNodeInvalid1\"),", + "\n Get(Error.InvalidDataNode, \"DataNodeInvalid2\")};", + "\nawait CheckErrors(inputFileName, errorsBm);" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputFileName = \"Data/DataNodeParameter_Duplicate.csv\";", + "\nvar errorsBm = new List(){Get(Error.DuplicateSingleDataNode, \"DT1.1\"),", + "\n Get(Error.DuplicateInterDataNode, \"DT1.1\",\"DTR1.1\"),};", + "\nawait CheckErrors(inputFileName, errorsBm);" + ] + }, + { + "cell_type": "code", + "source": [ + "var inputFileName = \"Data/DataNodeParameter_InvalidReinsCov.csv\";", + "\nvar errorsBm = new List(){Get(Error.ReinsuranceCoverageDataNode, \"DT1.1\",\"DT1.1\")};", + "\nawait CheckErrors(inputFileName, errorsBm);" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/QueriesTest.ipynb b/Test/QueriesTest.ipynb index c91c0f6b..490565f0 100644 --- a/Test/QueriesTest.ipynb +++ b/Test/QueriesTest.ipynb @@ -1,535 +1,423 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "_IqpJ1KMUEGYZFSIeqTQfg", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Utils/UtilityMethods\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6-FaBdsHfk2QsR8mnBirig", - "cell_type": "code", - "source": [ - "var gic = \"DT1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "lpSLXRR8SUWTReUAPXdCGw", - "cell_type": "markdown", - "source": [ - "# Test Load Current and Previous Parameter for Yield Curve" - ], - "metadata": {} - }, - { - "id": "MSTglT9520GqkMaeJVIboA", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vuGCdF-iCU6ZaQX6iiwCaA", - "cell_type": "code", - "source": [ - "public async Task CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(Args args, IEnumerable testData, ", - "\n (int Year, int Month) expectedCurrentPeriod, ", - "\n (int Year, int Month) expectedPreviousPeriod)", - "\n{", - "\n await Workspace.UpdateAsync(testData);", - "\n var eurCurrentAndPreviousYieldCurve = (await Workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Currency))[\"EUR\"];", - "\n ", - "\n //Check Current Period", - "\n eurCurrentAndPreviousYieldCurve[CurrentPeriod].Year.Should().Be(expectedCurrentPeriod.Year);", - "\n eurCurrentAndPreviousYieldCurve[CurrentPeriod].Month.Should().Be(expectedCurrentPeriod.Month);", - "\n ", - "\n //Check Previous Period", - "\n eurCurrentAndPreviousYieldCurve[PreviousPeriod].Year.Should().Be(expectedPreviousPeriod.Year);", - "\n eurCurrentAndPreviousYieldCurve[PreviousPeriod].Month.Should().Be(expectedPreviousPeriod.Month);", - "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RUfdhTU15EaPkO5FVp6qdw", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2020, 9),(2020, 9));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5lBUg6REDUqpF8AFQaSVMw", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2019, 12), (2019, 12));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yvs_kK9a6U-p4_zPj-yeTA", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2020, 6));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9KEHlyMSzEaR6u7TcXWcnQ", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9), (2020, 9));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TbyTWCzxOEKJ84ZrZjk0ug", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9), (2019, 9));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "B0cbAHylv0aRbz8NpHnX7w", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12), (2019, 12));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "mGbDxghxXkqBy6nh62h5wg", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2018, Month = 9}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12), (2019, 12));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-aimZbUkbE69ujpiBCQHeg", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 6}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 9},", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 6}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 6), (2019, 6));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "z7N6H3nrE0ib9q25l-HOLw", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2015, Month = 9},", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2016, 3));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "G1sMs6vn7UCUx9PcNnX0Zg", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2021, Month = 9},", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3}};", - "\n", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2016, 3));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bTtGvgxoRUuqc2eYUgyavQ", - "cell_type": "markdown", - "source": [ - "# Test Data Node State Query" - ], - "metadata": {} - }, - { - "id": "m6puoprjyUGBYqt7aPTc4A", - "cell_type": "code", - "source": [ - "public async Task CheckLoadDataNodeStateAsync(Args args, IEnumerable testData, bool isExpectedToBeActive)", - "\n{", - "\n await Workspace.UpdateAsync(testData);", - "\n var isActive = (await Workspace.LoadDataNodeStateAsync(args)).Keys.Contains(gic);", - "\n ", - "\n isActive.Should().Be(isExpectedToBeActive);", - "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1rUvJm2L4k-qth-62yWJcA", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", - "\nvar testData = new DataNodeState[] {new DataNodeState{ DataNode = gic, Year = 2019, Month = 12, State = State.Active },", - "\n new DataNodeState{ DataNode = gic, Year = 2020, Month = 6, State = State.Inactive }};", - "\nawait CheckLoadDataNodeStateAsync(args, testData, false);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "n8zP0mcxgUiGDxpciWfdUQ", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", - "\nvar testData = new DataNodeState[] {new DataNodeState{ DataNode = gic, Year = 2020, Month = 3, State = State.Active },", - "\n new DataNodeState{ DataNode = gic, Year = 2020, Month = 9, State = State.Inactive }};", - "\nawait CheckLoadDataNodeStateAsync(args, testData, false);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Bm1_QjQMz0GO56QnUrVqwg", - "cell_type": "markdown", - "source": [ - "# Test Load Yield Curve" - ], - "metadata": {} - }, - { - "id": "wAmKPPOo7kGNh3r-uijhJg", - "cell_type": "code", - "source": [ - "public async Task CheckLoadYieldCurveAsync(Args args, IEnumerable testData, ", - "\n (int year , int month) dataNodeYearAndMonth, ", - "\n double expectedCurrentPreviousFirstYcValue,", - "\n double expectedCurrentFirstYcValue,", - "\n double expectedLockedFirstYcValue)", - "\n{", - "\n await Workspace.UpdateAsync(testData);", - "\n await Workspace.UpdateAsync(new ReportingNode[]{new ReportingNode{Currency=\"EUR\",SystemName=\"CH\"}});", - "\n ", - "\n var dataNodes = new DataNodeData[]{new DataNodeData{ValuationApproach=\"BBA\", Year = dataNodeYearAndMonth.year, Month = dataNodeYearAndMonth.month, DataNode = gic, ContractualCurrency = \"EUR\"}};", - "\n var eurLockedYieldCurve = (await LoadLockedInYieldCurveAsync(Workspace, args, dataNodes));", - "\n var eurCurrentYieldCurve = (await LoadCurrentYieldCurveAsync(Workspace, args, dataNodes));", - "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", - "\n ", - "\n var errors = new List();", - "\n var currentPrevPeriod = eurCurrentYieldCurve[\"EUR\"][PreviousPeriod].Values.First();", - "\n if(Math.Abs(currentPrevPeriod - expectedCurrentPreviousFirstYcValue) > 1E-8)", - "\n errors.Add( $\"Current YieldCurve for Previous Period not matching:\\n Expected {expectedCurrentPreviousFirstYcValue} \\n Computed {currentPrevPeriod}.\" );", - "\n ", - "\n var currentCurrPeriod = eurCurrentYieldCurve[\"EUR\"][CurrentPeriod].Values.First();", - "\n if(Math.Abs(currentCurrPeriod - expectedCurrentFirstYcValue) > 1E-8)", - "\n errors.Add( $\"Current YieldCurve for Current Period not matching:\\n Expected {expectedCurrentFirstYcValue} \\n Computed {currentCurrPeriod}.\" );", - "\n ", - "\n var lockedYc = eurLockedYieldCurve[gic].Values.First();", - "\n if(Math.Abs(lockedYc - expectedLockedFirstYcValue) > 1E-8)", - "\n errors.Add( $\"LockedIn YieldCurve not matching:\\n Expected {expectedLockedFirstYcValue} \\n Computed {lockedYc}.\" );", - "\n ", - "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors)); ", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vRCMvk2zpk6YeQlQuLXkRQ", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Values = new double[]{0.1,0.2,0.3,0.4,0.5,0.6} }, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3, Values = new double[]{2.1,2.2,2.3,2.4,2.5,2.6} }, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2021, Month = 9, Values = new double[]{4.1,4.2,4.3,4.4,4.5,4.6} },", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3, Values = new double[]{6.1,6.2,6.3,6.4,6.5,6.6} }};", - "\n", - "\nawait CheckLoadYieldCurveAsync(args, testData, (2016, 6), 6.1, 0.1, 6.1);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZL_HAd63MUGyojndKeoyPA", - "cell_type": "markdown", - "source": [ - "# Test Load Data Node Parameter" - ], - "metadata": {} - }, - { - "id": "HHu8-DR7E0Gl3YlOdR0eWA", - "cell_type": "code", - "source": [ - "var gic2 = \"gic2\";", - "\nvar xgic = \"xgic\";", - "\nvar gric1 = \"gric1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VArCCnA-XEWWYph2oPfxmQ", - "cell_type": "code", - "source": [ - "public async Task CheckLoadInterDataNodeParameterAsync(Args args, IEnumerable testData, ", - "\n int previousYear,", - "\n int? currentYear = null)", - "\n{", - "\n currentYear = currentYear ?? previousYear;", - "\n await Workspace.UpdateAsync(testData);", - "\n ", - "\n var interDataNodeParameters = await LoadInterDataNodeParametersAsync(Workspace, args);", - "\n ", - "\n //Check Keys", - "\n var uniqueLinks = testData.Select(x => x.DataNode).Concat(testData.Select(x => x.LinkedDataNode)).ToHashSet();", - "\n uniqueLinks.Intersect(interDataNodeParameters.Keys).Count().Should().Be(uniqueLinks.Count());", - "\n ", - "\n //CheckInnerDictionaries", - "\n var currentYearData = testData.Where(x => x.Year == currentYear);", - "\n var previousYearData = testData.Where(x => x.Year == previousYear);", - "\n ", - "\n var errors = new List();", - "\n foreach(var dn in uniqueLinks)", - "\n {", - "\n //Set up BM counts", - "\n var currentLinks = currentYearData.Select(x => x.DataNode).Concat(currentYearData.Select(x => x.LinkedDataNode));", - "\n var currentLinksCount = currentLinks.Where(x => x == dn).Count();", - "\n var prevlinks = previousYearData.Select(x => x.DataNode).Concat(previousYearData.Select(x => x.LinkedDataNode));", - "\n var previousLinksCount = prevlinks.Where(x => x == dn).Count();", - "\n ", - "\n //Current Period", - "\n var computedCount = interDataNodeParameters[dn][CurrentPeriod].Count();", - "\n", - "\n if (currentYearData.Any())", - "\n {", - "\n if(computedCount != currentLinksCount)", - "\n errors.Add( $\"Current DataNode parameter count for {dn} not matching:\\n Expected {currentLinksCount} \\n Computed {computedCount}.\" );", - "\n }", - "\n else if(computedCount != previousLinksCount)", - "\n errors.Add( $\"Current DataNode parameter count for {dn} not matching:\\n Expected {previousLinksCount} \\n Computed {computedCount}.\" );", - "\n ", - "\n foreach (var param in interDataNodeParameters[dn][CurrentPeriod])", - "\n {", - "\n var linkedDn = param.DataNode == dn ? param.LinkedDataNode : param.DataNode;", - "\n var isLinkInPrevPeriod = previousYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn);", - "\n var isLinkInCurrPeriod = currentYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn); ", - "\n ", - "\n if(isLinkInPrevPeriod && !isLinkInCurrPeriod)", - "\n { ", - "\n if (param.ReinsuranceCoverage != ((double)previousYear)/1000)", - "\n errors.Add( $\"Current Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)previousYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", - "\n }", - "\n else if( param.ReinsuranceCoverage != ((double)currentYear)/1000)", - "\n errors.Add( $\"Current Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)currentYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", - "\n }", - "\n", - "\n //Previous Period", - "\n computedCount = interDataNodeParameters[dn][PreviousPeriod].Count();", - "\n ", - "\n if (currentYearData.Any())", - "\n {", - "\n if(computedCount != currentLinksCount)", - "\n errors.Add( $\"Previous DataNode parameter count for {dn} not matching:\\n Expected {currentLinksCount} \\n Computed {computedCount}.\" );", - "\n }", - "\n else if(computedCount != previousLinksCount)", - "\n errors.Add( $\"Previous DataNode parameter count for {dn} not matching:\\n Expected {previousLinksCount} \\n Computed {computedCount}.\" );", - "\n ", - "\n foreach (var param in interDataNodeParameters[dn][PreviousPeriod])", - "\n {", - "\n var linkedDn = param.DataNode == dn ? param.LinkedDataNode : param.DataNode;", - "\n var isLinkInPrevPeriod = previousYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn);", - "\n var isLinkInCurrPeriod = currentYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn); ", - "\n ", - "\n if(!isLinkInPrevPeriod && isLinkInCurrPeriod)", - "\n { ", - "\n if (param.ReinsuranceCoverage != ((double)currentYear)/1000)", - "\n errors.Add( $\"Previous Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)currentYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", - "\n }", - "\n else if( param.ReinsuranceCoverage != ((double)previousYear)/1000)", - "\n errors.Add( $\"Previous Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)previousYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", - "\n }", - "\n }", - "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", - "\n ", - "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "aOH89OGU5Eqn4PeSnUbJrw", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nint previousYear = 2019;", - "\nvar testData = new InterDataNodeParameter[] ", - "\n {new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", - "\n new InterDataNodeParameter{ DataNode = gic2, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", - "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", - "\n };", - "\n", - "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "cT_97C9oW0KF2qH_aG7Scw", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nint previousYear = 2019;", - "\nint currentYear = 2020;", - "\nvar testData = new InterDataNodeParameter[] ", - "\n {", - "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", - "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", - "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 9},", - "\n new InterDataNodeParameter{ DataNode = gic2, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 9}, ", - "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 9}, ", - "\n };", - "\n", - "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kJbew987pkum2Ge25tpsHQ", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nint previousYear = 2019;", - "\nint currentYear = 2020;", - "\nvar testData = new InterDataNodeParameter[] ", - "\n {", - "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", - "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", - "\n };", - "\n", - "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "IWMBAFYZpUaB-vgsMrm8dg", - "cell_type": "code", - "source": [ - "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nint previousYear = 2019;", - "\nint currentYear = 2020;", - "\nvar testData = new InterDataNodeParameter[] ", - "\n {", - "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 3}, ", - "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 3}, ", - "\n };", - "\n", - "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jtX2WSn4c02WOwMQ-oKUqQ", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Utils/UtilityMethods\"" + ] + }, + { + "cell_type": "code", + "source": [ + "var gic = \"DT1.1\";" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Load Current and Previous Parameter for Yield Curve" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(Args args, IEnumerable testData, ", + "\n (int Year, int Month) expectedCurrentPeriod, ", + "\n (int Year, int Month) expectedPreviousPeriod)", + "\n{", + "\n await Workspace.UpdateAsync(testData);", + "\n var eurCurrentAndPreviousYieldCurve = (await Workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Currency))[\"EUR\"];", + "\n ", + "\n //Check Current Period", + "\n eurCurrentAndPreviousYieldCurve[CurrentPeriod].Year.Should().Be(expectedCurrentPeriod.Year);", + "\n eurCurrentAndPreviousYieldCurve[CurrentPeriod].Month.Should().Be(expectedCurrentPeriod.Month);", + "\n ", + "\n //Check Previous Period", + "\n eurCurrentAndPreviousYieldCurve[PreviousPeriod].Year.Should().Be(expectedPreviousPeriod.Year);", + "\n eurCurrentAndPreviousYieldCurve[PreviousPeriod].Month.Should().Be(expectedPreviousPeriod.Month);", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2020, 9),(2020, 9));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2019, 12), (2019, 12));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2020, 6));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9), (2020, 9));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9), (2019, 9));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12), (2019, 12));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2018, Month = 9}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12), (2019, 12));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 6}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 9},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 6}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 6), (2019, 6));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2015, Month = 9},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2016, 3));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2021, Month = 9},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3}};", + "\n", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2016, 3));" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Data Node State Query" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckLoadDataNodeStateAsync(Args args, IEnumerable testData, bool isExpectedToBeActive)", + "\n{", + "\n await Workspace.UpdateAsync(testData);", + "\n var isActive = (await Workspace.LoadDataNodeStateAsync(args)).Keys.Contains(gic);", + "\n ", + "\n isActive.Should().Be(isExpectedToBeActive);", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", + "\nvar testData = new DataNodeState[] {new DataNodeState{ DataNode = gic, Year = 2019, Month = 12, State = State.Active },", + "\n new DataNodeState{ DataNode = gic, Year = 2020, Month = 6, State = State.Inactive }};", + "\nawait CheckLoadDataNodeStateAsync(args, testData, false);" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", + "\nvar testData = new DataNodeState[] {new DataNodeState{ DataNode = gic, Year = 2020, Month = 3, State = State.Active },", + "\n new DataNodeState{ DataNode = gic, Year = 2020, Month = 9, State = State.Inactive }};", + "\nawait CheckLoadDataNodeStateAsync(args, testData, false);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Load Yield Curve" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckLoadYieldCurveAsync(Args args, IEnumerable testData, ", + "\n (int year , int month) dataNodeYearAndMonth, ", + "\n double expectedCurrentPreviousFirstYcValue,", + "\n double expectedCurrentFirstYcValue,", + "\n double expectedLockedFirstYcValue)", + "\n{", + "\n await Workspace.UpdateAsync(testData);", + "\n await Workspace.UpdateAsync(new ReportingNode[]{new ReportingNode{Currency=\"EUR\",SystemName=\"CH\"}});", + "\n ", + "\n var dataNodes = new DataNodeData[]{new DataNodeData{ValuationApproach=\"BBA\", Year = dataNodeYearAndMonth.year, Month = dataNodeYearAndMonth.month, DataNode = gic, ContractualCurrency = \"EUR\"}};", + "\n var eurLockedYieldCurve = (await LoadLockedInYieldCurveAsync(Workspace, args, dataNodes));", + "\n var eurCurrentYieldCurve = (await LoadCurrentYieldCurveAsync(Workspace, args, dataNodes));", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n ", + "\n var errors = new List();", + "\n var currentPrevPeriod = eurCurrentYieldCurve[\"EUR\"][PreviousPeriod].Values.First();", + "\n if(Math.Abs(currentPrevPeriod - expectedCurrentPreviousFirstYcValue) > 1E-8)", + "\n errors.Add( $\"Current YieldCurve for Previous Period not matching:\\n Expected {expectedCurrentPreviousFirstYcValue} \\n Computed {currentPrevPeriod}.\" );", + "\n ", + "\n var currentCurrPeriod = eurCurrentYieldCurve[\"EUR\"][CurrentPeriod].Values.First();", + "\n if(Math.Abs(currentCurrPeriod - expectedCurrentFirstYcValue) > 1E-8)", + "\n errors.Add( $\"Current YieldCurve for Current Period not matching:\\n Expected {expectedCurrentFirstYcValue} \\n Computed {currentCurrPeriod}.\" );", + "\n ", + "\n var lockedYc = eurLockedYieldCurve[gic].Values.First();", + "\n if(Math.Abs(lockedYc - expectedLockedFirstYcValue) > 1E-8)", + "\n errors.Add( $\"LockedIn YieldCurve not matching:\\n Expected {expectedLockedFirstYcValue} \\n Computed {lockedYc}.\" );", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors)); ", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Values = new double[]{0.1,0.2,0.3,0.4,0.5,0.6} }, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3, Values = new double[]{2.1,2.2,2.3,2.4,2.5,2.6} }, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2021, Month = 9, Values = new double[]{4.1,4.2,4.3,4.4,4.5,4.6} },", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3, Values = new double[]{6.1,6.2,6.3,6.4,6.5,6.6} }};", + "\n", + "\nawait CheckLoadYieldCurveAsync(args, testData, (2016, 6), 6.1, 0.1, 6.1);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Load Data Node Parameter" + ] + }, + { + "cell_type": "code", + "source": [ + "var gic2 = \"gic2\";", + "\nvar xgic = \"xgic\";", + "\nvar gric1 = \"gric1\";" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckLoadInterDataNodeParameterAsync(Args args, IEnumerable testData, ", + "\n int previousYear,", + "\n int? currentYear = null)", + "\n{", + "\n currentYear = currentYear ?? previousYear;", + "\n await Workspace.UpdateAsync(testData);", + "\n ", + "\n var interDataNodeParameters = await LoadInterDataNodeParametersAsync(Workspace, args);", + "\n ", + "\n //Check Keys", + "\n var uniqueLinks = testData.Select(x => x.DataNode).Concat(testData.Select(x => x.LinkedDataNode)).ToHashSet();", + "\n uniqueLinks.Intersect(interDataNodeParameters.Keys).Count().Should().Be(uniqueLinks.Count());", + "\n ", + "\n //CheckInnerDictionaries", + "\n var currentYearData = testData.Where(x => x.Year == currentYear);", + "\n var previousYearData = testData.Where(x => x.Year == previousYear);", + "\n ", + "\n var errors = new List();", + "\n foreach(var dn in uniqueLinks)", + "\n {", + "\n //Set up BM counts", + "\n var currentLinks = currentYearData.Select(x => x.DataNode).Concat(currentYearData.Select(x => x.LinkedDataNode));", + "\n var currentLinksCount = currentLinks.Where(x => x == dn).Count();", + "\n var prevlinks = previousYearData.Select(x => x.DataNode).Concat(previousYearData.Select(x => x.LinkedDataNode));", + "\n var previousLinksCount = prevlinks.Where(x => x == dn).Count();", + "\n ", + "\n //Current Period", + "\n var computedCount = interDataNodeParameters[dn][CurrentPeriod].Count();", + "\n", + "\n if (currentYearData.Any())", + "\n {", + "\n if(computedCount != currentLinksCount)", + "\n errors.Add( $\"Current DataNode parameter count for {dn} not matching:\\n Expected {currentLinksCount} \\n Computed {computedCount}.\" );", + "\n }", + "\n else if(computedCount != previousLinksCount)", + "\n errors.Add( $\"Current DataNode parameter count for {dn} not matching:\\n Expected {previousLinksCount} \\n Computed {computedCount}.\" );", + "\n ", + "\n foreach (var param in interDataNodeParameters[dn][CurrentPeriod])", + "\n {", + "\n var linkedDn = param.DataNode == dn ? param.LinkedDataNode : param.DataNode;", + "\n var isLinkInPrevPeriod = previousYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn);", + "\n var isLinkInCurrPeriod = currentYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn); ", + "\n ", + "\n if(isLinkInPrevPeriod && !isLinkInCurrPeriod)", + "\n { ", + "\n if (param.ReinsuranceCoverage != ((double)previousYear)/1000)", + "\n errors.Add( $\"Current Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)previousYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", + "\n }", + "\n else if( param.ReinsuranceCoverage != ((double)currentYear)/1000)", + "\n errors.Add( $\"Current Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)currentYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", + "\n }", + "\n", + "\n //Previous Period", + "\n computedCount = interDataNodeParameters[dn][PreviousPeriod].Count();", + "\n ", + "\n if (currentYearData.Any())", + "\n {", + "\n if(computedCount != currentLinksCount)", + "\n errors.Add( $\"Previous DataNode parameter count for {dn} not matching:\\n Expected {currentLinksCount} \\n Computed {computedCount}.\" );", + "\n }", + "\n else if(computedCount != previousLinksCount)", + "\n errors.Add( $\"Previous DataNode parameter count for {dn} not matching:\\n Expected {previousLinksCount} \\n Computed {computedCount}.\" );", + "\n ", + "\n foreach (var param in interDataNodeParameters[dn][PreviousPeriod])", + "\n {", + "\n var linkedDn = param.DataNode == dn ? param.LinkedDataNode : param.DataNode;", + "\n var isLinkInPrevPeriod = previousYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn);", + "\n var isLinkInCurrPeriod = currentYearData.Any(x => x.DataNode == dn && x.LinkedDataNode == linkedDn || x.DataNode == linkedDn && x.LinkedDataNode == dn); ", + "\n ", + "\n if(!isLinkInPrevPeriod && isLinkInCurrPeriod)", + "\n { ", + "\n if (param.ReinsuranceCoverage != ((double)currentYear)/1000)", + "\n errors.Add( $\"Previous Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)currentYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", + "\n }", + "\n else if( param.ReinsuranceCoverage != ((double)previousYear)/1000)", + "\n errors.Add( $\"Previous Reinsurance Coverage for {dn} linked to {linkedDn} not matching:\\n Expected {((double)previousYear)/1000} \\n Computed {param.ReinsuranceCoverage}.\" );", + "\n }", + "\n }", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nint previousYear = 2019;", + "\nvar testData = new InterDataNodeParameter[] ", + "\n {new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gic2, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n };", + "\n", + "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear);" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nint previousYear = 2019;", + "\nint currentYear = 2020;", + "\nvar testData = new InterDataNodeParameter[] ", + "\n {", + "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 9},", + "\n new InterDataNodeParameter{ DataNode = gic2, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 9}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 9}, ", + "\n };", + "\n", + "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nint previousYear = 2019;", + "\nint currentYear = 2020;", + "\nvar testData = new InterDataNodeParameter[] ", + "\n {", + "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)previousYear)/1000, Year = previousYear, Month = 3}, ", + "\n };", + "\n", + "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", + "\nint previousYear = 2019;", + "\nint currentYear = 2020;", + "\nvar testData = new InterDataNodeParameter[] ", + "\n {", + "\n new InterDataNodeParameter{ DataNode = gic, LinkedDataNode = gric1, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 3}, ", + "\n new InterDataNodeParameter{ DataNode = gric1, LinkedDataNode = xgic, ReinsuranceCoverage = ((double)currentYear)/1000, Year = currentYear, Month = 3}, ", + "\n };", + "\n", + "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/ReportStorageTest.ipynb b/Test/ReportStorageTest.ipynb index 58850654..4d728148 100644 --- a/Test/ReportStorageTest.ipynb +++ b/Test/ReportStorageTest.ipynb @@ -1,127 +1,97 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "-CZo3x5cFEuDFZgs0uV9Bg", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Report/ReportStorage\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uXciD3hgUUqyPIiuAEQo3g", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tdRjnVvg9UaWMh368aBZ3g", - "cell_type": "markdown", - "source": [ - "# Test Exchange Rate Query" - ], - "metadata": {} - }, - { - "id": "j4bt5YUenkeFF2iakkxvgg", - "cell_type": "code", - "source": [ - "Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bd3JNWC5Nk2uaw14n6g2xQ", - "cell_type": "code", - "source": [ - "public async Task CheckGetFx(string currentCurrency, string targetCurrency, int year, int month, IEnumerable testData, double fxBOPBenchmark, double fxAVGBenchmark, double fxEOPBenchmark)", - "\n{", - "\n await Workspace.UpdateAsync(testData);", - "\n ", - "\n //Create report storage", - "\n var period = (year, month);", - "\n var reportStorage = new ReportStorage(Workspace, Report);", - "\n await reportStorage.InitializeReportIndependentCacheAsync();", - "\n await reportStorage.InitializeAsync(period, \"G\", null, CurrencyType.Contractual);", - "\n ", - "\n var fxBOP = reportStorage.GetFx(period, currentCurrency, targetCurrency, FxPeriod.BeginningOfPeriod);", - "\n var fxAVG = reportStorage.GetFx(period, currentCurrency, targetCurrency, FxPeriod.Average);", - "\n var fxEOP = reportStorage.GetFx(period, currentCurrency, targetCurrency, FxPeriod.EndOfPeriod);", - "\n ", - "\n //Check FX rates", - "\n fxBOP.Should().Be(fxBOPBenchmark);", - "\n fxAVG.Should().Be(fxAVGBenchmark);", - "\n fxEOP.Should().Be(fxEOPBenchmark);", - "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "P6Lb3Bg1-ECmcI2_hG1fyQ", - "cell_type": "code", - "source": [ - "var testData = new ExchangeRate[] {new ExchangeRate{ Currency = \"EUR\", Year = 2020, Month = 12, FxType = FxType.Spot, FxToGroupCurrency = 10 }, ", - "\n new ExchangeRate{ Currency = \"EUR\", Year = 2021, Month = 3, FxType = FxType.Spot, FxToGroupCurrency = 15 },", - "\n new ExchangeRate{ Currency = \"EUR\", Year = 2021, Month = 6, FxType = FxType.Average, FxToGroupCurrency = 20 },", - "\n new ExchangeRate{ Currency = \"EUR\", Year = 2021, Month = 6, FxType = FxType.Spot, FxToGroupCurrency = 30 },", - "\n new ExchangeRate{ Currency = \"USD\", Year = 2020, Month = 12, FxType = FxType.Spot, FxToGroupCurrency = 5 },", - "\n new ExchangeRate{ Currency = \"USD\", Year = 2021, Month = 6, FxType = FxType.Average, FxToGroupCurrency = 2 },", - "\n new ExchangeRate{ Currency = \"USD\", Year = 2021, Month = 6, FxType = FxType.Spot, FxToGroupCurrency = 0.5 }};", - "\nawait CheckGetFx(\"EUR\", \"USD\", 2021, 6, testData, 2, 10, 60);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "OncbMvm_E0OazTHlWRs1yQ", - "cell_type": "code", - "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "h7lqAB05-0eTTOzD9xJS2g", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Report/ReportStorage\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Exchange Rate Query" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization());" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckGetFx(string currentCurrency, string targetCurrency, int year, int month, IEnumerable testData, double fxBOPBenchmark, double fxAVGBenchmark, double fxEOPBenchmark)", + "\n{", + "\n await Workspace.UpdateAsync(testData);", + "\n ", + "\n //Create report storage", + "\n var period = (year, month);", + "\n var reportStorage = new ReportStorage(Workspace, Report);", + "\n await reportStorage.InitializeReportIndependentCacheAsync();", + "\n await reportStorage.InitializeAsync(period, \"G\", null, CurrencyType.Contractual);", + "\n ", + "\n var fxBOP = reportStorage.GetFx(period, currentCurrency, targetCurrency, FxPeriod.BeginningOfPeriod);", + "\n var fxAVG = reportStorage.GetFx(period, currentCurrency, targetCurrency, FxPeriod.Average);", + "\n var fxEOP = reportStorage.GetFx(period, currentCurrency, targetCurrency, FxPeriod.EndOfPeriod);", + "\n ", + "\n //Check FX rates", + "\n fxBOP.Should().Be(fxBOPBenchmark);", + "\n fxAVG.Should().Be(fxAVGBenchmark);", + "\n fxEOP.Should().Be(fxEOPBenchmark);", + "\n ", + "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var testData = new ExchangeRate[] {new ExchangeRate{ Currency = \"EUR\", Year = 2020, Month = 12, FxType = FxType.Spot, FxToGroupCurrency = 10 }, ", + "\n new ExchangeRate{ Currency = \"EUR\", Year = 2021, Month = 3, FxType = FxType.Spot, FxToGroupCurrency = 15 },", + "\n new ExchangeRate{ Currency = \"EUR\", Year = 2021, Month = 6, FxType = FxType.Average, FxToGroupCurrency = 20 },", + "\n new ExchangeRate{ Currency = \"EUR\", Year = 2021, Month = 6, FxType = FxType.Spot, FxToGroupCurrency = 30 },", + "\n new ExchangeRate{ Currency = \"USD\", Year = 2020, Month = 12, FxType = FxType.Spot, FxToGroupCurrency = 5 },", + "\n new ExchangeRate{ Currency = \"USD\", Year = 2021, Month = 6, FxType = FxType.Average, FxToGroupCurrency = 2 },", + "\n new ExchangeRate{ Currency = \"USD\", Year = 2021, Month = 6, FxType = FxType.Spot, FxToGroupCurrency = 0.5 }};", + "\nawait CheckGetFx(\"EUR\", \"USD\", 2021, 6, testData, 2, 10, 60);" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/ReportVariablesTest.ipynb b/Test/ReportVariablesTest.ipynb index 343f3835..eb31bd44 100644 --- a/Test/ReportVariablesTest.ipynb +++ b/Test/ReportVariablesTest.ipynb @@ -1,256 +1,182 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "LQUN8dM-FUOLRRCNCCfefg", - "cell_type": "markdown", - "source": [ - "

Test Reports

" - ], - "metadata": {} - }, - { - "id": "FeOU5sOWxUCzzbh-gAXjpQ", - "cell_type": "markdown", - "source": [ - "# Infrastructure and Configuration" - ], - "metadata": {} - }, - { - "id": "eULpl26ryUODapYZKqPsAg", - "cell_type": "markdown", - "source": [ - "## Imports and Configurations" - ], - "metadata": {} - }, - { - "id": "v68OhAZHnkmBFLc4VS_Wsg", - "cell_type": "code", - "source": [ - "#r \"nuget:FluentAssertions\" " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "S5Jab8aqL0q_0yz2NvANCg", - "cell_type": "code", - "source": [ - "#!import \"ReportVariablesTestBase\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "T5-epYkxdESEdRkeQzPZ-Q", - "cell_type": "markdown", - "source": [ - "## Initialize Workspace" - ], - "metadata": {} - }, - { - "id": "MjO2BvvAS0e4HFtBefzQiQ", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WYaoK2llRES_PV3X7rt7dw", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LPEQPX6GkU6oZRTDNeu9gg", - "cell_type": "markdown", - "source": [ - "## Storage" - ], - "metadata": {} - }, - { - "id": "iyzfnUDQkE-IFlJDJhToWg", - "cell_type": "code", - "source": [ - "var reportStorage = new ReportStorage(Workspace, Report);", - "\nawait reportStorage.InitializeReportIndependentCacheAsync();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "PFEVTLIKUE6H0KLbPCp60w", - "cell_type": "markdown", - "source": [ - "## Configurations" - ], - "metadata": {} - }, - { - "id": "0JhPAc6LX0Wa6M-BQfsrPw", - "cell_type": "code", - "source": [ - "var path = \"./Data/ReportVariableBenchmarks/\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XutzHhUA00KlM1bajdW_IQ", - "cell_type": "code", - "source": [ - "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args;", - "\nICollection scopesData;", - "\nICollection benchmarkData;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WTg65cXwoUC2csjHSFzPfw", - "cell_type": "markdown", - "source": [ - "# Test Cases" - ], - "metadata": {} - }, - { - "id": "7rnaJC3nVkGkge79ibM8KA", - "cell_type": "markdown", - "source": [ - "## ((2020, 12), \"CH\", null, CurrencyType.Contractual)" - ], - "metadata": {} - }, - { - "id": "E34nYeT2ckKrYWP3mxgc2g", - "cell_type": "code", - "source": [ - "args = ((2020, 12), \"CH\", null, CurrencyType.Contractual);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uBf_ViTSUUe1CC5J5UfWHA", - "cell_type": "code", - "source": [ - "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", - "\nbenchmarkData = await GetBenchmarkDataAsync(args, path, Workspace, Import);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZB0QEVnuHUWzFbp6xXyVdg", - "cell_type": "code", - "source": [ - "scopesData.Should().BeEquivalentTo(benchmarkData,", - "\n options => options", - "\n //.ComparingRecordsByValue()", - "\n .ComparingRecordsByMembers() ", - "\n //.ComparingByMembers()", - "\n //.ComparingByValue()", - "\n //.Excluding(o => o.Value)", - "\n .Using(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, BenchmarkPrecision))", - "\n .WhenTypeIs()", - "\n );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "g026nTeHy0a1vC2J5XM87g", - "cell_type": "markdown", - "source": [ - "## ((2021, 3), \"CH\", null, CurrencyType.Contractual)" - ], - "metadata": {} - }, - { - "id": "D7qV0NdVHE2Kdk6uavXIKw", - "cell_type": "code", - "source": [ - "args = ((2021, 3), \"CH\", null, CurrencyType.Contractual);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZYBQRO7yZ02UzX2eYt7Vnw", - "cell_type": "code", - "source": [ - "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", - "\nbenchmarkData = await GetBenchmarkDataAsync(args, path, Workspace, Import);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "age1izMU1EmhYYO6S_LhWw", - "cell_type": "code", - "source": [ - "scopesData.Should().BeEquivalentTo(benchmarkData,", - "\n options => options", - "\n //.ComparingRecordsByValue()", - "\n .ComparingRecordsByMembers() ", - "\n //.ComparingByMembers()", - "\n //.ComparingByValue()", - "\n //.Excluding(o => o.Value)", - "\n .Using(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, Precision))", - "\n .WhenTypeIs()", - "\n );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dl7B6Z5qnEWoD8LTXhUAYw", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Test Reports

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Infrastructure and Configuration" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Imports and Configurations" + ] + }, + { + "cell_type": "code", + "source": [ + "#r \"nuget:FluentAssertions\" " + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"ReportVariablesTestBase\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Initialize Workspace" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Storage" + ] + }, + { + "cell_type": "code", + "source": [ + "var reportStorage = new ReportStorage(Workspace, Report);", + "\nawait reportStorage.InitializeReportIndependentCacheAsync();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Configurations" + ] + }, + { + "cell_type": "code", + "source": [ + "var path = \"./Data/ReportVariableBenchmarks/\";" + ] + }, + { + "cell_type": "code", + "source": [ + "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args;", + "\nICollection scopesData;", + "\nICollection benchmarkData;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test Cases" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## ((2020, 12), \"CH\", null, CurrencyType.Contractual)" + ] + }, + { + "cell_type": "code", + "source": [ + "args = ((2020, 12), \"CH\", null, CurrencyType.Contractual);" + ] + }, + { + "cell_type": "code", + "source": [ + "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", + "\nbenchmarkData = await GetBenchmarkDataAsync(args, path, Workspace, Import);" + ] + }, + { + "cell_type": "code", + "source": [ + "scopesData.Should().BeEquivalentTo(benchmarkData,", + "\n options => options", + "\n //.ComparingRecordsByValue()", + "\n .ComparingRecordsByMembers() ", + "\n //.ComparingByMembers()", + "\n //.ComparingByValue()", + "\n //.Excluding(o => o.Value)", + "\n .Using(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, BenchmarkPrecision))", + "\n .WhenTypeIs()", + "\n );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## ((2021, 3), \"CH\", null, CurrencyType.Contractual)" + ] + }, + { + "cell_type": "code", + "source": [ + "args = ((2021, 3), \"CH\", null, CurrencyType.Contractual);" + ] + }, + { + "cell_type": "code", + "source": [ + "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", + "\nbenchmarkData = await GetBenchmarkDataAsync(args, path, Workspace, Import);" + ] + }, + { + "cell_type": "code", + "source": [ + "scopesData.Should().BeEquivalentTo(benchmarkData,", + "\n options => options", + "\n //.ComparingRecordsByValue()", + "\n .ComparingRecordsByMembers() ", + "\n //.ComparingByMembers()", + "\n //.ComparingByValue()", + "\n //.Excluding(o => o.Value)", + "\n .Using(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, Precision))", + "\n .WhenTypeIs()", + "\n );" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/ReportVariablesTestBase.ipynb b/Test/ReportVariablesTestBase.ipynb index e031e8d0..77732e98 100644 --- a/Test/ReportVariablesTestBase.ipynb +++ b/Test/ReportVariablesTestBase.ipynb @@ -1,161 +1,129 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "FYwy37yMNEeDl1kHPRFpKg", - "cell_type": "markdown", - "source": [ - "

Report Variable Test Base

" - ], - "metadata": {} - }, - { - "id": "3ZyHFOIosEyHCIUotySSVQ", - "cell_type": "code", - "source": [ - "#!import \"../Report/ReportScopes\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "injwhNjFM0Gd0wGXOWk0iw", - "cell_type": "markdown", - "source": [ - "# Helpers" - ], - "metadata": {} - }, - { - "id": "16zJY8-HwUWXMwwH0PDnKA", - "cell_type": "code", - "source": [ - "const string benchmarkFileNamePrefix = \"ReportVariableBenchmarks_\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "w93TGY8caEWby3AEWexMfw", - "cell_type": "code", - "source": [ - "static string GetBenchmarkFileName(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args) => args.ToString().Replace(\"(\", \"\").Replace(\")\", \"\").Replace(\" \", \"\").Replace(\",\", \"_\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "FN-2epLYEEi0XlPqNMZBmQ", - "cell_type": "markdown", - "source": [ - "# Calculated" - ], - "metadata": {} - }, - { - "id": "lpbvuOTZvkeSAcnrEI9kXQ", - "cell_type": "code", - "source": [ - "static ICollection GetScopesData(Systemorph.Vertex.Scopes.IScopeWithStorage universe, ICollection<(ReportIdentity, CurrencyType)> identities) {", - "\n ", - "\n var lockedBePvs = universe.GetScopes(identities).Aggregate().LockedBestEstimate;", - "\n var currentBePvs = universe.GetScopes(identities).Aggregate().CurrentBestEstimate; ", - "\n", - "\n var lockedRaPvs = universe.GetScopes(identities).Aggregate().LockedRiskAdjustment;", - "\n var currentRaPvs = universe.GetScopes(identities).Aggregate().CurrentRiskAdjustment;", - "\n", - "\n var writtenActuals = universe.GetScopes(identities).Aggregate().Written;", - "\n var advanceActuals = universe.GetScopes(identities).Aggregate().Advance;", - "\n var overdueActuals = universe.GetScopes(identities).Aggregate().Overdue;", - "\n", - "\n var deferrableActuals = universe.GetScopes(identities).Aggregate().Deferrals;", - "\n", - "\n var csm = universe.GetScopes(identities).Aggregate().Csm;", - "\n var lc = universe.GetScopes(identities).Aggregate().Lc;", - "\n var loreco = universe.GetScopes(identities).Aggregate().Loreco;", - "\n", - "\n var fp = universe.GetScopes(identities).Aggregate().FinancialPerformance;", - "\n ", - "\n return Enumerable.Empty()", - "\n .Concat(lockedBePvs) ", - "\n .Concat(currentBePvs)", - "\n .Concat(lockedRaPvs)", - "\n .Concat(currentRaPvs)", - "\n .Concat(writtenActuals)", - "\n .Concat(advanceActuals)", - "\n .Concat(overdueActuals)", - "\n .Concat(deferrableActuals)", - "\n .Concat(csm)", - "\n .Concat(lc)", - "\n .Concat(loreco)", - "\n .Concat(fp)", - "\n .OrderBy(v => v.GroupOfContract).ThenBy(v => v.Scenario).ThenBy(v => v.Projection).ThenBy(v => v.AccidentYear).ThenBy(v => v.EstimateType).ThenBy(v => (v.VariableType, v.Novelty))", - "\n .ToArray();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "GBx1EE3IREu7RPWu8iZFbg", - "cell_type": "code", - "source": [ - "static async Task> GetScopesDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, ReportStorage reportStorage, Systemorph.Vertex.Scopes.Proxy.IScopeFactory scopes ) {", - "\n await reportStorage.InitializeAsync(args.Period, args.ReportingNode, args.Scenario, args.CurrencyType);", - "\n var identities = reportStorage.GetIdentities(args.Period, args.ReportingNode, args.Scenario, args.CurrencyType);", - "\n var universe = scopes.ForSingleton().WithStorage(reportStorage).ToScope();", - "\n return GetScopesData(universe, identities);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "fkOXnPgChECva8WmF0hbaQ", - "cell_type": "markdown", - "source": [ - "# Benchmarks" - ], - "metadata": {} - }, - { - "id": "BJVbgmFieEGNehAotQ38Eg", - "cell_type": "code", - "source": [ - "static async Task> GetBenchmarkDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, string path, IWorkspace workspace, IImportVariable importVariable) {", - "\n var bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";", - "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario });", - "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario, Year = args.Period.Year, Month = args.Period.Month });", - "\n await importVariable.FromFile(path + bmFileName).WithType(x => x.SnapshotMode()).WithTarget(workspace).ExecuteAsync();", - "\n var ret = await workspace.Query().ToArrayAsync();", - "\n workspace.Reset(x => x.ResetCurrentPartitions().ResetType());", - "\n return ret;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Report Variable Test Base

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Report/ReportScopes\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Helpers" + ] + }, + { + "cell_type": "code", + "source": [ + "const string benchmarkFileNamePrefix = \"ReportVariableBenchmarks_\";" + ] + }, + { + "cell_type": "code", + "source": [ + "static string GetBenchmarkFileName(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args) => args.ToString().Replace(\"(\", \"\").Replace(\")\", \"\").Replace(\" \", \"\").Replace(\",\", \"_\");" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Calculated" + ] + }, + { + "cell_type": "code", + "source": [ + "static ICollection GetScopesData(Systemorph.Vertex.Scopes.IScopeWithStorage universe, ICollection<(ReportIdentity, CurrencyType)> identities) {", + "\n ", + "\n var lockedBePvs = universe.GetScopes(identities).Aggregate().LockedBestEstimate;", + "\n var currentBePvs = universe.GetScopes(identities).Aggregate().CurrentBestEstimate; ", + "\n", + "\n var lockedRaPvs = universe.GetScopes(identities).Aggregate().LockedRiskAdjustment;", + "\n var currentRaPvs = universe.GetScopes(identities).Aggregate().CurrentRiskAdjustment;", + "\n", + "\n var writtenActuals = universe.GetScopes(identities).Aggregate().Written;", + "\n var advanceActuals = universe.GetScopes(identities).Aggregate().Advance;", + "\n var overdueActuals = universe.GetScopes(identities).Aggregate().Overdue;", + "\n", + "\n var deferrableActuals = universe.GetScopes(identities).Aggregate().Deferrals;", + "\n", + "\n var csm = universe.GetScopes(identities).Aggregate().Csm;", + "\n var lc = universe.GetScopes(identities).Aggregate().Lc;", + "\n var loreco = universe.GetScopes(identities).Aggregate().Loreco;", + "\n", + "\n var fp = universe.GetScopes(identities).Aggregate().FinancialPerformance;", + "\n ", + "\n return Enumerable.Empty()", + "\n .Concat(lockedBePvs) ", + "\n .Concat(currentBePvs)", + "\n .Concat(lockedRaPvs)", + "\n .Concat(currentRaPvs)", + "\n .Concat(writtenActuals)", + "\n .Concat(advanceActuals)", + "\n .Concat(overdueActuals)", + "\n .Concat(deferrableActuals)", + "\n .Concat(csm)", + "\n .Concat(lc)", + "\n .Concat(loreco)", + "\n .Concat(fp)", + "\n .OrderBy(v => v.GroupOfContract).ThenBy(v => v.Scenario).ThenBy(v => v.Projection).ThenBy(v => v.AccidentYear).ThenBy(v => v.EstimateType).ThenBy(v => (v.VariableType, v.Novelty))", + "\n .ToArray();", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "static async Task> GetScopesDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, ReportStorage reportStorage, Systemorph.Vertex.Scopes.Proxy.IScopeFactory scopes ) {", + "\n await reportStorage.InitializeAsync(args.Period, args.ReportingNode, args.Scenario, args.CurrencyType);", + "\n var identities = reportStorage.GetIdentities(args.Period, args.ReportingNode, args.Scenario, args.CurrencyType);", + "\n var universe = scopes.ForSingleton().WithStorage(reportStorage).ToScope();", + "\n return GetScopesData(universe, identities);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Benchmarks" + ] + }, + { + "cell_type": "code", + "source": [ + "static async Task> GetBenchmarkDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, string path, IWorkspace workspace, IImportVariable importVariable) {", + "\n var bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";", + "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario });", + "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario, Year = args.Period.Year, Month = args.Period.Month });", + "\n await importVariable.FromFile(path + bmFileName).WithType(x => x.SnapshotMode()).WithTarget(workspace).ExecuteAsync();", + "\n var ret = await workspace.Query().ToArrayAsync();", + "\n workspace.Reset(x => x.ResetCurrentPartitions().ResetType());", + "\n return ret;", + "\n}" + ] + } + ] } \ No newline at end of file diff --git a/Test/SpecificationsFinancialPerformance.ipynb b/Test/SpecificationsFinancialPerformance.ipynb index 70570b54..6cf10521 100644 --- a/Test/SpecificationsFinancialPerformance.ipynb +++ b/Test/SpecificationsFinancialPerformance.ipynb @@ -1,1692 +1,1184 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "5nO38HYGpkascixiTUO0gw", - "cell_type": "markdown", - "source": [ - "

Financial Performance Specifications

" - ], - "metadata": {} - }, - { - "id": "YiqIuEZ5Ika8lHG2QytiBg", - "cell_type": "markdown", - "source": [ - "The aim of this notebook is to document the Financial Performance reporting system. The process is pictorially explained in the following flowchart. ", - "\n", - "\n", - "\n
", - "\n", - "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." - ], - "metadata": {} - }, - { - "id": "I_4NcYOLg0-FT87qtmCw5g", - "cell_type": "markdown", - "source": [ - "In the following the Dimensions, Parameters, Nominal Cashflows, and Actuals are imported from the corresponding csv files in Initialization/Systemorph/" - ], - "metadata": {} - }, - { - "id": "G0Y5GVas3k6z7nhLhKYi2A", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "SZwhFp3mkUKWwRMH8wcnKw", - "cell_type": "markdown", - "source": [ - "---" - ], - "metadata": {} - }, - { - "id": "FCPPVD5qb0edgdnX8gE5TA", - "cell_type": "markdown", - "source": [ - "# Process Data" - ], - "metadata": {} - }, - { - "id": "8kQa9wme2E2KwZMXm_jkRQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Current Period, Reporting Node and Currency Type" - ], - "metadata": {} - }, - { - "id": "9Mil10I7XUKS9qwodcQnJQ", - "cell_type": "markdown", - "source": [ - "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" - ], - "metadata": {} - }, - { - "id": "jycgHCLPSU6SsnQh_NqdXQ", - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Q1ptu1Ih6UqNipHCM9wrFw", - "cell_type": "markdown", - "source": [ - "and the type of Currency among Contractual, Functional, and Group" - ], - "metadata": {} - }, - { - "id": "W_q-kxke4kSXENWTI_sTDg", - "cell_type": "code", - "source": [ - "var currencyType = CurrencyType.Contractual ;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Z5gPrgd79kaIdxevViMb5Q", - "cell_type": "markdown", - "source": [ - "Import the Report definitions, initialize the Workspace and the Test Suite:" - ], - "metadata": {} - }, - { - "id": "jZs86CqBw0S_Ms4QvU6Yhg", - "cell_type": "code", - "source": [ - "#!import \"../Report/ReportScopes\"", - "\n#!import \"../Report/ReportConfigurationAndUtils\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "fsDoELzhOEKHVk0LvwG8lg", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "FwJCyVQlg0iyVa9GIObOVA", - "cell_type": "code", - "source": [ - "var period = (year, month) ;", - "\nvar reportStorage = new ReportStorage(Workspace, Report) ;", - "\nvar Test = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0H5JBXBojEmJX2J4YxoSKQ", - "cell_type": "code", - "source": [ - "await reportStorage.InitializeReportIndependentCacheAsync();", - "\nawait reportStorage.InitializeAsync(period, reportingNode, null, currencyType);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ljauWn5bzkePv8oz0hmmcw", - "cell_type": "markdown", - "source": [ - "## View list of Identities" - ], - "metadata": {} - }, - { - "id": "ROlx1yHrOkOcN8NoaWg_kQ", - "cell_type": "markdown", - "source": [ - "Based on the Cashflows imported, the list of all possible identities, i.e. combinations of valid Contractual and Functional Currencies, Liability Types, (Re)Insurance and Oci, is contructed and reported here below:" - ], - "metadata": {} - }, - { - "id": "FWlyPQurk0e7MxUr1_Vh4Q", - "cell_type": "code", - "source": [ - "var identities = reportStorage.GetIdentities(period, reportingNode, null, currencyType);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dQr4xO85AkW_XOGwRhp3Wg", - "cell_type": "code", - "source": [ - "identities" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8WK3-WqoVkKWxMmrunWCPw", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Report" - ], - "metadata": {} - }, - { - "id": "6SapvCdFR0Wa-5iw2O7bmA", - "cell_type": "markdown", - "source": [ - "Please select here below the target Data Node for executing the tests below:" - ], - "metadata": {} - }, - { - "id": "tnnSkBvTP0OcTweKBHRVwA", - "cell_type": "code", - "source": [ - "var dataNode = \"DT1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MaxaD_pix0qUJSHQFYw_Yg", - "cell_type": "markdown", - "source": [ - "The Group of Contract selected is:" - ], - "metadata": {} - }, - { - "id": "ojOHd0ltR0ysyqjaXBV7fA", - "cell_type": "code", - "source": [ - "var groupOfContract = (await Workspace.Query().Where(x => x.SystemName == dataNode).ToArrayAsync()).FirstOrDefault();", - "\ngroupOfContract" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2wrq4ud_nUywAVYp0c16ng", - "cell_type": "markdown", - "source": [ - "where ", - "\n- the **OciType** can be Default for contracts with non-zero OCI, and null otherwise, ", - "\n- the **Liability Type** can be LRC for Liability for Remaining Coverage, and LIC for Liability of Incurred Claims,", - "\n- the **Partner** can be null for Insurance contracts, or equal to the Partner System Name for Reinsurance contracts." - ], - "metadata": {} - }, - { - "id": "FLplPZmhH0uHoByRc9jzyw", - "cell_type": "markdown", - "source": [ - "The summary of the Financial Performance report is shown below" - ], - "metadata": {} - }, - { - "id": "PPVlpKTvE0utqi7d_6hsOA", - "cell_type": "code", - "source": [ - "Report.ForDataCube( Test.GetScopes(identities).Aggregate().FinancialPerformance.Filter((\"GroupOfContract\", dataNode)) )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", - "\n .SliceColumnsBy(CurrencyGrouper(currencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", - "\n .ToReport() with { Height = 600 }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Y6ExKbo35kizVyUzucL8tg", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Inspection" - ], - "metadata": {} - }, - { - "id": "mljPLFn_Vk699EW8NxaqFQ", - "cell_type": "markdown", - "source": [ - "## Fulfillment Cashflows" - ], - "metadata": {} - }, - { - "id": "fXAJiiBobE-8cIFXnwQW_g", - "cell_type": "markdown", - "source": [ - "The Fulfillment Cashflow (FCF) corresponds to the sum of the Best Estimate [Present Value](../Import/ImportScopeCalculation#current-and-locked) (PV) and the [Risk Adjustment](../Import/ImportScopeCalculation#risk-adjustment) (RA), both summed over Amounty Types, and both discounted with the Locked-In curve in the BBA valuation approach:", - "\n", - "\n$$", - "\n\\text{FCF}(\\text{AoC}) = \\text{PV Locked}(\\text{AoC})", - "\n\\bigg|_{\\substack{\\text{Non Attributable} \\\\ \\text{Amount Types} \\\\ \\text{excluded}}} ", - "\n+ \\text{RA Locked}(\\text{AoC}) ~.", - "\n$$" - ], - "metadata": {} - }, - { - "id": "EIByt77nt02vKJ6M7fbYPA", - "cell_type": "markdown", - "source": [ - "### Non Financial" - ], - "metadata": {} - }, - { - "id": "BeRPnXRcr0KgXSe9gOqr0w", - "cell_type": "markdown", - "source": [ - "The computed value for the non financial contribution to the FCF is" - ], - "metadata": {} - }, - { - "id": "Tpu5SaZ9GEGA3y-zQW_yHw", - "cell_type": "code", - "source": [ - "var computedDeltaFCF_nonFinancial = Test.GetScopes(identities).Aggregate()", - "\n .FpNonFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1lQULEdowk-gnCueOrvJrg", - "cell_type": "code", - "source": [ - "computedDeltaFCF_nonFinancial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "i4QyAGfVmEGE_5Igb2Z-LQ", - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the full list of FCFs" - ], - "metadata": {} - }, - { - "id": "qqBotvtEjE22aC7q0898qw", - "cell_type": "code", - "source": [ - "var FCFs = Test.GetScopes(identities).Aggregate().Fcf.Filter((\"GroupOfContract\", dataNode));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VzFxq-PplkGMBBeSgTqoVg", - "cell_type": "code", - "source": [ - "var deltaFCF = FCFs.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n FCFs.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "iNXYCe0l-U2neY7wtMwZ0Q", - "cell_type": "code", - "source": [ - "deltaFCF.Aggregate().Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yI_ySCVJT06znmYYyfM3zQ", - "cell_type": "code", - "source": [ - "var expectedDeltaFCF_nonFinancial = deltaFCF.Filter((\"VariableType\", \"!IA\"), ", - "\n (\"VariableType\", \"!YCU\"), ", - "\n (\"VariableType\", \"!CRU\") ).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kYVlMOqOrEeCvRN9BdzD5Q", - "cell_type": "code", - "source": [ - "expectedDeltaFCF_nonFinancial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vLdRwY5WPEeVSdEZ6mq5eg", - "cell_type": "markdown", - "source": [ - "For consistency, this term is taken with the minus sign" - ], - "metadata": {} - }, - { - "id": "1z_-jBHxPECdPV59L1zu3w", - "cell_type": "code", - "source": [ - "expectedDeltaFCF_nonFinancial.CheckEquality( -computedDeltaFCF_nonFinancial ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zLC_x5tXRkqCJb8ko1k1pw", - "cell_type": "markdown", - "source": [ - "### Financial" - ], - "metadata": {} - }, - { - "id": "8q-L68QoyUWnE_1p9I8GrQ", - "cell_type": "markdown", - "source": [ - "Conversely, the computed value for the financial contribution to the Fulfillment Cashflows (FCF) is" - ], - "metadata": {} - }, - { - "id": "unbfg7yEZkajmEbeDpLGbw", - "cell_type": "code", - "source": [ - "var computedDeltaFCF_Financial = Test.GetScopes(identities).Aggregate()", - "\n .FpFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1Z9AZCSrsUqNaYXcDtgG9g", - "cell_type": "code", - "source": [ - "computedDeltaFCF_Financial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QUKtT16YKECBrRssqHJ7iA", - "cell_type": "markdown", - "source": [ - "The independent recalculation of this value reads" - ], - "metadata": {} - }, - { - "id": "DBD46hb6jkmOuS8fF8AzNg", - "cell_type": "code", - "source": [ - "var expectedDeltaFCF_Financial = (deltaFCF.Filter((\"VariableType\", \"IA\")) +", - "\n deltaFCF.Filter((\"VariableType\", \"YCU\")) +", - "\n deltaFCF.Filter((\"VariableType\", \"CRU\")) ).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3Pml-0__90GYfwqGIkh8hA", - "cell_type": "code", - "source": [ - "expectedDeltaFCF_Financial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WeeGHMbfv0yDqvE0uspuwA", - "cell_type": "markdown", - "source": [ - "taking the minus sign into account" - ], - "metadata": {} - }, - { - "id": "Jy8LN1Jl9UW7ZFn61_0E7g", - "cell_type": "code", - "source": [ - "expectedDeltaFCF_Financial.CheckEquality( -computedDeltaFCF_Financial ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KdafoHd6V0WcBY3w-7FCNg", - "cell_type": "markdown", - "source": [ - "### Other Comprehensive Income" - ], - "metadata": {} - }, - { - "id": "WTWsM2t8ske9c6Qp4Sw6tw", - "cell_type": "markdown", - "source": [ - "The Other Comprehensive Income (OCI) term is by definition the sum of the financial contributions not related to the insurance sector.", - "\n", - "\nThe Default method to compute the OCI term is by subtracting the FCF computed with the *Locked-In* rates and the FCF computed with the *Current* rates. In this way the non insurance financial volatiliy of the economic input is relegated to the OCI. " - ], - "metadata": {} - }, - { - "id": "HFvK3TQALEyxtaqOa072RA", - "cell_type": "code", - "source": [ - "var computedDeltaFCF_OCI = Test.GetScopes(identities).Aggregate()", - "\n .OciFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KlV-XHswLUm60jAtrKXRxw", - "cell_type": "code", - "source": [ - "computedDeltaFCF_OCI" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "wLYM_5_Cw0agX8ngdpiJNw", - "cell_type": "markdown", - "source": [ - "The OCI contribution is zero when the OCI option is disabled for the [target Group of Contract](#report).", - "\n", - "\nHere below we follow the steps to calculate independently the OCI contribution " - ], - "metadata": {} - }, - { - "id": "jExIPgxaoEKHbQ0n1CCDlg", - "cell_type": "code", - "source": [ - "var DeltaFCF_Locked = deltaFCF.Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Fi1WFLVNokSI8kGpGrtSgg", - "cell_type": "code", - "source": [ - "var FCFs_current = Test.GetScopes(identities).Aggregate().CurrentFcf.Filter((\"GroupOfContract\", dataNode));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "08PqnzK1VkqrjayuXu29Gw", - "cell_type": "code", - "source": [ - "var DeltaFCF_Current = FCFs_current.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n FCFs_current.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2H7J_REURECEUakkHg3uZQ", - "cell_type": "code", - "source": [ - "var expectedDeltaFCF_OCI = DeltaFCF_Locked - DeltaFCF_Current.Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0bDk7FRhN0C2sRCzbkIzrQ", - "cell_type": "code", - "source": [ - "DeltaFCF_Locked" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "FG-gv68W_E2X5Duxt7tKlw", - "cell_type": "code", - "source": [ - "DeltaFCF_Current.Aggregate().Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HOaaRyAoI0CC6BerqeJ41Q", - "cell_type": "code", - "source": [ - "expectedDeltaFCF_OCI" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uTbfa8NPIUqm-o4eZSU8fw", - "cell_type": "code", - "source": [ - "expectedDeltaFCF_OCI.CheckEquality( computedDeltaFCF_OCI ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1IZSRJ3t_0CNXpp4ywd9VQ", - "cell_type": "markdown", - "source": [ - "## Contractual Service Margin" - ], - "metadata": {} - }, - { - "id": "5bsUEITa6kuGaTRVkZ084A", - "cell_type": "markdown", - "source": [ - "### Non Financial" - ], - "metadata": {} - }, - { - "id": "JTfLDJSJQEOWT2i89grUSQ", - "cell_type": "markdown", - "source": [ - "The computed value for the non financial change of the CSM is" - ], - "metadata": {} - }, - { - "id": "8ILRJFbhBUC62g15t754iQ", - "cell_type": "code", - "source": [ - "var computedDeltaCSM_nonFinancial = Test.GetScopes(identities).Aggregate()", - "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WKz0gPwLNU-dpX_9pel6qQ", - "cell_type": "code", - "source": [ - "computedDeltaCSM_nonFinancial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "M-zez2dNKEqoEuSnVmQOAQ", - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the full CSM data from which the delta can be computed:" - ], - "metadata": {} - }, - { - "id": "u3qO33HX2EWTdU-FsXV1DQ", - "cell_type": "code", - "source": [ - "var CSM = Test.GetScopes(identities).Aggregate().Csm.Filter((\"GroupOfContract\", dataNode));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "sUzTJENNQE2vyUAMH18-Fg", - "cell_type": "code", - "source": [ - "var deltaCSM = CSM.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n CSM.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YE8SeJsLGkigzdsg2lrthg", - "cell_type": "code", - "source": [ - "deltaCSM.Aggregate().Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "APgQnfCAvUGZOS1alGD76A", - "cell_type": "markdown", - "source": [ - "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" - ], - "metadata": {} - }, - { - "id": "RtFAIsTtqkKptF872l2QOA", - "cell_type": "code", - "source": [ - "var expectedDeltaCSM_nonFinancial = deltaCSM.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QIAfXjMAUkKl824oTIpkxg", - "cell_type": "code", - "source": [ - "expectedDeltaCSM_nonFinancial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ROYdG5qKq0WskXY9TubsCw", - "cell_type": "code", - "source": [ - "expectedDeltaCSM_nonFinancial.CheckEquality( -computedDeltaCSM_nonFinancial ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "B3v_a4ACR0aaHYEIZ5Efmw", - "cell_type": "markdown", - "source": [ - "### Financial" - ], - "metadata": {} - }, - { - "id": "XUhfK022zUq-fhkyjtdiRA", - "cell_type": "markdown", - "source": [ - "Conversely, the computed value for the financial change of the CSM is" - ], - "metadata": {} - }, - { - "id": "ni56W_02FkyqpCsEn8POig", - "cell_type": "code", - "source": [ - "var computedDeltaCSM_Financial = Test.GetScopes(identities).Aggregate()", - "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "UBEJvfmS9UOcouMKcyVlSA", - "cell_type": "code", - "source": [ - "computedDeltaCSM_Financial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TqRsmZIHlUqsIwggU5ok1w", - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" - ], - "metadata": {} - }, - { - "id": "60OowsZamEOXwPfjqtKINg", - "cell_type": "code", - "source": [ - "var expectedDeltaCSM_Financial = ( deltaCSM.Filter((\"VariableType\", \"IA\")) +", - "\n deltaCSM.Filter((\"VariableType\", \"YCU\")) +", - "\n deltaCSM.Filter((\"VariableType\", \"CRU\")) )", - "\n .Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "d89jwj04Ak-rvKD6GrFThw", - "cell_type": "code", - "source": [ - "expectedDeltaCSM_Financial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HZ5FzlG01U-9aaQvlx_cCQ", - "cell_type": "code", - "source": [ - "expectedDeltaCSM_Financial.CheckEquality( -computedDeltaCSM_Financial ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "q-EaVofzPkeq9BLkL6Pk2w", - "cell_type": "markdown", - "source": [ - "## Loss Component" - ], - "metadata": {} - }, - { - "id": "LE5bZlbq_UWJBvszrykzuA", - "cell_type": "markdown", - "source": [ - "### Non Financial" - ], - "metadata": {} - }, - { - "id": "lFKLvci1FUOz6Q0a40u2-A", - "cell_type": "markdown", - "source": [ - "The computed value for the non financial change of the LC is" - ], - "metadata": {} - }, - { - "id": "NA8SeqEo5EiJhDQHBuTtjg", - "cell_type": "code", - "source": [ - "var computedDeltaLC_nonFinancial = Test.GetScopes(identities).Aggregate()", - "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yoNwfY6O-EGOYvwfX9CXKw", - "cell_type": "code", - "source": [ - "computedDeltaLC_nonFinancial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "wQpKhvuttU2S-2T2XqWz9g", - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the full CSM data from which the delta can be computed:" - ], - "metadata": {} - }, - { - "id": "ZnNiktkIsEmVeTAPp4eq0Q", - "cell_type": "code", - "source": [ - "var LC = Test.GetScopes(identities).Aggregate().Lc.Filter((\"GroupOfContract\", dataNode));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XRtrMck4ak-bF1LUNbR-bw", - "cell_type": "code", - "source": [ - "var deltaLC = LC.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n LC.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "rUaX0OrwkUuo2_xNMVz34g", - "cell_type": "code", - "source": [ - "deltaLC.Aggregate().Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Xv4auAOkAE6oXxsy4JGUBw", - "cell_type": "markdown", - "source": [ - "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" - ], - "metadata": {} - }, - { - "id": "c95lLlyhYU2YCY4HE8ZVIg", - "cell_type": "code", - "source": [ - "var expectedDeltaLC_nonFinancial = deltaLC.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qmlrXNV4n0iOMmSFHVe7wA", - "cell_type": "code", - "source": [ - "expectedDeltaLC_nonFinancial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "k_hU6dAGrEmzN3vI30De0A", - "cell_type": "code", - "source": [ - "expectedDeltaLC_nonFinancial.CheckEquality( -computedDeltaLC_nonFinancial ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "q0Cm5RmXxUa4oQVQ1fuHjw", - "cell_type": "markdown", - "source": [ - "### Financial" - ], - "metadata": {} - }, - { - "id": "cAJ4Q4Rx60aaCC-Nt-gdpQ", - "cell_type": "markdown", - "source": [ - "Conversely, the computed value for the financial change of the LC is" - ], - "metadata": {} - }, - { - "id": "MtdwhbqZiU-TOLVfW0DFDg", - "cell_type": "code", - "source": [ - "var computedDeltaLC_Financial = Test.GetScopes(identities).Aggregate()", - "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "cWArdm8iMESr118b9tDMkQ", - "cell_type": "code", - "source": [ - "computedDeltaLC_Financial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "q2pAhq-A_0aROq8zEDtVCA", - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" - ], - "metadata": {} - }, - { - "id": "fxZPPdSMCkG-mV0CjyLK4g", - "cell_type": "code", - "source": [ - "var expectedDeltaLC_Financial = ( deltaLC.Filter((\"VariableType\", \"IA\")) +", - "\n deltaLC.Filter((\"VariableType\", \"YCU\")) +", - "\n deltaLC.Filter((\"VariableType\", \"CRU\")) )", - "\n .Aggregate().Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WYqhArIhB0aUgSAq2pl4Ag", - "cell_type": "code", - "source": [ - "expectedDeltaLC_Financial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "IzddiJL3oUewH76M1wgr1w", - "cell_type": "code", - "source": [ - "expectedDeltaLC_Financial.CheckEquality( -computedDeltaLC_Financial ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ktY-cyI15E-U1ahdw6cDuA", - "cell_type": "markdown", - "source": [ - "## Loss Recovery Component" - ], - "metadata": {} - }, - { - "id": "Jj5QAJYtR0mPDZsLbwt82w", - "cell_type": "markdown", - "source": [ - "### Non Financial" - ], - "metadata": {} - }, - { - "id": "MNr136KdUEWkl6QE99H-tQ", - "cell_type": "markdown", - "source": [ - "If the [target Group of Contract](#report) is not of type Re-Insurance, the result of the following will return null.", - "\n", - "\nThe computed value for the non financial change of the LoReCo is" - ], - "metadata": {} - }, - { - "id": "vheo4pqpoUC636g-YZNg7w", - "cell_type": "code", - "source": [ - "var computedDeltaLORECO_nonFinancial = Test.GetScopes(identities).Aggregate()", - "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gcye9gWqLUSp2DBeuZK5JA", - "cell_type": "code", - "source": [ - "computedDeltaLORECO_nonFinancial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1h9DSjP030GvgF_-V2wXEQ", - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the full LoReCo data from which the delta can be computed:" - ], - "metadata": {} - }, - { - "id": "toras9Yo70eeiatIr1j9fw", - "cell_type": "code", - "source": [ - "var LORECO = Test.GetScopes(identities).Aggregate().Loreco.Filter((\"GroupOfContract\", dataNode));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uT9D_Ku9WkS7lCo1nrxs0Q", - "cell_type": "code", - "source": [ - "var deltaLORECO = LORECO.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n LORECO.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Qhxfbqq4OEaXyYoe5rfTUg", - "cell_type": "code", - "source": [ - "deltaLORECO.Aggregate()?.Value?? 0" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_uTlE0FJFEOI34sBONg8Mw", - "cell_type": "markdown", - "source": [ - "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" - ], - "metadata": {} - }, - { - "id": "qmBrKRZP8U-13Lup_I2e5Q", - "cell_type": "code", - "source": [ - "var expectedDeltaLORECO_nonFinancial = deltaLORECO.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tMMjF_m4D0aRpukRYlpdLA", - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_nonFinancial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "in3E9cuYDEymJ4n3r_iWPA", - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_nonFinancial.CheckEquality( -computedDeltaLORECO_nonFinancial ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "OaAYtHkPf0CohNZ6dPoGGA", - "cell_type": "markdown", - "source": [ - "### Financial" - ], - "metadata": {} - }, - { - "id": "gHC-7-HgtEWWHf6ZCY6dDQ", - "cell_type": "markdown", - "source": [ - "Conversely, the computed value for the financial change of the LoReCo is" - ], - "metadata": {} - }, - { - "id": "Y9twZB0o6ESo6PY18cZj9g", - "cell_type": "code", - "source": [ - "var computedDeltaLORECO_Financial = Test.GetScopes(identities).Aggregate()", - "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3wLUoygmE0CXCU5UFkL41Q", - "cell_type": "code", - "source": [ - "computedDeltaLORECO_Financial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "j5qJfGmdMkGwoFc1yb_X3Q", - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" - ], - "metadata": {} - }, - { - "id": "3UGSj5-MYUSI-mW2tMJXVg", - "cell_type": "code", - "source": [ - "var expectedDeltaLORECO_Financial = ( deltaLORECO.Filter((\"VariableType\", \"IA\")) +", - "\n deltaLORECO.Filter((\"VariableType\", \"YCU\")) +", - "\n deltaLORECO.Filter((\"VariableType\", \"CRU\")) )", - "\n .Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_Yk_rP1ZHEqRB6g3yMCUMg", - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_Financial" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dDZLX-mHFEyX5X2GNKLW7Q", - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_Financial.CheckEquality( -computedDeltaLORECO_Financial ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "S8TFuLo4eUeNTC-d5f9GjA", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Reconciliation" - ], - "metadata": {} - }, - { - "id": "GEzn2LZBRkSr7oqQsmzPDA", - "cell_type": "markdown", - "source": [ - "Based on the results calculated in Section 3, we check here the consistency of the [Financial Performance Report](#report). ", - "\n", - "\nFiner granular reconciliations can be performed by following the datails of how each report contributes to the Financial Performance Report. Please, refer to the [Report documentation](../Report/ReportScopes#financial-performance) for all the details. " - ], - "metadata": {} - }, - { - "id": "a6N6B4TD8kuk12aZT40KVg", - "cell_type": "markdown", - "source": [ - "## Insurance Revenue" - ], - "metadata": {} - }, - { - "id": "6MZPkbR47EmeDYqsSV4urQ", - "cell_type": "markdown", - "source": [ - "The Insurance Revenue (IR) contributions vary from Insurance to Re-Insurance and depend on the Liability Type of the [target Group of Contract](#report). This can be summarized by the formulas below", - "\n", - "\n$$", - "\n\\text{IR} = \\left\\{ ", - "\n\\begin{array}{ll}", - "\n\\Delta\\text{FCF Gross Non Financial} + \\Delta\\text{CSM Non Financial} + \\Delta\\text{CSM Release} \\\\", - "\n+ \\text{Incurred Incoming Cashflows} + \\text{Claims ICO} + \\text{Incurred Deferrals} \\\\", - "\n+ \\text{Exc. Experience Adjustment on Premiums} ~~,", - "\n& \\text{for LRC Insurance contracts} \\\\[0.2cm]", - "\n\\Delta\\text{CSM Non Financial} + \\Delta\\text{CSM Release} \\\\", - "\n+ \\text{Incurred Incoming Cashflows} + \\text{Claims ICO} + \\text{Incurred Deferrals} ~~,", - "\n& \\text{for LIC Insurance contracts} \\\\[0.2cm]", - "\n\\text{Claims ICO} + \\text{Incurred Deferrals} ~~,", - "\n& \\text{for Re-Insurance contracts}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nHere below we recompute the IR term:" - ], - "metadata": {} - }, - { - "id": "dFWCtF0eBkqXubXgarv3IA", - "cell_type": "code", - "source": [ - "var expectedDeltaCSM_release = deltaCSM.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "cnXGdn9kHkaAPsUUjaffrg", - "cell_type": "code", - "source": [ - "var expectedIncurredIncomingCashflows = Test.GetScopes(identities).Aggregate().Premiums", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "d5AwPz1_ZUiGBL5xhIKZ4g", - "cell_type": "code", - "source": [ - "var expectedIncurredDeferralsIr = Test.GetScopes(identities).Aggregate().AmortizationToIr", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YsUQO-5qx0mI-Ze0xAxR2g", - "cell_type": "code", - "source": [ - "var expectedClaimsICO = Test.GetScopes(identities).Aggregate().ClaimsIcoToIr", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uEta4W7kvEGPG1QyEoMh7w", - "cell_type": "code", - "source": [ - "var expectedExcExperienceAdjPremiums = Test.GetScopes(identities).Aggregate().ExperienceAdjustmentOnPremium", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zOT5DeoAmUCB4VCKdUJ2lw", - "cell_type": "code", - "source": [ - "double IR = 0;", - "\nif(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LRC\")", - "\n IR = - expectedDeltaFCF_nonFinancial ", - "\n - expectedDeltaCSM_nonFinancial ", - "\n - expectedDeltaCSM_release ", - "\n + expectedIncurredIncomingCashflows", - "\n + expectedClaimsICO", - "\n + expectedIncurredDeferralsIr", - "\n + expectedExcExperienceAdjPremiums;", - "\nelse if(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LIC\")", - "\n IR = - expectedDeltaCSM_nonFinancial", - "\n - expectedDeltaCSM_release", - "\n + expectedIncurredIncomingCashflows", - "\n + expectedClaimsICO", - "\n + expectedIncurredDeferralsIr ", - "\n + expectedExcExperienceAdjPremiums;", - "\nelse if(groupOfContract.Partner != null)", - "\n IR = + expectedClaimsICO", - "\n + expectedIncurredDeferralsIr", - "\n + expectedExcExperienceAdjPremiums;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gPU-YBlmbU-CuZWTrFnM-Q", - "cell_type": "code", - "source": [ - "IR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yE-6MD2uiE6ttfKjHLsQlg", - "cell_type": "markdown", - "source": [ - "## Insurance Service Expenses" - ], - "metadata": {} - }, - { - "id": "Obp_9f3AZkCH8Lap4aYmFg", - "cell_type": "markdown", - "source": [ - "Analogously, the Insurance Service Expenses (ISE) read", - "\n", - "\n$$", - "\n\\text{ISE} = \\left\\{ ", - "\n\\begin{array}{ll}", - "\n\\Delta\\text{LC Non Financial}", - "\n+ \\Delta\\text{LC Release}", - "\n+ \\text{Incurred ClaimsNIC} \\\\", - "\n+ \\text{Incurred Expenses}", - "\n+ \\text{Incurred Commissions}", - "\n+ \\text{Incurred Deferrals}", - "\n& \\text{for LRC Insurance contracts} \\\\[0.2cm]", - "\n\\Delta\\text{FCF Reinsurance Non Financial}", - "\n+ \\Delta\\text{LC Non Financial}", - "\n+ \\Delta\\text{LC Release}", - "\n+ \\text{Incurred ClaimsNIC} \\\\", - "\n+ \\text{Incurred Expenses} ", - "\n+ \\text{Incurred Commissions}", - "\n+ \\text{Incurred Deferrals}", - "\n& \\text{for LIC Insurance contracts} \\\\[0.2cm]", - "\n\\Delta\\text{FCF Reinsurance Non Financial} ", - "\n+ \\Delta\\text{CSM Non Financial} ", - "\n+ \\Delta\\text{CSM Release} \\\\", - "\n+ \\Delta\\text{LC Non Financial} ", - "\n+ \\Delta\\text{LC Release} ", - "\n+ \\Delta\\text{LoReCo Non Financial} \\\\", - "\n+ \\text{Incurred Incoming Cashflows} ", - "\n+ \\text{Incurred ClaimsNIC} ", - "\n+ \\text{Incurred Expenses} \\\\", - "\n+ \\text{Incurred Commissions}", - "\n+ \\text{Incurred Deferrals}", - "\n& \\text{for Re-Insurance contracts}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nHere below we recompute the ISE term:" - ], - "metadata": {} - }, - { - "id": "JL2Q7lsrlEucGEc4EjA_oA", - "cell_type": "code", - "source": [ - "var expectedDeltaLC_release = deltaLC.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "O9r-rlZ5hky9sOj-zExurg", - "cell_type": "code", - "source": [ - "var expectedDeltaLoReCo_release = deltaLORECO.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bL0MmHokbUmpt_-xEliEwg", - "cell_type": "code", - "source": [ - "var expectedIncurredClaimsNIC = Test.GetScopes(identities).Aggregate().ClaimsNic", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "pV3DTg_19k2Hvp6dPqucww", - "cell_type": "code", - "source": [ - "var expectedIncurredExpenses = Test.GetScopes(identities).Aggregate().Expenses", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KKkpsRFmHUiTPE7WDhV5LQ", - "cell_type": "code", - "source": [ - "var expectedIncurredCommissions = Test.GetScopes(identities).Aggregate().Commissions", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZoXGr9AuiUiZ9G1X4jUa8Q", - "cell_type": "code", - "source": [ - "var expectedIncurredClaimsICO = Test.GetScopes(identities).Aggregate().ClaimsIcoToIse", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "80_7zlUU90-JspeAvDJ9lQ", - "cell_type": "code", - "source": [ - "var expectedIncurredDeferralsIse = Test.GetScopes(identities).Aggregate().AmortizationToIse", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Cekx0MB6YkyVgxkvslykvQ", - "cell_type": "code", - "source": [ - "double ISE = 0;", - "\nif(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LRC\")", - "\n ISE = - expectedDeltaLC_nonFinancial ", - "\n - expectedDeltaLC_release", - "\n + expectedIncurredClaimsNIC ", - "\n + expectedIncurredExpenses ", - "\n + expectedIncurredClaimsICO", - "\n + expectedIncurredCommissions", - "\n + expectedIncurredDeferralsIse;", - "\nelse if(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LIC\")", - "\n ISE = - expectedDeltaFCF_nonFinancial", - "\n - expectedDeltaLC_nonFinancial ", - "\n - expectedDeltaLC_release", - "\n + expectedIncurredClaimsNIC ", - "\n + expectedIncurredExpenses ", - "\n + expectedIncurredClaimsICO", - "\n + expectedIncurredCommissions", - "\n + expectedIncurredDeferralsIse;", - "\nelse if(groupOfContract.Partner != null)", - "\n ISE = - expectedDeltaFCF_nonFinancial", - "\n - expectedDeltaCSM_nonFinancial", - "\n - expectedDeltaCSM_release", - "\n - expectedDeltaLC_nonFinancial ", - "\n - expectedDeltaLC_release", - "\n - expectedDeltaLoReCo_release", - "\n + expectedIncurredIncomingCashflows", - "\n + expectedIncurredClaimsNIC ", - "\n + expectedIncurredExpenses ", - "\n + expectedIncurredClaimsICO", - "\n + expectedIncurredCommissions", - "\n + expectedIncurredDeferralsIse;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "081ToSk3WESb6183HlFQlA", - "cell_type": "code", - "source": [ - "ISE" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "83VrYmGYX0uHykId27aWOQ", - "cell_type": "markdown", - "source": [ - "## Insurance Finance Income/Expenses" - ], - "metadata": {} - }, - { - "id": "NAkWvaF6NUG6tYDPqEbVNA", - "cell_type": "markdown", - "source": [ - "The Financial part associated to the Insurance business encompassing both the Income and Expenses is denoted IFIE from the initials marked in capital letters. The ", - "\n", - "\n$$", - "\n\\text{IFIE} = \\left\\{", - "\n\\begin{array}{ll}", - "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} ~~,", - "\n& \\text{for Insurance contracts} \\\\[0.2cm]", - "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} ", - "\n+ \\Delta\\text{LoReCo Financial} ~~, ", - "\n& \\text{for Re-Insurance contracts}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nHere below we recompute the IFIE term:" - ], - "metadata": {} - }, - { - "id": "JkwONyKiakC4XpVgxusdRg", - "cell_type": "code", - "source": [ - "double IFIE = 0;", - "\nif(groupOfContract.Partner == null) ", - "\n IFIE = - expectedDeltaFCF_Financial ", - "\n - expectedDeltaCSM_Financial", - "\n - expectedDeltaLC_Financial;", - "\nelse", - "\n IFIE = - expectedDeltaFCF_Financial ", - "\n - expectedDeltaCSM_Financial", - "\n - expectedDeltaLC_Financial", - "\n - expectedDeltaLORECO_Financial;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "grefaMt7BEaTJ7dsa0AUQA", - "cell_type": "code", - "source": [ - "IFIE" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6_E3dWyyF0COz4xLh1e-xA", - "cell_type": "markdown", - "source": [ - "## Other Comprehensive Income" - ], - "metadata": {} - }, - { - "id": "jK3nTYcm30KoVUioi71r4g", - "cell_type": "markdown", - "source": [ - "The Other Comprehensive Income (OCI) can be non-zero only when the OCI is enabled for [target Group of Contract](#report), that is, Oci Type = Default.", - "\n", - "\n$$", - "\n\\text{OCI} = \\Delta\\text{FCF} \\big|_{\\text{Locked-in}} - \\Delta\\text{FCF} \\big|_{\\text{Current}} ~~.", - "\n$$", - "\n", - "\nHere below we recompute the OCI term:" - ], - "metadata": {} - }, - { - "id": "j2wpd2OAuUmjvKWQoew9jQ", - "cell_type": "code", - "source": [ - "var OCI = expectedDeltaFCF_OCI;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "7R8qKIIsGU6fcW8M2M2M5g", - "cell_type": "code", - "source": [ - "OCI" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_BPpLy2cnUKTaE-9tgr-UQ", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Financial Performance Specifications

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The aim of this notebook is to document the Financial Performance reporting system. The process is pictorially explained in the following flowchart. ", + "\n", + "\n", + "\n
", + "\n", + "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." + ] + }, + { + "cell_type": "markdown", + "source": [ + "In the following the Dimensions, Parameters, Nominal Cashflows, and Actuals are imported from the corresponding csv files in Initialization/Systemorph/" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Process Data" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Current Period, Reporting Node and Currency Type" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" + ] + }, + { + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "and the type of Currency among Contractual, Functional, and Group" + ] + }, + { + "cell_type": "code", + "source": [ + "var currencyType = CurrencyType.Contractual ;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Import the Report definitions, initialize the Workspace and the Test Suite:" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Report/ReportScopes\"", + "\n#!import \"../Report/ReportConfigurationAndUtils\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "code", + "source": [ + "var period = (year, month) ;", + "\nvar reportStorage = new ReportStorage(Workspace, Report) ;", + "\nvar Test = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" + ] + }, + { + "cell_type": "code", + "source": [ + "await reportStorage.InitializeReportIndependentCacheAsync();", + "\nawait reportStorage.InitializeAsync(period, reportingNode, null, currencyType);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## View list of Identities" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Based on the Cashflows imported, the list of all possible identities, i.e. combinations of valid Contractual and Functional Currencies, Liability Types, (Re)Insurance and Oci, is contructed and reported here below:" + ] + }, + { + "cell_type": "code", + "source": [ + "var identities = reportStorage.GetIdentities(period, reportingNode, null, currencyType);" + ] + }, + { + "cell_type": "code", + "source": [ + "identities" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Report" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Please select here below the target Data Node for executing the tests below:" + ] + }, + { + "cell_type": "code", + "source": [ + "var dataNode = \"DT1.1\";" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Group of Contract selected is:" + ] + }, + { + "cell_type": "code", + "source": [ + "var groupOfContract = (await Workspace.Query().Where(x => x.SystemName == dataNode).ToArrayAsync()).FirstOrDefault();", + "\ngroupOfContract" + ] + }, + { + "cell_type": "markdown", + "source": [ + "where ", + "\n- the **OciType** can be Default for contracts with non-zero OCI, and null otherwise, ", + "\n- the **Liability Type** can be LRC for Liability for Remaining Coverage, and LIC for Liability of Incurred Claims,", + "\n- the **Partner** can be null for Insurance contracts, or equal to the Partner System Name for Reinsurance contracts." + ] + }, + { + "cell_type": "markdown", + "source": [ + "The summary of the Financial Performance report is shown below" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube( Test.GetScopes(identities).Aggregate().FinancialPerformance.Filter((\"GroupOfContract\", dataNode)) )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", + "\n .SliceColumnsBy(CurrencyGrouper(currencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", + "\n .ToReport() with { Height = 600 }" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Inspection" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Fulfillment Cashflows" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Fulfillment Cashflow (FCF) corresponds to the sum of the Best Estimate [Present Value](../Import/ImportScopeCalculation#current-and-locked) (PV) and the [Risk Adjustment](../Import/ImportScopeCalculation#risk-adjustment) (RA), both summed over Amounty Types, and both discounted with the Locked-In curve in the BBA valuation approach:", + "\n", + "\n$$", + "\n\\text{FCF}(\\text{AoC}) = \\text{PV Locked}(\\text{AoC})", + "\n\\bigg|_{\\substack{\\text{Non Attributable} \\\\ \\text{Amount Types} \\\\ \\text{excluded}}} ", + "\n+ \\text{RA Locked}(\\text{AoC}) ~.", + "\n$$" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Non Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed value for the non financial contribution to the FCF is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaFCF_nonFinancial = Test.GetScopes(identities).Aggregate()", + "\n .FpNonFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaFCF_nonFinancial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the full list of FCFs" + ] + }, + { + "cell_type": "code", + "source": [ + "var FCFs = Test.GetScopes(identities).Aggregate().Fcf.Filter((\"GroupOfContract\", dataNode));" + ] + }, + { + "cell_type": "code", + "source": [ + "var deltaFCF = FCFs.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n FCFs.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ] + }, + { + "cell_type": "code", + "source": [ + "deltaFCF.Aggregate().Value" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaFCF_nonFinancial = deltaFCF.Filter((\"VariableType\", \"!IA\"), ", + "\n (\"VariableType\", \"!YCU\"), ", + "\n (\"VariableType\", \"!CRU\") ).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaFCF_nonFinancial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For consistency, this term is taken with the minus sign" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaFCF_nonFinancial.CheckEquality( -computedDeltaFCF_nonFinancial ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Conversely, the computed value for the financial contribution to the Fulfillment Cashflows (FCF) is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaFCF_Financial = Test.GetScopes(identities).Aggregate()", + "\n .FpFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaFCF_Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The independent recalculation of this value reads" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaFCF_Financial = (deltaFCF.Filter((\"VariableType\", \"IA\")) +", + "\n deltaFCF.Filter((\"VariableType\", \"YCU\")) +", + "\n deltaFCF.Filter((\"VariableType\", \"CRU\")) ).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaFCF_Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "taking the minus sign into account" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaFCF_Financial.CheckEquality( -computedDeltaFCF_Financial ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Other Comprehensive Income" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Other Comprehensive Income (OCI) term is by definition the sum of the financial contributions not related to the insurance sector.", + "\n", + "\nThe Default method to compute the OCI term is by subtracting the FCF computed with the *Locked-In* rates and the FCF computed with the *Current* rates. In this way the non insurance financial volatiliy of the economic input is relegated to the OCI. " + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaFCF_OCI = Test.GetScopes(identities).Aggregate()", + "\n .OciFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaFCF_OCI" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The OCI contribution is zero when the OCI option is disabled for the [target Group of Contract](#report).", + "\n", + "\nHere below we follow the steps to calculate independently the OCI contribution " + ] + }, + { + "cell_type": "code", + "source": [ + "var DeltaFCF_Locked = deltaFCF.Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "var FCFs_current = Test.GetScopes(identities).Aggregate().CurrentFcf.Filter((\"GroupOfContract\", dataNode));" + ] + }, + { + "cell_type": "code", + "source": [ + "var DeltaFCF_Current = FCFs_current.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n FCFs_current.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaFCF_OCI = DeltaFCF_Locked - DeltaFCF_Current.Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "DeltaFCF_Locked" + ] + }, + { + "cell_type": "code", + "source": [ + "DeltaFCF_Current.Aggregate().Value" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaFCF_OCI" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaFCF_OCI.CheckEquality( computedDeltaFCF_OCI ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Contractual Service Margin" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Non Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed value for the non financial change of the CSM is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaCSM_nonFinancial = Test.GetScopes(identities).Aggregate()", + "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaCSM_nonFinancial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the full CSM data from which the delta can be computed:" + ] + }, + { + "cell_type": "code", + "source": [ + "var CSM = Test.GetScopes(identities).Aggregate().Csm.Filter((\"GroupOfContract\", dataNode));" + ] + }, + { + "cell_type": "code", + "source": [ + "var deltaCSM = CSM.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n CSM.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ] + }, + { + "cell_type": "code", + "source": [ + "deltaCSM.Aggregate().Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaCSM_nonFinancial = deltaCSM.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaCSM_nonFinancial" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaCSM_nonFinancial.CheckEquality( -computedDeltaCSM_nonFinancial ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Conversely, the computed value for the financial change of the CSM is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaCSM_Financial = Test.GetScopes(identities).Aggregate()", + "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaCSM_Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaCSM_Financial = ( deltaCSM.Filter((\"VariableType\", \"IA\")) +", + "\n deltaCSM.Filter((\"VariableType\", \"YCU\")) +", + "\n deltaCSM.Filter((\"VariableType\", \"CRU\")) )", + "\n .Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaCSM_Financial" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaCSM_Financial.CheckEquality( -computedDeltaCSM_Financial ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Loss Component" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Non Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed value for the non financial change of the LC is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaLC_nonFinancial = Test.GetScopes(identities).Aggregate()", + "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaLC_nonFinancial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the full CSM data from which the delta can be computed:" + ] + }, + { + "cell_type": "code", + "source": [ + "var LC = Test.GetScopes(identities).Aggregate().Lc.Filter((\"GroupOfContract\", dataNode));" + ] + }, + { + "cell_type": "code", + "source": [ + "var deltaLC = LC.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n LC.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ] + }, + { + "cell_type": "code", + "source": [ + "deltaLC.Aggregate().Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaLC_nonFinancial = deltaLC.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLC_nonFinancial" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLC_nonFinancial.CheckEquality( -computedDeltaLC_nonFinancial ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Conversely, the computed value for the financial change of the LC is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaLC_Financial = Test.GetScopes(identities).Aggregate()", + "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaLC_Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaLC_Financial = ( deltaLC.Filter((\"VariableType\", \"IA\")) +", + "\n deltaLC.Filter((\"VariableType\", \"YCU\")) +", + "\n deltaLC.Filter((\"VariableType\", \"CRU\")) )", + "\n .Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLC_Financial" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLC_Financial.CheckEquality( -computedDeltaLC_Financial ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Loss Recovery Component" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Non Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "If the [target Group of Contract](#report) is not of type Re-Insurance, the result of the following will return null.", + "\n", + "\nThe computed value for the non financial change of the LoReCo is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaLORECO_nonFinancial = Test.GetScopes(identities).Aggregate()", + "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaLORECO_nonFinancial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the full LoReCo data from which the delta can be computed:" + ] + }, + { + "cell_type": "code", + "source": [ + "var LORECO = Test.GetScopes(identities).Aggregate().Loreco.Filter((\"GroupOfContract\", dataNode));" + ] + }, + { + "cell_type": "code", + "source": [ + "var deltaLORECO = LORECO.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", + "\n LORECO.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" + ] + }, + { + "cell_type": "code", + "source": [ + "deltaLORECO.Aggregate()?.Value?? 0" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaLORECO_nonFinancial = deltaLORECO.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_nonFinancial" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_nonFinancial.CheckEquality( -computedDeltaLORECO_nonFinancial ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Conversely, the computed value for the financial change of the LoReCo is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaLORECO_Financial = Test.GetScopes(identities).Aggregate()", + "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaLORECO_Financial" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaLORECO_Financial = ( deltaLORECO.Filter((\"VariableType\", \"IA\")) +", + "\n deltaLORECO.Filter((\"VariableType\", \"YCU\")) +", + "\n deltaLORECO.Filter((\"VariableType\", \"CRU\")) )", + "\n .Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_Financial" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_Financial.CheckEquality( -computedDeltaLORECO_Financial ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Reconciliation" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Based on the results calculated in Section 3, we check here the consistency of the [Financial Performance Report](#report). ", + "\n", + "\nFiner granular reconciliations can be performed by following the datails of how each report contributes to the Financial Performance Report. Please, refer to the [Report documentation](../Report/ReportScopes#financial-performance) for all the details. " + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Insurance Revenue" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Insurance Revenue (IR) contributions vary from Insurance to Re-Insurance and depend on the Liability Type of the [target Group of Contract](#report). This can be summarized by the formulas below", + "\n", + "\n$$", + "\n\\text{IR} = \\left\\{ ", + "\n\\begin{array}{ll}", + "\n\\Delta\\text{FCF Gross Non Financial} + \\Delta\\text{CSM Non Financial} + \\Delta\\text{CSM Release} \\\\", + "\n+ \\text{Incurred Incoming Cashflows} + \\text{Claims ICO} + \\text{Incurred Deferrals} \\\\", + "\n+ \\text{Exc. Experience Adjustment on Premiums} ~~,", + "\n& \\text{for LRC Insurance contracts} \\\\[0.2cm]", + "\n\\Delta\\text{CSM Non Financial} + \\Delta\\text{CSM Release} \\\\", + "\n+ \\text{Incurred Incoming Cashflows} + \\text{Claims ICO} + \\text{Incurred Deferrals} ~~,", + "\n& \\text{for LIC Insurance contracts} \\\\[0.2cm]", + "\n\\text{Claims ICO} + \\text{Incurred Deferrals} ~~,", + "\n& \\text{for Re-Insurance contracts}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nHere below we recompute the IR term:" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaCSM_release = deltaCSM.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedIncurredIncomingCashflows = Test.GetScopes(identities).Aggregate().Premiums", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedIncurredDeferralsIr = Test.GetScopes(identities).Aggregate().AmortizationToIr", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedClaimsICO = Test.GetScopes(identities).Aggregate().ClaimsIcoToIr", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedExcExperienceAdjPremiums = Test.GetScopes(identities).Aggregate().ExperienceAdjustmentOnPremium", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "double IR = 0;", + "\nif(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LRC\")", + "\n IR = - expectedDeltaFCF_nonFinancial ", + "\n - expectedDeltaCSM_nonFinancial ", + "\n - expectedDeltaCSM_release ", + "\n + expectedIncurredIncomingCashflows", + "\n + expectedClaimsICO", + "\n + expectedIncurredDeferralsIr", + "\n + expectedExcExperienceAdjPremiums;", + "\nelse if(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LIC\")", + "\n IR = - expectedDeltaCSM_nonFinancial", + "\n - expectedDeltaCSM_release", + "\n + expectedIncurredIncomingCashflows", + "\n + expectedClaimsICO", + "\n + expectedIncurredDeferralsIr ", + "\n + expectedExcExperienceAdjPremiums;", + "\nelse if(groupOfContract.Partner != null)", + "\n IR = + expectedClaimsICO", + "\n + expectedIncurredDeferralsIr", + "\n + expectedExcExperienceAdjPremiums;" + ] + }, + { + "cell_type": "code", + "source": [ + "IR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Insurance Service Expenses" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Analogously, the Insurance Service Expenses (ISE) read", + "\n", + "\n$$", + "\n\\text{ISE} = \\left\\{ ", + "\n\\begin{array}{ll}", + "\n\\Delta\\text{LC Non Financial}", + "\n+ \\Delta\\text{LC Release}", + "\n+ \\text{Incurred ClaimsNIC} \\\\", + "\n+ \\text{Incurred Expenses}", + "\n+ \\text{Incurred Commissions}", + "\n+ \\text{Incurred Deferrals}", + "\n& \\text{for LRC Insurance contracts} \\\\[0.2cm]", + "\n\\Delta\\text{FCF Reinsurance Non Financial}", + "\n+ \\Delta\\text{LC Non Financial}", + "\n+ \\Delta\\text{LC Release}", + "\n+ \\text{Incurred ClaimsNIC} \\\\", + "\n+ \\text{Incurred Expenses} ", + "\n+ \\text{Incurred Commissions}", + "\n+ \\text{Incurred Deferrals}", + "\n& \\text{for LIC Insurance contracts} \\\\[0.2cm]", + "\n\\Delta\\text{FCF Reinsurance Non Financial} ", + "\n+ \\Delta\\text{CSM Non Financial} ", + "\n+ \\Delta\\text{CSM Release} \\\\", + "\n+ \\Delta\\text{LC Non Financial} ", + "\n+ \\Delta\\text{LC Release} ", + "\n+ \\Delta\\text{LoReCo Non Financial} \\\\", + "\n+ \\text{Incurred Incoming Cashflows} ", + "\n+ \\text{Incurred ClaimsNIC} ", + "\n+ \\text{Incurred Expenses} \\\\", + "\n+ \\text{Incurred Commissions}", + "\n+ \\text{Incurred Deferrals}", + "\n& \\text{for Re-Insurance contracts}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nHere below we recompute the ISE term:" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaLC_release = deltaLC.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaLoReCo_release = deltaLORECO.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedIncurredClaimsNIC = Test.GetScopes(identities).Aggregate().ClaimsNic", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedIncurredExpenses = Test.GetScopes(identities).Aggregate().Expenses", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedIncurredCommissions = Test.GetScopes(identities).Aggregate().Commissions", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedIncurredClaimsICO = Test.GetScopes(identities).Aggregate().ClaimsIcoToIse", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedIncurredDeferralsIse = Test.GetScopes(identities).Aggregate().AmortizationToIse", + "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "double ISE = 0;", + "\nif(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LRC\")", + "\n ISE = - expectedDeltaLC_nonFinancial ", + "\n - expectedDeltaLC_release", + "\n + expectedIncurredClaimsNIC ", + "\n + expectedIncurredExpenses ", + "\n + expectedIncurredClaimsICO", + "\n + expectedIncurredCommissions", + "\n + expectedIncurredDeferralsIse;", + "\nelse if(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LIC\")", + "\n ISE = - expectedDeltaFCF_nonFinancial", + "\n - expectedDeltaLC_nonFinancial ", + "\n - expectedDeltaLC_release", + "\n + expectedIncurredClaimsNIC ", + "\n + expectedIncurredExpenses ", + "\n + expectedIncurredClaimsICO", + "\n + expectedIncurredCommissions", + "\n + expectedIncurredDeferralsIse;", + "\nelse if(groupOfContract.Partner != null)", + "\n ISE = - expectedDeltaFCF_nonFinancial", + "\n - expectedDeltaCSM_nonFinancial", + "\n - expectedDeltaCSM_release", + "\n - expectedDeltaLC_nonFinancial ", + "\n - expectedDeltaLC_release", + "\n - expectedDeltaLoReCo_release", + "\n + expectedIncurredIncomingCashflows", + "\n + expectedIncurredClaimsNIC ", + "\n + expectedIncurredExpenses ", + "\n + expectedIncurredClaimsICO", + "\n + expectedIncurredCommissions", + "\n + expectedIncurredDeferralsIse;" + ] + }, + { + "cell_type": "code", + "source": [ + "ISE" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Insurance Finance Income/Expenses" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Financial part associated to the Insurance business encompassing both the Income and Expenses is denoted IFIE from the initials marked in capital letters. The ", + "\n", + "\n$$", + "\n\\text{IFIE} = \\left\\{", + "\n\\begin{array}{ll}", + "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} ~~,", + "\n& \\text{for Insurance contracts} \\\\[0.2cm]", + "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} ", + "\n+ \\Delta\\text{LoReCo Financial} ~~, ", + "\n& \\text{for Re-Insurance contracts}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nHere below we recompute the IFIE term:" + ] + }, + { + "cell_type": "code", + "source": [ + "double IFIE = 0;", + "\nif(groupOfContract.Partner == null) ", + "\n IFIE = - expectedDeltaFCF_Financial ", + "\n - expectedDeltaCSM_Financial", + "\n - expectedDeltaLC_Financial;", + "\nelse", + "\n IFIE = - expectedDeltaFCF_Financial ", + "\n - expectedDeltaCSM_Financial", + "\n - expectedDeltaLC_Financial", + "\n - expectedDeltaLORECO_Financial;" + ] + }, + { + "cell_type": "code", + "source": [ + "IFIE" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Other Comprehensive Income" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Other Comprehensive Income (OCI) can be non-zero only when the OCI is enabled for [target Group of Contract](#report), that is, Oci Type = Default.", + "\n", + "\n$$", + "\n\\text{OCI} = \\Delta\\text{FCF} \\big|_{\\text{Locked-in}} - \\Delta\\text{FCF} \\big|_{\\text{Current}} ~~.", + "\n$$", + "\n", + "\nHere below we recompute the OCI term:" + ] + }, + { + "cell_type": "code", + "source": [ + "var OCI = expectedDeltaFCF_OCI;" + ] + }, + { + "cell_type": "code", + "source": [ + "OCI" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/SpecificationsImportActuals.ipynb b/Test/SpecificationsImportActuals.ipynb index b803db6b..cb0b1acb 100644 --- a/Test/SpecificationsImportActuals.ipynb +++ b/Test/SpecificationsImportActuals.ipynb @@ -1,705 +1,501 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "1O9abtyGKUeDiX_VyaeaAQ", - "cell_type": "markdown", - "source": [ - "

Import Actuals Specifications

" - ], - "metadata": {} - }, - { - "id": "mgxNtYdjh027T2LccTaWsA", - "cell_type": "markdown", - "source": [ - "The aim of this notebook is to document the calculations taking place when importing the Actuals. For this documentation notebook the Data is imported from the corresponding csv files located in the following path Initialization/Systemorph/. The process is pictorially explained in the following flowchart. ", - "\n", - "\n", - "\n
", - "\n", - "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." - ], - "metadata": {} - }, - { - "id": "9sXMifQXi0yuys7dMnvmmA", - "cell_type": "markdown", - "source": [ - "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" - ], - "metadata": {} - }, - { - "id": "TYI7B_9JxEm9gBQSiHP7Tw", - "cell_type": "code", - "source": [ - "#!import \"SpecificationsSetup\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "sQZ9EDWrRUCqjDaDiUaslg", - "cell_type": "markdown", - "source": [ - "---" - ], - "metadata": {} - }, - { - "id": "9VuASxTZcE64BWvOvV6Y0A", - "cell_type": "markdown", - "source": [ - "# Import Data" - ], - "metadata": {} - }, - { - "id": "cb5PqhqcY0eWhhsN18hk8Q", - "cell_type": "markdown", - "source": [ - "", - "\n## Current Period" - ], - "metadata": {} - }, - { - "id": "AYwuUnm7D0OvGFWfuLCS0g", - "cell_type": "markdown", - "source": [ - "Please select the target period (i.e. year and month), Reporting Node, Economic Basis, and Data Node based on the imported data:" - ], - "metadata": {} - }, - { - "id": "e0LWvI9K1U-qRdDpHJWU3Q", - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;", - "\nvar economicBasis = \"L\" ;", - "\nvar dataNode = \"DT1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MfXiwU7pSkeiWLcmqQJytA", - "cell_type": "markdown", - "source": [ - "Import the Dimensions, Yield Curves and Nominal Cashflows from the corresponding csv files in Initialization/Systemorph/" - ], - "metadata": {} - }, - { - "id": "VckQZIZagUGxLJK_kIkJzA", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Epv9604EmEmVeKtkGt_iqA", - "cell_type": "markdown", - "source": [ - "Initialization of the Test Suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" - ], - "metadata": {} - }, - { - "id": "UWRWl2pRz0eA8IvYfBeXbQ", - "cell_type": "code", - "source": [ - "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Actual);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Ball02llF0KmddCeo9vhsw", - "cell_type": "markdown", - "source": [ - "", - "\n## View imported Actuals" - ], - "metadata": {} - }, - { - "id": "XiBDlMNVEk-oEido9aLDsA", - "cell_type": "markdown", - "source": [ - "Here the imported Actuals from csv are visualized " - ], - "metadata": {} - }, - { - "id": "CaVs88CPvEuA-lj1QXbU4A", - "cell_type": "code", - "source": [ - "Test.GetStorage().GetIfrsVariables(dataNode)", - "\n .Where(x => new string[] {EstimateTypes.A, EstimateTypes.AA, EstimateTypes.OA}.Contains(x.EstimateType))", - "\n .Where(x => x.AocType != \"EOP\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "J2FGEyUHWk-y2N3yq7bQGQ", - "cell_type": "markdown", - "source": [ - "where the filter is selecting only those *estimate types* associated to the imported Actuals, hence excluding the IFRS variables calculated when [importing the cashflows](SpecificationsImportCashflows)." - ], - "metadata": {} - }, - { - "id": "ZFf-ptMOJUaVX3hg-LJRPA", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Base Actuals" - ], - "metadata": {} - }, - { - "id": "q2ZSjwzGV0iSYC2rHoNKBQ", - "cell_type": "markdown", - "source": [ - "The following simplified AoC Chain applies for Advance and Overdue Actuals:", - "\n1. Beginning of Period (BOP)", - "\n2. Cash flow (CF)", - "\n3. Amortization (AM) ", - "\n4. End of Period (EOP) ", - "\n", - "\nWe consider 4 types of Actual values, which are distinguished through their [Estimate Type](../DataModel/DataStructure#estimate-type):", - "\n- Actuals (A)", - "\n- Advance Actuals (AA)", - "\n- Overdue Actuals (OA)", - "\n- Deferrable Actuals (DA)", - "\n", - "\nwith the Estimate Type's system name shown between parenthesis above.", - "\nThey are computed by the so-called Actual Base **Scope**", - "\n", - "\n$$", - "\n\\text{Actual Base} (\\text{AoC}) = \\left\\{", - "\n\\begin{array}{cl}", - "\n0 & \\text{if AoC step is AM,} \\\\", - "\n\\text{Actual Base}(\\rm{BOP}) + \\text{Actual Base}(\\rm{CF}) + \\text{Actual Base}(\\rm{WO}) & \\text{if AoC step is EOP and Estimate Type is not A,} \\\\", - "\n\\text{Imported Actual} & \\text{otherwise.}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nWe start by selecting one of the [imported Actual](#view-imported-actuals) and we pick up an available data node, novelty, and amount type. Then, we can retrieve the corresponding actual (if any) with AoC type BOP, R, and WO. ", - "\n", - "\nNote that the **Identity** for Actual Base contains information about the target data node, AoC type, novelty, amount type and estimate type." - ], - "metadata": {} - }, - { - "id": "3mz_ogsNkUOQiwgPjhzFSw", - "cell_type": "markdown", - "source": [ - "## End of Period" - ], - "metadata": {} - }, - { - "id": "1gmNQIcnYkWzuw3POkhHTg", - "cell_type": "markdown", - "source": [ - "The imported actuals for the AoC steps BOP, CF, and WO are:" - ], - "metadata": {} - }, - { - "id": "m0tpSB8gxUyDD338Zgkb2Q", - "cell_type": "code", - "source": [ - "var actualBaseBOP = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" }, \"PR\", \"AA\", (int?)null) ); ", - "\nactualBaseBOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dJten8gq_kyMKh4S8U_dzw", - "cell_type": "code", - "source": [ - "var actualBaseCF = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) );", - "\nactualBaseCF" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YmaBzLIDzU-jXeSLLeah2Q", - "cell_type": "code", - "source": [ - "var actualBaseWO = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"WO\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) ); ", - "\nactualBaseWO" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kkzVuYU0TUq_BrtrZbS2Cg", - "cell_type": "markdown", - "source": [ - "Based on the imported actuals and according to the [formula above](#base-actual), the computed actual for AoC step EOP reads" - ], - "metadata": {} - }, - { - "id": "rJlipm8F8UqWjrerzqNxHw", - "cell_type": "code", - "source": [ - "var computedActualBaseEOP = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"EOP\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) ); ", - "\ncomputedActualBaseEOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "agUQcE0dMkGmHLSL3ckUNA", - "cell_type": "markdown", - "source": [ - "The computed value can be compared with the expected value" - ], - "metadata": {} - }, - { - "id": "iNuhJJEj4UukayFi6gCk5Q", - "cell_type": "code", - "source": [ - "computedActualBaseEOP.Value == actualBaseBOP.Value + actualBaseCF.Value + actualBaseWO.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LoHEbpUBtUKZRzu41Eyo1g", - "cell_type": "code", - "source": [ - "computedActualBaseEOP.Value.Should().Be( actualBaseBOP.Value + actualBaseCF.Value + actualBaseWO.Value );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "g-rX5A35Bk67CAhSb5UMBw", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Deferrable Actuals" - ], - "metadata": {} - }, - { - "id": "Yb0BdsMIdEmyenFYmcNP0g", - "cell_type": "markdown", - "source": [ - "The Deferrable Actuals (DA) are computed as follows", - "\n", - "\n$$", - "\n\\text{Deferrable Actual} (\\text{AoC}) = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{Actual Base}_{\\substack{\\text{Estimate Type}=\\text{A} \\\\ \\text{Amount Type}=\\text{ACA}}} (\\text{CF})", - "\n +\\text{Actual Base}_{\\substack{\\text{Estimate Type}=\\text{A} \\\\ \\text{Amount Type}=\\text{AEA}}} (\\text{CF}) & \\text{if AoC step is CF } \\\\", - "\n-\\text{AMF} \\cdot \\big( \\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) \\big) & \\text{if AoC step is AM } \\\\", - "\n\\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) + \\text{Deferrable Actual}(\\rm{AM}) & \\text{if AoC step is EOP } \\\\", - "\n\\text{Input Actual}_{\\text{Estimate Type}=\\text{DA}} (\\text{BOP}) & \\text{if AoC step is BOP } \\\\", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere ACA and AEA are *Aquisition* Amount Types from *Attributable Commission* and *Attributable Expenses*, respectively.", - "\n", - "\nNote that the **Identity** of Deferrable Actual is encompassing solely data node, Aoc type, and novelty." - ], - "metadata": {} - }, - { - "id": "dIh2Kt3mwEOjtIdYsSQLpw", - "cell_type": "markdown", - "source": [ - "## Beginning of Period" - ], - "metadata": {} - }, - { - "id": "ZwwOl_GoSEyoQi2486bksw", - "cell_type": "code", - "source": [ - "var computedDeferrableActualBOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" } );", - "\ncomputedDeferrableActualBOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "rwIPbApkqk20YefMttJaBQ", - "cell_type": "markdown", - "source": [ - "The deferrable Actual for the AoC step being BOP is simply the EOP Actual of the previous period. In fact, if the latter exists among the [imported Actuals](#view-imported-actuals), it is reported here below as the BOP of the current period:" - ], - "metadata": {} - }, - { - "id": "ECOpAU6G40ecEEPHz210UQ", - "cell_type": "code", - "source": [ - "var expectedDeferrableActualBOP = Test.GetStorage().GetValue(new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" }, (string)null, EstimateTypes.DA, (int?)null);", - "\nexpectedDeferrableActualBOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "F_RpeDiSsk2xnjvgkmQyfA", - "cell_type": "markdown", - "source": [ - "The expected value is compared with the computed result: " - ], - "metadata": {} - }, - { - "id": "RAI7Dd_j4kaqQJENtCDH2Q", - "cell_type": "code", - "source": [ - "computedDeferrableActualBOP.Value == expectedDeferrableActualBOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Xj5YWVMuskWq5g578_rF3g", - "cell_type": "code", - "source": [ - "computedDeferrableActualBOP.Value.Should().Be(expectedDeferrableActualBOP);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VE3a5lAE40OUqsCPrC8OkQ", - "cell_type": "markdown", - "source": [ - "## Cash flow" - ], - "metadata": {} - }, - { - "id": "KCDTqi_VaEeLnsXIQtuFfw", - "cell_type": "code", - "source": [ - "var computedDeferrableActualCF = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" } );", - "\ncomputedDeferrableActualCF" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-npyFyfnKU2HKSBOkmaWqw", - "cell_type": "markdown", - "source": [ - "The deferrable Actual for the AoC step being CF is the sum of the base Actuals with Amount Type ACA and AEA:" - ], - "metadata": {} - }, - { - "id": "DMXlh_BdV0m-gGATOlCmXw", - "cell_type": "code", - "source": [ - "var actualBaseAEA = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"AEA\", \"A\", (int?)null) );", - "\nactualBaseAEA" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0bhhirWn60Sa22kkJBKxPA", - "cell_type": "code", - "source": [ - "var actualBaseACA = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"ACA\", \"A\", (int?)null) );", - "\nactualBaseACA" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "s5th00fR9km5T_Jn7WG_Tw", - "cell_type": "code", - "source": [ - "var expectedDeferrableActualCF = actualBaseAEA.Value + actualBaseACA.Value;", - "\nexpectedDeferrableActualCF" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nTo3qqybYkKSKmR3F1ElOA", - "cell_type": "markdown", - "source": [ - "The expected value is compared with the computed result: " - ], - "metadata": {} - }, - { - "id": "focF1ZcZDUOXSSNLlZkfFg", - "cell_type": "code", - "source": [ - "computedDeferrableActualCF.Value == expectedDeferrableActualCF" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zj2ipSnC_UqYHMXCw093xg", - "cell_type": "code", - "source": [ - "computedDeferrableActualCF.Value.Should().Be(expectedDeferrableActualCF);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RQuw7gToOkS4hInnv9Kzww", - "cell_type": "markdown", - "source": [ - "## Amortization" - ], - "metadata": {} - }, - { - "id": "_MvSo7kpmEO8Lx_8g70chg", - "cell_type": "code", - "source": [ - "var computedDeferrableActualAM = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", - "\ncomputedDeferrableActualAM" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "GxyMep7IRUuKq-XPTZaSoA", - "cell_type": "markdown", - "source": [ - "The deferrable Actual for the AoC step being AM is the sum of the deferrable Actuals for AoC step BOP and CF multiplied by the current period amortization factor:" - ], - "metadata": {} - }, - { - "id": "YxvqYPNNPkGTrfpko0P9tg", - "cell_type": "code", - "source": [ - "var currentPeriodAmortizationFactor = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", - "\ncurrentPeriodAmortizationFactor" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CcAeUSZHEUy_ZLSZOjwWNQ", - "cell_type": "code", - "source": [ - "Test.GetStorage().GetValue(new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" }, (string)null, \"F\", \"L\", (int?)null)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "R7RYD25pIkyzpVtr4bTYZQ", - "cell_type": "code", - "source": [ - "var expectedDeferrableActualAM = -currentPeriodAmortizationFactor.Value * (expectedDeferrableActualBOP + expectedDeferrableActualCF);", - "\nexpectedDeferrableActualAM" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "57FkYeaQNEGS22T303mszw", - "cell_type": "markdown", - "source": [ - "The expected value is compared with the computed result: " - ], - "metadata": {} - }, - { - "id": "vj4ilsvlW0Kd_W6yb9M_LA", - "cell_type": "code", - "source": [ - "computedDeferrableActualAM.Value == expectedDeferrableActualAM" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-ZnJyECl70mF5zHLrrMwJA", - "cell_type": "code", - "source": [ - "computedDeferrableActualAM.Value.Should().Be( expectedDeferrableActualAM );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xc8raQB2aECcY5vJIlfnXw", - "cell_type": "markdown", - "source": [ - "## End of Period" - ], - "metadata": {} - }, - { - "id": "LVj_SAEOeEy1V78xmool1w", - "cell_type": "code", - "source": [ - "var computedDeferrableActualEOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"EOP\", Novelty = \"C\" } );", - "\ncomputedDeferrableActualEOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4thR0prSO0KUITk7bFfW2g", - "cell_type": "markdown", - "source": [ - "The deferrable Actual for the AoC step being EOP is the sum of the deferrable Actuals for AoC step BOP, CF, and AM:" - ], - "metadata": {} - }, - { - "id": "KCOAQSqabUmBYKvz1FRHWQ", - "cell_type": "code", - "source": [ - "var deferrableActualBOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" } );", - "\ndeferrableActualBOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-goqiLAXmEa7aVplCpRGjQ", - "cell_type": "code", - "source": [ - "var deferrableActualCF = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" } );", - "\ndeferrableActualCF" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "IW3UXfNFZ0CCML8Omp0uKQ", - "cell_type": "code", - "source": [ - "var deferrableActualAM = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", - "\ndeferrableActualAM" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LbrMeCRVTEGd8XazzJK4UQ", - "cell_type": "code", - "source": [ - "var expectedDeferrableActualEOP = deferrableActualBOP.Value + deferrableActualCF.Value + deferrableActualAM.Value;", - "\nexpectedDeferrableActualEOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bq4Rfl5WFEejDIWSCzYAgA", - "cell_type": "markdown", - "source": [ - "The expected value is compared with the computed result: " - ], - "metadata": {} - }, - { - "id": "hKN5tE4QmkuzwXxOyxc9xQ", - "cell_type": "code", - "source": [ - "computedDeferrableActualEOP.Value == expectedDeferrableActualEOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BrWWx3tS2UK7lsbEDU4TOg", - "cell_type": "code", - "source": [ - "computedDeferrableActualEOP.Value.Should().Be(expectedDeferrableActualEOP);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Rn9tO4dA3kGJWgSdp5k-hA", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Import Actuals Specifications

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The aim of this notebook is to document the calculations taking place when importing the Actuals. For this documentation notebook the Data is imported from the corresponding csv files located in the following path Initialization/Systemorph/. The process is pictorially explained in the following flowchart. ", + "\n", + "\n", + "\n
", + "\n", + "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." + ] + }, + { + "cell_type": "markdown", + "source": [ + "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"SpecificationsSetup\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Data" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Current Period" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Please select the target period (i.e. year and month), Reporting Node, Economic Basis, and Data Node based on the imported data:" + ] + }, + { + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;", + "\nvar economicBasis = \"L\" ;", + "\nvar dataNode = \"DT1.1\";" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Import the Dimensions, Yield Curves and Nominal Cashflows from the corresponding csv files in Initialization/Systemorph/" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Initialization of the Test Suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" + ] + }, + { + "cell_type": "code", + "source": [ + "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Actual);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## View imported Actuals" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Here the imported Actuals from csv are visualized " + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().GetIfrsVariables(dataNode)", + "\n .Where(x => new string[] {EstimateTypes.A, EstimateTypes.AA, EstimateTypes.OA}.Contains(x.EstimateType))", + "\n .Where(x => x.AocType != \"EOP\")" + ] + }, + { + "cell_type": "markdown", + "source": [ + "where the filter is selecting only those *estimate types* associated to the imported Actuals, hence excluding the IFRS variables calculated when [importing the cashflows](SpecificationsImportCashflows)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Base Actuals" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The following simplified AoC Chain applies for Advance and Overdue Actuals:", + "\n1. Beginning of Period (BOP)", + "\n2. Cash flow (CF)", + "\n3. Amortization (AM) ", + "\n4. End of Period (EOP) ", + "\n", + "\nWe consider 4 types of Actual values, which are distinguished through their [Estimate Type](../DataModel/DataStructure#estimate-type):", + "\n- Actuals (A)", + "\n- Advance Actuals (AA)", + "\n- Overdue Actuals (OA)", + "\n- Deferrable Actuals (DA)", + "\n", + "\nwith the Estimate Type's system name shown between parenthesis above.", + "\nThey are computed by the so-called Actual Base **Scope**", + "\n", + "\n$$", + "\n\\text{Actual Base} (\\text{AoC}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n0 & \\text{if AoC step is AM,} \\\\", + "\n\\text{Actual Base}(\\rm{BOP}) + \\text{Actual Base}(\\rm{CF}) + \\text{Actual Base}(\\rm{WO}) & \\text{if AoC step is EOP and Estimate Type is not A,} \\\\", + "\n\\text{Imported Actual} & \\text{otherwise.}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nWe start by selecting one of the [imported Actual](#view-imported-actuals) and we pick up an available data node, novelty, and amount type. Then, we can retrieve the corresponding actual (if any) with AoC type BOP, R, and WO. ", + "\n", + "\nNote that the **Identity** for Actual Base contains information about the target data node, AoC type, novelty, amount type and estimate type." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## End of Period" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The imported actuals for the AoC steps BOP, CF, and WO are:" + ] + }, + { + "cell_type": "code", + "source": [ + "var actualBaseBOP = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" }, \"PR\", \"AA\", (int?)null) ); ", + "\nactualBaseBOP" + ] + }, + { + "cell_type": "code", + "source": [ + "var actualBaseCF = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) );", + "\nactualBaseCF" + ] + }, + { + "cell_type": "code", + "source": [ + "var actualBaseWO = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"WO\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) ); ", + "\nactualBaseWO" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Based on the imported actuals and according to the [formula above](#base-actual), the computed actual for AoC step EOP reads" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedActualBaseEOP = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"EOP\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) ); ", + "\ncomputedActualBaseEOP" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed value can be compared with the expected value" + ] + }, + { + "cell_type": "code", + "source": [ + "computedActualBaseEOP.Value == actualBaseBOP.Value + actualBaseCF.Value + actualBaseWO.Value" + ] + }, + { + "cell_type": "code", + "source": [ + "computedActualBaseEOP.Value.Should().Be( actualBaseBOP.Value + actualBaseCF.Value + actualBaseWO.Value );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Deferrable Actuals" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Deferrable Actuals (DA) are computed as follows", + "\n", + "\n$$", + "\n\\text{Deferrable Actual} (\\text{AoC}) = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{Actual Base}_{\\substack{\\text{Estimate Type}=\\text{A} \\\\ \\text{Amount Type}=\\text{ACA}}} (\\text{CF})", + "\n +\\text{Actual Base}_{\\substack{\\text{Estimate Type}=\\text{A} \\\\ \\text{Amount Type}=\\text{AEA}}} (\\text{CF}) & \\text{if AoC step is CF } \\\\", + "\n-\\text{AMF} \\cdot \\big( \\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) \\big) & \\text{if AoC step is AM } \\\\", + "\n\\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) + \\text{Deferrable Actual}(\\rm{AM}) & \\text{if AoC step is EOP } \\\\", + "\n\\text{Input Actual}_{\\text{Estimate Type}=\\text{DA}} (\\text{BOP}) & \\text{if AoC step is BOP } \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere ACA and AEA are *Aquisition* Amount Types from *Attributable Commission* and *Attributable Expenses*, respectively.", + "\n", + "\nNote that the **Identity** of Deferrable Actual is encompassing solely data node, Aoc type, and novelty." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Beginning of Period" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeferrableActualBOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" } );", + "\ncomputedDeferrableActualBOP" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The deferrable Actual for the AoC step being BOP is simply the EOP Actual of the previous period. In fact, if the latter exists among the [imported Actuals](#view-imported-actuals), it is reported here below as the BOP of the current period:" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeferrableActualBOP = Test.GetStorage().GetValue(new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" }, (string)null, EstimateTypes.DA, (int?)null);", + "\nexpectedDeferrableActualBOP" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected value is compared with the computed result: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeferrableActualBOP.Value == expectedDeferrableActualBOP" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeferrableActualBOP.Value.Should().Be(expectedDeferrableActualBOP);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Cash flow" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeferrableActualCF = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" } );", + "\ncomputedDeferrableActualCF" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The deferrable Actual for the AoC step being CF is the sum of the base Actuals with Amount Type ACA and AEA:" + ] + }, + { + "cell_type": "code", + "source": [ + "var actualBaseAEA = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"AEA\", \"A\", (int?)null) );", + "\nactualBaseAEA" + ] + }, + { + "cell_type": "code", + "source": [ + "var actualBaseACA = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"ACA\", \"A\", (int?)null) );", + "\nactualBaseACA" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeferrableActualCF = actualBaseAEA.Value + actualBaseACA.Value;", + "\nexpectedDeferrableActualCF" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected value is compared with the computed result: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeferrableActualCF.Value == expectedDeferrableActualCF" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeferrableActualCF.Value.Should().Be(expectedDeferrableActualCF);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Amortization" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeferrableActualAM = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", + "\ncomputedDeferrableActualAM" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The deferrable Actual for the AoC step being AM is the sum of the deferrable Actuals for AoC step BOP and CF multiplied by the current period amortization factor:" + ] + }, + { + "cell_type": "code", + "source": [ + "var currentPeriodAmortizationFactor = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", + "\ncurrentPeriodAmortizationFactor" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().GetValue(new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" }, (string)null, \"F\", \"L\", (int?)null)" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeferrableActualAM = -currentPeriodAmortizationFactor.Value * (expectedDeferrableActualBOP + expectedDeferrableActualCF);", + "\nexpectedDeferrableActualAM" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected value is compared with the computed result: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeferrableActualAM.Value == expectedDeferrableActualAM" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeferrableActualAM.Value.Should().Be( expectedDeferrableActualAM );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## End of Period" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeferrableActualEOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"EOP\", Novelty = \"C\" } );", + "\ncomputedDeferrableActualEOP" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The deferrable Actual for the AoC step being EOP is the sum of the deferrable Actuals for AoC step BOP, CF, and AM:" + ] + }, + { + "cell_type": "code", + "source": [ + "var deferrableActualBOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" } );", + "\ndeferrableActualBOP" + ] + }, + { + "cell_type": "code", + "source": [ + "var deferrableActualCF = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" } );", + "\ndeferrableActualCF" + ] + }, + { + "cell_type": "code", + "source": [ + "var deferrableActualAM = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", + "\ndeferrableActualAM" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeferrableActualEOP = deferrableActualBOP.Value + deferrableActualCF.Value + deferrableActualAM.Value;", + "\nexpectedDeferrableActualEOP" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected value is compared with the computed result: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeferrableActualEOP.Value == expectedDeferrableActualEOP" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeferrableActualEOP.Value.Should().Be(expectedDeferrableActualEOP);" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/SpecificationsImportCashflows.ipynb b/Test/SpecificationsImportCashflows.ipynb index 27b2e084..eac7cd32 100644 --- a/Test/SpecificationsImportCashflows.ipynb +++ b/Test/SpecificationsImportCashflows.ipynb @@ -1,2906 +1,1990 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "toc-showtags": "False", - "toc-showmarkdowntxt": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "lI4yThFtAkGBL2c6iGY6NA", - "cell_type": "markdown", - "source": [ - "

Import Cashflows Specifications

" - ], - "metadata": {} - }, - { - "id": "XPSBZvgeJUWm3KfISi0_kw", - "cell_type": "markdown", - "source": [ - "The aim of this notebook is to document the calculation of the Present Values and Amortization Factors starting from the nominal Cashflows and the Yearly Yield Curve. These starting data is imported from the corresponding csv files located in the following path Initialization/Systemorph/. The process is pictorially explained in the following flowchart. ", - "\n", - "\n", - "\n
", - "\n", - "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." - ], - "metadata": {} - }, - { - "id": "KuBokOZnNEKyeai5pecD_A", - "cell_type": "markdown", - "source": [ - "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" - ], - "metadata": {} - }, - { - "id": "ymRDCUIfokuZuGhcIgRC2Q", - "cell_type": "code", - "source": [ - "#!import \"SpecificationsSetup\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "K2nnKAzJ1kWqqKCw6hgCpg", - "cell_type": "markdown", - "source": [ - "---" - ], - "metadata": {} - }, - { - "id": "vDUrjRR4W0Cab2XwoLh66g", - "cell_type": "markdown", - "source": [ - "# Import Data" - ], - "metadata": {} - }, - { - "id": "25t6_azELkmmpL2KrlobIg", - "cell_type": "markdown", - "source": [ - "", - "\n## Current Period" - ], - "metadata": {} - }, - { - "id": "p89NHTl7QUan7LJZcHQ7CA", - "cell_type": "markdown", - "source": [ - "Please select the target period (i.e. year and month), Reporting Node, Economic Basis, and Data Node based on the imported data:" - ], - "metadata": {} - }, - { - "id": "1AQXjlCH5UqQtZhHE_ToWA", - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;", - "\nvar economicBasis = \"C\" ;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "C7KE2ugMTEeeZXpow5IctQ", - "cell_type": "markdown", - "source": [ - "Import the Dimensions, Yield Curves and Nominal Cashflows from the corresponding csv files in Initialization/Systemorph/" - ], - "metadata": {} - }, - { - "id": "o-K6Iedo20-WGrgowVvxNA", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Kd4etWIfVECgbQOUwpJjng", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "wRwk6MvytEO_Ynh6H4re9g", - "cell_type": "markdown", - "source": [ - "At this point reference data are loaded. Import now a cashfow file with a 720 elements." - ], - "metadata": {} - }, - { - "id": "u4C4qyNFokyVYXTnBsqhGw", - "cell_type": "code", - "source": [ - "var groupOfContract = \"GricComplex\";", - "\nawait UploadCashflowsAsync(\"Data/CashflowComplex.csv\")" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5qP7HJWjK0K-tb_-qAYFaw", - "cell_type": "markdown", - "source": [ - "Initialization of the Test suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" - ], - "metadata": {} - }, - { - "id": "_NJvnl5PKE6FQXhN5Pr_tw", - "cell_type": "code", - "source": [ - "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "raVSJGuqL0i16HubdvKRSQ", - "cell_type": "markdown", - "source": [ - "", - "\n## View loaded Data Nodes" - ], - "metadata": {} - }, - { - "id": "C-jrvc1_akme8Lq4zXXNnA", - "cell_type": "markdown", - "source": [ - "The imported active Data Nodes from Initialization/Systemorph/DataNodes.csv are " - ], - "metadata": {} - }, - { - "id": "ayPI03mGFEuJqDditI5Zcg", - "cell_type": "code", - "source": [ - "Test.GetStorage().DataNodeDataBySystemName" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "PNkJZPN3D0OTE4K9m7yhtw", - "cell_type": "markdown", - "source": [ - "", - "\n## View loaded Yearly Yield Curve" - ], - "metadata": {} - }, - { - "id": "449EmK-s0EC-qvpkUic0Ng", - "cell_type": "markdown", - "source": [ - "Here the correct Yield Curve is chosen among those imported from Initialization/Systemorph/Data.csv according to the [current period](#year-and-period) and the Aoc Step according the [Aoc Configuration](../DataModel/DataStructure#aoc-configuration). In the following we retrieve the desired identity." - ], - "metadata": {} - }, - { - "id": "GFBbfoECXkyIOhUvzUj1YA", - "cell_type": "code", - "source": [ - "var aocType = \"CL\";", - "\nvar novelty = \"C\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Xh9Ph958zUaWPoHyXTfa7g", - "cell_type": "code", - "source": [ - "var id = Test.GetIdentity(groupOfContract, aocType, novelty);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LSypuaGSnkmcuusalSOIMw", - "cell_type": "code", - "source": [ - "var yearlyYieldCurve = Test.GetStorage().GetYearlyYieldCurve(id, economicBasis);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZVGOGlL470Cv6pGp5K4TQA", - "cell_type": "code", - "source": [ - "yearlyYieldCurve" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YHtOWxQvJUygOp9bM9DnOg", - "cell_type": "markdown", - "source": [ - "", - "\n## View loaded Nominal Cashflows" - ], - "metadata": {} - }, - { - "id": "nuWozOR2zUqFJgmjZjSpSw", - "cell_type": "markdown", - "source": [ - "The nominal Cashflows for the current period are loaded together with last period Cashflows for Group of Contract that were already existent. ", - "\n", - "\nThe relative files are located in: Files/.", - "\n", - "\nThe result is showed in the following list to be compared with the entries of the csv files" - ], - "metadata": {} - }, - { - "id": "5XHFiMOI_k6ZLxFuzYGObA", - "cell_type": "code", - "source": [ - "Test.GetStorage().GetRawVariables(groupOfContract)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "i5XQoNnkHkCwFkZK-wvzeg", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Interest and Discount Rates" - ], - "metadata": {} - }, - { - "id": "QvPW08NJs0mc35ufVdJITA", - "cell_type": "markdown", - "source": [ - "The Yield Curve ${\\text{YC}_i}$ associated to the the [selected period](#year-and-period) and target currency of the Group of Contract Reporting Node is [displayed above](#view-loaded-yearly-yield-curve) and used in this section to calculate the Interest and Discount factors", - "\n", - "\n$$", - "\n\\text{Interest}_i = \\big( 1 + \\text{YC}_i \\big) ^{\\frac{1}{12}} ~,", - "\n$$", - "\n", - "\nand", - "\n", - "\n\\begin{align}", - "\n\\text{Discount}_i = \\big( 1 + \\text{YC}_i \\big) ^{-\\frac{1}{12}} ~.", - "\n\\end{align}" - ], - "metadata": {} - }, - { - "id": "Tx3o3lO8s0m5gv72S8Okfw", - "cell_type": "markdown", - "source": [ - "In the Scope named *MonthlyRate* the Interest and Discount factors are computed" - ], - "metadata": {} - }, - { - "id": "WjCiyKVx3UKysYDWgLig9w", - "cell_type": "code", - "source": [ - "var computedMonthlyRates = Test.GetScope( id );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Q4y_soImlkyK0gLglSALsQ", - "cell_type": "code", - "source": [ - "computedMonthlyRates" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "fl25D0dZKk6SeRoszzGp6Q", - "cell_type": "markdown", - "source": [ - "## Interest" - ], - "metadata": {} - }, - { - "id": "Z9R5ky64QUmw-BnZLN2Jug", - "cell_type": "markdown", - "source": [ - "In the following, the Interest factors computed by the application are recalculated independently according to the formula above in two different ways" - ], - "metadata": {} - }, - { - "id": "JAjIqFrQ-UizVR9ENdEB5Q", - "cell_type": "code", - "source": [ - "var expectedInterest = yearlyYieldCurve.Select( yc => (1 + yc)^( 1.0 / 12.0) );", - "\nexpectedInterest" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KHb-pVU5lkKoPw1Yx6IOLw", - "cell_type": "code", - "source": [ - "from yc in yearlyYieldCurve select (1 + yc)^( 1.0 / 12.0 ) " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "eWIhGYRQQUSp9YT53BxCgw", - "cell_type": "code", - "source": [ - "computedMonthlyRates.Interest.CheckEquality( expectedInterest ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Pt64D8ANL06gXx9he1WVzw", - "cell_type": "markdown", - "source": [ - "## Discount" - ], - "metadata": {} - }, - { - "id": "TPUopwWBTUG3gPPmb2B5Nw", - "cell_type": "markdown", - "source": [ - "The following recalculates the Discount factors to be compared with the computed values" - ], - "metadata": {} - }, - { - "id": "YtUiQ2xnzE2FfAa6LlAcfw", - "cell_type": "code", - "source": [ - "var expectedDiscount = yearlyYieldCurve.Select( yc => (1 + yc)^( -1.0 / 12.0) );", - "\nexpectedDiscount" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZGVBiwBOUk-I3JmXZnK4JA", - "cell_type": "code", - "source": [ - "computedMonthlyRates.Discount.CheckEquality( expectedDiscount ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "lMyTCC6GPUW45Cvx6U3JRw", - "cell_type": "markdown", - "source": [ - "## Test method: Get Valid Element" - ], - "metadata": {} - }, - { - "id": "FZ9_fdXlIECy7PDdcDlH1Q", - "cell_type": "markdown", - "source": [ - "Given the present Yield Curve array has finite *length*, the extrapolation implemented is taking the last element for all successive years. This behavior is given by the function *GetValidElement*. The test in this section assures that constant extrapolation is taken for *index* > *length*" - ], - "metadata": {} - }, - { - "id": "IfoqWI9zGkGc-Po9tnOcoQ", - "cell_type": "code", - "source": [ - "expectedDiscount.GetValidElement( 120 )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Z5ZpUs9wmUWbGWk6GcxNeA", - "cell_type": "code", - "source": [ - "expectedDiscount.GetValidElement( 120 ).Should().Be( expectedDiscount.Last() );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-KgziQbrF0mQYRsvkSkeGw", - "cell_type": "markdown", - "source": [ - "

", - "\n# Cashflows" - ], - "metadata": {} - }, - { - "id": "ITDv12Ph90ObEuoxNIr45w", - "cell_type": "markdown", - "source": [ - "This section deals with the calculation of the *Cumulated Discounted Cashflows* (CDC) starting from the nominal Cashflows. " - ], - "metadata": {} - }, - { - "id": "Isggf5h2S0unL3O7pgAirQ", - "cell_type": "markdown", - "source": [ - "## Choose identity" - ], - "metadata": {} - }, - { - "id": "pwQ4TMUvhUK-StHJEDFlCg", - "cell_type": "markdown", - "source": [ - "Each loaded nominal Cashflows is assigned to a so-called *Identity* which uniquely identifies it based on the *Data Node*, *Aoc Type*, and *Novelty*. In the following cells we retrieve the desired Identity:" - ], - "metadata": {} - }, - { - "id": "3MHGdD0V1k6cXBNxvaUgHA", - "cell_type": "code", - "source": [ - "var aocType = \"CL\";", - "\nvar novelty = \"C\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gPX1Ygo_DECIrwFPBvRXSQ", - "cell_type": "code", - "source": [ - "var id = Test.GetIdentity(groupOfContract, aocType, novelty);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KOWB-LuZSE6jCwSkVWLqLQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Nominal Cashflow" - ], - "metadata": {} - }, - { - "id": "7wA9Mo5SWkGRA9UpDIfDug", - "cell_type": "markdown", - "source": [ - "Consider the two Amount Type *PR* and *NIC*, with Transaction Period being *Beginning of Period* (BOP) and *End of Period* (EOP), respectively. The corresponding nominal Cashflows are deposited in the Scopes named *NominalCashflow* with the Identity provided above, Calculation Type *BE*, and the aforementioned Amount Types. These nominal Cashflows correspond with those [loaded from the csv files](#view-loaded-nominal-cashflows). " - ], - "metadata": {} - }, - { - "id": "mlWZ7mpOFkSD2Ru1TCl59g", - "cell_type": "code", - "source": [ - "var amountTypePR = \"PR\";", - "\nvar amountTypeNIC = \"NIC\";", - "\nvar calculationType = \"BE\";", - "\nvar accidentYear = (int?)null;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9TXHMp0XEEKq8LfUzqH9CA", - "cell_type": "code", - "source": [ - "var nominalPR = Test.GetScope((id, amountTypePR, calculationType, accidentYear));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WlEihYtxbECHWuuKVgue_w", - "cell_type": "code", - "source": [ - "nominalPR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "NERNBoD-OkiRREaV55ijeA", - "cell_type": "code", - "source": [ - "var nominalNIC = Test.GetScope((id, amountTypeNIC, calculationType, accidentYear));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hFfWM0bKxkW3mOhIZgZ5AQ", - "cell_type": "code", - "source": [ - "nominalNIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "765s5aL5Z0K0t5ZLuyCojg", - "cell_type": "markdown", - "source": [ - "", - "\n## Cumulated Discounted Cashflow" - ], - "metadata": {} - }, - { - "id": "JT4SSHYyVkK6kvw6pm1RYQ", - "cell_type": "markdown", - "source": [ - "The CDC is defined by the following recursive formulas", - "\n", - "\n$$", - "\n\\text{CDC}_t = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{Nominal}_t + \\text{CDC}_{t+1} \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} ~, & \\text{if Transaction Period is Beginning of Period} \\\\", - "\n\\big( \\text{Nominal}_t + \\text{CDC}_{t+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} ~, & \\text{if Transaction Period is End of Period}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere the Transaction Period depends on the given cashflow Amount Type. " - ], - "metadata": {} - }, - { - "id": "d_iKZefoME6wTrnz9UAv5A", - "cell_type": "markdown", - "source": [ - "### Beginning of Period" - ], - "metadata": {} - }, - { - "id": "espKPj1dtUuJz8XXQUAKzg", - "cell_type": "markdown", - "source": [ - "The Amount Type **Premiums** (PR) has Transaction Period **Beginning of Period** (BOP). The corresponding CDC calculated by the application is" - ], - "metadata": {} - }, - { - "id": "T7aVgGRgDEakkG-s3lfN0g", - "cell_type": "code", - "source": [ - "var computedDiscountedPR = Test.GetScope((id, amountTypePR, calculationType, accidentYear));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3FU71v2QJkyxs_bZfP4Uow", - "cell_type": "code", - "source": [ - "computedDiscountedPR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4YMOoutvQU-8pkN7n6TASQ", - "cell_type": "markdown", - "source": [ - "In the following cell we independently evaluate the expected discounted cashflow according to the formula above:" - ], - "metadata": {} - }, - { - "id": "ybObocoOVUKh6wl-2THKMA", - "cell_type": "code", - "source": [ - "var expectedDiscountedPR = new double[nominalPR.Values.Length];", - "\n", - "\nEnumerable.Range(0, nominalPR.Values.Length).Reverse()", - "\n .ForEach( i => expectedDiscountedPR[i] = nominalPR.Values[i] + expectedDiscountedPR.GetValidElement(i+1) * expectedDiscount.GetValidElement(i/12) );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "z256hRI3W0-dt-SPwhspvA", - "cell_type": "code", - "source": [ - "expectedDiscountedPR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kS81thpvcUK8_BDbmIGAew", - "cell_type": "code", - "source": [ - "(nominalPR.Values, nominalPR.Values.Length)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BVho0r3vFECpLdRKqXPiJQ", - "cell_type": "markdown", - "source": [ - "The expected cumulated discount is compared with the computed values" - ], - "metadata": {} - }, - { - "id": "rFrYAjOqPU6GlakOLi6Whg", - "cell_type": "code", - "source": [ - "computedDiscountedPR.Values.CheckEquality( expectedDiscountedPR )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CNA426Ac4ESI3ob66JKdfg", - "cell_type": "code", - "source": [ - "computedDiscountedPR.Values.CheckEquality( expectedDiscountedPR ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qGuikH-yU0uOYPbqe-xgiA", - "cell_type": "markdown", - "source": [ - "### End Of Period" - ], - "metadata": {} - }, - { - "id": "PxdI661DkEOx8fXIEikCeg", - "cell_type": "markdown", - "source": [ - "The Amount Type **Non Investment Component** (NIC) has Transaction Period **End of Period** (EOP). The corresponding CDC calculated by the application is" - ], - "metadata": {} - }, - { - "id": "glGfJSBB_UyhR3a-IkrEyw", - "cell_type": "code", - "source": [ - "var computedDiscountedNIC = Test.GetScope((id, amountTypeNIC, calculationType, accidentYear));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RYBSPN2Cvk-wIGFAo24vXA", - "cell_type": "code", - "source": [ - "computedDiscountedNIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qHM_Iqz93Ee9T-BENSbB6Q", - "cell_type": "markdown", - "source": [ - "In the following cell we independently evaluate the expected discounted cashflow according to the formula above:" - ], - "metadata": {} - }, - { - "id": "MROITxwMj0ujWWt4L-Up3w", - "cell_type": "code", - "source": [ - "var expectedDiscountedNIC = new double[nominalNIC.Values.Length];", - "\n", - "\nEnumerable.Range(0, nominalNIC.Values.Length).Reverse()", - "\n .ForEach( i => expectedDiscountedNIC[i] = ( nominalNIC.Values[i] + expectedDiscountedNIC.GetValidElement(i+1) ) * expectedDiscount.GetValidElement(i/12) );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "oHNnWbOAC02remoQuB3xeQ", - "cell_type": "code", - "source": [ - "expectedDiscountedNIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "pxhcnJV1UUuGT40Y5o79JA", - "cell_type": "markdown", - "source": [ - "The expected cumulated discount is compared with the computed values" - ], - "metadata": {} - }, - { - "id": "fB_CWCbH30qYOnXykKpInQ", - "cell_type": "code", - "source": [ - "computedDiscountedNIC.Values.CheckEquality( expectedDiscountedNIC )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "s2gR76itBESoEBFxheTs2g", - "cell_type": "code", - "source": [ - "computedDiscountedNIC.Values.CheckEquality( expectedDiscountedNIC ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WdMso-NBKku_uV1NVbeBoQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Non Performance Risk Adjustment" - ], - "metadata": {} - }, - { - "id": "x6qIuyV8iUmHNpSrP7kT_Q", - "cell_type": "markdown", - "source": [ - "In this section we treat the determination of the non-performance risk adjustment, an element offsetting partially future", - "\nclaims according to the risk that the reinsurance company cannot fulfil the full extent of its obligations.", - "\n", - "\nFirstly, the discounting recursive relation can be written explicitly as", - "\n", - "\n$$", - "\n\\begin{array}{l}", - "\n\\text{CDC}_t = \\big( \\text{Nominal}_t + \\text{CDC}_{t+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} \\\\", - "\n\\Rightarrow \\text{CDC}_t = \\sum_{\\tau=t} \\big( \\text{Valid Discount}_{\\frac{t}{12}} \\big)^{\\tau-t+1} \\cdot \\text{Nominal}_\\tau ", - "\n\\end{array}", - "\n$$", - "\n", - "\nFor nominal Cashflows with Amount Type being *Claims*, the risk-adjusted Cumulated Discounted Cashflow ", - "\nis assigned the Amount Type **Credit Default Risk** (CDR), ", - "\nand is obtained by multiplying the right hand side of the latter formula by the corresponding risk factor", - "\n", - "\n$$", - "\n\\text{CDC}_t^{\\text{Amount Type}=\\text{CDR}} = \\sum_{\\tau=t} \\big( \\text{Valid Discount}_{\\frac{t}{12}} \\big)^{\\tau-t+1} \\cdot \\text{Nominal}_\\tau^{\\text{Claim}} \\cdot \\big( e^{-\\gamma(\\tau-t)} -1 \\big)", - "\n$$", - "\n", - "\nwhere $\\gamma$ is the assumed non-performance probability of the reinsurer to be provided as an [input parameter](../DataModel/DataStructure#credit-default-rate).", - "\n", - "\nThis rate is constant for the whole projection period, that is, $\\gamma$ is not a function of $t$. ", - "\nIt effectively amounts to a constant increase in the continuous discount rate by $\\gamma$. " - ], - "metadata": {} - }, - { - "id": "a0Ap0lOGJE21INUHWmjGoQ", - "cell_type": "markdown", - "source": [ - "### Explicit vs recursive formula" - ], - "metadata": {} - }, - { - "id": "pbGuRNJm70SkHeIktIoBDQ", - "cell_type": "markdown", - "source": [ - "The explicit formula is tested versus the expected result obtained with the recursive formula" - ], - "metadata": {} - }, - { - "id": "e6e-jV9vnE6RTUlNhgK1Vw", - "cell_type": "code", - "source": [ - "var expectedDiscountedNICbis = new double[nominalNIC.Values.Length];", - "\n", - "\n//for(int t = 0; t < 12; t++)", - "\n// for(int tau = t; tau < 12; tau++)", - "\n// expectedDiscountedNICbis[t] += nominalNIC.Values[tau] * Math.Pow(expectedDiscount.GetValidElement(t/12), tau-t+1);", - "\n", - "\nEnumerable.Range(0, nominalNIC.Values.Length)", - "\n .ForEach( i => expectedDiscountedNICbis[i] = ", - "\n Enumerable.Range(i, nominalNIC.Values.Length-i).Select( tau => nominalNIC.Values[tau] * Math.Pow(expectedDiscount.GetValidElement(i/12), tau-i+1) ).Sum() );", - "\n ", - "\nexpectedDiscountedNIC.CheckEquality( expectedDiscountedNICbis )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "7VKY58rmN0i4hNUObTx5Lg", - "cell_type": "markdown", - "source": [ - "### Risk Adjusted Claims " - ], - "metadata": {} - }, - { - "id": "CDMXGMuNGUWSY2-VFbiSkQ", - "cell_type": "markdown", - "source": [ - "The computed CDC with Amount Type being CDR reads" - ], - "metadata": {} - }, - { - "id": "XnvESgljxkSWyht7EqW7NA", - "cell_type": "code", - "source": [ - "var computedDiscountedCRD = Test.GetScope((id, \"CDR\", calculationType, accidentYear));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "reDXOTbUxEGUchxSzysJog", - "cell_type": "code", - "source": [ - "computedDiscountedCRD" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nv4x6ysZxEmmtipcaDJy9g", - "cell_type": "markdown", - "source": [ - "The starting point for the non performance risk adjustment is the computation of the sum of nominal Cashflows with Amount Type **Claims** listed below" - ], - "metadata": {} - }, - { - "id": "bOQ1CXDjbUOygxJaPI-XYQ", - "cell_type": "code", - "source": [ - "Test.GetStorage().GetClaims()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0pTAfl977UK_SmRREnPF6Q", - "cell_type": "markdown", - "source": [ - "with the corresponding nominal Cashflows being" - ], - "metadata": {} - }, - { - "id": "syJWhInzsEObE2ykdoGLew", - "cell_type": "code", - "source": [ - "var nominalNIC = Test.GetScope((id, \"NIC\", calculationType, accidentYear));", - "\nnominalNIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "C7ko6wgyUkSyCQS2-Q8GuQ", - "cell_type": "code", - "source": [ - "var nominalICO = Test.GetScope((id, \"ICO\", calculationType, accidentYear));", - "\nnominalICO" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "GrTtn99Pc0KsTrYaIj7vhg", - "cell_type": "code", - "source": [ - "var nominalALE = Test.GetScope((id, \"ALE\", calculationType, accidentYear));", - "\nnominalNIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gAGXa9ftTUODRVbLikWr2A", - "cell_type": "code", - "source": [ - "var nominalULE = Test.GetScope((id, \"ULE\", calculationType, accidentYear));", - "\nnominalNIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ybob0Y2K00ysBNz_vpid2w", - "cell_type": "code", - "source": [ - "var nominalClaims = nominalICO.Values + nominalNIC.Values + nominalALE.Values + nominalULE.Values;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "7UXMUmrFwEKfhXV-EPyNOQ", - "cell_type": "markdown", - "source": [ - "Secondly, the correct credit risk rate (parameter $\\gamma$ in the [formula above](#non-performance-risk-adjustment)) is retrieved from the list of imported [Partner Rating](../DataModel/DataStructure) and [Credit Default Rates](../DataModel/DataStructure) relative to the target [Data Node](#year-and-period)'s Partner" - ], - "metadata": {} - }, - { - "id": "to_RSXazSEKtePbtjP11bA", - "cell_type": "code", - "source": [ - "groupOfContract" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qblrNkgGZkibWZqeduwsJg", - "cell_type": "code", - "source": [ - "var creditDefaultRate = Test.GetStorage().GetNonPerformanceRiskRate( id );", - "\ncreditDefaultRate" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "OAZT23-9Uk2Bs3qRbvUOKw", - "cell_type": "markdown", - "source": [ - "Lastly, using the [formula above](#non-performance-risk-adjustment), the expected CDR discounted Cashflow can be computed" - ], - "metadata": {} - }, - { - "id": "rUJBZVBNdU-8u5dSP4bv8w", - "cell_type": "code", - "source": [ - "var expectedDiscountedCDR = new double[nominalNIC.Values.Length];", - "\n", - "\nEnumerable.Range(0, nominalClaims.Length).ForEach( t => ", - "\n expectedDiscountedCDR[t] = Enumerable.Range(t, nominalClaims.Length-t).Select( tau => ", - "\n nominalClaims[tau] * Math.Pow(expectedDiscount.GetValidElement(t/12), tau-t+1) * (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", - "\n ).Sum() );", - "\n", - "\nexpectedDiscountedCDR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kKmpjPuP70GAVkBoNBqNrA", - "cell_type": "markdown", - "source": [ - "Finally, the expected cumulated discount is compared with the computed values" - ], - "metadata": {} - }, - { - "id": "m_bSBl61DE26IDp7VpY6dg", - "cell_type": "code", - "source": [ - "computedDiscountedCRD.Values.CheckEquality( expectedDiscountedCDR )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "DqkJo2YgcE65RX7db90WKQ", - "cell_type": "code", - "source": [ - "computedDiscountedCRD.Values.CheckEquality( expectedDiscountedCDR ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "mvwCM2Umf0OZHCcpOt9V5Q", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Present Values" - ], - "metadata": {} - }, - { - "id": "jzTF3NdnHkqzQ4KSajU3ig", - "cell_type": "markdown", - "source": [ - "For an implementation of these formulas refer to the [ImportScopeCalculation notebook](../Import/ImportScopeCalculation). " - ], - "metadata": {} - }, - { - "id": "g03stTrBDk-qgVynbAHR8w", - "cell_type": "markdown", - "source": [ - "The company portfolio value in one period is given by the following Analysis of Change AoC steps:", - "\n1. Beginning of Period (BoP): starting value of the portfolio as of December last year (in the Year to Date view), ", - "\n2. Model Corrections (MC): change of the portfolio value based on the model change,", - "\n3. Cash Flow (CF):", - "\n4. Interest Accretion (IA): ", - "\n5. Assumption Update (AU): ", - "\n6. Yield Curve Update (YCU): impact of yield curve update occured during the reporting period,", - "\n7. Credit Risk Update (CRU): impact of credit default rate update occured during the reporting period,", - "\n8. Experience Variance (EV): value adjustments following insurance related events which took place (e.g. mortality),", - "\n9. Combined Liabilities (CL):", - "\n10. End of Period (EOP): portfolio value at the end of the current period.", - "\n", - "\nNote: the AoC steps WO, EA and AM are not included in the Present Value calculation, hence their values if inquired is zero." - ], - "metadata": {} - }, - { - "id": "YcUNq4BqbUuS6xpbevFZDw", - "cell_type": "markdown", - "source": [ - "The Present Value Base (PVB) values are valid for all [Economic Basis](../DataModel/DataStructure#economic-basis) and depends on the corresponding [AoCType](../DataModel/DataStructure#aoc-type):", - "\n", - "\n$$", - "\n\\text{PVB}_t \\big(\\text{AoC}\\big) = ", - "\n\\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{CDC}_t & \\text{if AoC is Beginning of Period (BOP) } \\\\", - "\n-\\text{Nominal}_t(\\text{Parent AoC}) & \\text{if AoC is Expected Cashflow (CF) } \\\\", - "\n\\text{InterestAccretion}_t & \\text{if AoC is Interest Accretion (IA) } \\\\", - "\n\\text{CDC}_t(\\text{Parent AoC}) & \\text{if AoC is End of Period (EOP) } \\\\", - "\n\\text{CDC}_{t}(\\text{current AoC}) - \\text{CDC}_{t}(\\text{parent AoC}) & \\text{otherwise}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nand the Projected Present Value (PPV) reads", - "\n", - "\n$$", - "\n\\text{PPV} \\big(\\text{AoC},\\text{TS},\\text{S}\\big) = \\left\\{", - "\n\\begin{array}{cll}", - "\n\\text{PVB}_{S} & \\text{if AoC Valuation Period is Beginning of Period } & \\text{ (e.g. BOP, MC) } \\\\", - "\n\\text{PVB}_{S+TS/2 -1} & \\text{if AoC Valuation Period is Mid of Period } & \\text{ (no examples in current data model) } \\\\", - "\n\\sum_{i=S}^{S + TS -1}\\text{PVB}_{i} & \\text{if AoC Valuation Period is Delta } & \\text{ (e.g. CF, IA) } \\\\", - "\n\\text{PVB}_{S + TS} & \\text{if AoC Valuation Period is End of Period } & \\text{ (e.g. YCU, CRU, EV, CL, EOP) } \\\\", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere the Shift (S) and Time Step (TS) are derived from the current [Year and Period](#year-and-period)" - ], - "metadata": {} - }, - { - "id": "96OPjQu30EWs42-nfLhp4A", - "cell_type": "code", - "source": [ - "var projectionPeriod = 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4ZzZwXo6T0-e0QLjP8y4hg", - "cell_type": "code", - "source": [ - "Test.GetStorage().GetShift(projectionPeriod)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "netwTLrv3EmUheR4K9fkww", - "cell_type": "code", - "source": [ - "Test.GetStorage().GetTimeStep(projectionPeriod)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HMUKlLJN6kCSVDgFWS5NUw", - "cell_type": "markdown", - "source": [ - "## Load Cashflow Data" - ], - "metadata": {} - }, - { - "id": "HZbqZPP1wUiVXHajP55O6w", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZWm_0QT1NEy3vrI1pssFEg", - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ERPDxPrxRE2F80hUf91cqQ", - "cell_type": "markdown", - "source": [ - "At this point standard Cashflows are loaded." - ], - "metadata": {} - }, - { - "id": "5qSxlX_u-0a1kyOkKpWkrw", - "cell_type": "markdown", - "source": [ - "Initialization of the Test suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" - ], - "metadata": {} - }, - { - "id": "yQhC05DCzEGeOGNpEf3mbg", - "cell_type": "code", - "source": [ - "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "R-gHWFQh4USaSbZeSX4nRA", - "cell_type": "markdown", - "source": [ - "## Select Group of Contract", - "\n", - "\nHere, it is possible to select the Group of Contract used to run the next section of this Notebook." - ], - "metadata": {} - }, - { - "id": "S6Fw2Fa0UUOkuS8wyQfBtg", - "cell_type": "code", - "source": [ - "groupOfContract = \"DTR1.1\" ;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hT5J5i-Tk0evmsGzFslKZA", - "cell_type": "markdown", - "source": [ - "## Beginning of Period" - ], - "metadata": {} - }, - { - "id": "nvqfr4Ux3kWlzwsCW0_USg", - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Beginning of Period is:" - ], - "metadata": {} - }, - { - "id": "fC63Uw1ey0OYVorrzegYrA", - "cell_type": "code", - "source": [ - "var idBoP = Test.GetIdentity(groupOfContract, \"BOP\", \"I\");", - "\nidBoP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-_jk2YKNT0u7l9uCTrc18w", - "cell_type": "code", - "source": [ - "var computedPresentValueBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueBoP_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ddqVdgtt20KgvWxmw6d8tQ", - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, the expected BOP AoCType for PVB is defined to be equal to the discounted cashflows with the same Identity, Amount Type, and Calculation Type, whereas the PPV is the S-th element of the PVB." - ], - "metadata": {} - }, - { - "id": "UCd_zlXg7UKAz7Ak8etIKQ", - "cell_type": "code", - "source": [ - "var discountedBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", - "\ndiscountedBoP_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "he2CNq7s20a2kIAEI1Ew5A", - "cell_type": "code", - "source": [ - "var expectedPresentValueBoP_PR = discountedBoP_PR.Values;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "k8y7lMCUU0ahMIV2XNly5w", - "cell_type": "markdown", - "source": [ - "In the following cell we check whether the expected values match the computed values" - ], - "metadata": {} - }, - { - "id": "E_a4AaUiYU-qVqiFMH4Ffg", - "cell_type": "code", - "source": [ - "computedPresentValueBoP_PR.Values.CheckEquality( expectedPresentValueBoP_PR )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "USXwqdZpmEOlDJdxqDBZaA", - "cell_type": "code", - "source": [ - "computedPresentValueBoP_PR.Values.CheckEquality( expectedPresentValueBoP_PR ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-zbiX1EOvUaXOZIuba9Jbw", - "cell_type": "markdown", - "source": [ - "", - "\n## Model Corrections" - ], - "metadata": {} - }, - { - "id": "8tg7sZov10aMykVfqjUstg", - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Model Corrections is:" - ], - "metadata": {} - }, - { - "id": "CxmloqNXXkaE5PpJU1ydAQ", - "cell_type": "code", - "source": [ - "var idMC = Test.GetIdentity(groupOfContract, \"MC\", \"I\");", - "\nidMC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nvbs4pu8Sk-fnfw1MqBJEQ", - "cell_type": "code", - "source": [ - "var computedPresentValueMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueMC_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8I2WEVons0iuf2UA4TyGtQ", - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, for MC AoCType, the PVB is equal to the difference between the CDC of the current AoCType and the CDC of its parent. Additionally, the PPV is the S-th element of the PVB." - ], - "metadata": {} - }, - { - "id": "XX3McWqdQECPv33I70zR8w", - "cell_type": "code", - "source": [ - "Test.GetScope((idMC, \"PR\")).Values" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dnlMbprPGEefEvBLpE3SVA", - "cell_type": "code", - "source": [ - "var discountedMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", - "\ndiscountedMC_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "pqOSCzCTJEyNauxM07RTvg", - "cell_type": "code", - "source": [ - "var expectedPresentValueMC_PR = discountedMC_PR.Values - discountedBoP_PR.Values;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gjdYsN-ftE-HlOKgEwvQLg", - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ], - "metadata": {} - }, - { - "id": "WOMu6tnVOEWiRZqaziMRcg", - "cell_type": "code", - "source": [ - "computedPresentValueMC_PR.Values.CheckEquality( expectedPresentValueMC_PR )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TvZ78p6vLkCL-xejOqvUcw", - "cell_type": "code", - "source": [ - "computedPresentValueMC_PR.Value == expectedPresentValueMC_PR[0]" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "w9D4tVGk5UmDB-tTCeS5Rw", - "cell_type": "code", - "source": [ - "computedPresentValueMC_PR.Values.CheckEquality( expectedPresentValueMC_PR ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nnvwi_zKy0ebrac1nrqanQ", - "cell_type": "code", - "source": [ - "computedPresentValueMC_PR.Value.Should().Be( expectedPresentValueMC_PR[0] );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jiKZ8kbywUK4oPhyLtuzFg", - "cell_type": "markdown", - "source": [ - "## Cashflow" - ], - "metadata": {} - }, - { - "id": "LG4pdtcxt0K_GSnJ0CDHLA", - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Cashflow is:" - ], - "metadata": {} - }, - { - "id": "CIshbPDh_0OC_HeMFEe2Rw", - "cell_type": "code", - "source": [ - "var idCF = Test.GetIdentity(groupOfContract, \"CF\", \"I\");", - "\nidCF" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5sLKCaklikuTAXBf9hAoGQ", - "cell_type": "code", - "source": [ - "var computedPresentValueCF_PR = Test.GetScope((idCF, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueCF_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VNaRi132eUy9m4SnHizakQ", - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, for CF AoCType, the PVB is equal to the nominal cashflow of its parent AoC step with opposite sign. The PPV is given by the sum of the first 3 elements." - ], - "metadata": {} - }, - { - "id": "pad5L8Zv40a1HYc508KwvA", - "cell_type": "code", - "source": [ - "var cfReferenceAocStep = Test.GetScope(idCF).Value;", - "\ncfReferenceAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "d_4naEye_0ez9ceQFlUsHg", - "cell_type": "code", - "source": [ - "var cfNominalReference_PR = Test.GetScope((idCF with {AocType = cfReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", - "\ncfNominalReference_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YSGvWpZAgk676PWkouVFvg", - "cell_type": "code", - "source": [ - "var expectedPresentValueCF_PR = -1.0 * cfNominalReference_PR.Values;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "T8i5WyGKH0eb6JTHWt3k3w", - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ], - "metadata": {} - }, - { - "id": "mlrKZMMExkOXb_z-QA-nzQ", - "cell_type": "code", - "source": [ - "computedPresentValueCF_PR.Values.CheckEquality( expectedPresentValueCF_PR )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_iXoBI2Ra06t95Lv-UKmdQ", - "cell_type": "code", - "source": [ - "computedPresentValueCF_PR.Values[0] + computedPresentValueCF_PR.Values[1] + computedPresentValueCF_PR.Values[2] == computedPresentValueCF_PR.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QWPx_7NUmEyE5Xu_kEeyjg", - "cell_type": "code", - "source": [ - "computedPresentValueCF_PR.Values.CheckEquality( expectedPresentValueCF_PR ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MSbSF0-9w0-iu_c3cNINjA", - "cell_type": "code", - "source": [ - "computedPresentValueCF_PR.Value.Should().Be( computedPresentValueCF_PR.Values[0] + computedPresentValueCF_PR.Values[1] + computedPresentValueCF_PR.Values[2] );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "iO7keKMcaE2t2gXC_7kqsA", - "cell_type": "markdown", - "source": [ - "", - "\n## Interest Accretion" - ], - "metadata": {} - }, - { - "id": "m6ZEzxBBsUyJ_QAcvMD6dA", - "cell_type": "markdown", - "source": [ - "For IA AoCType, the PVB is given by the following relation ", - "\n", - "\n$$", - "\n\\text{InterestAccretion}_i = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\big(\\text{CDC}_i(\\text{Parent AoC}) - \\text{Nominal}_i(\\text{parent AoC}) \\big) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, ", - "\n & \\text{if AmountType Transaction Period is Beginning of Period} \\\\", - "\n\\text{CDC}_i(\\text{parent AoC}) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, ", - "\n & \\text{otherwise}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhile the PPV is given by the sum of the first S elements.", - "\n", - "\nWhen selecting the Identity, note that the Novelty *C* is not contemplated for Interest Accretion." - ], - "metadata": {} - }, - { - "id": "NMCk4gASMU62Bn6JnDxQmQ", - "cell_type": "code", - "source": [ - "var idIA = Test.GetIdentity(groupOfContract, \"IA\", \"I\");", - "\nidIA" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "fGjntj5jp0KxtiO6hKj29A", - "cell_type": "markdown", - "source": [ - "### Amount Type BOP" - ], - "metadata": {} - }, - { - "id": "byoRIpg2MkegjRvCvI9Ung", - "cell_type": "markdown", - "source": [ - "The computed Present Value for Amount Type **Premiums** (PR) with Transaction Period **Beginning of Period** (BOP) is" - ], - "metadata": {} - }, - { - "id": "ZiyHW9AJqEqeFgbYLv9FQA", - "cell_type": "code", - "source": [ - "var computedPresentValueIA_PR = Test.GetScope((idIA, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueIA_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XsDT4dnWfEqsJ28QKuHueg", - "cell_type": "markdown", - "source": [ - "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the interest factors, the nominal and discounted Cashflow of the parent Aoc Step" - ], - "metadata": {} - }, - { - "id": "yFVC3VGv4E2tNAJb0CRucw", - "cell_type": "code", - "source": [ - "var iaComputedMonthlyRates = Test.GetScope( idIA );", - "\niaComputedMonthlyRates" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kNS1BMQgXUCkSOuUK_IS7g", - "cell_type": "code", - "source": [ - "var iaReferenceAocStep = Test.GetScope(idIA).Value;", - "\niaReferenceAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "m6gpvEMNwEqFRImTGZBmTQ", - "cell_type": "code", - "source": [ - "var nominalIaReference_PR = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", - "\nnominalIaReference_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kEFdXGJHjkK39Ed9UMwNQA", - "cell_type": "code", - "source": [ - "var discountedIaReference_PR = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", - "\ndiscountedIaReference_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "b-s6yRRvEUeLF_z6-rD7lw", - "cell_type": "code", - "source": [ - "var expectedPresentValueIA_PR = discountedIaReference_PR.Values.Select((val, index) => ( val - nominalIaReference_PR.Values[index]) * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kpN29rNO-Uu2al_yAtJQVg", - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ], - "metadata": {} - }, - { - "id": "2R1QDTLoAkSYgN3VL0pXxg", - "cell_type": "code", - "source": [ - "computedPresentValueIA_PR.Values.CheckEquality( expectedPresentValueIA_PR )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ioWKmAEOBk6ly7qdPm8UcQ", - "cell_type": "code", - "source": [ - "computedPresentValueIA_PR.Values[0] + computedPresentValueIA_PR.Values[1] + computedPresentValueIA_PR.Values[2] == computedPresentValueIA_PR.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "lLcVd6QU_E-CV-zx6UKKyw", - "cell_type": "code", - "source": [ - "computedPresentValueIA_PR.Values.CheckEquality( expectedPresentValueIA_PR ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nksstSVXV0KMKV3s1Qzbjw", - "cell_type": "code", - "source": [ - "computedPresentValueIA_PR.Value.Should().Be( computedPresentValueIA_PR.Values[0] + computedPresentValueIA_PR.Values[1] + computedPresentValueIA_PR.Values[2] );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-DoJ5d5hPkGgyuUIARfcpw", - "cell_type": "markdown", - "source": [ - "### Amount Type EOP" - ], - "metadata": {} - }, - { - "id": "AIiYNFEf4EC9W5W55HyRuw", - "cell_type": "markdown", - "source": [ - "The computed Present Value for Amount Type **Non Investment Component** (NIC) with Transaction Period **End of Period** (EOP) is" - ], - "metadata": {} - }, - { - "id": "1sPIRjZ290ekFi_RcQIo0g", - "cell_type": "code", - "source": [ - "var computedPresentValueIA_NIC = Test.GetScope((idIA, \"NIC\", \"BE\", (int?)null));", - "\ncomputedPresentValueIA_NIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8nDAQ54uqUOqhCa5ArK8Ig", - "cell_type": "markdown", - "source": [ - "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the interest monthly rates, the discounted Cashflow of the parent Aoc Step" - ], - "metadata": {} - }, - { - "id": "HMwmW4WN50q8XsSBrLA9mw", - "cell_type": "code", - "source": [ - "var iaReferenceAocStep = Test.GetScope(idIA).Value;", - "\niaReferenceAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "harsyLraKU-NCaV-qs_10A", - "cell_type": "code", - "source": [ - "var discountedIaReference_NIC = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"NIC\", \"BE\", (int?)null));", - "\ndiscountedIaReference_NIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CeJcWORR1USjRX0vRrD9uw", - "cell_type": "code", - "source": [ - "var expectedPresentValueIA_NIC = discountedIaReference_NIC.Values.Select((val, index) => val * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Bg1hcEUU9UarAJ7j6K3Cgg", - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ], - "metadata": {} - }, - { - "id": "hiB4BkoAvUWvG3yaH-lUgg", - "cell_type": "code", - "source": [ - "computedPresentValueIA_NIC.Values.CheckEquality( expectedPresentValueIA_NIC )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "FAOKIDlrpEiY95BXbRJ9Lg", - "cell_type": "code", - "source": [ - "computedPresentValueIA_NIC.Values[0] + computedPresentValueIA_NIC.Values[1] + computedPresentValueIA_NIC.Values[2] == computedPresentValueIA_NIC.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3XieKhmULE2hpsAGvEz6Jw", - "cell_type": "code", - "source": [ - "computedPresentValueIA_NIC.Values.CheckEquality( expectedPresentValueIA_NIC ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "7eg7INUm50qXDWFveCVSJA", - "cell_type": "code", - "source": [ - "computedPresentValueIA_NIC.Value.Should().Be( computedPresentValueIA_NIC.Values[0] + computedPresentValueIA_NIC.Values[1] + computedPresentValueIA_NIC.Values[2] );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6PbcOZfV3Ua46NCV9bNvnw", - "cell_type": "markdown", - "source": [ - "## Yield Curve Update" - ], - "metadata": {} - }, - { - "id": "AJCuWf4c_kG-MTka3KHH9A", - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Yield Curve Update is:" - ], - "metadata": {} - }, - { - "id": "xECM9ubIAUWuJJQrVhS96Q", - "cell_type": "code", - "source": [ - "var idYcu = Test.GetIdentity(groupOfContract, \"YCU\", \"I\");", - "\nidYcu" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZtcMBnMzIkCuhjXxj25VQA", - "cell_type": "code", - "source": [ - "var computedPresentValueYCU_PR = Test.GetScope((idYcu, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueYCU_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "i_nXQ_NxtkanS4_VPwpXAA", - "cell_type": "markdown", - "source": [ - "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the discount factors for beginning of period and for end of period applied to the reference Aoc step, followed by the difference between the CDC obtained with end of period discount factor and the CDC obtained with beginning of period discount factor. " - ], - "metadata": {} - }, - { - "id": "qPgsLajbvEek7uwPNGMznw", - "cell_type": "code", - "source": [ - "var ycReferenceAocStep = Test.GetScope(idYcu).Value;", - "\nycReferenceAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "s8uI23FdzE6M9phEhZvlpg", - "cell_type": "code", - "source": [ - "var ycParentAocStep = Test.GetScope((idYcu, \"PR\")).Values.Single();", - "\nycParentAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "utP-1N2gHk2noyPx1Bz_Xw", - "cell_type": "code", - "source": [ - "var ycParentId = idYcu with {AocType = ycParentAocStep.AocType, Novelty = ycParentAocStep.Novelty};", - "\nycParentId" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "mtfbhW8_Fkar_ZID9fIKvw", - "cell_type": "markdown", - "source": [ - "Here is the parent AocStep discounted with the beginning of period discount factor." - ], - "metadata": {} - }, - { - "id": "m-hTC4iApEK8Ex_Oq8nqYQ", - "cell_type": "code", - "source": [ - "var discountedYcParent = Test.GetScope((ycParentId, \"PR\", \"BE\", (int?)null));", - "\ndiscountedYcParent" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "y1gdrxvTuE6sNtropNbIvg", - "cell_type": "markdown", - "source": [ - "Here we independently compute the CDC of the parent AocStep discounted with end of period discount factor." - ], - "metadata": {} - }, - { - "id": "v2NdunV9lUCmDXNy3tWk5g", - "cell_type": "code", - "source": [ - "var nominalYcParent = Test.GetScope((ycParentId, \"PR\", \"BE\", (int?)null));", - "\nnominalYcParent" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Y5RkFcGlxUWUCsWbNDtAbg", - "cell_type": "code", - "source": [ - "var ycComputedMonthlyRates = Test.GetScope( idYcu );", - "\nycComputedMonthlyRates" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Yko2CYybLEGJHMKwCDW3-g", - "cell_type": "code", - "source": [ - "var ycReferenceDiscountedEop = new double[nominalYcParent.Values.Length];", - "\n", - "\nEnumerable.Range(0, nominalYcParent.Values.Length).Reverse()", - "\n .ForEach( i => ycReferenceDiscountedEop[i] = nominalYcParent.Values[i] + ycReferenceDiscountedEop.GetValidElement(i+1) * ycComputedMonthlyRates.Discount.GetValidElement(i/12) );", - "\nycReferenceDiscountedEop" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-nB_BwXaFUSg1RGG9OtRWQ", - "cell_type": "code", - "source": [ - "var expectedPresentValueYCU_PR = ycReferenceDiscountedEop - discountedYcParent.Values;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "oqAvk5VK906PkRkAT2OaRg", - "cell_type": "code", - "source": [ - "computedPresentValueYCU_PR.Values.CheckEquality( expectedPresentValueYCU_PR )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tUv9lq_VLEqCkXFKJJuQig", - "cell_type": "code", - "source": [ - "computedPresentValueYCU_PR.Value == expectedPresentValueYCU_PR[3]" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "m4ee2o2DZ0aKf2FH92STsw", - "cell_type": "code", - "source": [ - "computedPresentValueYCU_PR.Values.CheckEquality( expectedPresentValueYCU_PR ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kA0wrkGJaUG-mcZFz8IYPw", - "cell_type": "code", - "source": [ - "computedPresentValueYCU_PR.Value.Should().Be( expectedPresentValueYCU_PR[3] );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "USKTbJfkSE607v_NwHKjvA", - "cell_type": "markdown", - "source": [ - "## Credit Risk Update" - ], - "metadata": {} - }, - { - "id": "QxohiF0860mtmiIoW8C26A", - "cell_type": "markdown", - "source": [ - "This Aoc Step is relevant only in the case of a Group of Reinsurance Contract." - ], - "metadata": {} - }, - { - "id": "aN_4K8LWFU-JoAvOSlRyvw", - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Credit Risk Update is:" - ], - "metadata": {} - }, - { - "id": "JuGimhzAIEKT0SIZKqog0w", - "cell_type": "code", - "source": [ - "var idCru = Test.GetIdentity(groupOfContract, \"CRU\", \"I\");", - "\nidCru" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "77exgwl5wUefPwQGSvv_nA", - "cell_type": "code", - "source": [ - "var computedPresentValueCRU = Test.GetScope((idCru, \"CDR\", \"BE\", (int?)null));", - "\ncomputedPresentValueCRU" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ltjSbNI1_k-mVdX0EBv-xA", - "cell_type": "markdown", - "source": [ - "The Present Value can be recomputed independently starting as the difference between the CDC obtained with end of period credit default risk rate and the CDC obtained with beginning of period credit default risk rate, both computed using the Nominal cashflow of the reference Aoc Step and the End Of Period discounting factors. " - ], - "metadata": {} - }, - { - "id": "5Mi2lhLj9kivaiTjvv2G1Q", - "cell_type": "code", - "source": [ - "var cruReferenceAocStep = Test.GetScope(idCru).Value;", - "\ncruReferenceAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "px7VkUXT10yK8uLGIu7UEw", - "cell_type": "code", - "source": [ - "var cruReferenceId = idCru with {AocType = cruReferenceAocStep.AocType, Novelty = cruReferenceAocStep.Novelty};", - "\ncruReferenceId" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0EZECyt5MEWdc8mjDVvhuA", - "cell_type": "code", - "source": [ - "var cruParentAocStep = Test.GetScope((idCru, \"CDR\")).Values.Single();", - "\ncruParentAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "osW4gCnv2EKUPFxXxAMqJA", - "cell_type": "code", - "source": [ - "var cruParentId = idCru with {AocType = cruParentAocStep.AocType, Novelty = cruParentAocStep.Novelty};", - "\ncruParentId" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LpyKsQ8EekaZw0sPwhs2Vw", - "cell_type": "markdown", - "source": [ - "Here is the parent AocStep discounted with beginning of period credit default risk rate." - ], - "metadata": {} - }, - { - "id": "72C7qsrN9Ui9B_XYbrIpsQ", - "cell_type": "code", - "source": [ - "var discountedCruParent = Test.GetScope((cruParentId, \"CDR\", \"BE\", (int?)null));", - "\ndiscountedCruParent" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vRLrx8ecq02PiEdHXn3hBg", - "cell_type": "code", - "source": [ - "var nominalCruReference = Test.GetScope((cruReferenceId, \"CDR\", \"BE\", (int?)null)).Values;", - "\nnominalCruReference" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jLV_5_vMx0OrVHD_Yu5mVA", - "cell_type": "code", - "source": [ - "var creditDefaultRate = Test.GetStorage().GetNonPerformanceRiskRate( idCru );", - "\ncreditDefaultRate" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VEgXXlyhrEawDMht-nAV9A", - "cell_type": "code", - "source": [ - "var cruComputedMonthlyRates = Test.GetScope( idCru );", - "\ncruComputedMonthlyRates" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "owmqecMemE-q5q164EhXnw", - "cell_type": "markdown", - "source": [ - "Lastly, using the [formula above](#non-performance-risk-adjustment), the expected CDR discounted Cashflow can be computed" - ], - "metadata": {} - }, - { - "id": "LYbZBgKavEO7IynuEAXGcA", - "cell_type": "code", - "source": [ - "var cruExpectedDiscountedCDR = new double[nominalCruReference.Length];", - "\n", - "\nEnumerable.Range(0, nominalCruReference.Length).ForEach( t => ", - "\n cruExpectedDiscountedCDR[t] = Enumerable.Range(t, nominalCruReference.Length-t).Select( tau => ", - "\n nominalCruReference[tau] * ", - "\n Math.Pow(cruComputedMonthlyRates.Discount.GetValidElement(t/12), tau-t+1) * ", - "\n (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", - "\n ).Sum() );", - "\n", - "\ncruExpectedDiscountedCDR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "f8a9p87_WUCugmBsw0E4sA", - "cell_type": "code", - "source": [ - "var expectedPresentValueCRU = cruExpectedDiscountedCDR - discountedCruParent.Values;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "7odSeJ5RTUmTR32M-5tlAA", - "cell_type": "code", - "source": [ - "computedPresentValueCRU.Values.CheckEquality( expectedPresentValueCRU )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ojtYz8I9xkaTA1AcV3U1Cw", - "cell_type": "code", - "source": [ - "computedPresentValueCRU.Value == expectedPresentValueCRU[3]" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WH8Cl5EMp0ewbK4iQ7-W3A", - "cell_type": "code", - "source": [ - "computedPresentValueCRU.Values.CheckEquality( expectedPresentValueCRU ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-4irtBVO70uLS-mVjr-3jQ", - "cell_type": "code", - "source": [ - "computedPresentValueCRU.Value.Should().Be( expectedPresentValueCRU[3] );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QLzUGR2eJk-J02bHAg78sg", - "cell_type": "markdown", - "source": [ - "## Combined Liabilities" - ], - "metadata": {} - }, - { - "id": "bxMjiXdzt0a-HXTolLPSig", - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Combined Liabilities and Amount Type PR is:" - ], - "metadata": {} - }, - { - "id": "iWOEJ3tfb02n5-nhXKNWPg", - "cell_type": "code", - "source": [ - "var idCL = Test.GetIdentity(groupOfContract, \"CL\", \"C\");", - "\nidCL" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RxytwcSRIEOh4gnpLjM-6A", - "cell_type": "code", - "source": [ - "var computedPresentValueCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueCL_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "L0VyPzCrw02LlbNwi8lo6Q", - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, for CL AoCType, the PVB is equal to the difference between the CDC of the current AoCType and the CDC of its parent(s). Additionally, the PPV is the $(\\text{S}+\\text{TS})$-th element of the PVB." - ], - "metadata": {} - }, - { - "id": "eWjL6y9C3k-py-95Mi0SJg", - "cell_type": "code", - "source": [ - "var clParents = Test.GetScope((idCL,\"PR\")).Values;", - "\nclParents" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "o7Xu2o42K0SylUpXrn5bIw", - "cell_type": "code", - "source": [ - "var expectedPresentValueCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null)).Values -", - "\n clParents.Select(aocStep => Test.GetScope((idCL with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, \"PR\", \"BE\", (int?)null)).Values).Aggregate();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "2Pzjvmq7BEGnPjDo-Jvo3g", - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ], - "metadata": {} - }, - { - "id": "mJ3zeyh3YUSL7myhsdowKg", - "cell_type": "code", - "source": [ - "computedPresentValueCL_PR.Values.CheckEquality( expectedPresentValueCL_PR )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "t8dZLcMcYEiQaGohNjbhbw", - "cell_type": "code", - "source": [ - "computedPresentValueCL_PR.Value == expectedPresentValueCL_PR[3]" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CG2NuOh-OUWD0O9KjUlTKg", - "cell_type": "code", - "source": [ - "computedPresentValueCL_PR.Values.CheckEquality( expectedPresentValueCL_PR ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "FNsLWW7W6UmZwW_agz-FbQ", - "cell_type": "code", - "source": [ - "computedPresentValueCL_PR.Value.Should().Be( expectedPresentValueCL_PR[3] );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YAUW6hLjTkSDSB8hvqc-Ow", - "cell_type": "markdown", - "source": [ - "## End of Period" - ], - "metadata": {} - }, - { - "id": "ED73CBkcQkyvPg6_7eDFSg", - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type End of Period is:" - ], - "metadata": {} - }, - { - "id": "k3jsi34sxkSGoxKA1Btb1g", - "cell_type": "code", - "source": [ - "var idEOP = Test.GetIdentity(groupOfContract, \"EOP\", \"C\");", - "\nidEOP" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "s86AHJ-4Pk6Va461mh5gBQ", - "cell_type": "code", - "source": [ - "var computedPresentValueEOP_NIC = Test.GetScope((idEOP, \"NIC\", \"BE\", (int?)null));", - "\ncomputedPresentValueEOP_NIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QVXK0fUvN0-yuvBbKXPPrw", - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, for EOP AoCType, the PVB is equal to the CDC of the parent AoC step, while the PPV is the $(\\text{S}+\\text{TS})$-th element of the PVB." - ], - "metadata": {} - }, - { - "id": "22vabLHnN0uty9-9BNNPNg", - "cell_type": "code", - "source": [ - "var eopReferenceAocStep = Test.GetScope(idEOP).Value;", - "\neopReferenceAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ECiuOq0oL0eK5tMnQpoHtg", - "cell_type": "code", - "source": [ - "var discountedCL_NIC = Test.GetScope((idEOP with {AocType = eopReferenceAocStep.AocType, Novelty = eopReferenceAocStep.Novelty}, \"NIC\", \"BE\", (int?)null));", - "\ndiscountedCL_NIC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TgfGcomxyEu_Bi31dr0a8Q", - "cell_type": "code", - "source": [ - "var expectedPresentValueEOP_NIC = discountedCL_NIC.Values;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "COrZzNoVR0uPcoTvusJl9A", - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ], - "metadata": {} - }, - { - "id": "uHz3FD5pz0KtlPWvehPSTw", - "cell_type": "code", - "source": [ - "computedPresentValueEOP_NIC.Values.CheckEquality( expectedPresentValueEOP_NIC )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "NgccZKROIUGyHphm6Pt3mA", - "cell_type": "code", - "source": [ - "computedPresentValueEOP_NIC.Value == expectedPresentValueEOP_NIC[3]" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9jo2Z3ljfkyeYFEYk8YevQ", - "cell_type": "code", - "source": [ - "computedPresentValueEOP_NIC.Values.CheckEquality( expectedPresentValueEOP_NIC ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "wQEKDnBmiEiCcxaQ5z8n_Q", - "cell_type": "code", - "source": [ - "computedPresentValueEOP_NIC.Value.Should().Be( expectedPresentValueEOP_NIC[3] );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TYv8HCkwJ0-eIPL5UgmkSg", - "cell_type": "markdown", - "source": [ - "## Check for zero PVB values" - ], - "metadata": {} - }, - { - "id": "ypVkZQiC50KtLKlrkxwfWA", - "cell_type": "markdown", - "source": [ - "### Amortization" - ], - "metadata": {} - }, - { - "id": "f6LQtXZHZE60NfgYXKiAmg", - "cell_type": "markdown", - "source": [ - "For AM AoCType, the PVB values are zero, i.e. Amortization is not part of the Present Value computation. In this subsection we check whether the corresponding values are zero accordingly. " - ], - "metadata": {} - }, - { - "id": "YmNDcj0tDEObggNuOxfFVg", - "cell_type": "code", - "source": [ - "var idAM = Test.GetIdentity(groupOfContract, \"AM\", \"C\");", - "\nidAM" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Hbvbc_-ghkCPuBcY4CaNSw", - "cell_type": "code", - "source": [ - "var computedPresentValueAM_PR = Test.GetScope((idAM, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueAM_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vtA_SwM1FkWUvn7cz_gsEg", - "cell_type": "code", - "source": [ - "var computedPresentValueAM_PR = Test.GetScope((idAM, \"NIC\", \"BE\", (int?)null));", - "\ncomputedPresentValueAM_PR" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Hm9t12cEPEq0qfPXqqQKDA", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Amortization Factors" - ], - "metadata": {} - }, - { - "id": "HIn4-XNBlUC_ryCdXqFJXw", - "cell_type": "markdown", - "source": [ - "The amortization factors (AMF) are calculated from the corresponding Nominal and Discounted Cashflows with Calculation Type being *Coverage Units* (CU). ", - "\nThe monthly AMF is", - "\n", - "\n$$", - "\n\\text{AMF}^{\\text{Monthly}}_t = 1 - \\frac{ \\text{Nominal}^{\\text{Coverage Units}}_t } { \\text{CDC}^{\\text{Coverage Units}}_t } ~,", - "\n$$", - "\n", - "\nwhile the AMF related to the current period is", - "\n", - "\n$$", - "\n\\text{AMF} = \\prod _{t = \\text{S}}^{\\text{S}+\\text{TS}} \\text{AMF}^{\\text{Monthly}}_t ~.", - "\n$$", - "\n", - "\nwhere the shift S and Time Step TS for the [current period](#year-and-period) are" - ], - "metadata": {} - }, - { - "id": "GMNrVzKXH0ymV23dJDvYKQ", - "cell_type": "code", - "source": [ - "var projectionPeriod = 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YPFhl76CQkyB4G8ObloZRg", - "cell_type": "code", - "source": [ - "var shift = Test.GetStorage().GetShift(projectionPeriod);", - "\nshift" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-kXqVC_kq0CICZBKBb1HlQ", - "cell_type": "code", - "source": [ - "var timeStep = Test.GetStorage().GetTimeStep(projectionPeriod);", - "\ntimeStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "t4HaEWnCNk6mQabiDiws1w", - "cell_type": "markdown", - "source": [ - "## Monthly Amortization" - ], - "metadata": {} - }, - { - "id": "xeALkGs7xUeu3Y4WpeNO1Q", - "cell_type": "markdown", - "source": [ - "The computed monthly and current period Amortization Factors derived from a non-zero [imported](#year-and-period) nominal cashflows and its corresponding discounted are shown in the following" - ], - "metadata": {} - }, - { - "id": "L1ZjEB2bYkqJCYEQcSaCLA", - "cell_type": "code", - "source": [ - "var idAM = Test.GetIdentity(groupOfContract, \"CL\", \"C\");", - "\nidAM" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "P_fB5G8CbkOe7_gqmr8nQA", - "cell_type": "code", - "source": [ - "var nominalCashflowAmortizationFactorTest = Test.GetScope( (idAM, default(string), \"CU\", (int?)null) );", - "\nnominalCashflowAmortizationFactorTest" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nwNr460Q5kO_3WOTIbp0qQ", - "cell_type": "code", - "source": [ - "var discountedCashflowAmortizationFactorTest = Test.GetScope(idAM);", - "\ndiscountedCashflowAmortizationFactorTest" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "uCI4iAP0DUGsPQOWdrwDuA", - "cell_type": "code", - "source": [ - "var computedMonthlyAmortizationFactor = Test.GetScope(idAM with {AocType = \"AM\"});", - "\ncomputedMonthlyAmortizationFactor" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gHcGaR3jfEWKUAK4D2kCVw", - "cell_type": "markdown", - "source": [ - "In the following cell we independently evaluate the expected monthly amortization factor according to the [formula above](#amortization-factor) and we check whether expected vs computed match" - ], - "metadata": {} - }, - { - "id": "I8F4XooarU6ejB9dIO3ByA", - "cell_type": "code", - "source": [ - "var expectedMonthlyAmortizationFactor = nominalCashflowAmortizationFactorTest.Values.Zip(discountedCashflowAmortizationFactorTest.Values, ", - "\n (nominal, discountedCumulated) => 1 - nominal / discountedCumulated ).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QwB0UIilbkK-CRTF-jWgEA", - "cell_type": "code", - "source": [ - "expectedMonthlyAmortizationFactor.RepeatOnce()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_66rpQUzrU-3wQQMLfLqTw", - "cell_type": "code", - "source": [ - "computedMonthlyAmortizationFactor.MonthlyAmortizationFactors.CheckEquality( expectedMonthlyAmortizationFactor )" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ibllj4WfMkCzKaaYRuhfmA", - "cell_type": "code", - "source": [ - "computedMonthlyAmortizationFactor.MonthlyAmortizationFactors.CheckEquality( expectedMonthlyAmortizationFactor ).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Jk9YlP6QCkqRxZo-o68MsA", - "cell_type": "markdown", - "source": [ - "## Current Period" - ], - "metadata": {} - }, - { - "id": "DTl5o5jz_0erzyZWFTpUHQ", - "cell_type": "markdown", - "source": [ - "The computed current period amortization factor is" - ], - "metadata": {} - }, - { - "id": "PCy8Dakbh0mPaY2sEWzjGg", - "cell_type": "code", - "source": [ - "var computedCurrentPeriodAmortizationFactor = Test.GetScope(idAM with {AocType = \"AM\"});", - "\ncomputedCurrentPeriodAmortizationFactor" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "FdbZR9Yuy0-UNKH3vCixGw", - "cell_type": "markdown", - "source": [ - "Conversely, the current period Amortization factor can be independently computed using the [formula above](#amortization-factor) as" - ], - "metadata": {} - }, - { - "id": "w8ypGjX1wUGEjtCySuAp3w", - "cell_type": "code", - "source": [ - "var expectedCurrentPeriodAmortizationFactor = expectedMonthlyAmortizationFactor.Skip(shift).Take(timeStep).Aggregate(1d, (x, y) => x * y);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YwRfJmVI3UmwsjBL1JE48Q", - "cell_type": "code", - "source": [ - "expectedCurrentPeriodAmortizationFactor" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "33_7tRKRmUu9inImy1G2VQ", - "cell_type": "code", - "source": [ - "computedCurrentPeriodAmortizationFactor.Value == expectedCurrentPeriodAmortizationFactor" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "rM6pE_9pL0SCB56yFBmlUA", - "cell_type": "code", - "source": [ - "computedCurrentPeriodAmortizationFactor.Value.Should().Be( expectedCurrentPeriodAmortizationFactor );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zJ4a8KsYUEWmMuBSKeJn0g", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Results persisted" - ], - "metadata": {} - }, - { - "id": "c4kFsHdrzEut20I1sKx5wQ", - "cell_type": "markdown", - "source": [ - "The last step during the Cashflow import is to save, namely *persist* the Present Values computed with *locked* (L) and *current* (C) economic basis, and calculation type being *Best Estimate* (BE). ", - "\n", - "\nThese data is the starting point of the [Contractual Service Margin calculation](\"SpecificationsCSM\")." - ], - "metadata": {} - }, - { - "id": "zco2828uiUeNWEkjLJSbmA", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False", + "toc-showtags": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Import Cashflows Specifications

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The aim of this notebook is to document the calculation of the Present Values and Amortization Factors starting from the nominal Cashflows and the Yearly Yield Curve. These starting data is imported from the corresponding csv files located in the following path Initialization/Systemorph/. The process is pictorially explained in the following flowchart. ", + "\n", + "\n", + "\n
", + "\n", + "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." + ] + }, + { + "cell_type": "markdown", + "source": [ + "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"SpecificationsSetup\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Data" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Current Period" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Please select the target period (i.e. year and month), Reporting Node, Economic Basis, and Data Node based on the imported data:" + ] + }, + { + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;", + "\nvar economicBasis = \"C\" ;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Import the Dimensions, Yield Curves and Nominal Cashflows from the corresponding csv files in Initialization/Systemorph/" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "At this point reference data are loaded. Import now a cashfow file with a 720 elements." + ] + }, + { + "cell_type": "code", + "source": [ + "var groupOfContract = \"GricComplex\";", + "\nawait UploadCashflowsAsync(\"Data/CashflowComplex.csv\")" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Initialization of the Test suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" + ] + }, + { + "cell_type": "code", + "source": [ + "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## View loaded Data Nodes" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The imported active Data Nodes from Initialization/Systemorph/DataNodes.csv are " + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().DataNodeDataBySystemName" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## View loaded Yearly Yield Curve" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Here the correct Yield Curve is chosen among those imported from Initialization/Systemorph/Data.csv according to the [current period](#year-and-period) and the Aoc Step according the [Aoc Configuration](../DataModel/DataStructure#aoc-configuration). In the following we retrieve the desired identity." + ] + }, + { + "cell_type": "code", + "source": [ + "var aocType = \"CL\";", + "\nvar novelty = \"C\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var id = Test.GetIdentity(groupOfContract, aocType, novelty);" + ] + }, + { + "cell_type": "code", + "source": [ + "var yearlyYieldCurve = Test.GetStorage().GetYearlyYieldCurve(id, economicBasis);" + ] + }, + { + "cell_type": "code", + "source": [ + "yearlyYieldCurve" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## View loaded Nominal Cashflows" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The nominal Cashflows for the current period are loaded together with last period Cashflows for Group of Contract that were already existent. ", + "\n", + "\nThe relative files are located in: Files/.", + "\n", + "\nThe result is showed in the following list to be compared with the entries of the csv files" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().GetRawVariables(groupOfContract)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Interest and Discount Rates" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Yield Curve ${\\text{YC}_i}$ associated to the the [selected period](#year-and-period) and target currency of the Group of Contract Reporting Node is [displayed above](#view-loaded-yearly-yield-curve) and used in this section to calculate the Interest and Discount factors", + "\n", + "\n$$", + "\n\\text{Interest}_i = \\big( 1 + \\text{YC}_i \\big) ^{\\frac{1}{12}} ~,", + "\n$$", + "\n", + "\nand", + "\n", + "\n\\begin{align}", + "\n\\text{Discount}_i = \\big( 1 + \\text{YC}_i \\big) ^{-\\frac{1}{12}} ~.", + "\n\\end{align}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "In the Scope named *MonthlyRate* the Interest and Discount factors are computed" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedMonthlyRates = Test.GetScope( id );" + ] + }, + { + "cell_type": "code", + "source": [ + "computedMonthlyRates" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Interest" + ] + }, + { + "cell_type": "markdown", + "source": [ + "In the following, the Interest factors computed by the application are recalculated independently according to the formula above in two different ways" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedInterest = yearlyYieldCurve.Select( yc => (1 + yc)^( 1.0 / 12.0) );", + "\nexpectedInterest" + ] + }, + { + "cell_type": "code", + "source": [ + "from yc in yearlyYieldCurve select (1 + yc)^( 1.0 / 12.0 ) " + ] + }, + { + "cell_type": "code", + "source": [ + "computedMonthlyRates.Interest.CheckEquality( expectedInterest ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Discount" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The following recalculates the Discount factors to be compared with the computed values" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDiscount = yearlyYieldCurve.Select( yc => (1 + yc)^( -1.0 / 12.0) );", + "\nexpectedDiscount" + ] + }, + { + "cell_type": "code", + "source": [ + "computedMonthlyRates.Discount.CheckEquality( expectedDiscount ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Test method: Get Valid Element" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Given the present Yield Curve array has finite *length*, the extrapolation implemented is taking the last element for all successive years. This behavior is given by the function *GetValidElement*. The test in this section assures that constant extrapolation is taken for *index* > *length*" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDiscount.GetValidElement( 120 )" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDiscount.GetValidElement( 120 ).Should().Be( expectedDiscount.Last() );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n# Cashflows" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This section deals with the calculation of the *Cumulated Discounted Cashflows* (CDC) starting from the nominal Cashflows. " + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Choose identity" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Each loaded nominal Cashflows is assigned to a so-called *Identity* which uniquely identifies it based on the *Data Node*, *Aoc Type*, and *Novelty*. In the following cells we retrieve the desired Identity:" + ] + }, + { + "cell_type": "code", + "source": [ + "var aocType = \"CL\";", + "\nvar novelty = \"C\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var id = Test.GetIdentity(groupOfContract, aocType, novelty);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Nominal Cashflow" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Consider the two Amount Type *PR* and *NIC*, with Transaction Period being *Beginning of Period* (BOP) and *End of Period* (EOP), respectively. The corresponding nominal Cashflows are deposited in the Scopes named *NominalCashflow* with the Identity provided above, Calculation Type *BE*, and the aforementioned Amount Types. These nominal Cashflows correspond with those [loaded from the csv files](#view-loaded-nominal-cashflows). " + ] + }, + { + "cell_type": "code", + "source": [ + "var amountTypePR = \"PR\";", + "\nvar amountTypeNIC = \"NIC\";", + "\nvar calculationType = \"BE\";", + "\nvar accidentYear = (int?)null;" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalPR = Test.GetScope((id, amountTypePR, calculationType, accidentYear));" + ] + }, + { + "cell_type": "code", + "source": [ + "nominalPR" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalNIC = Test.GetScope((id, amountTypeNIC, calculationType, accidentYear));" + ] + }, + { + "cell_type": "code", + "source": [ + "nominalNIC" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Cumulated Discounted Cashflow" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The CDC is defined by the following recursive formulas", + "\n", + "\n$$", + "\n\\text{CDC}_t = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{Nominal}_t + \\text{CDC}_{t+1} \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} ~, & \\text{if Transaction Period is Beginning of Period} \\\\", + "\n\\big( \\text{Nominal}_t + \\text{CDC}_{t+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} ~, & \\text{if Transaction Period is End of Period}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere the Transaction Period depends on the given cashflow Amount Type. " + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Beginning of Period" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Amount Type **Premiums** (PR) has Transaction Period **Beginning of Period** (BOP). The corresponding CDC calculated by the application is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDiscountedPR = Test.GetScope((id, amountTypePR, calculationType, accidentYear));" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDiscountedPR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "In the following cell we independently evaluate the expected discounted cashflow according to the formula above:" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDiscountedPR = new double[nominalPR.Values.Length];", + "\n", + "\nEnumerable.Range(0, nominalPR.Values.Length).Reverse()", + "\n .ForEach( i => expectedDiscountedPR[i] = nominalPR.Values[i] + expectedDiscountedPR.GetValidElement(i+1) * expectedDiscount.GetValidElement(i/12) );" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDiscountedPR" + ] + }, + { + "cell_type": "code", + "source": [ + "(nominalPR.Values, nominalPR.Values.Length)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected cumulated discount is compared with the computed values" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDiscountedPR.Values.CheckEquality( expectedDiscountedPR )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDiscountedPR.Values.CheckEquality( expectedDiscountedPR ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### End Of Period" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Amount Type **Non Investment Component** (NIC) has Transaction Period **End of Period** (EOP). The corresponding CDC calculated by the application is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDiscountedNIC = Test.GetScope((id, amountTypeNIC, calculationType, accidentYear));" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDiscountedNIC" + ] + }, + { + "cell_type": "markdown", + "source": [ + "In the following cell we independently evaluate the expected discounted cashflow according to the formula above:" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDiscountedNIC = new double[nominalNIC.Values.Length];", + "\n", + "\nEnumerable.Range(0, nominalNIC.Values.Length).Reverse()", + "\n .ForEach( i => expectedDiscountedNIC[i] = ( nominalNIC.Values[i] + expectedDiscountedNIC.GetValidElement(i+1) ) * expectedDiscount.GetValidElement(i/12) );" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDiscountedNIC" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected cumulated discount is compared with the computed values" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDiscountedNIC.Values.CheckEquality( expectedDiscountedNIC )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDiscountedNIC.Values.CheckEquality( expectedDiscountedNIC ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Non Performance Risk Adjustment" + ] + }, + { + "cell_type": "markdown", + "source": [ + "In this section we treat the determination of the non-performance risk adjustment, an element offsetting partially future", + "\nclaims according to the risk that the reinsurance company cannot fulfil the full extent of its obligations.", + "\n", + "\nFirstly, the discounting recursive relation can be written explicitly as", + "\n", + "\n$$", + "\n\\begin{array}{l}", + "\n\\text{CDC}_t = \\big( \\text{Nominal}_t + \\text{CDC}_{t+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} \\\\", + "\n\\Rightarrow \\text{CDC}_t = \\sum_{\\tau=t} \\big( \\text{Valid Discount}_{\\frac{t}{12}} \\big)^{\\tau-t+1} \\cdot \\text{Nominal}_\\tau ", + "\n\\end{array}", + "\n$$", + "\n", + "\nFor nominal Cashflows with Amount Type being *Claims*, the risk-adjusted Cumulated Discounted Cashflow ", + "\nis assigned the Amount Type **Credit Default Risk** (CDR), ", + "\nand is obtained by multiplying the right hand side of the latter formula by the corresponding risk factor", + "\n", + "\n$$", + "\n\\text{CDC}_t^{\\text{Amount Type}=\\text{CDR}} = \\sum_{\\tau=t} \\big( \\text{Valid Discount}_{\\frac{t}{12}} \\big)^{\\tau-t+1} \\cdot \\text{Nominal}_\\tau^{\\text{Claim}} \\cdot \\big( e^{-\\gamma(\\tau-t)} -1 \\big)", + "\n$$", + "\n", + "\nwhere $\\gamma$ is the assumed non-performance probability of the reinsurer to be provided as an [input parameter](../DataModel/DataStructure#credit-default-rate).", + "\n", + "\nThis rate is constant for the whole projection period, that is, $\\gamma$ is not a function of $t$. ", + "\nIt effectively amounts to a constant increase in the continuous discount rate by $\\gamma$. " + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Explicit vs recursive formula" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The explicit formula is tested versus the expected result obtained with the recursive formula" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDiscountedNICbis = new double[nominalNIC.Values.Length];", + "\n", + "\n//for(int t = 0; t < 12; t++)", + "\n// for(int tau = t; tau < 12; tau++)", + "\n// expectedDiscountedNICbis[t] += nominalNIC.Values[tau] * Math.Pow(expectedDiscount.GetValidElement(t/12), tau-t+1);", + "\n", + "\nEnumerable.Range(0, nominalNIC.Values.Length)", + "\n .ForEach( i => expectedDiscountedNICbis[i] = ", + "\n Enumerable.Range(i, nominalNIC.Values.Length-i).Select( tau => nominalNIC.Values[tau] * Math.Pow(expectedDiscount.GetValidElement(i/12), tau-i+1) ).Sum() );", + "\n ", + "\nexpectedDiscountedNIC.CheckEquality( expectedDiscountedNICbis )" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Risk Adjusted Claims " + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed CDC with Amount Type being CDR reads" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDiscountedCRD = Test.GetScope((id, \"CDR\", calculationType, accidentYear));" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDiscountedCRD" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The starting point for the non performance risk adjustment is the computation of the sum of nominal Cashflows with Amount Type **Claims** listed below" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().GetClaims()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "with the corresponding nominal Cashflows being" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalNIC = Test.GetScope((id, \"NIC\", calculationType, accidentYear));", + "\nnominalNIC" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalICO = Test.GetScope((id, \"ICO\", calculationType, accidentYear));", + "\nnominalICO" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalALE = Test.GetScope((id, \"ALE\", calculationType, accidentYear));", + "\nnominalNIC" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalULE = Test.GetScope((id, \"ULE\", calculationType, accidentYear));", + "\nnominalNIC" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalClaims = nominalICO.Values + nominalNIC.Values + nominalALE.Values + nominalULE.Values;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Secondly, the correct credit risk rate (parameter $\\gamma$ in the [formula above](#non-performance-risk-adjustment)) is retrieved from the list of imported [Partner Rating](../DataModel/DataStructure) and [Credit Default Rates](../DataModel/DataStructure) relative to the target [Data Node](#year-and-period)'s Partner" + ] + }, + { + "cell_type": "code", + "source": [ + "groupOfContract" + ] + }, + { + "cell_type": "code", + "source": [ + "var creditDefaultRate = Test.GetStorage().GetNonPerformanceRiskRate( id );", + "\ncreditDefaultRate" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Lastly, using the [formula above](#non-performance-risk-adjustment), the expected CDR discounted Cashflow can be computed" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDiscountedCDR = new double[nominalNIC.Values.Length];", + "\n", + "\nEnumerable.Range(0, nominalClaims.Length).ForEach( t => ", + "\n expectedDiscountedCDR[t] = Enumerable.Range(t, nominalClaims.Length-t).Select( tau => ", + "\n nominalClaims[tau] * Math.Pow(expectedDiscount.GetValidElement(t/12), tau-t+1) * (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", + "\n ).Sum() );", + "\n", + "\nexpectedDiscountedCDR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Finally, the expected cumulated discount is compared with the computed values" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDiscountedCRD.Values.CheckEquality( expectedDiscountedCDR )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDiscountedCRD.Values.CheckEquality( expectedDiscountedCDR ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Present Values" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For an implementation of these formulas refer to the [ImportScopeCalculation notebook](../Import/ImportScopeCalculation). " + ] + }, + { + "cell_type": "markdown", + "source": [ + "The company portfolio value in one period is given by the following Analysis of Change AoC steps:", + "\n1. Beginning of Period (BoP): starting value of the portfolio as of December last year (in the Year to Date view), ", + "\n2. Model Corrections (MC): change of the portfolio value based on the model change,", + "\n3. Cash Flow (CF):", + "\n4. Interest Accretion (IA): ", + "\n5. Assumption Update (AU): ", + "\n6. Yield Curve Update (YCU): impact of yield curve update occured during the reporting period,", + "\n7. Credit Risk Update (CRU): impact of credit default rate update occured during the reporting period,", + "\n8. Experience Variance (EV): value adjustments following insurance related events which took place (e.g. mortality),", + "\n9. Combined Liabilities (CL):", + "\n10. End of Period (EOP): portfolio value at the end of the current period.", + "\n", + "\nNote: the AoC steps WO, EA and AM are not included in the Present Value calculation, hence their values if inquired is zero." + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Present Value Base (PVB) values are valid for all [Economic Basis](../DataModel/DataStructure#economic-basis) and depends on the corresponding [AoCType](../DataModel/DataStructure#aoc-type):", + "\n", + "\n$$", + "\n\\text{PVB}_t \\big(\\text{AoC}\\big) = ", + "\n\\left\\{", + "\n\\begin{array}{cl}", + "\n\\text{CDC}_t & \\text{if AoC is Beginning of Period (BOP) } \\\\", + "\n-\\text{Nominal}_t(\\text{Parent AoC}) & \\text{if AoC is Expected Cashflow (CF) } \\\\", + "\n\\text{InterestAccretion}_t & \\text{if AoC is Interest Accretion (IA) } \\\\", + "\n\\text{CDC}_t(\\text{Parent AoC}) & \\text{if AoC is End of Period (EOP) } \\\\", + "\n\\text{CDC}_{t}(\\text{current AoC}) - \\text{CDC}_{t}(\\text{parent AoC}) & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nand the Projected Present Value (PPV) reads", + "\n", + "\n$$", + "\n\\text{PPV} \\big(\\text{AoC},\\text{TS},\\text{S}\\big) = \\left\\{", + "\n\\begin{array}{cll}", + "\n\\text{PVB}_{S} & \\text{if AoC Valuation Period is Beginning of Period } & \\text{ (e.g. BOP, MC) } \\\\", + "\n\\text{PVB}_{S+TS/2 -1} & \\text{if AoC Valuation Period is Mid of Period } & \\text{ (no examples in current data model) } \\\\", + "\n\\sum_{i=S}^{S + TS -1}\\text{PVB}_{i} & \\text{if AoC Valuation Period is Delta } & \\text{ (e.g. CF, IA) } \\\\", + "\n\\text{PVB}_{S + TS} & \\text{if AoC Valuation Period is End of Period } & \\text{ (e.g. YCU, CRU, EV, CL, EOP) } \\\\", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere the Shift (S) and Time Step (TS) are derived from the current [Year and Period](#year-and-period)" + ] + }, + { + "cell_type": "code", + "source": [ + "var projectionPeriod = 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().GetShift(projectionPeriod)" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().GetTimeStep(projectionPeriod)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Load Cashflow Data" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "At this point standard Cashflows are loaded." + ] + }, + { + "cell_type": "markdown", + "source": [ + "Initialization of the Test suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" + ] + }, + { + "cell_type": "code", + "source": [ + "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Select Group of Contract", + "\n", + "\nHere, it is possible to select the Group of Contract used to run the next section of this Notebook." + ] + }, + { + "cell_type": "code", + "source": [ + "groupOfContract = \"DTR1.1\" ;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Beginning of Period" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Beginning of Period is:" + ] + }, + { + "cell_type": "code", + "source": [ + "var idBoP = Test.GetIdentity(groupOfContract, \"BOP\", \"I\");", + "\nidBoP" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueBoP_PR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, the expected BOP AoCType for PVB is defined to be equal to the discounted cashflows with the same Identity, Amount Type, and Calculation Type, whereas the PPV is the S-th element of the PVB." + ] + }, + { + "cell_type": "code", + "source": [ + "var discountedBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", + "\ndiscountedBoP_PR" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedPresentValueBoP_PR = discountedBoP_PR.Values;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "In the following cell we check whether the expected values match the computed values" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueBoP_PR.Values.CheckEquality( expectedPresentValueBoP_PR )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueBoP_PR.Values.CheckEquality( expectedPresentValueBoP_PR ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Model Corrections" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Model Corrections is:" + ] + }, + { + "cell_type": "code", + "source": [ + "var idMC = Test.GetIdentity(groupOfContract, \"MC\", \"I\");", + "\nidMC" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueMC_PR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, for MC AoCType, the PVB is equal to the difference between the CDC of the current AoCType and the CDC of its parent. Additionally, the PPV is the S-th element of the PVB." + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetScope((idMC, \"PR\")).Values" + ] + }, + { + "cell_type": "code", + "source": [ + "var discountedMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", + "\ndiscountedMC_PR" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedPresentValueMC_PR = discountedMC_PR.Values - discountedBoP_PR.Values;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueMC_PR.Values.CheckEquality( expectedPresentValueMC_PR )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueMC_PR.Value == expectedPresentValueMC_PR[0]" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueMC_PR.Values.CheckEquality( expectedPresentValueMC_PR ).Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueMC_PR.Value.Should().Be( expectedPresentValueMC_PR[0] );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Cashflow" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Cashflow is:" + ] + }, + { + "cell_type": "code", + "source": [ + "var idCF = Test.GetIdentity(groupOfContract, \"CF\", \"I\");", + "\nidCF" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueCF_PR = Test.GetScope((idCF, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueCF_PR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, for CF AoCType, the PVB is equal to the nominal cashflow of its parent AoC step with opposite sign. The PPV is given by the sum of the first 3 elements." + ] + }, + { + "cell_type": "code", + "source": [ + "var cfReferenceAocStep = Test.GetScope(idCF).Value;", + "\ncfReferenceAocStep" + ] + }, + { + "cell_type": "code", + "source": [ + "var cfNominalReference_PR = Test.GetScope((idCF with {AocType = cfReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", + "\ncfNominalReference_PR" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedPresentValueCF_PR = -1.0 * cfNominalReference_PR.Values;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCF_PR.Values.CheckEquality( expectedPresentValueCF_PR )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCF_PR.Values[0] + computedPresentValueCF_PR.Values[1] + computedPresentValueCF_PR.Values[2] == computedPresentValueCF_PR.Value" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCF_PR.Values.CheckEquality( expectedPresentValueCF_PR ).Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCF_PR.Value.Should().Be( computedPresentValueCF_PR.Values[0] + computedPresentValueCF_PR.Values[1] + computedPresentValueCF_PR.Values[2] );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Interest Accretion" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For IA AoCType, the PVB is given by the following relation ", + "\n", + "\n$$", + "\n\\text{InterestAccretion}_i = \\left\\{", + "\n\\begin{array}{cl}", + "\n\\big(\\text{CDC}_i(\\text{Parent AoC}) - \\text{Nominal}_i(\\text{parent AoC}) \\big) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, ", + "\n & \\text{if AmountType Transaction Period is Beginning of Period} \\\\", + "\n\\text{CDC}_i(\\text{parent AoC}) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, ", + "\n & \\text{otherwise}", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhile the PPV is given by the sum of the first S elements.", + "\n", + "\nWhen selecting the Identity, note that the Novelty *C* is not contemplated for Interest Accretion." + ] + }, + { + "cell_type": "code", + "source": [ + "var idIA = Test.GetIdentity(groupOfContract, \"IA\", \"I\");", + "\nidIA" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Amount Type BOP" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed Present Value for Amount Type **Premiums** (PR) with Transaction Period **Beginning of Period** (BOP) is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueIA_PR = Test.GetScope((idIA, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueIA_PR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the interest factors, the nominal and discounted Cashflow of the parent Aoc Step" + ] + }, + { + "cell_type": "code", + "source": [ + "var iaComputedMonthlyRates = Test.GetScope( idIA );", + "\niaComputedMonthlyRates" + ] + }, + { + "cell_type": "code", + "source": [ + "var iaReferenceAocStep = Test.GetScope(idIA).Value;", + "\niaReferenceAocStep" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalIaReference_PR = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", + "\nnominalIaReference_PR" + ] + }, + { + "cell_type": "code", + "source": [ + "var discountedIaReference_PR = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", + "\ndiscountedIaReference_PR" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedPresentValueIA_PR = discountedIaReference_PR.Values.Select((val, index) => ( val - nominalIaReference_PR.Values[index]) * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueIA_PR.Values.CheckEquality( expectedPresentValueIA_PR )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueIA_PR.Values[0] + computedPresentValueIA_PR.Values[1] + computedPresentValueIA_PR.Values[2] == computedPresentValueIA_PR.Value" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueIA_PR.Values.CheckEquality( expectedPresentValueIA_PR ).Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueIA_PR.Value.Should().Be( computedPresentValueIA_PR.Values[0] + computedPresentValueIA_PR.Values[1] + computedPresentValueIA_PR.Values[2] );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Amount Type EOP" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed Present Value for Amount Type **Non Investment Component** (NIC) with Transaction Period **End of Period** (EOP) is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueIA_NIC = Test.GetScope((idIA, \"NIC\", \"BE\", (int?)null));", + "\ncomputedPresentValueIA_NIC" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the interest monthly rates, the discounted Cashflow of the parent Aoc Step" + ] + }, + { + "cell_type": "code", + "source": [ + "var iaReferenceAocStep = Test.GetScope(idIA).Value;", + "\niaReferenceAocStep" + ] + }, + { + "cell_type": "code", + "source": [ + "var discountedIaReference_NIC = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"NIC\", \"BE\", (int?)null));", + "\ndiscountedIaReference_NIC" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedPresentValueIA_NIC = discountedIaReference_NIC.Values.Select((val, index) => val * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueIA_NIC.Values.CheckEquality( expectedPresentValueIA_NIC )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueIA_NIC.Values[0] + computedPresentValueIA_NIC.Values[1] + computedPresentValueIA_NIC.Values[2] == computedPresentValueIA_NIC.Value" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueIA_NIC.Values.CheckEquality( expectedPresentValueIA_NIC ).Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueIA_NIC.Value.Should().Be( computedPresentValueIA_NIC.Values[0] + computedPresentValueIA_NIC.Values[1] + computedPresentValueIA_NIC.Values[2] );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Yield Curve Update" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Yield Curve Update is:" + ] + }, + { + "cell_type": "code", + "source": [ + "var idYcu = Test.GetIdentity(groupOfContract, \"YCU\", \"I\");", + "\nidYcu" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueYCU_PR = Test.GetScope((idYcu, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueYCU_PR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the discount factors for beginning of period and for end of period applied to the reference Aoc step, followed by the difference between the CDC obtained with end of period discount factor and the CDC obtained with beginning of period discount factor. " + ] + }, + { + "cell_type": "code", + "source": [ + "var ycReferenceAocStep = Test.GetScope(idYcu).Value;", + "\nycReferenceAocStep" + ] + }, + { + "cell_type": "code", + "source": [ + "var ycParentAocStep = Test.GetScope((idYcu, \"PR\")).Values.Single();", + "\nycParentAocStep" + ] + }, + { + "cell_type": "code", + "source": [ + "var ycParentId = idYcu with {AocType = ycParentAocStep.AocType, Novelty = ycParentAocStep.Novelty};", + "\nycParentId" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Here is the parent AocStep discounted with the beginning of period discount factor." + ] + }, + { + "cell_type": "code", + "source": [ + "var discountedYcParent = Test.GetScope((ycParentId, \"PR\", \"BE\", (int?)null));", + "\ndiscountedYcParent" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Here we independently compute the CDC of the parent AocStep discounted with end of period discount factor." + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalYcParent = Test.GetScope((ycParentId, \"PR\", \"BE\", (int?)null));", + "\nnominalYcParent" + ] + }, + { + "cell_type": "code", + "source": [ + "var ycComputedMonthlyRates = Test.GetScope( idYcu );", + "\nycComputedMonthlyRates" + ] + }, + { + "cell_type": "code", + "source": [ + "var ycReferenceDiscountedEop = new double[nominalYcParent.Values.Length];", + "\n", + "\nEnumerable.Range(0, nominalYcParent.Values.Length).Reverse()", + "\n .ForEach( i => ycReferenceDiscountedEop[i] = nominalYcParent.Values[i] + ycReferenceDiscountedEop.GetValidElement(i+1) * ycComputedMonthlyRates.Discount.GetValidElement(i/12) );", + "\nycReferenceDiscountedEop" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedPresentValueYCU_PR = ycReferenceDiscountedEop - discountedYcParent.Values;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueYCU_PR.Values.CheckEquality( expectedPresentValueYCU_PR )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueYCU_PR.Value == expectedPresentValueYCU_PR[3]" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueYCU_PR.Values.CheckEquality( expectedPresentValueYCU_PR ).Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueYCU_PR.Value.Should().Be( expectedPresentValueYCU_PR[3] );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Credit Risk Update" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This Aoc Step is relevant only in the case of a Group of Reinsurance Contract." + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Credit Risk Update is:" + ] + }, + { + "cell_type": "code", + "source": [ + "var idCru = Test.GetIdentity(groupOfContract, \"CRU\", \"I\");", + "\nidCru" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueCRU = Test.GetScope((idCru, \"CDR\", \"BE\", (int?)null));", + "\ncomputedPresentValueCRU" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Present Value can be recomputed independently starting as the difference between the CDC obtained with end of period credit default risk rate and the CDC obtained with beginning of period credit default risk rate, both computed using the Nominal cashflow of the reference Aoc Step and the End Of Period discounting factors. " + ] + }, + { + "cell_type": "code", + "source": [ + "var cruReferenceAocStep = Test.GetScope(idCru).Value;", + "\ncruReferenceAocStep" + ] + }, + { + "cell_type": "code", + "source": [ + "var cruReferenceId = idCru with {AocType = cruReferenceAocStep.AocType, Novelty = cruReferenceAocStep.Novelty};", + "\ncruReferenceId" + ] + }, + { + "cell_type": "code", + "source": [ + "var cruParentAocStep = Test.GetScope((idCru, \"CDR\")).Values.Single();", + "\ncruParentAocStep" + ] + }, + { + "cell_type": "code", + "source": [ + "var cruParentId = idCru with {AocType = cruParentAocStep.AocType, Novelty = cruParentAocStep.Novelty};", + "\ncruParentId" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Here is the parent AocStep discounted with beginning of period credit default risk rate." + ] + }, + { + "cell_type": "code", + "source": [ + "var discountedCruParent = Test.GetScope((cruParentId, \"CDR\", \"BE\", (int?)null));", + "\ndiscountedCruParent" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalCruReference = Test.GetScope((cruReferenceId, \"CDR\", \"BE\", (int?)null)).Values;", + "\nnominalCruReference" + ] + }, + { + "cell_type": "code", + "source": [ + "var creditDefaultRate = Test.GetStorage().GetNonPerformanceRiskRate( idCru );", + "\ncreditDefaultRate" + ] + }, + { + "cell_type": "code", + "source": [ + "var cruComputedMonthlyRates = Test.GetScope( idCru );", + "\ncruComputedMonthlyRates" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Lastly, using the [formula above](#non-performance-risk-adjustment), the expected CDR discounted Cashflow can be computed" + ] + }, + { + "cell_type": "code", + "source": [ + "var cruExpectedDiscountedCDR = new double[nominalCruReference.Length];", + "\n", + "\nEnumerable.Range(0, nominalCruReference.Length).ForEach( t => ", + "\n cruExpectedDiscountedCDR[t] = Enumerable.Range(t, nominalCruReference.Length-t).Select( tau => ", + "\n nominalCruReference[tau] * ", + "\n Math.Pow(cruComputedMonthlyRates.Discount.GetValidElement(t/12), tau-t+1) * ", + "\n (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", + "\n ).Sum() );", + "\n", + "\ncruExpectedDiscountedCDR" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedPresentValueCRU = cruExpectedDiscountedCDR - discountedCruParent.Values;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCRU.Values.CheckEquality( expectedPresentValueCRU )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCRU.Value == expectedPresentValueCRU[3]" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCRU.Values.CheckEquality( expectedPresentValueCRU ).Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCRU.Value.Should().Be( expectedPresentValueCRU[3] );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Combined Liabilities" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type Combined Liabilities and Amount Type PR is:" + ] + }, + { + "cell_type": "code", + "source": [ + "var idCL = Test.GetIdentity(groupOfContract, \"CL\", \"C\");", + "\nidCL" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueCL_PR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, for CL AoCType, the PVB is equal to the difference between the CDC of the current AoCType and the CDC of its parent(s). Additionally, the PPV is the $(\\text{S}+\\text{TS})$-th element of the PVB." + ] + }, + { + "cell_type": "code", + "source": [ + "var clParents = Test.GetScope((idCL,\"PR\")).Values;", + "\nclParents" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedPresentValueCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null)).Values -", + "\n clParents.Select(aocStep => Test.GetScope((idCL with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, \"PR\", \"BE\", (int?)null)).Values).Aggregate();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCL_PR.Values.CheckEquality( expectedPresentValueCL_PR )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCL_PR.Value == expectedPresentValueCL_PR[3]" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCL_PR.Values.CheckEquality( expectedPresentValueCL_PR ).Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueCL_PR.Value.Should().Be( expectedPresentValueCL_PR[3] );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## End of Period" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed Present Value for Aoc type End of Period is:" + ] + }, + { + "cell_type": "code", + "source": [ + "var idEOP = Test.GetIdentity(groupOfContract, \"EOP\", \"C\");", + "\nidEOP" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueEOP_NIC = Test.GetScope((idEOP, \"NIC\", \"BE\", (int?)null));", + "\ncomputedPresentValueEOP_NIC" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#present-values) above, for EOP AoCType, the PVB is equal to the CDC of the parent AoC step, while the PPV is the $(\\text{S}+\\text{TS})$-th element of the PVB." + ] + }, + { + "cell_type": "code", + "source": [ + "var eopReferenceAocStep = Test.GetScope(idEOP).Value;", + "\neopReferenceAocStep" + ] + }, + { + "cell_type": "code", + "source": [ + "var discountedCL_NIC = Test.GetScope((idEOP with {AocType = eopReferenceAocStep.AocType, Novelty = eopReferenceAocStep.Novelty}, \"NIC\", \"BE\", (int?)null));", + "\ndiscountedCL_NIC" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedPresentValueEOP_NIC = discountedCL_NIC.Values;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The expected PVB and PPV are compared with the computed results in the following two cells: " + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueEOP_NIC.Values.CheckEquality( expectedPresentValueEOP_NIC )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueEOP_NIC.Value == expectedPresentValueEOP_NIC[3]" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueEOP_NIC.Values.CheckEquality( expectedPresentValueEOP_NIC ).Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedPresentValueEOP_NIC.Value.Should().Be( expectedPresentValueEOP_NIC[3] );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Check for zero PVB values" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Amortization" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For AM AoCType, the PVB values are zero, i.e. Amortization is not part of the Present Value computation. In this subsection we check whether the corresponding values are zero accordingly. " + ] + }, + { + "cell_type": "code", + "source": [ + "var idAM = Test.GetIdentity(groupOfContract, \"AM\", \"C\");", + "\nidAM" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueAM_PR = Test.GetScope((idAM, \"PR\", \"BE\", (int?)null));", + "\ncomputedPresentValueAM_PR" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedPresentValueAM_PR = Test.GetScope((idAM, \"NIC\", \"BE\", (int?)null));", + "\ncomputedPresentValueAM_PR" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Amortization Factors" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The amortization factors (AMF) are calculated from the corresponding Nominal and Discounted Cashflows with Calculation Type being *Coverage Units* (CU). ", + "\nThe monthly AMF is", + "\n", + "\n$$", + "\n\\text{AMF}^{\\text{Monthly}}_t = 1 - \\frac{ \\text{Nominal}^{\\text{Coverage Units}}_t } { \\text{CDC}^{\\text{Coverage Units}}_t } ~,", + "\n$$", + "\n", + "\nwhile the AMF related to the current period is", + "\n", + "\n$$", + "\n\\text{AMF} = \\prod _{t = \\text{S}}^{\\text{S}+\\text{TS}} \\text{AMF}^{\\text{Monthly}}_t ~.", + "\n$$", + "\n", + "\nwhere the shift S and Time Step TS for the [current period](#year-and-period) are" + ] + }, + { + "cell_type": "code", + "source": [ + "var projectionPeriod = 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var shift = Test.GetStorage().GetShift(projectionPeriod);", + "\nshift" + ] + }, + { + "cell_type": "code", + "source": [ + "var timeStep = Test.GetStorage().GetTimeStep(projectionPeriod);", + "\ntimeStep" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Monthly Amortization" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed monthly and current period Amortization Factors derived from a non-zero [imported](#year-and-period) nominal cashflows and its corresponding discounted are shown in the following" + ] + }, + { + "cell_type": "code", + "source": [ + "var idAM = Test.GetIdentity(groupOfContract, \"CL\", \"C\");", + "\nidAM" + ] + }, + { + "cell_type": "code", + "source": [ + "var nominalCashflowAmortizationFactorTest = Test.GetScope( (idAM, default(string), \"CU\", (int?)null) );", + "\nnominalCashflowAmortizationFactorTest" + ] + }, + { + "cell_type": "code", + "source": [ + "var discountedCashflowAmortizationFactorTest = Test.GetScope(idAM);", + "\ndiscountedCashflowAmortizationFactorTest" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedMonthlyAmortizationFactor = Test.GetScope(idAM with {AocType = \"AM\"});", + "\ncomputedMonthlyAmortizationFactor" + ] + }, + { + "cell_type": "markdown", + "source": [ + "In the following cell we independently evaluate the expected monthly amortization factor according to the [formula above](#amortization-factor) and we check whether expected vs computed match" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedMonthlyAmortizationFactor = nominalCashflowAmortizationFactorTest.Values.Zip(discountedCashflowAmortizationFactorTest.Values, ", + "\n (nominal, discountedCumulated) => 1 - nominal / discountedCumulated ).ToArray();" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedMonthlyAmortizationFactor.RepeatOnce()" + ] + }, + { + "cell_type": "code", + "source": [ + "computedMonthlyAmortizationFactor.MonthlyAmortizationFactors.CheckEquality( expectedMonthlyAmortizationFactor )" + ] + }, + { + "cell_type": "code", + "source": [ + "computedMonthlyAmortizationFactor.MonthlyAmortizationFactors.CheckEquality( expectedMonthlyAmortizationFactor ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Current Period" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed current period amortization factor is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedCurrentPeriodAmortizationFactor = Test.GetScope(idAM with {AocType = \"AM\"});", + "\ncomputedCurrentPeriodAmortizationFactor" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Conversely, the current period Amortization factor can be independently computed using the [formula above](#amortization-factor) as" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedCurrentPeriodAmortizationFactor = expectedMonthlyAmortizationFactor.Skip(shift).Take(timeStep).Aggregate(1d, (x, y) => x * y);" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedCurrentPeriodAmortizationFactor" + ] + }, + { + "cell_type": "code", + "source": [ + "computedCurrentPeriodAmortizationFactor.Value == expectedCurrentPeriodAmortizationFactor" + ] + }, + { + "cell_type": "code", + "source": [ + "computedCurrentPeriodAmortizationFactor.Value.Should().Be( expectedCurrentPeriodAmortizationFactor );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Results persisted" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The last step during the Cashflow import is to save, namely *persist* the Present Values computed with *locked* (L) and *current* (C) economic basis, and calculation type being *Best Estimate* (BE). ", + "\n", + "\nThese data is the starting point of the [Contractual Service Margin calculation](\"SpecificationsCSM\")." + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/SpecificationsSetup.ipynb b/Test/SpecificationsSetup.ipynb index 96e7025a..d112b3d2 100644 --- a/Test/SpecificationsSetup.ipynb +++ b/Test/SpecificationsSetup.ipynb @@ -1,137 +1,125 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "fE38qOjHW0a08mH8kJrwSg", - "cell_type": "code", - "source": [ - "#!import \"../Import/ImportScopeCalculation\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9xNRIpaJukO9dK_x-P6MAg", - "cell_type": "code", - "source": [ - "public interface Universe : IMutableScopeWithStorage{}", - "\n", - "\npublic async Task StartCalculatorAsync(string reportingNode, int year, int month, string economicBasis, Periodicity period, string format) ", - "\n{", - "\n ", - "\n var importArgs = new ImportArgs(reportingNode, year, month, period, null, format);", - "\n Workspace.Reset();", - "\n Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization());", - "\n", - "\n var partition = (await DataSource.Query().Where(p => p.ReportingNode == importArgs.ReportingNode &&", - "\n p.Year == importArgs.Year &&", - "\n p.Month == importArgs.Month &&", - "\n p.Scenario == importArgs.Scenario", - "\n ).ToArrayAsync()).Single().Id;", - "\n await DataSource.Partition.SetAsync(partition);", - "\n", - "\n //Set Workspace as when the parsing is completed.", - "\n if(importArgs.ImportFormat == ImportFormats.Actual)", - "\n { ", - "\n await Workspace.UpdateAsync(await DataSource.Query()", - "\n .Where(x => x.Partition == partition && ", - "\n new string[]{EstimateTypes.A, EstimateTypes.AA, EstimateTypes.OA}.Contains(x.EstimateType) && ", - "\n new string[]{AocTypes.CF, AocTypes.WO}.Contains(x.AocType))", - "\n .ToArrayAsync());", - "\n }", - "\n else if(importArgs.ImportFormat == ImportFormats.Opening)", - "\n { ", - "\n await Workspace.UpdateAsync(await DataSource.Query()", - "\n .Where(x => x.Partition == partition && ", - "\n new string[]{ EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.DA}.Contains(x.EstimateType) && ", - "\n x.AocType == AocTypes.BOP && x.Novelty == Novelties.I)", - "\n .ToArrayAsync());", - "\n }", - "\n else", - "\n {", - "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => x.Partition == partition).ToArrayAsync());", - "\n }", - "\n var storage = new ImportStorage(importArgs, DataSource, Workspace);", - "\n await storage.InitializeAsync();", - "\n return Scopes.ForStorage(storage).WithContext(economicBasis).ToScope();", - "\n}", - "\n", - "\npublic static ImportIdentity GetIdentity (this Universe universe, string dataNode, string aocType, string novelty) ", - "\n => universe.GetScope(dataNode).Identities.Single( x => x.AocType == aocType && x.Novelty == novelty );", - "\n", - "\nstatic T GetValidElement(this IList array, int index) => GetElementOrDefault(array, index);", - "\n", - "\nstatic T GetValidElement(this IEnumerable array, int index) => GetElementOrDefault(array.ToArray(), index);", - "\n", - "\nstatic void ForEach(this IEnumerable self, Action action) => self.ToList().ForEach(action);", - "\n", - "\npublic static IfrsVariable FromPvToIfrsVariable(this PresentValue scope)", - "\n => new IfrsVariable{ EconomicBasis = scope.EconomicBasis, ", - "\n EstimateType = scope.Identity.CalculationType, ", - "\n DataNode = scope.Identity.Id.DataNode, ", - "\n AocType = scope.Identity.Id.AocType, ", - "\n Novelty = scope.Identity.Id.Novelty, ", - "\n AccidentYear = scope.Identity.AccidentYear,", - "\n AmountType = scope.Identity.AmountType,", - "\n Value = scope.Value,", - "\n Partition = scope.GetStorage().TargetPartition };", - "\n", - "\npublic static IfrsVariable FromCsmToIfrsVariable(this Csm scope)", - "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", - "\n DataNode = scope.Identity.DataNode, ", - "\n AocType = scope.Identity.AocType, ", - "\n Novelty = scope.Identity.Novelty, ", - "\n Value = scope.Value,", - "\n Partition = scope.GetStorage().TargetPartition };", - "\n", - "\npublic static IfrsVariable FromLcToIfrsVariable(this Lc scope)", - "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", - "\n DataNode = scope.Identity.DataNode, ", - "\n AocType = scope.Identity.AocType, ", - "\n Novelty = scope.Identity.Novelty, ", - "\n Value = scope.Value,", - "\n Partition = scope.GetStorage().TargetPartition };", - "\n", - "\npublic static IfrsVariable FromLoReCoToIfrsVariable(this LoReCo scope)", - "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", - "\n DataNode = scope.Identity.DataNode, ", - "\n AocType = scope.Identity.AocType, ", - "\n Novelty = scope.Identity.Novelty, ", - "\n Value = scope.Value,", - "\n Partition = scope.GetStorage().TargetPartition };" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nbL-Fjewnk-tw5Vk1IJ2rg", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!import \"../Import/ImportScopeCalculation\"" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface Universe : IMutableScopeWithStorage{}", + "\n", + "\npublic async Task StartCalculatorAsync(string reportingNode, int year, int month, string economicBasis, Periodicity period, string format) ", + "\n{", + "\n ", + "\n var importArgs = new ImportArgs(reportingNode, year, month, period, null, format);", + "\n Workspace.Reset();", + "\n Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());", + "\n", + "\n var partition = (await DataSource.Query().Where(p => p.ReportingNode == importArgs.ReportingNode &&", + "\n p.Year == importArgs.Year &&", + "\n p.Month == importArgs.Month &&", + "\n p.Scenario == importArgs.Scenario", + "\n ).ToArrayAsync()).Single().Id;", + "\n await DataSource.Partition.SetAsync(partition);", + "\n", + "\n //Set Workspace as when the parsing is completed.", + "\n if(importArgs.ImportFormat == ImportFormats.Actual)", + "\n { ", + "\n await Workspace.UpdateAsync(await DataSource.Query()", + "\n .Where(x => x.Partition == partition && ", + "\n new string[]{EstimateTypes.A, EstimateTypes.AA, EstimateTypes.OA}.Contains(x.EstimateType) && ", + "\n new string[]{AocTypes.CF, AocTypes.WO}.Contains(x.AocType))", + "\n .ToArrayAsync());", + "\n }", + "\n else if(importArgs.ImportFormat == ImportFormats.Opening)", + "\n { ", + "\n await Workspace.UpdateAsync(await DataSource.Query()", + "\n .Where(x => x.Partition == partition && ", + "\n new string[]{ EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.DA}.Contains(x.EstimateType) && ", + "\n x.AocType == AocTypes.BOP && x.Novelty == Novelties.I)", + "\n .ToArrayAsync());", + "\n }", + "\n else", + "\n {", + "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => x.Partition == partition).ToArrayAsync());", + "\n }", + "\n var storage = new ImportStorage(importArgs, DataSource, Workspace);", + "\n await storage.InitializeAsync();", + "\n return Scopes.ForStorage(storage).WithContext(economicBasis).ToScope();", + "\n}", + "\n", + "\npublic static ImportIdentity GetIdentity (this Universe universe, string dataNode, string aocType, string novelty) ", + "\n => universe.GetScope(dataNode).Identities.Single( x => x.AocType == aocType && x.Novelty == novelty );", + "\n", + "\nstatic T GetValidElement(this IList array, int index) => GetElementOrDefault(array, index);", + "\n", + "\nstatic T GetValidElement(this IEnumerable array, int index) => GetElementOrDefault(array.ToArray(), index);", + "\n", + "\nstatic void ForEach(this IEnumerable self, Action action) => self.ToList().ForEach(action);", + "\n", + "\npublic static IfrsVariable FromPvToIfrsVariable(this PresentValue scope)", + "\n => new IfrsVariable{ EconomicBasis = scope.EconomicBasis, ", + "\n EstimateType = scope.Identity.CalculationType, ", + "\n DataNode = scope.Identity.Id.DataNode, ", + "\n AocType = scope.Identity.Id.AocType, ", + "\n Novelty = scope.Identity.Id.Novelty, ", + "\n AccidentYear = scope.Identity.AccidentYear,", + "\n AmountType = scope.Identity.AmountType,", + "\n Value = scope.Value,", + "\n Partition = scope.GetStorage().TargetPartition };", + "\n", + "\npublic static IfrsVariable FromCsmToIfrsVariable(this Csm scope)", + "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", + "\n DataNode = scope.Identity.DataNode, ", + "\n AocType = scope.Identity.AocType, ", + "\n Novelty = scope.Identity.Novelty, ", + "\n Value = scope.Value,", + "\n Partition = scope.GetStorage().TargetPartition };", + "\n", + "\npublic static IfrsVariable FromLcToIfrsVariable(this Lc scope)", + "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", + "\n DataNode = scope.Identity.DataNode, ", + "\n AocType = scope.Identity.AocType, ", + "\n Novelty = scope.Identity.Novelty, ", + "\n Value = scope.Value,", + "\n Partition = scope.GetStorage().TargetPartition };", + "\n", + "\npublic static IfrsVariable FromLoReCoToIfrsVariable(this LoReCo scope)", + "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", + "\n DataNode = scope.Identity.DataNode, ", + "\n AocType = scope.Identity.AocType, ", + "\n Novelty = scope.Identity.Novelty, ", + "\n Value = scope.Value,", + "\n Partition = scope.GetStorage().TargetPartition };" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/SpecificationsTechnicalMargin.ipynb b/Test/SpecificationsTechnicalMargin.ipynb index 5e35ce33..83eaaba1 100644 --- a/Test/SpecificationsTechnicalMargin.ipynb +++ b/Test/SpecificationsTechnicalMargin.ipynb @@ -1,2576 +1,1762 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "g8tjy1GbI0uoEDhZW9OubA", - "cell_type": "markdown", - "source": [ - "

Technical Margin Specifications

" - ], - "metadata": {} - }, - { - "id": "x6HTq-dyx0CT0axGCN5uCw", - "cell_type": "markdown", - "source": [ - "The aim of this notebook is to document the Technical Margin (TM) and its allocation to the Contractual Service Margin (CSM), Loss Component (LC), or Loss Recovery Component (LoReCo). The process is pictorially explained in the following flowchart. ", - "\n", - "\n", - "\n
", - "\n", - "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." - ], - "metadata": {} - }, - { - "id": "LhxZv_5tLEW3BCU74MttbA", - "cell_type": "markdown", - "source": [ - "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" - ], - "metadata": {} - }, - { - "id": "yPpeVsREbUy--NQi9jbNpw", - "cell_type": "code", - "source": [ - "#!import \"SpecificationsSetup\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "U3AjnYiM5kuSmp75cguUSA", - "cell_type": "markdown", - "source": [ - "---" - ], - "metadata": {} - }, - { - "id": "ECkaAKQIMEu5hqUdpeBq8Q", - "cell_type": "markdown", - "source": [ - "# Import Data" - ], - "metadata": {} - }, - { - "id": "SEMqfkxNU0e_-5mrR4lZTw", - "cell_type": "markdown", - "source": [ - "", - "\n## Current Period" - ], - "metadata": {} - }, - { - "id": "IvTb1XGZ1kuJ-VvXkuWNJw", - "cell_type": "markdown", - "source": [ - "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" - ], - "metadata": {} - }, - { - "id": "KdFdFW3OhUy3KzhPTiarkg", - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;", - "\nvar economicBasis = \"L\" ;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "UnwIzmJO6EeRXQWBbmoK1g", - "cell_type": "markdown", - "source": [ - "Import the Dimensions, Parameters, Nominal Cashflows, and Actuals from the corresponding csv files in Initialization/Systemorph/" - ], - "metadata": {} - }, - { - "id": "xPBxX-MYjEirprXfdCjqHw", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8lAk_SdyNEmrDVylgM3ueg", - "cell_type": "markdown", - "source": [ - "Initialization of the Test Suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" - ], - "metadata": {} - }, - { - "id": "LZ2n8pzel0OnpsJ86gHLDw", - "cell_type": "code", - "source": [ - "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YRjwR8fuJkK9bvH84fq8dA", - "cell_type": "markdown", - "source": [ - "", - "\n## View loaded Data Nodes" - ], - "metadata": {} - }, - { - "id": "YEMgdgKuwEe_bIe-xkd09g", - "cell_type": "markdown", - "source": [ - "The imported active Data Nodes from Initialization/Systemorph/DataNodes.csv are " - ], - "metadata": {} - }, - { - "id": "uS9vfK-rBUiZsfCYiJzIpA", - "cell_type": "code", - "source": [ - "Test.GetStorage().DataNodeDataBySystemName" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LvO_qjZPmEOI6YxzgwM4vg", - "cell_type": "markdown", - "source": [ - "whereas the Data Nodes of your imported Cashflows are" - ], - "metadata": {} - }, - { - "id": "jpqlfwEBkU20upkPfktIQA", - "cell_type": "code", - "source": [ - "Test.GetStorage().DataNodesByImportScope[ImportScope.Primary]" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Km-AMREk2ECK0lggstN9yA", - "cell_type": "markdown", - "source": [ - "Please select here below the target Data Node for executing the tests below:" - ], - "metadata": {} - }, - { - "id": "KeB4MbA30U-GTokbWzsbNw", - "cell_type": "code", - "source": [ - "var dataNode = \"DT1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "yjMtNI_UpEOFhOhlYPIjdg", - "cell_type": "markdown", - "source": [ - "## View list of Identities" - ], - "metadata": {} - }, - { - "id": "2suX-6pDYUu9ZRoKpbzwtg", - "cell_type": "markdown", - "source": [ - "Based on the Cashflows imported, the list of all possible identities, i.e. combinations of valid Data Nodes, Aoc steps, and Novelties, is contructed and reported here below:" - ], - "metadata": {} - }, - { - "id": "uXw2nYCpZ0i16yt57O-hZw", - "cell_type": "code", - "source": [ - "var allIdentities = Test.GetScopes(Test.GetStorage().DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "PpgNb9iz3kaMC2BeZoDKXQ", - "cell_type": "code", - "source": [ - "allIdentities" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "FX3f8E0cn0iRfjDMfGMWMw", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Present Value" - ], - "metadata": {} - }, - { - "id": "bjt2kV7OaU-pgEwV4_f7cw", - "cell_type": "markdown", - "source": [ - "Projected Present Values (PPVs) are calculated for each Amount Type (AT) either with the *locked-in* (L) and with the *current* (C) Yield Curves. While the former is the latest available as per end of the DataNode's inception year, the latter is the latest available as per the current period. ", - "\nPPVs for both Economic Basis L and C have been defined [here](../Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", - "\n", - "\nAccording to the BBA methodology, the CSM calculation uses the PV with locked-in Yield Curve simply defined as", - "\n", - "\n$$", - "\n\\text{PV Locked}(\\text{AoC}, \\text{AT}) = \\text{PPV}(\\text{AoC}, \\text{AT}) \\big|_{\\substack{ \\text{Calculation Type = BE} \\\\ \\text{Economic Base = L} } }", - "\n$$" - ], - "metadata": {} - }, - { - "id": "z3MoqQ9eQUS09tb1mXkFyA", - "cell_type": "code", - "source": [ - "var pvsLocked = allIdentities.SelectMany(id => Test.GetScope(id).PresentValues", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromPvToIfrsVariable())).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "t7tRCeCG10KKMVZzfO_pPg", - "cell_type": "markdown", - "source": [ - "Below a view of the computed locked-in PV " - ], - "metadata": {} - }, - { - "id": "OIen-nXHD0SiauOT9N-_Bg", - "cell_type": "code", - "source": [ - "Report.ForObjects(pvsLocked)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.EconomicBasis)", - "\n .GroupColumnsBy(x => x.AmountType)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "muPGuU2J_0C0ajt9hkta5A", - "cell_type": "markdown", - "source": [ - "Aggregated values are also available as the sum over all [Amount Types](../DataModel/DataStructure#amount-type):", - "\n", - "\n$$", - "\n\\text{PV Locked Value}(\\text{AoC}) = \\sum_{\\text{AT}} \\text{PV Locked}(\\text{AoC}, \\text{AT})", - "\n$$" - ], - "metadata": {} - }, - { - "id": "kvGGn3Q4rUex05dzYM9qdg", - "cell_type": "markdown", - "source": [ - "Here below an example" - ], - "metadata": {} - }, - { - "id": "9_XxzJoITE-6372AHPhE3g", - "cell_type": "code", - "source": [ - "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "R9nUtmCCQECPK-w_Mp_yVw", - "cell_type": "code", - "source": [ - "id_BoP_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "du2mo7J8002QJbtRt584Mw", - "cell_type": "code", - "source": [ - "Test.GetScope( id_BoP_I ).Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_OxvDZWrPka_CFvaMAisxg", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Risk Adjustment" - ], - "metadata": {} - }, - { - "id": "376Njyw59EGhWrieNRi8jQ", - "cell_type": "markdown", - "source": [ - "The CSM calculation also uses locked-in Risk Adjustment (RA Locked) which is retrieved from the corresponding Present Value with [Calculation Type](../DataModel/DataStructure#calculation-type) being RA defined [here](../Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", - "\n", - "\nRisk Adjustment values can be written as", - "\n", - "\n$$", - "\n\\text{RA Locked Value}(\\text{AoC}) = \\text{PV}(\\text{AoC})|_{\\substack{ \\text{Calculation Type = RA} \\\\ \\text{Economic Base = L} }}", - "\n$$", - "\n", - "\nwhere the imported Cashflows for the RA Calculation Type are already aggregated over all [Amount Types](../DataModel/DataStructure#amount-type)." - ], - "metadata": {} - }, - { - "id": "3siM-DZsEEiBkk5Y3FRKFg", - "cell_type": "markdown", - "source": [ - "Here below an example" - ], - "metadata": {} - }, - { - "id": "Xl2yuS6a60C9Quny8zQ-5A", - "cell_type": "code", - "source": [ - "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LSaHrUxyq0i4azSGh961Jg", - "cell_type": "code", - "source": [ - "id_BoP_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RuOYh7rjz0G8Mc61JSv5Yg", - "cell_type": "code", - "source": [ - "Test.GetScope( id_BoP_I ).Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qAzxMRN-SkuuSQuz6UYYYQ", - "cell_type": "markdown", - "source": [ - "The RA Locked per Data Node imported are" - ], - "metadata": {} - }, - { - "id": "I6YzC1vPqUKXP9iGgM9VCw", - "cell_type": "code", - "source": [ - "var rasLocked = allIdentities.SelectMany(id => Test.GetScope(id).PresentValues", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromPvToIfrsVariable())).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "iYZeYBNeU0C41iCvscI1CA", - "cell_type": "code", - "source": [ - "Report.ForObjects(rasLocked)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.EconomicBasis)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "fuyUZe63NEiB09VJA2Na4A", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Technical Margin" - ], - "metadata": {} - }, - { - "id": "2VStZINSF0KMaeav25AQSQ", - "cell_type": "markdown", - "source": [ - "For the computation of the CSM or LC components for each AoC step, it is convenient to introduce the notion of technical margin (TM).", - "\n", - "\nFirstly, it is useful to define the so-called Aggregated Technical Margin (ATM)", - "\n", - "\n$$", - "\n\\text{ATM} (\\text{AoC}) = \\sum_{s\\in\\text{previous AoC steps}} \\text{TM}(s) ~,", - "\n$$", - "\n", - "\nand the Interest Accretion Factor (IAF) ", - "\n", - "\n$$", - "\n\\text{IAF} = \\prod_{i=1}^{\\text{TS}} (1 + \\text{YC}_i) - 1 ~.", - "\n$$", - "\n", - "\nThe TM is defined as", - "\n", - "\n$$", - "\n\\text{TM}(\\text{AoC}) = \\left\\{", - "\n\\begin{array}{rl}", - "\n\\text{TM}(\\rm{EOP}) \\text{ of the previous period} ~ & \\text{if }s = \\text{BOP and Novelty is In-Force}. \\\\", - "\n0 ~ & \\text{if }s = \\text{CF}. \\\\", - "\n\\text{IAF} \\cdot ~ \\text{ATM}(\\text{AoC}) ~ & \\text{if }s = \\text{IA}. \\\\", - "\n\\rm{Premiums} + \\text{Attributable Expense and Commissions} + \\text{Investment Claims} ~ & \\text{if }s = \\text{EA}. \\\\", - "\n-\\text{AMF} \\cdot ~ \\text{ATM}(\\text{AoC}) ~ & \\text{if }s = \\text{AM}. \\\\", - "\n\\text{PV Locked Value}(\\text{AoC}) ", - "\n\\bigg|_{\\substack{\\text{Non Attributable} \\\\ ", - "\n \\text{Amount Types} \\\\ ", - "\n \\text{excluded}}} ", - "\n+ \\text{RA Locked Value}(\\text{AoC}) ~ & \\text{otherwise} ", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere AMF is the Amortization Factor that is defined [here](../Import/ImportScopeCalculation#amortization-factor) and tested [here](SpecificationsImportCashflows#amortization-factor), with YC being the [Yield Curve](#yield-curves) and TS is the Time-Step, ", - "\nand the Premiums, Attributable Expense and Commissions and Investment Claims terms are given by:", - "\n", - "\n$$", - "\n\\begin{array}{lcl}", - "\n\\rm{Premiums} &=& \\text{Premium Allocation Factor} \\cdot \\sum_{\\text{Amount Type}\\in\\{\\text{PR and its children}\\}}", - "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - ", - "\n \\big(\\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}} + \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~, \\\\", - "\n\\text{Attributable Expense and Commissions} &=& \\sum_{\\text{Amount Type}\\in\\{\\rm{ACA}, \\rm{AEA}\\}}", - "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - \\text{Actual}_{\\text{Novelty=C}} ~, \\\\", - "\n\\text{Investment Claims } &=& \\sum_{\\text{Amount Type}\\in\\{\\text{ICO and its children}\\}}", - "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - ", - "\n \\big( \\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}} + \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~.", - "\n\\end{array}", - "\n$$", - "\n", - "\nThe AoC Type **CF** is implicit for all formulas, PV is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **OA** and **AA** (see details [here](../Import/ImportScopeCalculation#actual-base))." - ], - "metadata": {} - }, - { - "id": "dHH8INfYdk6Y3NzMtPgJbA", - "cell_type": "markdown", - "source": [ - "## Beginning of Period" - ], - "metadata": {} - }, - { - "id": "X49_KQk8ek2l9u2XuCXQPw", - "cell_type": "code", - "source": [ - "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-MSegalanEGCyd9Lmbhk2g", - "cell_type": "code", - "source": [ - "id_BoP_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "GauKnHaTZk2qPtNwgM0kgQ", - "cell_type": "code", - "source": [ - "var computedTM_BoP_I = Test.GetScope(id_BoP_I);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "sDV3uzZnZE-xy3w3XNF0xA", - "cell_type": "code", - "source": [ - "computedTM_BoP_I.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3rv0eEV93Euw7OXSDpqR0w", - "cell_type": "markdown", - "source": [ - "The TM for BOP is equal to the TM for EOP of the previous period, that is, the sum of Csm, Loss Component and LoReCo as of at the end of last period (see the corresponding [formula](#technical-margins)). ", - "\n", - "\nThe corresponding **IFRS Variables** can be loaded directly from the *Storage*" - ], - "metadata": {} - }, - { - "id": "AOE-Piw6OUGsQ3Bl1AuGbw", - "cell_type": "code", - "source": [ - "var valueCsm = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.C, null);", - "\nvalueCsm" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YdYcIzhRG0CLSLEWQblsEA", - "cell_type": "code", - "source": [ - "var valueLc = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.L, null);", - "\nvalueLc" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0Onxmh3pPU6pxWFOSJt6DA", - "cell_type": "code", - "source": [ - "var valueLr = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.LR, null);", - "\nvalueLr" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0x0FA_cjZEWhsLSbrQq40g", - "cell_type": "code", - "source": [ - "var expectedTM_BoP_I = -valueCsm + valueLc + valueLr;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "SJSNzLoPJUiPGHBvEduNeQ", - "cell_type": "code", - "source": [ - "expectedTM_BoP_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8VnVUHSzbE-KpM6n4ONuQg", - "cell_type": "code", - "source": [ - "computedTM_BoP_I.Value.Should().BeApproximately( expectedTM_BoP_I, Precision );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xIQdOuzLvESRKcPIgcUsPQ", - "cell_type": "markdown", - "source": [ - "", - "\n## Model Corrections" - ], - "metadata": {} - }, - { - "id": "fNltK5PaA0Kw7wchmSNY_w", - "cell_type": "code", - "source": [ - "var id_MC_I = Test.GetIdentity(dataNode, \"MC\", \"I\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RRBZvtJHhUikmA_j6oodwg", - "cell_type": "code", - "source": [ - "id_MC_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "AOGe1hxqB0auL-m48n4LEQ", - "cell_type": "code", - "source": [ - "var computedTM_MC_I = Test.GetScope(id_MC_I);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "glwYLenix0mbVAzz2QauDg", - "cell_type": "code", - "source": [ - "computedTM_MC_I.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "NmTxRKBaJUSBln-u_LqjRA", - "cell_type": "markdown", - "source": [ - "The TM for MC is given by the default [formula](#technical-margins), i.e. it is equal to the sum of PV and RA Locked, where the former does not encompass the *NonAttributable* Amount Types" - ], - "metadata": {} - }, - { - "id": "cZmPuuHgGEiu5xbMXe88xQ", - "cell_type": "code", - "source": [ - "var expectedTM_MC_I = Test.GetScope(id_MC_I).Value + Test.GetScope( id_MC_I ).Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4L9o1tHqWki3eAAa7xkajA", - "cell_type": "code", - "source": [ - "expectedTM_MC_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "98q4ZQeegkuz71N9nfEHJg", - "cell_type": "code", - "source": [ - "computedTM_MC_I.Value.Should().BeApproximately( expectedTM_MC_I, Precision );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "B5PYDN0vMkqQxtE9Hyw25A", - "cell_type": "markdown", - "source": [ - "## Cash Flow" - ], - "metadata": {} - }, - { - "id": "499xH8CoX0GNNMn3D9roXg", - "cell_type": "code", - "source": [ - "var id_CF_I = Test.GetIdentity(dataNode, \"CF\", \"I\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "D0CbUxy5UUKrMhBCxYOZgg", - "cell_type": "code", - "source": [ - "id_CF_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5Wp3bWCQyUGxZdn4_VfQ6Q", - "cell_type": "code", - "source": [ - "var computedTM_CF_I = Test.GetScope(id_CF_I);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nd6a0CNEH0S7s7gB7otViA", - "cell_type": "code", - "source": [ - "computedTM_CF_I.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3n9f5rJGHUulpGouIZZY-w", - "cell_type": "markdown", - "source": [ - "According to the [formula](#technical-margins) above, the tecnical margin is 0 for the Cash Flow AoC step " - ], - "metadata": {} - }, - { - "id": "rKHBn4AQB0-Xf3R7XoqAaQ", - "cell_type": "code", - "source": [ - "computedTM_CF_I.Value.Should().BeApproximately( 0, Precision );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "AVeLuFLOC0C5EG_ODOOKgg", - "cell_type": "markdown", - "source": [ - "", - "\n## Interest Accretion" - ], - "metadata": {} - }, - { - "id": "fb9GTLqZ10S_IGiMHnsjtA", - "cell_type": "code", - "source": [ - "var id_IA_I = Test.GetIdentity(dataNode, \"IA\", \"I\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qTqnPKarN0W0KXR3GY0C2Q", - "cell_type": "code", - "source": [ - "id_IA_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-A6XSrwceEml_t5TZg447g", - "cell_type": "code", - "source": [ - "var computedTM_IA_I = Test.GetScope(id_IA_I);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "grxq6Y2xxkeWfYaEXojn4w", - "cell_type": "code", - "source": [ - "computedTM_IA_I.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "S4WYAmNv9kOPoeM8Utgblg", - "cell_type": "markdown", - "source": [ - "According to the [formula](#technical-margins) above, for the AoC step IA, the TM is equal to sum of the TMs of its previous AoC step multiplied by the IAF. " - ], - "metadata": {} - }, - { - "id": "4WhIgYaOr0aGNomU8C5-uA", - "cell_type": "markdown", - "source": [ - "The IAF associated to the current period (i.e. shift and time step) can be calculated from the shift, the time Step, and the Interest Rates" - ], - "metadata": {} - }, - { - "id": "4xfyE1DlUEqKdYMjYcygRw", - "cell_type": "code", - "source": [ - "var projectionPeriod = 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "RjAsyz82BECP1W48K-a7rA", - "cell_type": "code", - "source": [ - "var shift = Test.GetStorage().GetShift(projectionPeriod);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "wsHHDSkq-0-huGE1nvj3wQ", - "cell_type": "code", - "source": [ - "var timeStep = Test.GetStorage().GetTimeStep(projectionPeriod);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_gEJdoVPuUyxvU1oEF2Clw", - "cell_type": "code", - "source": [ - "(shift, timeStep)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "lNmbEvWOU0KMR_ZMy4DQpQ", - "cell_type": "code", - "source": [ - "var monthlyRates = Test.GetScope(id_IA_I);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "p4EWaRtorkCe5b4KbM6kFA", - "cell_type": "code", - "source": [ - "monthlyRates" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WhnDXZb69ES2SSJKZBdqPA", - "cell_type": "code", - "source": [ - "var IAF = Enumerable.Range(shift,timeStep).Select(i => monthlyRates.Interest.GetValidElement(i/12)).Aggregate(1.0d, (x, y) => x * y ) - 1.0d;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "A4PMm2aaGEejwDCTGWNc2w", - "cell_type": "code", - "source": [ - "IAF" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bJTIxBr6wUSGCYZKPko5RA", - "cell_type": "markdown", - "source": [ - "Since the previous AoC steps are" - ], - "metadata": {} - }, - { - "id": "fJq-TMlCuE-9Xsfek5KWug", - "cell_type": "code", - "source": [ - "var previousAocStep = Test.GetScope((id_IA_I, InputSource.Cashflow)).Values;", - "\npreviousAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "__ftTIzmrUS_DQUcSg34vg", - "cell_type": "markdown", - "source": [ - "the expected TM for the Amortization step reads" - ], - "metadata": {} - }, - { - "id": "FMyRgLCS30mHjSbBaZ6LgA", - "cell_type": "code", - "source": [ - "var expectedTM_IA_I = IAF * previousAocStep.Sum(aoc => Test.GetScope(id_IA_I with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "UBacH9pFIkG_rxoWOux8Rg", - "cell_type": "code", - "source": [ - "expectedTM_IA_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1-tr5DyvAEyE3oMQwJnJyA", - "cell_type": "code", - "source": [ - "computedTM_IA_I.Value.Should().BeApproximately( expectedTM_IA_I, Precision );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TAmMb4uGQ0CGG-bwB1k0bg", - "cell_type": "markdown", - "source": [ - "## Combined Liabilities" - ], - "metadata": {} - }, - { - "id": "RH193aFtkEq65MfZGDWFgQ", - "cell_type": "code", - "source": [ - "var id_CL_C = Test.GetIdentity(dataNode, \"CL\", \"C\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8Ug4OQB9lEWCTqQm6mWYdA", - "cell_type": "code", - "source": [ - "id_CL_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YDa8Beon7Umu1aUF0ONGJQ", - "cell_type": "code", - "source": [ - "var computedTM_CL_C = Test.GetScope(id_CL_C);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "eyyv-oaJE0KWTDaGRKqDpw", - "cell_type": "code", - "source": [ - "computedTM_CL_C.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VWU-qT5aV0GrakHpIsqPgQ", - "cell_type": "markdown", - "source": [ - "According to the default TM [formula](#technical-margins), for the CL step the TM is equal to the sum of PV and RA Locked, where the former does not encompass the *NonAttributable* Amount Types" - ], - "metadata": {} - }, - { - "id": "6EyiiEVRzkuI6YRXJQ1MTQ", - "cell_type": "code", - "source": [ - "var expectedTM_CL_C = Test.GetScope(id_CL_C).Value + Test.GetScope( id_CL_C ).Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0dDkPEAfeE-XhvLA7DH1Wg", - "cell_type": "code", - "source": [ - "expectedTM_CL_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MKmlpGv4-E64crKcv0Zlig", - "cell_type": "code", - "source": [ - "computedTM_CL_C.Value.Should().BeApproximately( expectedTM_CL_C, Precision );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WDBCcZKCLUeobaNw-juV1g", - "cell_type": "markdown", - "source": [ - "## Experience Adjustment" - ], - "metadata": {} - }, - { - "id": "2dBJGbhnzk6wE_QuqLi-RQ", - "cell_type": "code", - "source": [ - "var id_EA_C = Test.GetIdentity(dataNode, \"EA\", \"C\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hyawxe-JhUqkLHKOWPTdQw", - "cell_type": "code", - "source": [ - "id_EA_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "goQMZoAJfkSEn4o50YRUew", - "cell_type": "code", - "source": [ - "var computedTM_EA_C = Test.GetScope(id_EA_C);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8dX7PfDfwEWf7hkrubnBxw", - "cell_type": "code", - "source": [ - "computedTM_EA_C.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-WJt_6_ZIkGH0yWrnqftrQ", - "cell_type": "markdown", - "source": [ - "According to the [formula](#technical-margins) above, for the AoC step EA, the TM is equal to sum of the Premiums, Attributable Expense and Commissions, and Investment Claims. Here below we calculate these terms individually." - ], - "metadata": {} - }, - { - "id": "DB62V_OoakmF-fa0ir-6vg", - "cell_type": "markdown", - "source": [ - "The Premiums, Attributable Expense and Commissions and Investment Claims Present Values and Actuals are calculated using the CF AoC step. Therefore, as first step we define the relevant AoC step and Novelties:" - ], - "metadata": {} - }, - { - "id": "tGqV5u76l0-NIz-zJDKesQ", - "cell_type": "code", - "source": [ - "var referenceAoCType = Test.GetScope(id_EA_C).Value.AocType;", - "\nvar referenceAoC = Test.GetStorage().GetNovelties().Select(n => new AocStep(referenceAoCType, n));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tFXCsZ7yPkaUO_sP6Rf4dw", - "cell_type": "code", - "source": [ - "referenceAoC" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Zn9OSvz3M02EYNKavRdHWA", - "cell_type": "markdown", - "source": [ - "**Premiums**" - ], - "metadata": {} - }, - { - "id": "hD28G9xlTki7-KNMU73QQQ", - "cell_type": "markdown", - "source": [ - "The list of Premiums Amount Type defined in the imported dimensions and the Premium Allocation Factor can be retrieved" - ], - "metadata": {} - }, - { - "id": "WPVewiJ-ZUKbnl0snAuRBA", - "cell_type": "code", - "source": [ - "Test.GetStorage().GetPremiums()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "N6sWBi5BvkKF2O4N78nT_Q", - "cell_type": "code", - "source": [ - "var premiumAllocationFactor = Test.GetStorage().GetPremiumAllocationFactor(id_EA_C);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Fmxi3kQshEaXnPNNsbhPNg", - "cell_type": "code", - "source": [ - "premiumAllocationFactor" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "GY7vCaRdK0GOmI8q5PX9_Q", - "cell_type": "markdown", - "source": [ - "Lastly, the Premiums term is" - ], - "metadata": {} - }, - { - "id": "5-HIYLo-bk2YFsABuEJCsQ", - "cell_type": "code", - "source": [ - "var premiums = premiumAllocationFactor * Test.GetStorage().GetPremiums()", - "\n .Sum(p => referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", - "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.A, (int?)null)).Value)", - "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.AA, (int?)null)).Value)", - "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.OA, (int?)null)).Value)", - "\n );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "fg0ynhRLfEiTL68jnBFYPg", - "cell_type": "code", - "source": [ - "premiums" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "GpYhgIs7bkijYtGnn_rmug", - "cell_type": "markdown", - "source": [ - "**Attributable Expense and Commissions**" - ], - "metadata": {} - }, - { - "id": "HLALKVc8NE233oTSH12a-Q", - "cell_type": "markdown", - "source": [ - "Analogously, the Attributable Expense and Commissions term can be computed" - ], - "metadata": {} - }, - { - "id": "tPhUn5VaikiP2WaFNmIoiA", - "cell_type": "code", - "source": [ - "var attributableExpenseAndCommissions = new string[] {AmountTypes.ACA, AmountTypes.AEA}", - "\n .Sum(d => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", - "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, EstimateTypes.A, (int?)null)).Value));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CBelGvY28Uef9-9DjuaJSA", - "cell_type": "code", - "source": [ - "attributableExpenseAndCommissions" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "endWZOKckEWp2c6BLELK1w", - "cell_type": "markdown", - "source": [ - "**Investment Claims**" - ], - "metadata": {} - }, - { - "id": "AHIdM5P7nUyMySdWDQN-kA", - "cell_type": "markdown", - "source": [ - "Finally the Investment Claims term reads" - ], - "metadata": {} - }, - { - "id": "bETNZXjO2EuzRVFBP4Nykw", - "cell_type": "code", - "source": [ - "var investmentClaims = Test.GetStorage().GetInvestmentClaims()", - "\n .Sum(ic => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", - "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.A, (int?)null)).Value)", - "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.AA, (int?)null)).Value)", - "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.OA, (int?)null)).Value)", - "\n );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hKxm4Ea8-kCpGkmuQ8-P1g", - "cell_type": "code", - "source": [ - "investmentClaims" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tHqLLnVgKE6pcPnvAv06Tg", - "cell_type": "markdown", - "source": [ - "**Expected TM**" - ], - "metadata": {} - }, - { - "id": "ffxLkcddWUifhMB2Ybvzzw", - "cell_type": "code", - "source": [ - "var expectedTM_EA_C = premiums + attributableExpenseAndCommissions + investmentClaims;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "SUkya34JlUm2dEmvnV6bTQ", - "cell_type": "code", - "source": [ - "expectedTM_EA_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KL-ACiIWbkaCFXsaDZoW-g", - "cell_type": "code", - "source": [ - "computedTM_EA_C.Value.Should().BeApproximately( expectedTM_EA_C, Precision );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "aly806PPsk6nb1bq-n7-Sg", - "cell_type": "markdown", - "source": [ - "## Amortization" - ], - "metadata": {} - }, - { - "id": "bsMWbnZzwkiwXgJ8qAvFvw", - "cell_type": "code", - "source": [ - "var id_AM_C = Test.GetIdentity(dataNode, \"AM\", \"C\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "f4APi5_3CUmHUbP4cXLdcg", - "cell_type": "code", - "source": [ - "id_AM_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Rh7epJw7NUaRJ1RMc2rMQg", - "cell_type": "code", - "source": [ - "var computedTM_AM_C = Test.GetScope(id_AM_C);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8zkFkhgH00CXbsv5T8h-Hg", - "cell_type": "code", - "source": [ - "computedTM_AM_C.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "exXE3mAyIEi-kS4auuzrKQ", - "cell_type": "code", - "source": [ - "computedTM_AM_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "EpoM-9UMx0qwL68EXUoiiA", - "cell_type": "markdown", - "source": [ - "According to the [formula](#technical-margins) above, for the AoC step AM, the TM is equal to sum of the TMs of its previous AoC step multiplied by the amortization factor with opposite sign. ", - "\n", - "\nThe AoC step previous to Amortization are" - ], - "metadata": {} - }, - { - "id": "RWUkvmQU9kqvjgKafKtMGg", - "cell_type": "code", - "source": [ - "var previousAocStep = Test.GetScope((id_AM_C, InputSource.Cashflow)).Values;", - "\npreviousAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WvdwUX-cX0SvELfpTOrxHA", - "cell_type": "markdown", - "source": [ - "while the Amortization Factor can be retrieved in the following" - ], - "metadata": {} - }, - { - "id": "HTgPDX8Zw0agihg2o3LoWQ", - "cell_type": "code", - "source": [ - "Test.GetScope(id_AM_C)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "r74wo-n4PEiaFDs1bW_41w", - "cell_type": "markdown", - "source": [ - "Therefore, the expected TM for the Amortization step reads" - ], - "metadata": {} - }, - { - "id": "SznuOL-o1Uy5mmuI-jmWPw", - "cell_type": "code", - "source": [ - "var expectedTM_AM_C = -Test.GetScope(id_AM_C).Value * ", - "\n previousAocStep.Sum(aoc => Test.GetScope(id_AM_C with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "rEbKtIir70eeIiyYnSAFiA", - "cell_type": "code", - "source": [ - "expectedTM_AM_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5Boj82BZcUanZERZtQH1mA", - "cell_type": "code", - "source": [ - "computedTM_AM_C.Value.Should().BeApproximately( expectedTM_AM_C, Precision );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "IoyFPh2DekK36wAQkduuFw", - "cell_type": "markdown", - "source": [ - "## End of Period" - ], - "metadata": {} - }, - { - "id": "e7GBWeapNUCJFEwl3Hdlfw", - "cell_type": "code", - "source": [ - "var id_EoP_C = Test.GetIdentity(dataNode, \"EOP\", \"C\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bFFAsDW4HU21gY0oQl4w-g", - "cell_type": "code", - "source": [ - "id_EoP_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-NF7JtObB0el7f59d8rHzw", - "cell_type": "code", - "source": [ - "var computedTM_EoP_C = Test.GetScope(id_EoP_C);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "J6OQYmtTy0O6Pa4dqCaYEQ", - "cell_type": "code", - "source": [ - "computedTM_EoP_C.Value" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ar4enZGkDkahHzmCKHvxBA", - "cell_type": "code", - "source": [ - "var expectedTM_EoP_C = Test.GetScope( id_EoP_C ).Value + Test.GetScope( id_EoP_C ).Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Q-Rv4WF-uEOJenziP5Ko6w", - "cell_type": "code", - "source": [ - "expectedTM_EoP_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "GE0JdvladkOqE6BxVNRMcA", - "cell_type": "code", - "source": [ - "computedTM_EoP_C.Value.Should().BeApproximately( expectedTM_EoP_C, Precision );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XDuHL9hx2E6DU5ayGYHutQ", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Switch Logic " - ], - "metadata": {} - }, - { - "id": "NHk1HPZ3y0K-uGfMOBF1gQ", - "cell_type": "markdown", - "source": [ - "The CSM and LC figures are allocated for each AoC step based on the sign of the ATM. Specifically, for positive (negative) ATM, the TM of the current step is allocated to the LC (CSM), unless the TM flips the sign of the ATM. This special circumstance is named **switch**. It can happen at any AoC step with the only exception of Amortization where there is no switch from the previous step.", - "\nWhen a switch occurs the total contribution to the CSM (LC) prior the switching step is brought to 0 and the remaing amount is allocated to LC (CSM).", - "\n", - "\nIn the following the AoC chain is investigated." - ], - "metadata": {} - }, - { - "id": "qkwHpG9GrUmO52LhVW0gMw", - "cell_type": "markdown", - "source": [ - "## Beginning of Period", - "\n", - "\nFor the BOP, the last period is considered, which dictates that the corresponding EOP figures considered have necessarily Novelty of type *In-Force*.", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{BOP}) &=& \\text{CSM}(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force} \\\\", - "\n\\text{LC}(\\text{BOP}) &=& \\text{LC}(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", - "\n\\end{array}", - "\n$$" - ], - "metadata": {} - }, - { - "id": "x2DkfQwGp0q67zTOEqWSDg", - "cell_type": "code", - "source": [ - "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "U1ZDbeNAYUSlPIqSHFql-A", - "cell_type": "code", - "source": [ - "id_BoP_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "OeYWN1P_DEOPTJgMbEYdwg", - "cell_type": "code", - "source": [ - "var computedCSM_BoP_I = Test.GetScope(id_BoP_I).Value;", - "\nvar computedLC_BoP_I = Test.GetScope(id_BoP_I).Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ihEr80PWCkGZdhvb1ggfKw", - "cell_type": "code", - "source": [ - "(computedCSM_BoP_I, computedLC_BoP_I)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "gGKUWa-n40u9Xu3VNw4n7A", - "cell_type": "markdown", - "source": [ - "To understand where the BOP is allocated, we retrieve the corresponding TM and, based on its sign, we expect the CSM or the LC to be non-zero according to the [formula](#switch-logic) above" - ], - "metadata": {} - }, - { - "id": "GbsT5_IX40yquehB3bXzWg", - "cell_type": "code", - "source": [ - "var TM_BOP_I = Test.GetScope(id_BoP_I).Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VzVSQA_NVE2D__qk77LRuQ", - "cell_type": "code", - "source": [ - "TM_BOP_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VyqxO7jhD06tjnlyZWgklA", - "cell_type": "code", - "source": [ - "var expectedCSM_BoP_I = TM_BOP_I < 0 ? -TM_BOP_I : 0;", - "\nvar expectedLC_BoP_I = TM_BOP_I > 0 ? +TM_BOP_I : 0;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "I9Ou_OG9n0-4enuli2WR8w", - "cell_type": "code", - "source": [ - "(expectedCSM_BoP_I, expectedLC_BoP_I)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZGzRu0gOjEuAs_AaPiyaAA", - "cell_type": "code", - "source": [ - "computedCSM_BoP_I.CheckEquality(computedCSM_BoP_I).Should().Be(true);", - "\nexpectedLC_BoP_I.CheckEquality(computedLC_BoP_I).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Dmr2QZObzkCiSqWNVstsqA", - "cell_type": "markdown", - "source": [ - "## Following AoC steps" - ], - "metadata": {} - }, - { - "id": "QhyguKxmFkur5akQ_kuU4w", - "cell_type": "markdown", - "source": [ - "From the BOP up to the CL step, the switch logic is applied separately to the In-Force and New Business novelties." - ], - "metadata": {} - }, - { - "id": "j2v9TGxKBEi9vyAXzjnYRQ", - "cell_type": "code", - "source": [ - "var id_MC_I = Test.GetIdentity(dataNode, \"MC\", \"I\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "oURGBY049UO_6rpp5Yvd8w", - "cell_type": "code", - "source": [ - "id_MC_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Zz6IYfaXW0eEwAt1CFXLqQ", - "cell_type": "code", - "source": [ - "var computedCSM_MC_I = Test.GetScope(id_MC_I).Value;", - "\nvar computedLC_MC_I = Test.GetScope(id_MC_I).Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "anLo2TEZn0a-c-b58-NptA", - "cell_type": "code", - "source": [ - "(computedCSM_MC_I, computedLC_MC_I)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "_3ECx3xw6kaAPhipr_o3IQ", - "cell_type": "markdown", - "source": [ - "According to the [formula](#switch-logic) above this AoC step is allocated either to CSM or to LC based on the sign of ATM + TM. Both these two terms can be retrieved from the **TechnicalMargin** Scope." - ], - "metadata": {} - }, - { - "id": "vDlb6A-66UaV1dj-A7BpwA", - "cell_type": "code", - "source": [ - "var TM_MC_I = Test.GetScope(id_MC_I);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "tWklX6ndd0eQuh10WyJwow", - "cell_type": "code", - "source": [ - "TM_MC_I" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VShlk81fLE6vcS4-zPChpA", - "cell_type": "markdown", - "source": [ - "The correctness of the ATM can be checked by firstly withdrawing the previous AoC steps" - ], - "metadata": {} - }, - { - "id": "ZeVVDyOg8kiQOSI9_cx7Sg", - "cell_type": "code", - "source": [ - "var previousAocStep = Test.GetScope((id_MC_I, InputSource.Cashflow)).Values;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TGc_r6IcEUWsmmbS1dH8gA", - "cell_type": "code", - "source": [ - "previousAocStep" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "4LVnT3VEWkyKk021jdSe1g", - "cell_type": "markdown", - "source": [ - "and then evaluating the sum of the corresponding TMs" - ], - "metadata": {} - }, - { - "id": "C4MRuXZBHEWOoGmxdDMPNQ", - "cell_type": "code", - "source": [ - "var expectedATM = previousAocStep.Sum(aoc => Test.GetScope(id_MC_I with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "AjUcTq64mUiQGuUK9WLhpQ", - "cell_type": "code", - "source": [ - "expectedATM" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qG0nHl69Y0qX9agYsei91g", - "cell_type": "markdown", - "source": [ - "Therefore, the following condition for ATM calculated by the **TechnicalMargin** Scope needs to be fullfilled" - ], - "metadata": {} - }, - { - "id": "-2a6HsG0-U6ss9qGHoExYw", - "cell_type": "code", - "source": [ - "TM_MC_I.AggregatedValue.Should().BeApproximately( expectedATM, Precision );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "z3e8UQynb02Bjtq0B_KbcA", - "cell_type": "markdown", - "source": [ - "The CSM and LC can be allocated according to the [Switch Logic](#switch-logic)." - ], - "metadata": {} - }, - { - "id": "SpZykQISGUS5t5LfteXTqg", - "cell_type": "code", - "source": [ - "double expectedCSM_MC_I; ", - "\ndouble expectedLC_MC_I; " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8I15mZw2KUKeZMDPsOvYfg", - "cell_type": "code", - "source": [ - "var aggregated = TM_MC_I.Value + TM_MC_I.AggregatedValue;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Qw1GlZ5Edkaz3I-5i96u9A", - "cell_type": "markdown", - "source": [ - "If there is no switch from LC, i.e. $\\text{ATM} (\\text{AoC}) > 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\ge 0 $, then:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& 0 ~, \\\\", - "\n\\text{LC}(\\text{AoC}) &=& \\text{TM}(\\text{AoC}) ~.", - "\n\\end{array}", - "\n$$" - ], - "metadata": {} - }, - { - "id": "7da5XEhrhEu35M4vNuKJ7Q", - "cell_type": "code", - "source": [ - "if(TM_MC_I.AggregatedValue > 0 && aggregated >= 0) {", - "\n expectedCSM_MC_I = 0 ;", - "\n expectedLC_MC_I = TM_MC_I.Value ;", - "\n} " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "KbFNOw70mEePHWniU_e5Gw", - "cell_type": "markdown", - "source": [ - "If there is no switch from CSM, i.e. $\\text{ATM} (\\text{AoC}) \\le 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\le 0 $, then:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) ~, \\\\", - "\n\\text{LC}(\\text{AoC}) &=& 0 ~.", - "\n\\end{array}", - "\n$$" - ], - "metadata": {} - }, - { - "id": "fgaGOnieo0qKvh_7zYB2Iw", - "cell_type": "code", - "source": [ - "if(TM_MC_I.AggregatedValue < 0 && aggregated <= 0) {", - "\n expectedCSM_MC_I = -TM_MC_I.Value ;", - "\n expectedLC_MC_I = 0 ;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "wI01nxemTE6PWDDgvWjtww", - "cell_type": "markdown", - "source": [ - "If $\\text{ATM} (\\text{AoC}) > 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\le 0$, then there is a switch to CSM:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) -\\text{ATM} (\\text{AoC}) ~, \\\\", - "\n\\text{LC}(\\text{AoC}) &=& -\\text{ATM} (\\text{AoC}) ~.", - "\n\\end{array}", - "\n$$" - ], - "metadata": {} - }, - { - "id": "r_Z-PV3jnEe61s5dxqqeAQ", - "cell_type": "code", - "source": [ - "if(TM_MC_I.AggregatedValue > 0 && aggregated <= 0) {", - "\n expectedCSM_MC_I = -aggregated;", - "\n expectedLC_MC_I = -TM_MC_I.AggregatedValue ;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "UGTIjdFCpUOf3okJiq05Xw", - "cell_type": "markdown", - "source": [ - "On the other hand, if $\\text{ATM} (\\text{AoC}) \\le 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) > 0$, ", - "\nthen the switch is to LC:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& \\text{ATM} (\\text{AoC}) ~, \\\\", - "\n\\text{LC}(\\text{AoC}) &=& \\text{TM}(\\text{AoC}) + \\text{ATM} (\\text{AoC}) ~.", - "\n\\end{array}", - "\n$$" - ], - "metadata": {} - }, - { - "id": "b4tllqavSUaAPPPQ9-2xNw", - "cell_type": "code", - "source": [ - "if(TM_MC_I.AggregatedValue <= 0 && aggregated > 0) {", - "\n expectedCSM_MC_I = TM_MC_I.AggregatedValue ;", - "\n expectedLC_MC_I = aggregated ;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "7DcRpZcCLEurfCz1WhmBsA", - "cell_type": "markdown", - "source": [ - "Therefore, the expected CSM and LC for this step are" - ], - "metadata": {} - }, - { - "id": "Cynr0d0AokyhPo5thwHxng", - "cell_type": "code", - "source": [ - "(expectedCSM_MC_I, expectedLC_MC_I)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "jt1m57jeUUOnClnAWUh4GQ", - "cell_type": "code", - "source": [ - "expectedCSM_MC_I.CheckEquality(computedCSM_MC_I).Should().Be(true);", - "\nexpectedLC_MC_I.CheckEquality(computedLC_MC_I).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0CzQml-85UuZbrhJFsKLDw", - "cell_type": "markdown", - "source": [ - "", - "\n## Combined Liabilities" - ], - "metadata": {} - }, - { - "id": "l3-1ZxlOU06br5k6_VWJgw", - "cell_type": "markdown", - "source": [ - "The CL Aoc Step brings both contributions to CSM and LC together as the novelities are summed.", - "\n", - "\nFor the CL step, the logic is similar to the one above, except that a switch from LC to CSM can happen **because of New Business and despite of In-Force**, in which case we have:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) - \\text{ATM}(\\text{Last In-Force AoC step}) - \\text{TM}(\\text{Last In-Force AoC step}) \\\\", - "\n\\text{LC}(\\text{AoC}) &=& -\\text{ATM}(\\text{Last In-Force AoC step}) - \\text{TM}(\\text{Last In-Force AoC step})", - "\n\\end{array}", - "\n$$", - "\n", - "\nIf, on the other hand, the switch from LC to CSM happens **because of In-Force and despite of New Business**, then we have:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& - \\text{TM}(\\text{AoC}) - \\text{ATM}(\\text{Last NB AoC step}) - \\text{TM}(\\text{Last NB AoC step}) \\\\", - "\n\\text{LC}(\\text{AoC}) &=& - \\text{ATM}(\\text{Last NB AoC step}) - \\text{TM}(\\text{Last NB AoC step})", - "\n\\end{array}", - "\n$$", - "\n", - "\nFor the switch in the other direction, i.e. from CSM to LC the formulas are similar except that LC and CSM are swapped." - ], - "metadata": {} - }, - { - "id": "LbA7zjeoTUmzsL20pTogpg", - "cell_type": "code", - "source": [ - "var id_CL_C = Test.GetIdentity(dataNode, \"CL\", \"C\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "BQ0_Jmo4GUCeoSwaNpzSEQ", - "cell_type": "code", - "source": [ - "id_CL_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "b1ZovjyK206ocT3in7tJJg", - "cell_type": "code", - "source": [ - "var computedCSM_CL_C = Test.GetScope(id_CL_C).Value;", - "\nvar computedLC_CL_C = Test.GetScope(id_CL_C).Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "di_k8t-Q8k6S_g2qUV6UKA", - "cell_type": "code", - "source": [ - "(computedCSM_CL_C, computedLC_CL_C)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HNbDZeZA-0q7FhEWN2i1AA", - "cell_type": "markdown", - "source": [ - "The CL step considers the last step of both the New Business and the In Force Novelties to decide what to allocate to CSM or LC. " - ], - "metadata": {} - }, - { - "id": "gFyHo7Xd80Kx9qUhOBfakQ", - "cell_type": "code", - "source": [ - "var lastAocSteps = Test.GetScope((id_CL_C, InputSource.Cashflow)).Values.GroupBy(x => x.Novelty).Select(g => g.Last());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Z0o-1_Kj7kqDfc6VHr5cxQ", - "cell_type": "code", - "source": [ - "lastAocSteps" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "OJYdM2hIAk-hyqf4zANz0A", - "cell_type": "markdown", - "source": [ - "Selecting the corresponding AocTypes:" - ], - "metadata": {} - }, - { - "id": "W0LNije6AESOhExOn3cEIQ", - "cell_type": "code", - "source": [ - "var lastAocTypeNb = lastAocSteps.Single(x => x.Novelty == Novelties.N).AocType;", - "\nvar lastAocTypeI = lastAocSteps.Single(x => x.Novelty == Novelties.I).AocType;", - "\n(lastAocTypeI, lastAocTypeNb)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LQ6g6NwhGkaAn6cNDgnwLw", - "cell_type": "code", - "source": [ - "var lastTM_NewBusiness = Test.GetScope(id_CL_C with {AocType = lastAocTypeNb, Novelty = Novelties.N});" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "h_-vLUO1a0CaiTlvHdl-Qw", - "cell_type": "code", - "source": [ - "lastTM_NewBusiness" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "vx-ERfMXoEmPlM7YjfSpVg", - "cell_type": "code", - "source": [ - "var lastTM_InForce = Test.GetScope(id_CL_C with {AocType = lastAocTypeI, Novelty = Novelties.I});" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nEAfJcJBfU6e8ESe_G-HGQ", - "cell_type": "code", - "source": [ - "lastTM_InForce" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "IsysT0dxB02V9LtXUi4WKw", - "cell_type": "markdown", - "source": [ - "Conversely the TM and ATM for the CL step is" - ], - "metadata": {} - }, - { - "id": "0nCrk056Kki5-Lj4k_DNUA", - "cell_type": "code", - "source": [ - "var TM_Combined = Test.GetScope(id_CL_C);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HYP4Ehlpz06WTCeicsf-TA", - "cell_type": "code", - "source": [ - "TM_Combined" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VizwJ9n3JUWNn8VHtyyZRg", - "cell_type": "markdown", - "source": [ - "where the ATM of CL is given by the sum of the ATMs of the New Business and In Force Novelties" - ], - "metadata": {} - }, - { - "id": "_6wJKgMbikuQcgsNrkRUKA", - "cell_type": "code", - "source": [ - "var aggregatedNewBusiness = lastTM_NewBusiness.Value + lastTM_NewBusiness.AggregatedValue;", - "\nvar aggregatedInForce = lastTM_InForce.Value + lastTM_InForce.AggregatedValue;", - "\nvar sum = aggregatedNewBusiness + aggregatedInForce;", - "\nsum" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VmDd0wzbzEW0oE885Kyqww", - "cell_type": "code", - "source": [ - "( (sum - TM_Combined.AggregatedValue)/sum < 1.0e-12).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "19uVR0w7F02xd9KaJ2yVIQ", - "cell_type": "markdown", - "source": [ - "In order to decide where the TM of the CL step is allocated, one has to check the sign of the ATM + TM for both the New Business and the In Force" - ], - "metadata": {} - }, - { - "id": "QeZXbaKXGk2Vyp4P4dxgJg", - "cell_type": "code", - "source": [ - "var aggregatedCombined = TM_Combined.Value + TM_Combined.AggregatedValue;", - "\naggregatedCombined" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Njb3qejxeU6T_QL3ocb23g", - "cell_type": "markdown", - "source": [ - "According to the [formulas above](#combined-liabilities), for a positive (negative) aggregated CL value, the CL TM has to be allocated to LC (CSM). ", - "\n
In case the one of last Aoc step of the novelties (I, NB) has the sign of the CL ATM opposite to the CL ATM, the CL AocStep is used to introduce a balancing item to bring the ATM of the novelty with opposite sign to 0. ", - "\n
This is equivalent to execute the switch logic with a balancing item = ATM of the last AocStep having opposite sign to CL ATM. ", - "\n
Note that if CL TM is zero this results in allocating the same amount with opposite sign to CSM(note that the sign of the CSM componet is flipped) and LC." - ], - "metadata": {} - }, - { - "id": "PKCnye7OH0qMHL6PW1vWMw", - "cell_type": "code", - "source": [ - "double expectedCSM_CL_C; ", - "\ndouble expectedLC_CL_C; " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "mR_PzvyP50CGygsS3pFx9g", - "cell_type": "code", - "source": [ - "var balancingItem = aggregatedCombined < 0 ? aggregatedNewBusiness : aggregatedInForce;", - "\nbalancingItem" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hhE70xjs-EGuXjI4ztfscQ", - "cell_type": "code", - "source": [ - "", - "\nif(aggregatedCombined > 0) {", - "\n expectedCSM_CL_C = balancingItem ;", - "\n expectedLC_CL_C = TM_Combined.Value + balancingItem;", - "\n} else {", - "\n expectedLC_CL_C = - balancingItem ;", - "\n expectedCSM_CL_C = TM_Combined.Value - balancingItem ;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "474WEtEUPEqOIsiRVbHO0g", - "cell_type": "code", - "source": [ - "(expectedCSM_CL_C, expectedLC_CL_C)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-gNe5T_ZLEeVHsBfCLPhWA", - "cell_type": "code", - "source": [ - "expectedCSM_CL_C.CheckEquality(computedCSM_CL_C).Should().Be(true);", - "\nexpectedLC_CL_C.CheckEquality(computedLC_CL_C).Should().Be(true);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "DyvDoHzrBEq3_wVcCchkEw", - "cell_type": "markdown", - "source": [ - "## End Of Period", - "\n", - "\nFor the last AoC step, the EOP is the sum of all previous steps", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{EOP}) &=& \\sum_{s~\\in~\\text{previous AoC steps}} \\text{CSM}(s) ~, \\\\", - "\n\\text{LC}(\\text{EOP}) &=& \\sum_{s~\\in~\\text{previous AoC steps}} \\text{LC}(s) ~.", - "\n\\end{array}", - "\n$$" - ], - "metadata": {} - }, - { - "id": "_ESoopqaZU-By3wLhIBkgw", - "cell_type": "code", - "source": [ - "var id_EoP_C = Test.GetIdentity(dataNode, \"EOP\", \"C\");" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZqMiKYtLj0mrhg2Bk0SKbQ", - "cell_type": "code", - "source": [ - "id_EoP_C" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qHO12xBFj0OKhZj66J3uxQ", - "cell_type": "code", - "source": [ - "var computedCSM_EoP_C = Test.GetScope(id_EoP_C).Value;", - "\nvar computedLC_EoP_C = Test.GetScope(id_EoP_C).Value;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "C54gDBF8B0iE8erZtf9PDA", - "cell_type": "code", - "source": [ - "(computedCSM_EoP_C, computedLC_EoP_C)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MoN2gU7CgkmSAoAH8E3P4g", - "cell_type": "markdown", - "source": [ - "

", - "\n
", - "\nFor the reinsurance case, the switch logic is identical to the one described above, except that it uses the corresponding gross case TM to allocate the figure either to CSM or to LoReCo. The reinsurance gross TM multiplied by the weights coming from the Reinsurance Coverage Parameter (Data Node Parameters). In case a GRIC has multiple GICs, then these weighted TMs are aggregated.", - "\n
" - ], - "metadata": {} - }, - { - "id": "-17yUzUfYU-46uPh5jCLzQ", - "cell_type": "markdown", - "source": [ - "" - ], - "metadata": {} - }, - { - "id": "LHXDcjueYUy1IKvyMPuZyQ", - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Contractual Service Margin and Loss Component" - ], - "metadata": {} - }, - { - "id": "O7oZvk5RIk-EplmELWCLLw", - "cell_type": "markdown", - "source": [ - "Here below a view of the CSM and Loss Component results are shown. ", - "\n", - "\nNote: the Data Nodes with LiabilityType being *LIC* are excluded." - ], - "metadata": {} - }, - { - "id": "WQsEnHxeUkWa24cVa17ASw", - "cell_type": "code", - "source": [ - "var allIdentitiesWoLic = allIdentities.Where(id => Test.GetStorage().DataNodeDataBySystemName[id.DataNode].LiabilityType != \"LIC\").ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "ZClqTg9_EEKdli2o4Blwqw", - "cell_type": "code", - "source": [ - "var csm = allIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromCsmToIfrsVariable())).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VYCT72rdHE6fE0HDC7ygOQ", - "cell_type": "markdown", - "source": [ - "## Gross case" - ], - "metadata": {} - }, - { - "id": "UsRkibKobkCtFXhm5l__xQ", - "cell_type": "code", - "source": [ - "var allInsuranceIdentitiesWoLic = allIdentitiesWoLic.Where(id => !id.IsReinsurance).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "PirmpNw8w0yTsQZmMWqgKw", - "cell_type": "code", - "source": [ - "var lc = allInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromLcToIfrsVariable())).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "rqcC8OgZSEWmclwqnva9LQ", - "cell_type": "markdown", - "source": [ - "## Re-Insurance case (LoReCo)" - ], - "metadata": {} - }, - { - "id": "9FlZC2iKzkimZWgYZNcsRw", - "cell_type": "code", - "source": [ - "var allReInsuranceIdentitiesWoLic = allIdentitiesWoLic.Where(id => id.IsReinsurance).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "NZ39ut9ark6eMKtKoBbyOg", - "cell_type": "code", - "source": [ - "var loreco = allReInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromLoReCoToIfrsVariable())).ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "x-kOOIetOka_mQDABgu3oQ", - "cell_type": "markdown", - "source": [ - "## Summary" - ], - "metadata": {} - }, - { - "id": "mF7UvAY_-EKAlqSsnrQcNQ", - "cell_type": "code", - "source": [ - "Report.ForObjects( csm.Concat(lc).Concat(loreco) )", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupColumnsBy(x => x.EstimateType)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "WMr4L1n4PUOCiZT5gKh9ug", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Technical Margin Specifications

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The aim of this notebook is to document the Technical Margin (TM) and its allocation to the Contractual Service Margin (CSM), Loss Component (LC), or Loss Recovery Component (LoReCo). The process is pictorially explained in the following flowchart. ", + "\n", + "\n", + "\n
", + "\n", + "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." + ] + }, + { + "cell_type": "markdown", + "source": [ + "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"SpecificationsSetup\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Data" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Current Period" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" + ] + }, + { + "cell_type": "code", + "source": [ + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;", + "\nvar economicBasis = \"L\" ;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Import the Dimensions, Parameters, Nominal Cashflows, and Actuals from the corresponding csv files in Initialization/Systemorph/" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Initialization of the Test Suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" + ] + }, + { + "cell_type": "code", + "source": [ + "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## View loaded Data Nodes" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The imported active Data Nodes from Initialization/Systemorph/DataNodes.csv are " + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().DataNodeDataBySystemName" + ] + }, + { + "cell_type": "markdown", + "source": [ + "whereas the Data Nodes of your imported Cashflows are" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().DataNodesByImportScope[ImportScope.Primary]" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Please select here below the target Data Node for executing the tests below:" + ] + }, + { + "cell_type": "code", + "source": [ + "var dataNode = \"DT1.1\";" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## View list of Identities" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Based on the Cashflows imported, the list of all possible identities, i.e. combinations of valid Data Nodes, Aoc steps, and Novelties, is contructed and reported here below:" + ] + }, + { + "cell_type": "code", + "source": [ + "var allIdentities = Test.GetScopes(Test.GetStorage().DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities).ToArray();" + ] + }, + { + "cell_type": "code", + "source": [ + "allIdentities" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Present Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Projected Present Values (PPVs) are calculated for each Amount Type (AT) either with the *locked-in* (L) and with the *current* (C) Yield Curves. While the former is the latest available as per end of the DataNode's inception year, the latter is the latest available as per the current period. ", + "\nPPVs for both Economic Basis L and C have been defined [here](../Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", + "\n", + "\nAccording to the BBA methodology, the CSM calculation uses the PV with locked-in Yield Curve simply defined as", + "\n", + "\n$$", + "\n\\text{PV Locked}(\\text{AoC}, \\text{AT}) = \\text{PPV}(\\text{AoC}, \\text{AT}) \\big|_{\\substack{ \\text{Calculation Type = BE} \\\\ \\text{Economic Base = L} } }", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "var pvsLocked = allIdentities.SelectMany(id => Test.GetScope(id).PresentValues", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromPvToIfrsVariable())).ToArray();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Below a view of the computed locked-in PV " + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForObjects(pvsLocked)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.EconomicBasis)", + "\n .GroupColumnsBy(x => x.AmountType)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Aggregated values are also available as the sum over all [Amount Types](../DataModel/DataStructure#amount-type):", + "\n", + "\n$$", + "\n\\text{PV Locked Value}(\\text{AoC}) = \\sum_{\\text{AT}} \\text{PV Locked}(\\text{AoC}, \\text{AT})", + "\n$$" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Here below an example" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_BoP_I" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetScope( id_BoP_I ).Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Risk Adjustment" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The CSM calculation also uses locked-in Risk Adjustment (RA Locked) which is retrieved from the corresponding Present Value with [Calculation Type](../DataModel/DataStructure#calculation-type) being RA defined [here](../Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", + "\n", + "\nRisk Adjustment values can be written as", + "\n", + "\n$$", + "\n\\text{RA Locked Value}(\\text{AoC}) = \\text{PV}(\\text{AoC})|_{\\substack{ \\text{Calculation Type = RA} \\\\ \\text{Economic Base = L} }}", + "\n$$", + "\n", + "\nwhere the imported Cashflows for the RA Calculation Type are already aggregated over all [Amount Types](../DataModel/DataStructure#amount-type)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "Here below an example" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_BoP_I" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetScope( id_BoP_I ).Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The RA Locked per Data Node imported are" + ] + }, + { + "cell_type": "code", + "source": [ + "var rasLocked = allIdentities.SelectMany(id => Test.GetScope(id).PresentValues", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromPvToIfrsVariable())).ToArray();" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForObjects(rasLocked)", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.EconomicBasis)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Technical Margin" + ] + }, + { + "cell_type": "markdown", + "source": [ + "For the computation of the CSM or LC components for each AoC step, it is convenient to introduce the notion of technical margin (TM).", + "\n", + "\nFirstly, it is useful to define the so-called Aggregated Technical Margin (ATM)", + "\n", + "\n$$", + "\n\\text{ATM} (\\text{AoC}) = \\sum_{s\\in\\text{previous AoC steps}} \\text{TM}(s) ~,", + "\n$$", + "\n", + "\nand the Interest Accretion Factor (IAF) ", + "\n", + "\n$$", + "\n\\text{IAF} = \\prod_{i=1}^{\\text{TS}} (1 + \\text{YC}_i) - 1 ~.", + "\n$$", + "\n", + "\nThe TM is defined as", + "\n", + "\n$$", + "\n\\text{TM}(\\text{AoC}) = \\left\\{", + "\n\\begin{array}{rl}", + "\n\\text{TM}(\\rm{EOP}) \\text{ of the previous period} ~ & \\text{if }s = \\text{BOP and Novelty is In-Force}. \\\\", + "\n0 ~ & \\text{if }s = \\text{CF}. \\\\", + "\n\\text{IAF} \\cdot ~ \\text{ATM}(\\text{AoC}) ~ & \\text{if }s = \\text{IA}. \\\\", + "\n\\rm{Premiums} + \\text{Attributable Expense and Commissions} + \\text{Investment Claims} ~ & \\text{if }s = \\text{EA}. \\\\", + "\n-\\text{AMF} \\cdot ~ \\text{ATM}(\\text{AoC}) ~ & \\text{if }s = \\text{AM}. \\\\", + "\n\\text{PV Locked Value}(\\text{AoC}) ", + "\n\\bigg|_{\\substack{\\text{Non Attributable} \\\\ ", + "\n \\text{Amount Types} \\\\ ", + "\n \\text{excluded}}} ", + "\n+ \\text{RA Locked Value}(\\text{AoC}) ~ & \\text{otherwise} ", + "\n\\end{array}", + "\n\\right.", + "\n$$", + "\n", + "\nwhere AMF is the Amortization Factor that is defined [here](../Import/ImportScopeCalculation#amortization-factor) and tested [here](SpecificationsImportCashflows#amortization-factor), with YC being the [Yield Curve](#yield-curves) and TS is the Time-Step, ", + "\nand the Premiums, Attributable Expense and Commissions and Investment Claims terms are given by:", + "\n", + "\n$$", + "\n\\begin{array}{lcl}", + "\n\\rm{Premiums} &=& \\text{Premium Allocation Factor} \\cdot \\sum_{\\text{Amount Type}\\in\\{\\text{PR and its children}\\}}", + "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - ", + "\n \\big(\\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}} + \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~, \\\\", + "\n\\text{Attributable Expense and Commissions} &=& \\sum_{\\text{Amount Type}\\in\\{\\rm{ACA}, \\rm{AEA}\\}}", + "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - \\text{Actual}_{\\text{Novelty=C}} ~, \\\\", + "\n\\text{Investment Claims } &=& \\sum_{\\text{Amount Type}\\in\\{\\text{ICO and its children}\\}}", + "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - ", + "\n \\big( \\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}} + \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~.", + "\n\\end{array}", + "\n$$", + "\n", + "\nThe AoC Type **CF** is implicit for all formulas, PV is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **OA** and **AA** (see details [here](../Import/ImportScopeCalculation#actual-base))." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Beginning of Period" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_BoP_I" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedTM_BoP_I = Test.GetScope(id_BoP_I);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_BoP_I.Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The TM for BOP is equal to the TM for EOP of the previous period, that is, the sum of Csm, Loss Component and LoReCo as of at the end of last period (see the corresponding [formula](#technical-margins)). ", + "\n", + "\nThe corresponding **IFRS Variables** can be loaded directly from the *Storage*" + ] + }, + { + "cell_type": "code", + "source": [ + "var valueCsm = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.C, null);", + "\nvalueCsm" + ] + }, + { + "cell_type": "code", + "source": [ + "var valueLc = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.L, null);", + "\nvalueLc" + ] + }, + { + "cell_type": "code", + "source": [ + "var valueLr = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.LR, null);", + "\nvalueLr" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedTM_BoP_I = -valueCsm + valueLc + valueLr;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedTM_BoP_I" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_BoP_I.Value.Should().BeApproximately( expectedTM_BoP_I, Precision );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Model Corrections" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_MC_I = Test.GetIdentity(dataNode, \"MC\", \"I\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_MC_I" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedTM_MC_I = Test.GetScope(id_MC_I);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_MC_I.Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The TM for MC is given by the default [formula](#technical-margins), i.e. it is equal to the sum of PV and RA Locked, where the former does not encompass the *NonAttributable* Amount Types" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedTM_MC_I = Test.GetScope(id_MC_I).Value + Test.GetScope( id_MC_I ).Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedTM_MC_I" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_MC_I.Value.Should().BeApproximately( expectedTM_MC_I, Precision );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Cash Flow" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_CF_I = Test.GetIdentity(dataNode, \"CF\", \"I\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_CF_I" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedTM_CF_I = Test.GetScope(id_CF_I);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_CF_I.Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#technical-margins) above, the tecnical margin is 0 for the Cash Flow AoC step " + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_CF_I.Value.Should().BeApproximately( 0, Precision );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Interest Accretion" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_IA_I = Test.GetIdentity(dataNode, \"IA\", \"I\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_IA_I" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedTM_IA_I = Test.GetScope(id_IA_I);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_IA_I.Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#technical-margins) above, for the AoC step IA, the TM is equal to sum of the TMs of its previous AoC step multiplied by the IAF. " + ] + }, + { + "cell_type": "markdown", + "source": [ + "The IAF associated to the current period (i.e. shift and time step) can be calculated from the shift, the time Step, and the Interest Rates" + ] + }, + { + "cell_type": "code", + "source": [ + "var projectionPeriod = 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "var shift = Test.GetStorage().GetShift(projectionPeriod);" + ] + }, + { + "cell_type": "code", + "source": [ + "var timeStep = Test.GetStorage().GetTimeStep(projectionPeriod);" + ] + }, + { + "cell_type": "code", + "source": [ + "(shift, timeStep)" + ] + }, + { + "cell_type": "code", + "source": [ + "var monthlyRates = Test.GetScope(id_IA_I);" + ] + }, + { + "cell_type": "code", + "source": [ + "monthlyRates" + ] + }, + { + "cell_type": "code", + "source": [ + "var IAF = Enumerable.Range(shift,timeStep).Select(i => monthlyRates.Interest.GetValidElement(i/12)).Aggregate(1.0d, (x, y) => x * y ) - 1.0d;" + ] + }, + { + "cell_type": "code", + "source": [ + "IAF" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Since the previous AoC steps are" + ] + }, + { + "cell_type": "code", + "source": [ + "var previousAocStep = Test.GetScope((id_IA_I, InputSource.Cashflow)).Values;", + "\npreviousAocStep" + ] + }, + { + "cell_type": "markdown", + "source": [ + "the expected TM for the Amortization step reads" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedTM_IA_I = IAF * previousAocStep.Sum(aoc => Test.GetScope(id_IA_I with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedTM_IA_I" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_IA_I.Value.Should().BeApproximately( expectedTM_IA_I, Precision );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Combined Liabilities" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_CL_C = Test.GetIdentity(dataNode, \"CL\", \"C\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_CL_C" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedTM_CL_C = Test.GetScope(id_CL_C);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_CL_C.Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the default TM [formula](#technical-margins), for the CL step the TM is equal to the sum of PV and RA Locked, where the former does not encompass the *NonAttributable* Amount Types" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedTM_CL_C = Test.GetScope(id_CL_C).Value + Test.GetScope( id_CL_C ).Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedTM_CL_C" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_CL_C.Value.Should().BeApproximately( expectedTM_CL_C, Precision );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Experience Adjustment" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_EA_C = Test.GetIdentity(dataNode, \"EA\", \"C\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_EA_C" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedTM_EA_C = Test.GetScope(id_EA_C);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_EA_C.Value" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#technical-margins) above, for the AoC step EA, the TM is equal to sum of the Premiums, Attributable Expense and Commissions, and Investment Claims. Here below we calculate these terms individually." + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Premiums, Attributable Expense and Commissions and Investment Claims Present Values and Actuals are calculated using the CF AoC step. Therefore, as first step we define the relevant AoC step and Novelties:" + ] + }, + { + "cell_type": "code", + "source": [ + "var referenceAoCType = Test.GetScope(id_EA_C).Value.AocType;", + "\nvar referenceAoC = Test.GetStorage().GetNovelties().Select(n => new AocStep(referenceAoCType, n));" + ] + }, + { + "cell_type": "code", + "source": [ + "referenceAoC" + ] + }, + { + "cell_type": "markdown", + "source": [ + "**Premiums**" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The list of Premiums Amount Type defined in the imported dimensions and the Premium Allocation Factor can be retrieved" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetStorage().GetPremiums()" + ] + }, + { + "cell_type": "code", + "source": [ + "var premiumAllocationFactor = Test.GetStorage().GetPremiumAllocationFactor(id_EA_C);" + ] + }, + { + "cell_type": "code", + "source": [ + "premiumAllocationFactor" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Lastly, the Premiums term is" + ] + }, + { + "cell_type": "code", + "source": [ + "var premiums = premiumAllocationFactor * Test.GetStorage().GetPremiums()", + "\n .Sum(p => referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.A, (int?)null)).Value)", + "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.AA, (int?)null)).Value)", + "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.OA, (int?)null)).Value)", + "\n );" + ] + }, + { + "cell_type": "code", + "source": [ + "premiums" + ] + }, + { + "cell_type": "markdown", + "source": [ + "**Attributable Expense and Commissions**" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Analogously, the Attributable Expense and Commissions term can be computed" + ] + }, + { + "cell_type": "code", + "source": [ + "var attributableExpenseAndCommissions = new string[] {AmountTypes.ACA, AmountTypes.AEA}", + "\n .Sum(d => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, EstimateTypes.A, (int?)null)).Value));" + ] + }, + { + "cell_type": "code", + "source": [ + "attributableExpenseAndCommissions" + ] + }, + { + "cell_type": "markdown", + "source": [ + "**Investment Claims**" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Finally the Investment Claims term reads" + ] + }, + { + "cell_type": "code", + "source": [ + "var investmentClaims = Test.GetStorage().GetInvestmentClaims()", + "\n .Sum(ic => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.A, (int?)null)).Value)", + "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.AA, (int?)null)).Value)", + "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.OA, (int?)null)).Value)", + "\n );" + ] + }, + { + "cell_type": "code", + "source": [ + "investmentClaims" + ] + }, + { + "cell_type": "markdown", + "source": [ + "**Expected TM**" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedTM_EA_C = premiums + attributableExpenseAndCommissions + investmentClaims;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedTM_EA_C" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_EA_C.Value.Should().BeApproximately( expectedTM_EA_C, Precision );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Amortization" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_AM_C = Test.GetIdentity(dataNode, \"AM\", \"C\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_AM_C" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedTM_AM_C = Test.GetScope(id_AM_C);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_AM_C.Value" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_AM_C" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#technical-margins) above, for the AoC step AM, the TM is equal to sum of the TMs of its previous AoC step multiplied by the amortization factor with opposite sign. ", + "\n", + "\nThe AoC step previous to Amortization are" + ] + }, + { + "cell_type": "code", + "source": [ + "var previousAocStep = Test.GetScope((id_AM_C, InputSource.Cashflow)).Values;", + "\npreviousAocStep" + ] + }, + { + "cell_type": "markdown", + "source": [ + "while the Amortization Factor can be retrieved in the following" + ] + }, + { + "cell_type": "code", + "source": [ + "Test.GetScope(id_AM_C)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Therefore, the expected TM for the Amortization step reads" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedTM_AM_C = -Test.GetScope(id_AM_C).Value * ", + "\n previousAocStep.Sum(aoc => Test.GetScope(id_AM_C with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedTM_AM_C" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_AM_C.Value.Should().BeApproximately( expectedTM_AM_C, Precision );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## End of Period" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_EoP_C = Test.GetIdentity(dataNode, \"EOP\", \"C\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_EoP_C" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedTM_EoP_C = Test.GetScope(id_EoP_C);" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_EoP_C.Value" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedTM_EoP_C = Test.GetScope( id_EoP_C ).Value + Test.GetScope( id_EoP_C ).Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedTM_EoP_C" + ] + }, + { + "cell_type": "code", + "source": [ + "computedTM_EoP_C.Value.Should().BeApproximately( expectedTM_EoP_C, Precision );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Switch Logic " + ] + }, + { + "cell_type": "markdown", + "source": [ + "The CSM and LC figures are allocated for each AoC step based on the sign of the ATM. Specifically, for positive (negative) ATM, the TM of the current step is allocated to the LC (CSM), unless the TM flips the sign of the ATM. This special circumstance is named **switch**. It can happen at any AoC step with the only exception of Amortization where there is no switch from the previous step.", + "\nWhen a switch occurs the total contribution to the CSM (LC) prior the switching step is brought to 0 and the remaing amount is allocated to LC (CSM).", + "\n", + "\nIn the following the AoC chain is investigated." + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Beginning of Period", + "\n", + "\nFor the BOP, the last period is considered, which dictates that the corresponding EOP figures considered have necessarily Novelty of type *In-Force*.", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{BOP}) &=& \\text{CSM}(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force} \\\\", + "\n\\text{LC}(\\text{BOP}) &=& \\text{LC}(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", + "\n\\end{array}", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_BoP_I" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedCSM_BoP_I = Test.GetScope(id_BoP_I).Value;", + "\nvar computedLC_BoP_I = Test.GetScope(id_BoP_I).Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "(computedCSM_BoP_I, computedLC_BoP_I)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "To understand where the BOP is allocated, we retrieve the corresponding TM and, based on its sign, we expect the CSM or the LC to be non-zero according to the [formula](#switch-logic) above" + ] + }, + { + "cell_type": "code", + "source": [ + "var TM_BOP_I = Test.GetScope(id_BoP_I).Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "TM_BOP_I" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedCSM_BoP_I = TM_BOP_I < 0 ? -TM_BOP_I : 0;", + "\nvar expectedLC_BoP_I = TM_BOP_I > 0 ? +TM_BOP_I : 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "(expectedCSM_BoP_I, expectedLC_BoP_I)" + ] + }, + { + "cell_type": "code", + "source": [ + "computedCSM_BoP_I.CheckEquality(computedCSM_BoP_I).Should().Be(true);", + "\nexpectedLC_BoP_I.CheckEquality(computedLC_BoP_I).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Following AoC steps" + ] + }, + { + "cell_type": "markdown", + "source": [ + "From the BOP up to the CL step, the switch logic is applied separately to the In-Force and New Business novelties." + ] + }, + { + "cell_type": "code", + "source": [ + "var id_MC_I = Test.GetIdentity(dataNode, \"MC\", \"I\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_MC_I" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedCSM_MC_I = Test.GetScope(id_MC_I).Value;", + "\nvar computedLC_MC_I = Test.GetScope(id_MC_I).Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "(computedCSM_MC_I, computedLC_MC_I)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formula](#switch-logic) above this AoC step is allocated either to CSM or to LC based on the sign of ATM + TM. Both these two terms can be retrieved from the **TechnicalMargin** Scope." + ] + }, + { + "cell_type": "code", + "source": [ + "var TM_MC_I = Test.GetScope(id_MC_I);" + ] + }, + { + "cell_type": "code", + "source": [ + "TM_MC_I" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The correctness of the ATM can be checked by firstly withdrawing the previous AoC steps" + ] + }, + { + "cell_type": "code", + "source": [ + "var previousAocStep = Test.GetScope((id_MC_I, InputSource.Cashflow)).Values;" + ] + }, + { + "cell_type": "code", + "source": [ + "previousAocStep" + ] + }, + { + "cell_type": "markdown", + "source": [ + "and then evaluating the sum of the corresponding TMs" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedATM = previousAocStep.Sum(aoc => Test.GetScope(id_MC_I with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedATM" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Therefore, the following condition for ATM calculated by the **TechnicalMargin** Scope needs to be fullfilled" + ] + }, + { + "cell_type": "code", + "source": [ + "TM_MC_I.AggregatedValue.Should().BeApproximately( expectedATM, Precision );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The CSM and LC can be allocated according to the [Switch Logic](#switch-logic)." + ] + }, + { + "cell_type": "code", + "source": [ + "double expectedCSM_MC_I; ", + "\ndouble expectedLC_MC_I; " + ] + }, + { + "cell_type": "code", + "source": [ + "var aggregated = TM_MC_I.Value + TM_MC_I.AggregatedValue;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "If there is no switch from LC, i.e. $\\text{ATM} (\\text{AoC}) > 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\ge 0 $, then:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& 0 ~, \\\\", + "\n\\text{LC}(\\text{AoC}) &=& \\text{TM}(\\text{AoC}) ~.", + "\n\\end{array}", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "if(TM_MC_I.AggregatedValue > 0 && aggregated >= 0) {", + "\n expectedCSM_MC_I = 0 ;", + "\n expectedLC_MC_I = TM_MC_I.Value ;", + "\n} " + ] + }, + { + "cell_type": "markdown", + "source": [ + "If there is no switch from CSM, i.e. $\\text{ATM} (\\text{AoC}) \\le 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\le 0 $, then:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) ~, \\\\", + "\n\\text{LC}(\\text{AoC}) &=& 0 ~.", + "\n\\end{array}", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "if(TM_MC_I.AggregatedValue < 0 && aggregated <= 0) {", + "\n expectedCSM_MC_I = -TM_MC_I.Value ;", + "\n expectedLC_MC_I = 0 ;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "If $\\text{ATM} (\\text{AoC}) > 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\le 0$, then there is a switch to CSM:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) -\\text{ATM} (\\text{AoC}) ~, \\\\", + "\n\\text{LC}(\\text{AoC}) &=& -\\text{ATM} (\\text{AoC}) ~.", + "\n\\end{array}", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "if(TM_MC_I.AggregatedValue > 0 && aggregated <= 0) {", + "\n expectedCSM_MC_I = -aggregated;", + "\n expectedLC_MC_I = -TM_MC_I.AggregatedValue ;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "On the other hand, if $\\text{ATM} (\\text{AoC}) \\le 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) > 0$, ", + "\nthen the switch is to LC:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& \\text{ATM} (\\text{AoC}) ~, \\\\", + "\n\\text{LC}(\\text{AoC}) &=& \\text{TM}(\\text{AoC}) + \\text{ATM} (\\text{AoC}) ~.", + "\n\\end{array}", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "if(TM_MC_I.AggregatedValue <= 0 && aggregated > 0) {", + "\n expectedCSM_MC_I = TM_MC_I.AggregatedValue ;", + "\n expectedLC_MC_I = aggregated ;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Therefore, the expected CSM and LC for this step are" + ] + }, + { + "cell_type": "code", + "source": [ + "(expectedCSM_MC_I, expectedLC_MC_I)" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedCSM_MC_I.CheckEquality(computedCSM_MC_I).Should().Be(true);", + "\nexpectedLC_MC_I.CheckEquality(computedLC_MC_I).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Combined Liabilities" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The CL Aoc Step brings both contributions to CSM and LC together as the novelities are summed.", + "\n", + "\nFor the CL step, the logic is similar to the one above, except that a switch from LC to CSM can happen **because of New Business and despite of In-Force**, in which case we have:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) - \\text{ATM}(\\text{Last In-Force AoC step}) - \\text{TM}(\\text{Last In-Force AoC step}) \\\\", + "\n\\text{LC}(\\text{AoC}) &=& -\\text{ATM}(\\text{Last In-Force AoC step}) - \\text{TM}(\\text{Last In-Force AoC step})", + "\n\\end{array}", + "\n$$", + "\n", + "\nIf, on the other hand, the switch from LC to CSM happens **because of In-Force and despite of New Business**, then we have:", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{AoC}) &=& - \\text{TM}(\\text{AoC}) - \\text{ATM}(\\text{Last NB AoC step}) - \\text{TM}(\\text{Last NB AoC step}) \\\\", + "\n\\text{LC}(\\text{AoC}) &=& - \\text{ATM}(\\text{Last NB AoC step}) - \\text{TM}(\\text{Last NB AoC step})", + "\n\\end{array}", + "\n$$", + "\n", + "\nFor the switch in the other direction, i.e. from CSM to LC the formulas are similar except that LC and CSM are swapped." + ] + }, + { + "cell_type": "code", + "source": [ + "var id_CL_C = Test.GetIdentity(dataNode, \"CL\", \"C\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_CL_C" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedCSM_CL_C = Test.GetScope(id_CL_C).Value;", + "\nvar computedLC_CL_C = Test.GetScope(id_CL_C).Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "(computedCSM_CL_C, computedLC_CL_C)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The CL step considers the last step of both the New Business and the In Force Novelties to decide what to allocate to CSM or LC. " + ] + }, + { + "cell_type": "code", + "source": [ + "var lastAocSteps = Test.GetScope((id_CL_C, InputSource.Cashflow)).Values.GroupBy(x => x.Novelty).Select(g => g.Last());" + ] + }, + { + "cell_type": "code", + "source": [ + "lastAocSteps" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Selecting the corresponding AocTypes:" + ] + }, + { + "cell_type": "code", + "source": [ + "var lastAocTypeNb = lastAocSteps.Single(x => x.Novelty == Novelties.N).AocType;", + "\nvar lastAocTypeI = lastAocSteps.Single(x => x.Novelty == Novelties.I).AocType;", + "\n(lastAocTypeI, lastAocTypeNb)" + ] + }, + { + "cell_type": "code", + "source": [ + "var lastTM_NewBusiness = Test.GetScope(id_CL_C with {AocType = lastAocTypeNb, Novelty = Novelties.N});" + ] + }, + { + "cell_type": "code", + "source": [ + "lastTM_NewBusiness" + ] + }, + { + "cell_type": "code", + "source": [ + "var lastTM_InForce = Test.GetScope(id_CL_C with {AocType = lastAocTypeI, Novelty = Novelties.I});" + ] + }, + { + "cell_type": "code", + "source": [ + "lastTM_InForce" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Conversely the TM and ATM for the CL step is" + ] + }, + { + "cell_type": "code", + "source": [ + "var TM_Combined = Test.GetScope(id_CL_C);" + ] + }, + { + "cell_type": "code", + "source": [ + "TM_Combined" + ] + }, + { + "cell_type": "markdown", + "source": [ + "where the ATM of CL is given by the sum of the ATMs of the New Business and In Force Novelties" + ] + }, + { + "cell_type": "code", + "source": [ + "var aggregatedNewBusiness = lastTM_NewBusiness.Value + lastTM_NewBusiness.AggregatedValue;", + "\nvar aggregatedInForce = lastTM_InForce.Value + lastTM_InForce.AggregatedValue;", + "\nvar sum = aggregatedNewBusiness + aggregatedInForce;", + "\nsum" + ] + }, + { + "cell_type": "code", + "source": [ + "( (sum - TM_Combined.AggregatedValue)/sum < 1.0e-12).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "In order to decide where the TM of the CL step is allocated, one has to check the sign of the ATM + TM for both the New Business and the In Force" + ] + }, + { + "cell_type": "code", + "source": [ + "var aggregatedCombined = TM_Combined.Value + TM_Combined.AggregatedValue;", + "\naggregatedCombined" + ] + }, + { + "cell_type": "markdown", + "source": [ + "According to the [formulas above](#combined-liabilities), for a positive (negative) aggregated CL value, the CL TM has to be allocated to LC (CSM). ", + "\n
In case the one of last Aoc step of the novelties (I, NB) has the sign of the CL ATM opposite to the CL ATM, the CL AocStep is used to introduce a balancing item to bring the ATM of the novelty with opposite sign to 0. ", + "\n
This is equivalent to execute the switch logic with a balancing item = ATM of the last AocStep having opposite sign to CL ATM. ", + "\n
Note that if CL TM is zero this results in allocating the same amount with opposite sign to CSM(note that the sign of the CSM componet is flipped) and LC." + ] + }, + { + "cell_type": "code", + "source": [ + "double expectedCSM_CL_C; ", + "\ndouble expectedLC_CL_C; " + ] + }, + { + "cell_type": "code", + "source": [ + "var balancingItem = aggregatedCombined < 0 ? aggregatedNewBusiness : aggregatedInForce;", + "\nbalancingItem" + ] + }, + { + "cell_type": "code", + "source": [ + "", + "\nif(aggregatedCombined > 0) {", + "\n expectedCSM_CL_C = balancingItem ;", + "\n expectedLC_CL_C = TM_Combined.Value + balancingItem;", + "\n} else {", + "\n expectedLC_CL_C = - balancingItem ;", + "\n expectedCSM_CL_C = TM_Combined.Value - balancingItem ;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "(expectedCSM_CL_C, expectedLC_CL_C)" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedCSM_CL_C.CheckEquality(computedCSM_CL_C).Should().Be(true);", + "\nexpectedLC_CL_C.CheckEquality(computedLC_CL_C).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## End Of Period", + "\n", + "\nFor the last AoC step, the EOP is the sum of all previous steps", + "\n", + "\n$$", + "\n\\begin{array}{rcl}", + "\n\\text{CSM}(\\text{EOP}) &=& \\sum_{s~\\in~\\text{previous AoC steps}} \\text{CSM}(s) ~, \\\\", + "\n\\text{LC}(\\text{EOP}) &=& \\sum_{s~\\in~\\text{previous AoC steps}} \\text{LC}(s) ~.", + "\n\\end{array}", + "\n$$" + ] + }, + { + "cell_type": "code", + "source": [ + "var id_EoP_C = Test.GetIdentity(dataNode, \"EOP\", \"C\");" + ] + }, + { + "cell_type": "code", + "source": [ + "id_EoP_C" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedCSM_EoP_C = Test.GetScope(id_EoP_C).Value;", + "\nvar computedLC_EoP_C = Test.GetScope(id_EoP_C).Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "(computedCSM_EoP_C, computedLC_EoP_C)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n
", + "\nFor the reinsurance case, the switch logic is identical to the one described above, except that it uses the corresponding gross case TM to allocate the figure either to CSM or to LoReCo. The reinsurance gross TM multiplied by the weights coming from the Reinsurance Coverage Parameter (Data Node Parameters). In case a GRIC has multiple GICs, then these weighted TMs are aggregated.", + "\n
" + ] + }, + { + "cell_type": "markdown", + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

", + "\n", + "\n# Contractual Service Margin and Loss Component" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Here below a view of the CSM and Loss Component results are shown. ", + "\n", + "\nNote: the Data Nodes with LiabilityType being *LIC* are excluded." + ] + }, + { + "cell_type": "code", + "source": [ + "var allIdentitiesWoLic = allIdentities.Where(id => Test.GetStorage().DataNodeDataBySystemName[id.DataNode].LiabilityType != \"LIC\").ToArray();" + ] + }, + { + "cell_type": "code", + "source": [ + "var csm = allIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromCsmToIfrsVariable())).ToArray();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Gross case" + ] + }, + { + "cell_type": "code", + "source": [ + "var allInsuranceIdentitiesWoLic = allIdentitiesWoLic.Where(id => !id.IsReinsurance).ToArray();" + ] + }, + { + "cell_type": "code", + "source": [ + "var lc = allInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromLcToIfrsVariable())).ToArray();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Re-Insurance case (LoReCo)" + ] + }, + { + "cell_type": "code", + "source": [ + "var allReInsuranceIdentitiesWoLic = allIdentitiesWoLic.Where(id => id.IsReinsurance).ToArray();" + ] + }, + { + "cell_type": "code", + "source": [ + "var loreco = allReInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "\n .Where(x => Math.Abs(x.Value) >= Precision)", + "\n .Select(x => x.FromLoReCoToIfrsVariable())).ToArray();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Summary" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForObjects( csm.Concat(lc).Concat(loreco) )", + "\n .WithQuerySource(Workspace)", + "\n .GroupColumnsBy(x => x.DataNode)", + "\n .GroupColumnsBy(x => x.EstimateType)", + "\n .GroupRowsBy(x => x.Novelty)", + "\n .GroupRowsBy(x => x.AocType)", + "\n .WithGridOptionsForIfrsVariable()", + "\n .ToReport()" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/TechnicalMarginTest.ipynb b/Test/TechnicalMarginTest.ipynb index d42316d9..9a79f348 100644 --- a/Test/TechnicalMarginTest.ipynb +++ b/Test/TechnicalMarginTest.ipynb @@ -1,305 +1,259 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "jaNl5tr4gEGSSk1KTK2HpA", - "cell_type": "markdown", - "source": [ - "

Technical Margin Allocation

" - ], - "metadata": {} - }, - { - "id": "E5WE0di2k0aFigu3aInmKw", - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "YndlmtSQOkuhu3OKAyNj0g", - "cell_type": "markdown", - "source": [ - "# Workspace Initialization " - ], - "metadata": {} - }, - { - "id": "7vwzSP8vUkSmgw1mvnWC1Q", - "cell_type": "code", - "source": [ - "Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TP-eEY5maEC5c7pVOpolxQ", - "cell_type": "markdown", - "source": [ - "# Test switch logic" - ], - "metadata": {} - }, - { - "id": "nhjoP-0CWUadpg116YgH6Q", - "cell_type": "code", - "source": [ - "//define group of contract", - "\nvar groupOfContract = \"DT1.1\";" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "nvCLj-DBhk211_Y_UDi0uQ", - "cell_type": "code", - "source": [ - "//Define partition", - "\n var args = new ImportArgs(\"CH\", 2020, 12, Periodicity.Quarterly, null, ImportFormats.Actual);", - "\n var partition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", - "\n x.Month == args.Month && x.Scenario == args.Scenario);", - "\n if(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "UmXmnz87HUKCgw066Gsx5A", - "cell_type": "code", - "source": [ - "public async Task CheckSwitchLogicAsync(IEnumerable inputDataSet, Dictionary csmLcSwitchBenchmark)", - "\n{", - "\n //Save test input data", - "\n await Workspace.UpdateAsync(inputDataSet);", - "\n ", - "\n //Set up import storage and test universe", - "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", - "\n await testStorage.InitializeAsync();", - "\n var testUniverse = Scopes.ForStorage(testStorage).ToScope();", - "\n ", - "\n var identities = testUniverse.GetScopes(testStorage.DataNodesByImportScope[ImportScope.Primary].Where(dn => dn == groupOfContract)).SelectMany(s => s.Identities);", - "\n var csm = testUniverse.GetScopes(identities, o => o.WithContext(\"C\")).Where(x => Math.Abs(x.Value) > Precision);", - "\n var lc = testUniverse.GetScopes(identities, o => o.WithContext(\"L\")).Where(x => Math.Abs(x.Value) > Precision);", - "\n //Clean up Workspace", - "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", - "\n ", - "\n var csmBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueCsm) > Precision).ToDictionary(x => x.Key, x => x.Value);", - "\n var lcBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueLc) > Precision).ToDictionary(x => x.Key, x => x.Value);", - "\n ", - "\n ", - "\n var errors = new List();", - "\n if(csm.Count() > csmBenchmark.Count()) ", - "\n {", - "\n var extraVariables = csm.Where(x => !csmBenchmark.Keys.Contains(new AocStep(x.Identity.AocType, x.Identity.Novelty)))", - "\n .Select(x => $\"AocType:{x.Identity.AocType}, Novelty:{x.Identity.Novelty}, EstimateType:{x.EstimateType}, Value:{x.Value}.\");", - "\n errors.Add( $\"{nameof(AllocateTechnicalMargin)} scope for CSM has more non zero items than benchmark. Extra computed variables : \\n {string.Join(\"\\n\", extraVariables)}.\" );", - "\n }", - "\n if(lc.Count() > lcBenchmark.Count()) ", - "\n {", - "\n var extraVariables = lc.Where(x => !lcBenchmark.Keys.Contains(new AocStep(x.Identity.AocType, x.Identity.Novelty)))", - "\n .Select(x => $\"AocType:{x.Identity.AocType}, Novelty:{x.Identity.Novelty}, EstimateType:{x.EstimateType}, Value:{x.Value}, \");", - "\n errors.Add( $\"{nameof(AllocateTechnicalMargin)} scope for LC has more non zero items compared to benchmark: \\n {string.Join(\"\\n\", extraVariables)}.\" );", - "\n }", - "\n ", - "\n //Check ValueCsm", - "\n foreach(var kvp in csmBenchmark)", - "\n {", - "\n var scopeSwitch = csm.SingleOrDefault(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", - "\n ", - "\n if(scopeSwitch == null)", - "\n {", - "\n errors.Add( $\"Missing calculated scope for AocType and Novelty: {kvp.Key.AocType}, {kvp.Key.Novelty}.\" );", - "\n continue;", - "\n }", - "\n ", - "\n if(Math.Abs(-1.0 * scopeSwitch.Value - kvp.Value.valueCsm) > Precision) ", - "\n errors.Add( $\"Values not matching for AocType {kvp.Key.AocType} and Novelty {kvp.Key.Novelty}. Scope: Csm {-1 * scopeSwitch.Value}; Benchmark: Csm {kvp.Value.valueCsm}.\" );", - "\n }", - "\n //Check ValueLc", - "\n foreach(var kvp in lcBenchmark)", - "\n {", - "\n var scopeSwitch = lc.SingleOrDefault(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", - "\n ", - "\n if(scopeSwitch == null)", - "\n {", - "\n errors.Add( $\"Missing calculated scope for AocType and Novelty: {kvp.Key.AocType}, {kvp.Key.Novelty}.\" );", - "\n continue;", - "\n }", - "\n ", - "\n if(Math.Abs(scopeSwitch.Value - kvp.Value.valueLc) > Precision) ", - "\n errors.Add( $\"Values not matching for AocType {kvp.Key.AocType} and Novelty {kvp.Key.Novelty}. Scope: Lc {scopeSwitch.Value}; Benchmark: Lc {kvp.Value.valueLc}.\" );", - "\n }", - "\n ", - "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "qKbQQyYPQU-Iye0tiP7x5A", - "cell_type": "code", - "source": [ - "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", - "\nvar inputDataSet = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", - "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", - "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = 15.0},", - "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = 100.0},", - "\n basicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = 100.0},", - "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", - "\n };", - "\n", - "\nvar csmLcSwitch_benchmark = new Dictionary()", - "\n {", - "\n {new AocStep(\"BOP\",\"N\"),(0d, 100d)},", - "\n {new AocStep(\"IA\",\"N\"), (0d, 15d)},", - "\n {new AocStep(\"EV\",\"N\"), (0d, 100d)},", - "\n {new AocStep(\"CL\",\"C\"), (0d, 100d)},", - "\n {new AocStep(\"EA\",\"C\"), (0d, -8.0)},", - "\n {new AocStep(\"AM\",\"C\"), (0d, -153.5)},", - "\n {new AocStep(\"EOP\",\"C\"),(0d, 153.5)},", - "\n };", - "\n", - "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "TK8_VLRvbkOFHfCgScgBGg", - "cell_type": "code", - "source": [ - "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", - "\nvar inputDataSet = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", - "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", - "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = 15.0},", - "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = 100.0},", - "\n basicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -500.0},", - "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", - "\n };", - "\n", - "\nvar csmLcSwitch_benchmark = new Dictionary()", - "\n {", - "\n {new AocStep(\"BOP\",\"N\"),(0d, 100d)},", - "\n {new AocStep(\"IA\",\"N\"), (0d, 15d)},", - "\n {new AocStep(\"EV\",\"N\"), (0d, 100d)},", - "\n {new AocStep(\"CL\",\"C\"), (285d, -215d)},", - "\n {new AocStep(\"EA\",\"C\"), (8d, 0d)},", - "\n {new AocStep(\"AM\",\"C\"), (-146.5d, 0d)},", - "\n {new AocStep(\"EOP\",\"C\"),(146.5d, 0d)},", - "\n };", - "\n", - "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zFF7F81APUmclfr-m3jMcw", - "cell_type": "code", - "source": [ - "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", - "\nvar inputDataSet = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", - "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", - "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -150.0},", - "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", - "\n };", - "\n", - "\nvar csmLcSwitch_benchmark = new Dictionary()", - "\n {", - "\n {new AocStep(\"BOP\",\"N\"), (0d, 100d)},", - "\n {new AocStep(\"IA\",\"N\"), (50d, -100d)},", - "\n {new AocStep(\"EA\",\"C\"), (8d, 0d)},", - "\n {new AocStep(\"AM\",\"C\"), (-29d, 0d)},", - "\n {new AocStep(\"EOP\",\"C\"),(29d, 0d)},", - "\n };", - "\n", - "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HBM6I7rP8UeMjn0PNDOkvg", - "cell_type": "code", - "source": [ - "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", - "\nvar inputDataSet = new IfrsVariable[]{", - "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"I\", Value = 5010.0, EstimateType = \"L\", AmountType = null},", - "\n basicIfrsVariable with {AocType = \"MC\", Novelty = \"I\", Value = -10.0},", - "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"I\", Value = -5015.0},", - "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = -100.0},", - "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = 10.0},", - "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = 150.0},", - "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = -45.0},", - "\n basicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -30.0},", - "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", - "\n };", - "\n", - "\nvar csmLcSwitch_benchmark = new Dictionary()", - "\n {", - "\n {new AocStep(\"BOP\",\"I\"),( 0d, 5010.0)},", - "\n {new AocStep(\"MC\",\"I\"), ( 0d, -10d)},", - "\n {new AocStep(\"IA\",\"I\"), ( 0d, 10d)},", - "\n {new AocStep(\"EV\",\"I\"), ( 5d,-5010d)},", - "\n ", - "\n {new AocStep(\"BOP\",\"N\"),(100d, 0d)},", - "\n {new AocStep(\"IA\",\"N\"), (-100d, 50d)},", - "\n {new AocStep(\"EV\",\"N\"), ( 0d, -45d)},", - "\n ", - "\n {new AocStep(\"CL\",\"C\"), ( 25d, -5d)},", - "\n {new AocStep(\"EA\",\"C\"), ( -8d, 0d)},", - "\n {new AocStep(\"AM\",\"C\"), ( -11d, 0d)},", - "\n {new AocStep(\"EOP\",\"C\"),( 11d, 0d)},", - "\n };", - "\n", - "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0mf1wwWN00-8_xIdPwv8aA", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Technical Margin Allocation

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Workspace Initialization " + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test switch logic" + ] + }, + { + "cell_type": "code", + "source": [ + "//define group of contract", + "\nvar groupOfContract = \"DT1.1\";" + ] + }, + { + "cell_type": "code", + "source": [ + "//Define partition", + "\n var args = new ImportArgs(\"CH\", 2020, 12, Periodicity.Quarterly, null, ImportFormats.Actual);", + "\n var partition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", + "\n x.Month == args.Month && x.Scenario == args.Scenario);", + "\n if(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckSwitchLogicAsync(IEnumerable inputDataSet, Dictionary csmLcSwitchBenchmark)", + "\n{", + "\n //Save test input data", + "\n await Workspace.UpdateAsync(inputDataSet);", + "\n ", + "\n //Set up import storage and test universe", + "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n var testUniverse = Scopes.ForStorage(testStorage).ToScope();", + "\n ", + "\n var identities = testUniverse.GetScopes(testStorage.DataNodesByImportScope[ImportScope.Primary].Where(dn => dn == groupOfContract)).SelectMany(s => s.Identities);", + "\n var csm = testUniverse.GetScopes(identities, o => o.WithContext(\"C\")).Where(x => Math.Abs(x.Value) > Precision);", + "\n var lc = testUniverse.GetScopes(identities, o => o.WithContext(\"L\")).Where(x => Math.Abs(x.Value) > Precision);", + "\n //Clean up Workspace", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", + "\n ", + "\n var csmBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueCsm) > Precision).ToDictionary(x => x.Key, x => x.Value);", + "\n var lcBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueLc) > Precision).ToDictionary(x => x.Key, x => x.Value);", + "\n ", + "\n ", + "\n var errors = new List();", + "\n if(csm.Count() > csmBenchmark.Count()) ", + "\n {", + "\n var extraVariables = csm.Where(x => !csmBenchmark.Keys.Contains(new AocStep(x.Identity.AocType, x.Identity.Novelty)))", + "\n .Select(x => $\"AocType:{x.Identity.AocType}, Novelty:{x.Identity.Novelty}, EstimateType:{x.EstimateType}, Value:{x.Value}.\");", + "\n errors.Add( $\"{nameof(AllocateTechnicalMargin)} scope for CSM has more non zero items than benchmark. Extra computed variables : \\n {string.Join(\"\\n\", extraVariables)}.\" );", + "\n }", + "\n if(lc.Count() > lcBenchmark.Count()) ", + "\n {", + "\n var extraVariables = lc.Where(x => !lcBenchmark.Keys.Contains(new AocStep(x.Identity.AocType, x.Identity.Novelty)))", + "\n .Select(x => $\"AocType:{x.Identity.AocType}, Novelty:{x.Identity.Novelty}, EstimateType:{x.EstimateType}, Value:{x.Value}, \");", + "\n errors.Add( $\"{nameof(AllocateTechnicalMargin)} scope for LC has more non zero items compared to benchmark: \\n {string.Join(\"\\n\", extraVariables)}.\" );", + "\n }", + "\n ", + "\n //Check ValueCsm", + "\n foreach(var kvp in csmBenchmark)", + "\n {", + "\n var scopeSwitch = csm.SingleOrDefault(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", + "\n ", + "\n if(scopeSwitch == null)", + "\n {", + "\n errors.Add( $\"Missing calculated scope for AocType and Novelty: {kvp.Key.AocType}, {kvp.Key.Novelty}.\" );", + "\n continue;", + "\n }", + "\n ", + "\n if(Math.Abs(-1.0 * scopeSwitch.Value - kvp.Value.valueCsm) > Precision) ", + "\n errors.Add( $\"Values not matching for AocType {kvp.Key.AocType} and Novelty {kvp.Key.Novelty}. Scope: Csm {-1 * scopeSwitch.Value}; Benchmark: Csm {kvp.Value.valueCsm}.\" );", + "\n }", + "\n //Check ValueLc", + "\n foreach(var kvp in lcBenchmark)", + "\n {", + "\n var scopeSwitch = lc.SingleOrDefault(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", + "\n ", + "\n if(scopeSwitch == null)", + "\n {", + "\n errors.Add( $\"Missing calculated scope for AocType and Novelty: {kvp.Key.AocType}, {kvp.Key.Novelty}.\" );", + "\n continue;", + "\n }", + "\n ", + "\n if(Math.Abs(scopeSwitch.Value - kvp.Value.valueLc) > Precision) ", + "\n errors.Add( $\"Values not matching for AocType {kvp.Key.AocType} and Novelty {kvp.Key.Novelty}. Scope: Lc {scopeSwitch.Value}; Benchmark: Lc {kvp.Value.valueLc}.\" );", + "\n }", + "\n ", + "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", + "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = 15.0},", + "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\nvar csmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"),(0d, 100d)},", + "\n {new AocStep(\"IA\",\"N\"), (0d, 15d)},", + "\n {new AocStep(\"EV\",\"N\"), (0d, 100d)},", + "\n {new AocStep(\"CL\",\"C\"), (0d, 100d)},", + "\n {new AocStep(\"EA\",\"C\"), (0d, -8.0)},", + "\n {new AocStep(\"AM\",\"C\"), (0d, -153.5)},", + "\n {new AocStep(\"EOP\",\"C\"),(0d, 153.5)},", + "\n };", + "\n", + "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" + ] + }, + { + "cell_type": "code", + "source": [ + "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", + "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = 15.0},", + "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -500.0},", + "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\nvar csmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"),(0d, 100d)},", + "\n {new AocStep(\"IA\",\"N\"), (0d, 15d)},", + "\n {new AocStep(\"EV\",\"N\"), (0d, 100d)},", + "\n {new AocStep(\"CL\",\"C\"), (285d, -215d)},", + "\n {new AocStep(\"EA\",\"C\"), (8d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), (-146.5d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(146.5d, 0d)},", + "\n };", + "\n", + "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" + ] + }, + { + "cell_type": "code", + "source": [ + "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", + "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -150.0},", + "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\nvar csmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"), (0d, 100d)},", + "\n {new AocStep(\"IA\",\"N\"), (50d, -100d)},", + "\n {new AocStep(\"EA\",\"C\"), (8d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), (-29d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(29d, 0d)},", + "\n };", + "\n", + "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" + ] + }, + { + "cell_type": "code", + "source": [ + "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"I\", Value = 5010.0, EstimateType = \"L\", AmountType = null},", + "\n basicIfrsVariable with {AocType = \"MC\", Novelty = \"I\", Value = -10.0},", + "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"I\", Value = -5015.0},", + "\n basicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = -100.0},", + "\n basicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = 10.0},", + "\n basicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = 150.0},", + "\n basicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = -45.0},", + "\n basicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -30.0},", + "\n basicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\nvar csmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"I\"),( 0d, 5010.0)},", + "\n {new AocStep(\"MC\",\"I\"), ( 0d, -10d)},", + "\n {new AocStep(\"IA\",\"I\"), ( 0d, 10d)},", + "\n {new AocStep(\"EV\",\"I\"), ( 5d,-5010d)},", + "\n ", + "\n {new AocStep(\"BOP\",\"N\"),(100d, 0d)},", + "\n {new AocStep(\"IA\",\"N\"), (-100d, 50d)},", + "\n {new AocStep(\"EV\",\"N\"), ( 0d, -45d)},", + "\n ", + "\n {new AocStep(\"CL\",\"C\"), ( 25d, -5d)},", + "\n {new AocStep(\"EA\",\"C\"), ( -8d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), ( -11d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),( 11d, 0d)},", + "\n };", + "\n", + "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Test/Tests.ipynb b/Test/Tests.ipynb index 1cd4f874..538dbf00 100644 --- a/Test/Tests.ipynb +++ b/Test/Tests.ipynb @@ -1,183 +1,123 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "TZgppEey_UevldeIhLk-Zg", - "cell_type": "markdown", - "source": [ - "

Tests

" - ], - "metadata": {} - }, - { - "id": "SyI_QtXCw0yCEOXRPFFsww", - "cell_type": "code", - "source": [ - "#!eval-notebook \"IfrsVariablesTest\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-uMg4UaFbECZuIbtwJCvJw", - "cell_type": "code", - "source": [ - "#!eval-notebook \"ImportStorageTest\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "x_X1-9LqmkCGI9R1UOQo6A", - "cell_type": "code", - "source": [ - "#!eval-notebook \"ReportStorageTest\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "fTEQQtLuT0uQ01JBhmVGzw", - "cell_type": "code", - "source": [ - "#!eval-notebook \"QueriesTest\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "iRWR94CbKU-eP1eVu7LpbA", - "cell_type": "code", - "source": [ - "#!eval-notebook \"AocStructureTest\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Omg1EkcRJ0miK9epGdB5Fg", - "cell_type": "code", - "source": [ - "#!eval-notebook \"TechnicalMarginTest\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "EMHkr07qoEyWT3n-TUrE_A", - "cell_type": "markdown", - "source": [ - "---" - ], - "metadata": {} - }, - { - "id": "XYHMD6zOzUS3CLOcyaAq_g", - "cell_type": "code", - "source": [ - "#!eval-notebook \"SpecificationsImportCashflows\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HfcLmG39kE2VFzt18WLEKA", - "cell_type": "code", - "source": [ - "#!eval-notebook \"SpecificationsImportActuals\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XgjC6ZJsvkGNTDeP374MXw", - "cell_type": "code", - "source": [ - "#!eval-notebook \"SpecificationsTechnicalMargin\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-zjdp-ODe0qnHVp1-wr02A", - "cell_type": "code", - "source": [ - "#!eval-notebook \"SpecificationsFinancialPerformance\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "QtahA_wtJUmc5mWycmnjzA", - "cell_type": "markdown", - "source": [ - "---" - ], - "metadata": {} - }, - { - "id": "xfKpAnti3UaiKrOBQeD8gw", - "cell_type": "code", - "source": [ - "//#!eval-notebook \"MapTemplateAndImportTest\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "5jyZtMUGUU6YhrXXY2mMqQ", - "cell_type": "markdown", - "source": [ - "---" - ], - "metadata": {} - }, - { - "id": "hvH198RRBUGXwPc-HsgU0A", - "cell_type": "code", - "source": [ - "#!eval-notebook \"ReportVariablesTest\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Q8h-6uY0TkCHeLq1bFnNhQ", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Tests

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"IfrsVariablesTest\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"ImportStorageTest\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"ReportStorageTest\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"QueriesTest\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"AocStructureTest\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"TechnicalMarginTest\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"SpecificationsImportCashflows\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"SpecificationsImportActuals\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"SpecificationsTechnicalMargin\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"SpecificationsFinancialPerformance\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "source": [ + "//#!eval-notebook \"MapTemplateAndImportTest\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"ReportVariablesTest\"" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Utils/ApplicationMessage.ipynb b/Utils/ApplicationMessage.ipynb index 80df11f5..a41569e3 100644 --- a/Utils/ApplicationMessage.ipynb +++ b/Utils/ApplicationMessage.ipynb @@ -1,149 +1,117 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False", + "toc-showmarkdowntxt": "False" }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "toc-showmarkdowntxt": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "broxX4LAHEyOyWz2MhegDg", - "cell_type": "markdown", - "source": [ - "

Application Message

" - ], - "metadata": {} - }, - { - "id": "h1R2W32vMUu5tJyRO8rd4A", - "cell_type": "code", - "source": [ - "#r \"nuget:Systemorph.Activities,1.2.3\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "84ytRYskFU-7SEmFS1wFiA", - "cell_type": "code", - "source": [ - "#!import \"../Constants/Validations\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zdCOoGGKDUad4bauxbDx8A", - "cell_type": "code", - "source": [ - "using Microsoft.Extensions.Logging;", - "\n", - "\npublic class ApplicationMessage {", - "\n private static ILogger log;", - "\n ", - "\n private static IActivityVariable activity;", - "\n ", - "\n public static void Configure (ILogger log, IActivityVariable activity) ", - "\n {", - "\n ApplicationMessage.log = log;", - "\n ApplicationMessage.activity = activity;", - "\n }", - "\n ", - "\n public static Object Log (Error e, params string[] s) { log.LogError(Get(e,s)); return null; }", - "\n ", - "\n public static Object Log (Warning w, params string[] s) { log.LogWarning(Get(w,s)); return null; }", - "\n ", - "\n public static bool HasErrors () => activity.HasErrors();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "rmXkyteAs0qIkylMj_uzoA", - "cell_type": "code", - "source": [ - "ApplicationMessage.Configure(Log, Activity)" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "C5Sz9dotT0ye5OfZ9kKzZg", - "cell_type": "markdown", - "source": [ - "# Utils" - ], - "metadata": {} - }, - { - "id": "PI-rD5MuDkm1oNDAzAlxdQ", - "cell_type": "code", - "source": [ - "public static bool HasErrors (this ActivityLog[] logs) {", - "\n foreach (var log in logs)", - "\n if(log.Errors.Any())", - "\n return true;", - "\n return false;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zP4DHMB7v0iJBQU0evmyJQ", - "cell_type": "code", - "source": [ - "public static ActivityLog Merge (this ActivityLog a, ActivityLog b) {", - "\n return a with { ", - "\n StartDateTime = a.StartDateTime < b.StartDateTime ? a.StartDateTime : b.StartDateTime,", - "\n FinishDateTime = a.FinishDateTime > b.FinishDateTime ? a.FinishDateTime : b.FinishDateTime,", - "\n Errors = a.Errors.Concat(b.Errors).ToList(),", - "\n Warnings = a.Warnings.Concat(b.Warnings).ToList(),", - "\n Infos = a.Infos.Concat(b.Infos).ToList(),", - "\n Status = a.Status == ActivityLogStatus.Failed || b.Status == ActivityLogStatus.Failed ? ActivityLogStatus.Failed : ActivityLogStatus.Succeeded", - "\n };", - "\n}", - "\n", - "\npublic static ActivityLog Merge (this ActivityLog[] logs) ", - "\n{", - "\n if(logs == null || logs.Length == 0) return null;", - "\n return logs.Aggregate((x, y) => x.Merge(y));", - "\n}", - "\n", - "\npublic static ActivityLog Merge (this ActivityLog[] logs, ActivityLog log) => logs.Merge().Merge(log);", - "\npublic static ActivityLog Merge (this ActivityLog log, ActivityLog[] logs) => log.Merge(logs.Merge());" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CdUfdMGymkqjIXT66mL65g", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Application Message

" + ] + }, + { + "cell_type": "code", + "source": [ + "#r \"nuget:Systemorph.Activities,1.2.3\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Constants/Validations\"" + ] + }, + { + "cell_type": "code", + "source": [ + "using Microsoft.Extensions.Logging;", + "\n", + "\npublic class ApplicationMessage {", + "\n private static ILogger log;", + "\n ", + "\n private static IActivityVariable activity;", + "\n ", + "\n public static void Configure (ILogger log, IActivityVariable activity) ", + "\n {", + "\n ApplicationMessage.log = log;", + "\n ApplicationMessage.activity = activity;", + "\n }", + "\n ", + "\n public static Object Log (Error e, params string[] s) { log.LogError(Get(e,s)); return null; }", + "\n ", + "\n public static Object Log (Warning w, params string[] s) { log.LogWarning(Get(w,s)); return null; }", + "\n ", + "\n public static bool HasErrors () => activity.HasErrors();", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "ApplicationMessage.Configure(Log, Activity)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Utils" + ] + }, + { + "cell_type": "code", + "source": [ + "public static bool HasErrors (this ActivityLog[] logs) {", + "\n foreach (var log in logs)", + "\n if(log.Errors.Any())", + "\n return true;", + "\n return false;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static ActivityLog Merge (this ActivityLog a, ActivityLog b) {", + "\n return a with { ", + "\n StartDateTime = a.StartDateTime < b.StartDateTime ? a.StartDateTime : b.StartDateTime,", + "\n FinishDateTime = a.FinishDateTime > b.FinishDateTime ? a.FinishDateTime : b.FinishDateTime,", + "\n Errors = a.Errors.Concat(b.Errors).ToList(),", + "\n Warnings = a.Warnings.Concat(b.Warnings).ToList(),", + "\n Infos = a.Infos.Concat(b.Infos).ToList(),", + "\n Status = a.Status == ActivityLogStatus.Failed || b.Status == ActivityLogStatus.Failed ? ActivityLogStatus.Failed : ActivityLogStatus.Succeeded", + "\n };", + "\n}", + "\n", + "\npublic static ActivityLog Merge (this ActivityLog[] logs) ", + "\n{", + "\n if(logs == null || logs.Length == 0) return null;", + "\n return logs.Aggregate((x, y) => x.Merge(y));", + "\n}", + "\n", + "\npublic static ActivityLog Merge (this ActivityLog[] logs, ActivityLog log) => logs.Merge().Merge(log);", + "\npublic static ActivityLog Merge (this ActivityLog log, ActivityLog[] logs) => log.Merge(logs.Merge());" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file diff --git a/Utils/UtilityMethods.ipynb b/Utils/UtilityMethods.ipynb index 8390e86f..c3706f06 100644 --- a/Utils/UtilityMethods.ipynb +++ b/Utils/UtilityMethods.ipynb @@ -1,1155 +1,899 @@ { - "metadata": { - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "authors": [], - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - } - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "id": "72RJn3yBk0-cdIRCo3QO6A", - "cell_type": "code", - "source": [ - "#!import \"../DataModel/DataStructure\"", - "\n#!import \"./ApplicationMessage\"" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "bTXVV8ziO0GApQeS_y9z3Q", - "cell_type": "code", - "source": [ - "using System.Linq.Expressions;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "0rrQ118FOkCCJosdbGYr_Q", - "cell_type": "markdown", - "source": [ - "# Math Functions" - ], - "metadata": {} - }, - { - "id": "JSuwpYPWEE-_BxSyEyzsbQ", - "cell_type": "code", - "source": [ - "static double DivideOrDefault(double numerator, double denominator, double defaultValue = default) => Math.Abs(denominator) > double.Epsilon ? numerator / denominator : defaultValue;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9dxEM2ggXU-zTLNvvCHsOQ", - "cell_type": "code", - "source": [ - "// because the default(T) is something else than the first/last element. What about \"static T GetValidElement(this IList array, int index)\"? ", - "\nstatic T GetElementOrDefault(this ICollection array, int index)", - "\n{ ", - "\n var count = array.Count;", - "\n if (array == null || count == 0)", - "\n return default(T);", - "\n", - "\n return index < 0", - "\n ? array.ElementAt(0) // should this case be removed?", - "\n : index < count", - "\n ? array.ElementAt(index)", - "\n : array.ElementAt(count -1);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "A-gLq4O2eE6IW3jx-1tDCw", - "cell_type": "markdown", - "source": [ - "# Enumerable Extensions" - ], - "metadata": {} - }, - { - "id": "QhtXvQfGpkOPqpRxznrgcg", - "cell_type": "code", - "source": [ - "public static Dictionary ToDictionaryGrouped(this IEnumerable source, Func keySelector, Func, TResult> elementSelector) => source.GroupBy(keySelector).ToDictionary(g => g.Key, elementSelector);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Brh1Yk0MoEO5H52znFTqUQ", - "cell_type": "code", - "source": [ - "public static IDataCube SelectToDataCube(this IEnumerable source, Func whereClause, Func selector) => source.Where(whereClause).Select(selector).ToDataCube();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "3hPGQtfhI0ic1_w5PyiBgw", - "cell_type": "code", - "source": [ - "public static IDataCube SelectToDataCube(this IEnumerable source, Func selector) => source.SelectToDataCube(x => true, selector);" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "-Y6HUEHIgEidj23uHIcscQ", - "cell_type": "code", - "source": [ - "public static double[] Prune (this IEnumerable source, double precision = Precision) => source.Reverse().SkipWhile(x => Math.Abs(x) < precision).Reverse().ToArray();" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xZnDqW6rXEagl6N5IPFBHg", - "cell_type": "markdown", - "source": [ - "# String Extensions" - ], - "metadata": {} - }, - { - "id": "3TZ5QaWLL0eXsicw9mEhrA", - "cell_type": "code", - "source": [ - "using System.Globalization;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "DLkjFfpXp0ODlwc_imkUwA", - "cell_type": "code", - "source": [ - "public static double CheckStringForExponentialAndConvertToDouble (this string s)", - "\n{ ", - "\n if (s == null) return default;", - "\n if (double.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out var doubleValue)) return doubleValue;", - "\n else { ApplicationMessage.Log(Error.ParsingScientificNotation, s); return 1; }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "740WQ9Xg6ESwS7mzcd_UDQ", - "cell_type": "markdown", - "source": [ - "# Enum Extentions" - ], - "metadata": {} - }, - { - "id": "WNoxcMPslUm-66pmOH5a8g", - "cell_type": "code", - "source": [ - "public static bool Contains(this T value, T lookingForFlag) ", - "\n where T : struct", - "\n{", - "\n int intValue = (int) (object) value;", - "\n int intLookingForFlag = (int) (object) lookingForFlag;", - "\n return ((intValue & intLookingForFlag) == intLookingForFlag);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "NgzAK-3L_kW3JQNLVUSQoQ", - "cell_type": "markdown", - "source": [ - "# Queries" - ], - "metadata": {} - }, - { - "id": "ekflioBoz0ukcAPWv4xRtQ", - "cell_type": "markdown", - "source": [ - "## FX" - ], - "metadata": {} - }, - { - "id": "B24vyYMc9kOlNnSUAfEHGQ", - "cell_type": "code", - "source": [ - "public static async Task>> GetExchangeRatesDictionaryAsync(this IQuerySource querySource, int year, int month)", - "\n => (await querySource.Query()", - "\n .Where(x => x.Year == year - 1 && x.Month == MonthInAYear && x.FxType == FxType.Spot ||", - "\n x.Year == year && x.Month == month)", - "\n .ToArrayAsync())", - "\n .ToDictionaryGrouped(x => x.Currency,", - "\n x => x.ToDictionary(y => (y.Year, y.Month, y.FxType) switch", - "\n {", - "\n (_, _, _) when y.Year == year - 1 && y.Month == MonthInAYear && y.FxType == FxType.Spot => FxPeriod.BeginningOfPeriod,", - "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Average => FxPeriod.Average,", - "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Spot => FxPeriod.EndOfPeriod", - "\n },", - "\n y => y.FxToGroupCurrency));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hSaegw7GtEWvUosF-y231g", - "cell_type": "code", - "source": [ - "public static double GetCurrencyToGroupFx(Dictionary> exchangeRates, string currency, FxPeriod fxPeriod, string groupCurrency)", - "\n{", - "\n if(currency == groupCurrency)", - "\n return 1;", - "\n", - "\n if(!exchangeRates.TryGetValue(currency, out var currencyToGroup))", - "\n ApplicationMessage.Log(Error.ExchangeRateCurrency, currency);", - "\n", - "\n if(!currencyToGroup.TryGetValue(fxPeriod, out var currencyToGroupFx))", - "\n ApplicationMessage.Log(Error.ExchangeRateNotFound, currency, fxPeriod.ToString());", - "\n", - "\n return currencyToGroupFx;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "hcDcg_DFUEOgLrrWw8cE2g", - "cell_type": "markdown", - "source": [ - "## Current and Previous Parameters" - ], - "metadata": {} - }, - { - "id": "qgieIWL7ZUe7mJIVbU_1gQ", - "cell_type": "markdown", - "source": [ - "TODOs:", - "\n
    ", - "\n
  • DataNodes Query: After merging with the new import storage, define IsFirstPeriod property.
  • ", - "\n
  • Once Scenario is defined as a simple property (e.g. in DataNodeState), introduce concept of Priority in LoadCurrentAndPreviousParameterAsync query (see ParameterResultsEntityQueryExtensions in IfrsGeneric).
  • ", - "\n
" - ], - "metadata": {} - }, - { - "id": "X01D1mGxS06sfFEPjwyG-A", - "cell_type": "code", - "source": [ - "public static async Task LoadParameterAsync(", - "\n this IQuerySource querySource,", - "\n int year,", - "\n int month,", - "\n Expression> filterExpression = null ) ", - "\n where T : IWithYearAndMonth", - "\n{", - "\n return await querySource.Query()", - "\n .Where(x => x.Year == year && x.Month <= month || x.Year < year)", - "\n .Where(filterExpression?? (Expression>)(x => true))", - "\n .ToArrayAsync();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "sKO5N-LgyEGBEZam7l9_Fg", - "cell_type": "code", - "source": [ - "public static async Task> LoadCurrentParameterAsync (", - "\n this IQuerySource querySource,", - "\n Args args,", - "\n Func identityExpression,", - "\n Expression> filterExpression = null ) ", - "\n where T : IWithYearAndMonth", - "\n{", - "\n return (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression))", - "\n .GroupBy(identityExpression)", - "\n .Select(y => y.OrderByDescending(x => x.Year)", - "\n .ThenByDescending(x => x.Month)", - "\n .FirstOrDefault())", - "\n .ToDictionary(identityExpression);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "I0M5hxr91UGl2zNnwXzW-g", - "cell_type": "code", - "source": [ - "public static async Task>> LoadCurrentAndPreviousParameterAsync (", - "\n this IQuerySource querySource,", - "\n Args args,", - "\n Func identityExpression,", - "\n Expression> filterExpression = null ) ", - "\n where T : IWithYearAndMonth", - "\n{", - "\n var parameters = (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression)).GroupBy(identityExpression);", - "\n ", - "\n var ret = new Dictionary>();", - "\n foreach(var p in parameters)", - "\n {", - "\n var inner = ret.GetOrAdd(p.Key, _ => new Dictionary());", - "\n", - "\n var currentCandidate = p.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", - "\n var previousCandidate = p.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", - "\n ", - "\n inner.Add(CurrentPeriod, currentCandidate != null ? currentCandidate : previousCandidate);", - "\n inner.Add(PreviousPeriod, previousCandidate != null ? previousCandidate : currentCandidate);", - "\n }", - "\n return ret;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "UMrZ966740-j48yfqsXM2g", - "cell_type": "markdown", - "source": [ - "", - "\n## Yield Curve" - ], - "metadata": {} - }, - { - "id": "qcQgXJr-l0Gql-aOiCdRrQ", - "cell_type": "code", - "source": [ - "public static async Task> LoadLockedInYieldCurveAsync(this IQuerySource querySource, Args args, ", - "\n IEnumerable dataNodes)", - "\n{", - "\n var lockedInYieldCurveByGoc = new Dictionary();", - "\n foreach (var dn in dataNodes.Where(x => x.ValuationApproach == ValuationApproaches.BBA))", - "\n {", - "\n var argsNew = args with {Year = dn.Year, Month = dn.Month};", - "\n var loadedYc = (await querySource.LoadCurrentParameterAsync(argsNew, x => x.Currency, x => x.Currency == dn.ContractualCurrency));", - "\n ", - "\n if(!loadedYc.TryGetValue(dn.ContractualCurrency, out var lockedYc))", - "\n ApplicationMessage.Log(Error.YieldCurveNotFound, dn.ContractualCurrency, argsNew.Year.ToString(), argsNew.Month.ToString());", - "\n ", - "\n lockedInYieldCurveByGoc[dn.DataNode] = lockedYc;", - "\n }", - "\n ", - "\n return lockedInYieldCurveByGoc;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "mkhcBCMjAku6Fqv8M8fhmg", - "cell_type": "code", - "source": [ - "public static async Task>> LoadCurrentYieldCurveAsync(this IQuerySource querySource, Args args, ", - "\n IEnumerable dataNodes)", - "\n{", - "\n var contractualCurrenciesInScope = dataNodes.Select(dn => dn.ContractualCurrency).ToHashSet();", - "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, ", - "\n x => x.Currency,", - "\n x => contractualCurrenciesInScope.Contains(x.Currency)", - "\n ));", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "11r0X9aBAUKWja2qSlbOWQ", - "cell_type": "markdown", - "source": [ - "## Data Node State" - ], - "metadata": {} - }, - { - "id": "ineEPRxhfkOAuclOvhZ1lw", - "cell_type": "code", - "source": [ - "//TODO : remove this method and clean up in queriesTest. We need a new test for LoadDataNodes.", - "\npublic static async Task> LoadDataNodeStateAsync(this IQuerySource querySource, Args args)", - "\n{", - "\n //This querySource is partitioned", - "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode))", - "\n .Where(x => x.Value[CurrentPeriod].State != State.Inactive)", - "\n .ToDictionary(x => x.Key, x => x.Value[CurrentPeriod]);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "B1n-fWXBi0GL93ngrSSRbQ", - "cell_type": "markdown", - "source": [ - "## Data Nodes" - ], - "metadata": {} - }, - { - "id": "jdq7blDf4U6-pmv3CMUQTQ", - "cell_type": "code", - "source": [ - "// TODO: the name of this method is strange, one expects DataNodes in return but instead obtains DataNodeData...", - "\npublic static async Task> LoadDataNodesAsync(this IQuerySource querySource, Args args) //How do we force the user to provide here a partitioned source? IWorkspace?", - "\n{", - "\n var dataNodeStates = await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", - "\n var activeDataNodes = dataNodeStates.Where(kvp => kvp.Value[CurrentPeriod].State != State.Inactive).Select(kvp => kvp.Key);", - "\n ", - "\n return (await querySource.Query().Where(dn => activeDataNodes.Contains(dn.SystemName)).ToArrayAsync())", - "\n .ToDictionary(dn => dn.SystemName, dn => {", - "\n var dnCurrentState = dataNodeStates[dn.SystemName][CurrentPeriod];", - "\n var dnPreviousState = dataNodeStates[dn.SystemName][PreviousPeriod];", - "\n return new DataNodeData(){Year = dnPreviousState.Year, ", - "\n Month = dnPreviousState.Month,", - "\n State = dnCurrentState.State,", - "\n PreviousState = dnPreviousState.State,", - "\n //from Group of Contract", - "\n DataNode = dn.SystemName,", - "\n ContractualCurrency = dn.ContractualCurrency,", - "\n FunctionalCurrency = dn.FunctionalCurrency,", - "\n LineOfBusiness = dn.LineOfBusiness,", - "\n ValuationApproach = dn.ValuationApproach,", - "\n OciType = dn.OciType,", - "\n Portfolio = dn.Portfolio,", - "\n AnnualCohort = dn.AnnualCohort,", - "\n LiabilityType = dn.LiabilityType,", - "\n Profitability = dn.Profitability,", - "\n Partner = dn.Partner,", - "\n IsReinsurance = dn.GetType() == typeof(GroupOfReinsuranceContract),", - "\n };", - "\n }", - "\n );", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "o0-QY0CD_U6QtHo8DUg-XA", - "cell_type": "markdown", - "source": [ - "## Data Node Parameters" - ], - "metadata": {} - }, - { - "id": "u2AAh0Om8k-FVnzV99qeXw", - "cell_type": "markdown", - "source": [ - "### Single data Node" - ], - "metadata": {} - }, - { - "id": "fGw6yDyGdkGSnMtEzlCWNg", - "cell_type": "code", - "source": [ - "public static async Task>> LoadSingleDataNodeParametersAsync(this IQuerySource querySource, Args args)", - "\n{", - "\n return await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "fqKznL41TkGOYs41YCJkIw", - "cell_type": "markdown", - "source": [ - "### Inter data Node" - ], - "metadata": {} - }, - { - "id": "9TJH-kJoTEmIucE-PjX7sw", - "cell_type": "code", - "source": [ - "public static async Task>>> LoadInterDataNodeParametersAsync(this IQuerySource querySource, Args args)", - "\n{", - "\n var identityExpressions = new Func[]{x => x.DataNode, x => x.LinkedDataNode,};", - "\n var parameterArray = (await querySource.LoadParameterAsync(args.Year, args.Month));", - "\n var parameters = identityExpressions.SelectMany(ie => parameterArray.GroupBy(ie));", - "\n ", - "\n return parameters.SelectMany(p => p", - "\n .GroupBy(x => x.DataNode != p.Key ? x.DataNode : x.LinkedDataNode)", - "\n .Select(gg =>", - "\n {", - "\n var currentCandidate = gg.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", - "\n var previousCandidate = gg.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", - "\n return (key: p.Key,", - "\n currentPeriod: currentCandidate != null ? currentCandidate : previousCandidate,", - "\n previousPeriod: previousCandidate != null ? previousCandidate : currentCandidate);", - "\n })", - "\n )", - "\n .ToDictionaryGrouped(x => x.key,", - "\n x => new Dictionary>{ {CurrentPeriod, x.Select(y => y.currentPeriod).ToHashSet()},", - "\n {PreviousPeriod, x.Select(y => y.previousPeriod).ToHashSet()}});", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "m5W0i-9h_USmOALgfJ5ynw", - "cell_type": "markdown", - "source": [ - "## Aoc Step Configuration" - ], - "metadata": {} - }, - { - "id": "foNau3wankChqmtvuPVxmw", - "cell_type": "code", - "source": [ - "public static async Task> LoadAocStepConfigurationAsync(this IQuerySource querySource, int year, int month)", - "\n => (await querySource.LoadParameterAsync(year, month)).GroupBy(x => (x.AocType, x.Novelty), (k, v) => v.OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).First()); " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "u2cguHXQ-kyIKbXgTS6P_g", - "cell_type": "code", - "source": [ - "public static async Task> LoadAocStepConfigurationAsDictionaryAsync(this IQuerySource querySource, int year, int month) => (await querySource.LoadAocStepConfigurationAsync(year, month)).ToDictionary(x => new AocStep(x.AocType, x.Novelty)); " - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "kujIpDbHiUyTpBosaNnjDg", - "cell_type": "markdown", - "source": [ - "# Export Configurations" - ], - "metadata": {} - }, - { - "id": "cdft6A5YOU-JKits9tdQ0w", - "cell_type": "markdown", - "source": [ - "## Main Tab" - ], - "metadata": {} - }, - { - "id": "qAmPBlXGBkanj2uTVSqlCA", - "cell_type": "code", - "source": [ - "public static IDocumentBuilder MainTabConfigurationWoScenario(this IDocumentBuilder builder, T args) where T : IfrsPartition", - "\n => builder.WithTable( config => config .AtBeginning() ", - "\n .WithName(Main) ", - "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", - "\n .WithColumn(x => x.Id, x => x.Delete())", - "\n .WithColumn(x => x.Scenario, x => x.Delete()));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xDi9MN7YXE6TzDsUxJKv_g", - "cell_type": "code", - "source": [ - "public static IDocumentBuilder MainTabConfiguration(this IDocumentBuilder builder, T args) where T : IfrsPartition", - "\n => builder.WithTable( config => config .AtBeginning() ", - "\n .WithName(Main) ", - "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", - "\n .WithColumn(x => x.Id, x => x.Delete()));" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "CRZfO8bZy0G9fSLekjFWUg", - "cell_type": "markdown", - "source": [ - "## Dimensions" - ], - "metadata": {} - }, - { - "id": "Ln1Wggqu406eomb1E8Akcw", - "cell_type": "code", - "source": [ - "public static IDocumentBuilder PortfolioConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : Portfolio", - "\n => builder.WithTable(config => { ", - "\n if(DependsOnType != default)", - "\n config = config.DependsOn(DependsOnType); ", - "\n return config .AtBeginning() ", - "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", - "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete());", - "\n });" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6qc9dAkjOkSfbiofWgLnXw", - "cell_type": "code", - "source": [ - "public static IDocumentBuilder GroupofContractConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : GroupOfContract", - "\n => builder.WithTable(config => { ", - "\n if(DependsOnType != default)", - "\n config = config.DependsOn(DependsOnType); ", - "\n if(typeof(T).Name == nameof(GroupOfInsuranceContract))", - "\n config = config.WithColumn(x => x.Partner, x => x.Delete());", - "\n return config .AtBeginning() ", - "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", - "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.ContractualCurrency, x => x.Delete())", - "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete())", - "\n .WithColumn(x => x.LineOfBusiness, x => x.Delete())", - "\n .WithColumn(x => x.OciType, x => x.Delete())", - "\n .WithColumn(x => x.ValuationApproach, x => x.Delete());", - "\n });" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "1dhHyd3JGEOohmsGAjA_gw", - "cell_type": "markdown", - "source": [ - "## Data Node State" - ], - "metadata": {} - }, - { - "id": "Ymq2Wq7sjkeLyNlifepNaQ", - "cell_type": "code", - "source": [ - "using DocumentFormat.OpenXml.Spreadsheet;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "dGKqDg0S5Eq62tKaxG_7yg", - "cell_type": "code", - "source": [ - "public record HelperState { public string State {get; init;} }" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "8HjMW_4oEkSc8gt502-Lkw", - "cell_type": "code", - "source": [ - "public static IExcelDocumentBuilder DataNodeStateConfiguration (this IExcelDocumentBuilder builder, DataNodeState[] data)", - "\n => builder", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(config => config ", - "\n .AtBeginning() ", - "\n .WithSource(source => data.AsQueryable())", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.Month, x => x.Delete())", - "\n .WithColumn(x => x.Year, x => x.Delete())", - "\n .WithColumn(x => x.Id, x => x.Delete())", - "\n .WithColumn(x => x.State, y => y.WithDataValidation(z => z.WithReferenceTo(t => t.State)))", - "\n );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "G2bKdGeyiEeKBz1bG8g86w", - "cell_type": "code", - "source": [ - "public static IExcelDocumentBuilder StateEnumConfiguration (this IExcelDocumentBuilder builder)", - "\n{", - "\n var helperState = new[] {new HelperState {State = \"Active\"}, new HelperState {State = \"Inactive\"} }; ", - "\n return builder.WithTable( config => config .WithSheetVisibility(SheetStateValues.Hidden)", - "\n //.WithColumn(x => x.State, z => z.WithNamedRange(y => y.WithName(\"HelperState_State\")))", - "\n .WithColumn(x => x.State, z => z.WithDefaultNamedRange())", - "\n .WithSource(source => helperState.AsQueryable()) );", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "zb2wO1m1uUaw0RbXeMwHGw", - "cell_type": "markdown", - "source": [ - "## Data Node Parameter" - ], - "metadata": {} - }, - { - "id": "4hvQE9cObUS1h9wW2WA_LA", - "cell_type": "code", - "source": [ - "public static IExcelDocumentBuilder DataNodeParameterConfiguration (this IExcelDocumentBuilder builder, Dictionary data)", - "\n => builder", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(config => config ", - "\n .AtBeginning() ", - "\n .WithSource(source => data[nameof(InterDataNodeParameter)].Cast().AsQueryable())", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.Month, x => x.Delete())", - "\n .WithColumn(x => x.Id, x => x.Delete())", - "\n .WithColumn(x => x.Year, x => x.Delete())", - "\n )", - "\n .WithTable(config => config ", - "\n .AtBeginning() ", - "\n .WithSource(source => data[nameof(SingleDataNodeParameter)].Cast().AsQueryable())", - "\n .WithColumn(x => x.DataNode, x => x.WithHeader(\"DataNode\"))", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.Month, x => x.Delete())", - "\n .WithColumn(x => x.Year, x => x.Delete())", - "\n .WithColumn(x => x.Year, x => x.Delete())", - "\n .WithColumn(x => x.Id, x => x.Delete())", - "\n );" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "HYdwh4HjBkC--t3kyqy0jg", - "cell_type": "markdown", - "source": [ - "# Report Configurations" - ], - "metadata": {} - }, - { - "id": "qnzf570gh0uWBWG5tHisdw", - "cell_type": "code", - "source": [ - "using Systemorph.Vertex.Pivot.Reporting.Builder;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "L21IHsS-ukOp7q2KpQYwrg", - "cell_type": "code", - "source": [ - "public static ReportBuilder WithGridOptionsForIfrsVariable", - "\n(this ReportBuilder reportBuilder, int reportHeight = 650)", - "\n{", - "\n return reportBuilder.WithGridOptions(go => go.WithColumns(cols => cols.Modify(\"Value\", c => c.WithWidth(300)", - "\n .WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", - "\n .WithRows(rows => rows.Where(r => !r.RowGroup.SystemName.EndsWith(\"NullGroup\")).ToList())", - "\n .WithAutoGroupColumn(c => c.WithWidth(250) with { Pinned = \"left\" }) with { Height = reportHeight, GroupDefaultExpanded = 2, OnGridReady = null }", - "\n );", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "xcQnRFiM80yaO6WWqlVJ3w", - "cell_type": "markdown", - "source": [ - "# Utility Methods Class" - ], - "metadata": {} - }, - { - "id": "Yl-kOA4SvkmoX4bFR30uGA", - "cell_type": "markdown", - "source": [ - "This class contains:", - "\n- EqualityComparer" - ], - "metadata": {} - }, - { - "id": "MzSS_gk3YUqeeUoxH5615g", - "cell_type": "code", - "source": [ - "public static class Utils {", - "\n public static void EqualityComparer (T[] collection1, T[] collection2) ", - "\n {", - "\n collection1.Length.Should().Be(collection2.Length);", - "\n var type = typeof(T);", - "\n var properties = type.GetProperties().Where(p => p.Name != \"Id\").ToArray();", - "\n if(properties.Count() == 0) {", - "\n bool isEqual = Enumerable.SequenceEqual(collection1, collection2);", - "\n isEqual.Should().Be(true);", - "\n }", - "\n foreach(var item1 in collection1) {", - "\n var item2 = collection2.Where(x => ", - "\n properties.All(prop => {", - "\n var propType = prop.PropertyType;", - "\n var val = prop.GetValue(item1);", - "\n var otherVal = prop.GetValue(x);", - "\n if(val == null && otherVal == null) return true;", - "\n else if((val != null && otherVal == null) || (val == null && otherVal != null)) return false;", - "\n else return Convert.ChangeType(otherVal, propType).Equals( Convert.ChangeType(val, propType) );", - "\n })", - "\n );", - "\n item2.Count().Should().NotBe(0);", - "\n }", - "\n }", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Fnb9erxecEyh69YlvuE30Q", - "cell_type": "code", - "source": [ - "// TODO: find a better arrangement to these methods", - "\nstatic var NumericalPrecisionEqualityChecker = 1.0E-10;", - "\n", - "\nstatic bool CheckEquality(this double[] arr1, double[] arr2) ", - "\n{", - "\n if(arr1.Length != arr2.Length) return false;", - "\n for(int i = 0; i < arr1.Length; i++) {", - "\n double d1 = arr1[i];", - "\n double d2 = arr2[i];", - "\n if(Math.Abs(d1) < NumericalPrecisionEqualityChecker && Math.Abs(d1) < NumericalPrecisionEqualityChecker) continue;", - "\n if(Math.Abs( (d1 - d2) / d1 ) > NumericalPrecisionEqualityChecker) return false;", - "\n }", - "\n return true;", - "\n}", - "\n", - "\nstatic bool CheckEquality(this IEnumerable arr1, double[] arr2) => CheckEquality(arr1.ToArray(), arr2);", - "\nstatic bool CheckEquality(this double[] arr1, IEnumerable arr2) => CheckEquality(arr1, arr2.ToArray());", - "\nstatic bool CheckEquality(this IEnumerable arr1, IEnumerable arr2) => CheckEquality(arr1.ToArray(), arr2.ToArray());", - "\nstatic bool CheckEquality(this double d1, double d2) => CheckEquality(d1.RepeatOnce(), d2.RepeatOnce());", - "\n", - "\nstatic bool CheckEquality(this double? d1, double? d2) ", - "\n{", - "\n if(d1 == null && d2 == null) return true;", - "\n else return CheckEquality((double)d1, (double)d2);", - "\n}", - "\n" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "etIXAOoMHEGKXFbnzCCRWA", - "cell_type": "markdown", - "source": [ - "## ToIdentityString" - ], - "metadata": {} - }, - { - "id": "-0U7OSuELUeCMTZ487kI_A", - "cell_type": "code", - "source": [ - "using System.Text;", - "\npublic static string ToIdentityString(this T v)", - "\n where T : class", - "\n{", - "\n StringBuilder sb = new StringBuilder();", - "\n var propertyInfos = v.GetType()", - "\n .GetProperties()", - "\n .Where(x => Attribute.IsDefined(x, typeof(IdentityPropertyAttribute)))", - "\n .OrderByDescending(x => x.PropertyType.Name).ThenByDescending(x => x.Name)", - "\n .Select(x => sb.Append(x.Name).Append(\":\").Append(v.GetType().GetProperty(x.Name)?.GetValue(v, null)).Append(\", \"));", - "\n", - "\nreturn propertyInfos.Select(p => p.ToString()).ToArray().Last();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "cq_4STuakk6krLbs6TZ4yg", - "cell_type": "markdown", - "source": [ - "## GetPreviousIdentities" - ], - "metadata": {} - }, - { - "id": "XYOo4uHfnkeKWMF_MQ5r-Q", - "cell_type": "code", - "source": [ - "public static Dictionary> GetPreviousIdentities(IEnumerable identities)", - "\n{", - "\n var bopNovelties = identities.Where(id => id.AocType == AocTypes.BOP).Select(id => id.Novelty);", - "\n var previousStep = (new string[]{Novelties.N,Novelties.I,Novelties.C})", - "\n .ToDictionary(n => n, n => bopNovelties.Contains(n) ? new AocStep(AocTypes.BOP,n) : null);", - "\n return identities.Where(id => id.AocType != AocTypes.BOP)", - "\n .ToDictionary(x => x, x => {var ret = x.AocType == AocTypes.CL ? previousStep.Where(kvp => kvp.Value != null).Select(kvp => kvp.Value).ToArray() ", - "\n : previousStep[x.Novelty].RepeatOnce();", - "\n previousStep[x.Novelty] = new AocStep(x.AocType, x.Novelty);", - "\n return ret;});", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "XbcZgL57GUy04M44loxF-g", - "cell_type": "markdown", - "source": [ - "## GetReferenceAocStepForCalculated" - ], - "metadata": {} - }, - { - "id": "MLNCUWgSAkyrA-DMWc-JpQ", - "cell_type": "code", - "source": [ - "public static AocStep GetReferenceAocStepForCalculated(this IEnumerable identities, Dictionary aocConfigurationByAocStep, AocStep identityAocStep)", - "\n{", - "\n return identities.LastOrDefault(aocStep => aocConfigurationByAocStep[aocStep].DataType != DataType.Calculated", - "\n && aocConfigurationByAocStep[aocStep].DataType != DataType.CalculatedTelescopic", - "\n && aocConfigurationByAocStep[aocStep].Order < aocConfigurationByAocStep[identityAocStep].Order", - "\n && aocStep.Novelty == identityAocStep.Novelty) ", - "\n ?? new AocStep(default, default);", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "VxJI9sGp3UyCFxyJM7MGKg", - "cell_type": "markdown", - "source": [ - "# Change Sign Rules" - ], - "metadata": {} - }, - { - "id": "Uv2X9RT3wkKLJvMvooTbSw", - "cell_type": "code", - "source": [ - "public static int GetSign((string AocType, string AmountType, string EstimateType, bool IsReinsurance) variable, Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", - "\n{", - "\n var isActual = (new string[] { EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.A }).Contains(variable.EstimateType) ? -1 : 1;", - "\n return isActual;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "MOV5tqPp2kSr4kp0wet0ag", - "cell_type": "markdown", - "source": [ - "# EstimateType And AmountType" - ], - "metadata": {} - }, - { - "id": "jf_kmDreZUyVr-gBkFuuCg", - "cell_type": "code", - "source": [ - "public static Dictionary> GetAmountTypesByEstimateType(Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", - "\n{", - "\n return new Dictionary>(){", - "\n {EstimateTypes.RA, new string[]{}.ToHashSet()},", - "\n {EstimateTypes.C, new string[]{}.ToHashSet()},", - "\n {EstimateTypes.L, new string[]{}.ToHashSet()},", - "\n {EstimateTypes.LR, new string[]{}.ToHashSet()},", - "\n };", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "j0oOSZn9ZkK6D6BR_YxuJg", - "cell_type": "markdown", - "source": [ - "# Technical Margin EstimateType" - ], - "metadata": {} - }, - { - "id": "86CBe5DnrkOi6irqUzCLNw", - "cell_type": "code", - "source": [ - "public static HashSet GetTechnicalMarginEstimateType()", - "\n{", - "\n return new []{EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, }.ToHashSet();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "9OeFmvwQJECtzHY6Dg8Yzw", - "cell_type": "markdown", - "source": [ - "# Discount and Cumulate" - ], - "metadata": {} - }, - { - "id": "Ajyhr4n0106OnU6fEIdL5g", - "cell_type": "code", - "source": [ - "public static double[] ComputeDiscountAndCumulate(this double[] nominalValues, double[] monthlyDiscounting, PeriodType periodType) ", - "\n{ ", - "\n if(nominalValues == null) return Enumerable.Empty().ToArray();", - "\n ", - "\n var ret = new double[nominalValues.Length];", - "\n ", - "\n if(periodType == PeriodType.BeginningOfPeriod)", - "\n {", - "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", - "\n ret[i] = nominalValues[i] + GetElementOrDefault(ret, i + 1) * GetElementOrDefault(monthlyDiscounting, i/12);", - "\n return ret;", - "\n }", - "\n ", - "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", - "\n ret[i] = ( nominalValues[i] + GetElementOrDefault(ret, i + 1) ) * GetElementOrDefault(monthlyDiscounting, i/12);", - "\n ", - "\n return ret;", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "LoqMwHfd8kOJYFyQxw5KNQ", - "cell_type": "code", - "source": [ - "public static double[] ComputeDiscountAndCumulateWithCreditDefaultRisk(this double[] nominalValues, double[] monthlyDiscounting, double nonPerformanceRiskRate) //Is it correct that NonPerformanceRiskRate is a double? Should it be an array that takes as input tau/t?", - "\n{ ", - "\n return Enumerable.Range(0, nominalValues.Length)", - "\n .Select( t => Enumerable.Range(t, nominalValues.Length-t)", - "\n .Select( tau => nominalValues[tau] * Math.Pow(GetElementOrDefault(monthlyDiscounting, t/12), tau-t+1) * (Math.Exp(-nonPerformanceRiskRate*(tau-t)) - 1) )", - "\n .Sum() )", - "\n .ToArray();", - "\n}" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "Y9wSV5wvy0mvkCNsCiRmlQ", - "cell_type": "markdown", - "source": [ - "# Import Configuration" - ], - "metadata": {} - }, - { - "id": "11et4IQ_0US7mUdWWNnouw", - "cell_type": "markdown", - "source": [ - "## Data Nodes" - ], - "metadata": {} - }, - { - "id": "fd6J9NnbXkmWF-7Qi2FmWA", - "cell_type": "code", - "source": [ - "public GroupOfInsuranceContract ExtendGroupOfContract(GroupOfInsuranceContract gic, IDataRow datarow) => gic;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "z4UEzk2bPEOGnwoC6UN3pg", - "cell_type": "code", - "source": [ - "public GroupOfReinsuranceContract ExtendGroupOfContract(GroupOfReinsuranceContract gric, IDataRow datarow) => gric;" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - }, - { - "id": "6k1Zt47Wtk6cltgFOwSPXQ", - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 1, - "outputs": [] - } - ] + "metadata": { + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!import \"../DataModel/DataStructure\"", + "\n#!import \"./ApplicationMessage\"" + ] + }, + { + "cell_type": "code", + "source": [ + "using System.Linq.Expressions;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Math Functions" + ] + }, + { + "cell_type": "code", + "source": [ + "static double DivideOrDefault(double numerator, double denominator, double defaultValue = default) => Math.Abs(denominator) > double.Epsilon ? numerator / denominator : defaultValue;" + ] + }, + { + "cell_type": "code", + "source": [ + "// because the default(T) is something else than the first/last element. What about \"static T GetValidElement(this IList array, int index)\"? ", + "\nstatic T GetElementOrDefault(this ICollection array, int index)", + "\n{ ", + "\n var count = array.Count;", + "\n if (array == null || count == 0)", + "\n return default(T);", + "\n", + "\n return index < 0", + "\n ? array.ElementAt(0) // should this case be removed?", + "\n : index < count", + "\n ? array.ElementAt(index)", + "\n : array.ElementAt(count -1);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Enumerable Extensions" + ] + }, + { + "cell_type": "code", + "source": [ + "public static Dictionary ToDictionaryGrouped(this IEnumerable source, Func keySelector, Func, TResult> elementSelector) => source.GroupBy(keySelector).ToDictionary(g => g.Key, elementSelector);" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDataCube SelectToDataCube(this IEnumerable source, Func whereClause, Func selector) => source.Where(whereClause).Select(selector).ToDataCube();" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDataCube SelectToDataCube(this IEnumerable source, Func selector) => source.SelectToDataCube(x => true, selector);" + ] + }, + { + "cell_type": "code", + "source": [ + "public static double[] Prune (this IEnumerable source, double precision = Precision) => source.Reverse().SkipWhile(x => Math.Abs(x) < precision).Reverse().ToArray();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# String Extensions" + ] + }, + { + "cell_type": "code", + "source": [ + "using System.Globalization;" + ] + }, + { + "cell_type": "code", + "source": [ + "public static double CheckStringForExponentialAndConvertToDouble (this string s)", + "\n{ ", + "\n if (s == null) return default;", + "\n if (double.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out var doubleValue)) return doubleValue;", + "\n else { ApplicationMessage.Log(Error.ParsingScientificNotation, s); return 1; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Enum Extentions" + ] + }, + { + "cell_type": "code", + "source": [ + "public static bool Contains(this T value, T lookingForFlag) ", + "\n where T : struct", + "\n{", + "\n int intValue = (int) (object) value;", + "\n int intLookingForFlag = (int) (object) lookingForFlag;", + "\n return ((intValue & intLookingForFlag) == intLookingForFlag);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Queries" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## FX" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>> GetExchangeRatesDictionaryAsync(this IQuerySource querySource, int year, int month)", + "\n => (await querySource.Query()", + "\n .Where(x => x.Year == year - 1 && x.Month == MonthInAYear && x.FxType == FxType.Spot ||", + "\n x.Year == year && x.Month == month)", + "\n .ToArrayAsync())", + "\n .ToDictionaryGrouped(x => x.Currency,", + "\n x => x.ToDictionary(y => (y.Year, y.Month, y.FxType) switch", + "\n {", + "\n (_, _, _) when y.Year == year - 1 && y.Month == MonthInAYear && y.FxType == FxType.Spot => FxPeriod.BeginningOfPeriod,", + "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Average => FxPeriod.Average,", + "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Spot => FxPeriod.EndOfPeriod", + "\n },", + "\n y => y.FxToGroupCurrency));" + ] + }, + { + "cell_type": "code", + "source": [ + "public static double GetCurrencyToGroupFx(Dictionary> exchangeRates, string currency, FxPeriod fxPeriod, string groupCurrency)", + "\n{", + "\n if(currency == groupCurrency)", + "\n return 1;", + "\n", + "\n if(!exchangeRates.TryGetValue(currency, out var currencyToGroup))", + "\n ApplicationMessage.Log(Error.ExchangeRateCurrency, currency);", + "\n", + "\n if(!currencyToGroup.TryGetValue(fxPeriod, out var currencyToGroupFx))", + "\n ApplicationMessage.Log(Error.ExchangeRateNotFound, currency, fxPeriod.ToString());", + "\n", + "\n return currencyToGroupFx;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Current and Previous Parameters" + ] + }, + { + "cell_type": "markdown", + "source": [ + "TODOs:", + "\n
    ", + "\n
  • DataNodes Query: After merging with the new import storage, define IsFirstPeriod property.
  • ", + "\n
  • Once Scenario is defined as a simple property (e.g. in DataNodeState), introduce concept of Priority in LoadCurrentAndPreviousParameterAsync query (see ParameterResultsEntityQueryExtensions in IfrsGeneric).
  • ", + "\n
" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task LoadParameterAsync(", + "\n this IQuerySource querySource,", + "\n int year,", + "\n int month,", + "\n Expression> filterExpression = null ) ", + "\n where T : IWithYearAndMonth", + "\n{", + "\n return await querySource.Query()", + "\n .Where(x => x.Year == year && x.Month <= month || x.Year < year)", + "\n .Where(filterExpression?? (Expression>)(x => true))", + "\n .ToArrayAsync();", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadCurrentParameterAsync (", + "\n this IQuerySource querySource,", + "\n Args args,", + "\n Func identityExpression,", + "\n Expression> filterExpression = null ) ", + "\n where T : IWithYearAndMonth", + "\n{", + "\n return (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression))", + "\n .GroupBy(identityExpression)", + "\n .Select(y => y.OrderByDescending(x => x.Year)", + "\n .ThenByDescending(x => x.Month)", + "\n .FirstOrDefault())", + "\n .ToDictionary(identityExpression);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>> LoadCurrentAndPreviousParameterAsync (", + "\n this IQuerySource querySource,", + "\n Args args,", + "\n Func identityExpression,", + "\n Expression> filterExpression = null ) ", + "\n where T : IWithYearAndMonth", + "\n{", + "\n var parameters = (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression)).GroupBy(identityExpression);", + "\n ", + "\n var ret = new Dictionary>();", + "\n foreach(var p in parameters)", + "\n {", + "\n var inner = ret.GetOrAdd(p.Key, _ => new Dictionary());", + "\n", + "\n var currentCandidate = p.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", + "\n var previousCandidate = p.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", + "\n ", + "\n inner.Add(CurrentPeriod, currentCandidate != null ? currentCandidate : previousCandidate);", + "\n inner.Add(PreviousPeriod, previousCandidate != null ? previousCandidate : currentCandidate);", + "\n }", + "\n return ret;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Yield Curve" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadLockedInYieldCurveAsync(this IQuerySource querySource, Args args, ", + "\n IEnumerable dataNodes)", + "\n{", + "\n var lockedInYieldCurveByGoc = new Dictionary();", + "\n foreach (var dn in dataNodes.Where(x => x.ValuationApproach == ValuationApproaches.BBA))", + "\n {", + "\n var argsNew = args with {Year = dn.Year, Month = dn.Month};", + "\n var loadedYc = (await querySource.LoadCurrentParameterAsync(argsNew, x => x.Currency, x => x.Currency == dn.ContractualCurrency));", + "\n ", + "\n if(!loadedYc.TryGetValue(dn.ContractualCurrency, out var lockedYc))", + "\n ApplicationMessage.Log(Error.YieldCurveNotFound, dn.ContractualCurrency, argsNew.Year.ToString(), argsNew.Month.ToString());", + "\n ", + "\n lockedInYieldCurveByGoc[dn.DataNode] = lockedYc;", + "\n }", + "\n ", + "\n return lockedInYieldCurveByGoc;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>> LoadCurrentYieldCurveAsync(this IQuerySource querySource, Args args, ", + "\n IEnumerable dataNodes)", + "\n{", + "\n var contractualCurrenciesInScope = dataNodes.Select(dn => dn.ContractualCurrency).ToHashSet();", + "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, ", + "\n x => x.Currency,", + "\n x => contractualCurrenciesInScope.Contains(x.Currency)", + "\n ));", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node State" + ] + }, + { + "cell_type": "code", + "source": [ + "//TODO : remove this method and clean up in queriesTest. We need a new test for LoadDataNodes.", + "\npublic static async Task> LoadDataNodeStateAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n //This querySource is partitioned", + "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode))", + "\n .Where(x => x.Value[CurrentPeriod].State != State.Inactive)", + "\n .ToDictionary(x => x.Key, x => x.Value[CurrentPeriod]);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Nodes" + ] + }, + { + "cell_type": "code", + "source": [ + "// TODO: the name of this method is strange, one expects DataNodes in return but instead obtains DataNodeData...", + "\npublic static async Task> LoadDataNodesAsync(this IQuerySource querySource, Args args) //How do we force the user to provide here a partitioned source? IWorkspace?", + "\n{", + "\n var dataNodeStates = await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", + "\n var activeDataNodes = dataNodeStates.Where(kvp => kvp.Value[CurrentPeriod].State != State.Inactive).Select(kvp => kvp.Key);", + "\n ", + "\n return (await querySource.Query().Where(dn => activeDataNodes.Contains(dn.SystemName)).ToArrayAsync())", + "\n .ToDictionary(dn => dn.SystemName, dn => {", + "\n var dnCurrentState = dataNodeStates[dn.SystemName][CurrentPeriod];", + "\n var dnPreviousState = dataNodeStates[dn.SystemName][PreviousPeriod];", + "\n return new DataNodeData(){Year = dnPreviousState.Year, ", + "\n Month = dnPreviousState.Month,", + "\n State = dnCurrentState.State,", + "\n PreviousState = dnPreviousState.State,", + "\n //from Group of Contract", + "\n DataNode = dn.SystemName,", + "\n ContractualCurrency = dn.ContractualCurrency,", + "\n FunctionalCurrency = dn.FunctionalCurrency,", + "\n LineOfBusiness = dn.LineOfBusiness,", + "\n ValuationApproach = dn.ValuationApproach,", + "\n OciType = dn.OciType,", + "\n Portfolio = dn.Portfolio,", + "\n AnnualCohort = dn.AnnualCohort,", + "\n LiabilityType = dn.LiabilityType,", + "\n Profitability = dn.Profitability,", + "\n Partner = dn.Partner,", + "\n IsReinsurance = dn.GetType() == typeof(GroupOfReinsuranceContract),", + "\n };", + "\n }", + "\n );", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node Parameters" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Single data Node" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>> LoadSingleDataNodeParametersAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n return await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Inter data Node" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>>> LoadInterDataNodeParametersAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n var identityExpressions = new Func[]{x => x.DataNode, x => x.LinkedDataNode,};", + "\n var parameterArray = (await querySource.LoadParameterAsync(args.Year, args.Month));", + "\n var parameters = identityExpressions.SelectMany(ie => parameterArray.GroupBy(ie));", + "\n ", + "\n return parameters.SelectMany(p => p", + "\n .GroupBy(x => x.DataNode != p.Key ? x.DataNode : x.LinkedDataNode)", + "\n .Select(gg =>", + "\n {", + "\n var currentCandidate = gg.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", + "\n var previousCandidate = gg.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", + "\n return (key: p.Key,", + "\n currentPeriod: currentCandidate != null ? currentCandidate : previousCandidate,", + "\n previousPeriod: previousCandidate != null ? previousCandidate : currentCandidate);", + "\n })", + "\n )", + "\n .ToDictionaryGrouped(x => x.key,", + "\n x => new Dictionary>{ {CurrentPeriod, x.Select(y => y.currentPeriod).ToHashSet()},", + "\n {PreviousPeriod, x.Select(y => y.previousPeriod).ToHashSet()}});", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Aoc Step Configuration" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadAocStepConfigurationAsync(this IQuerySource querySource, int year, int month)", + "\n => (await querySource.LoadParameterAsync(year, month)).GroupBy(x => (x.AocType, x.Novelty), (k, v) => v.OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).First()); " + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadAocStepConfigurationAsDictionaryAsync(this IQuerySource querySource, int year, int month) => (await querySource.LoadAocStepConfigurationAsync(year, month)).ToDictionary(x => new AocStep(x.AocType, x.Novelty)); " + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Export Configurations" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Main Tab" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDocumentBuilder MainTabConfigurationWoScenario(this IDocumentBuilder builder, T args) where T : IfrsPartition", + "\n => builder.WithTable( config => config .AtBeginning() ", + "\n .WithName(Main) ", + "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n .WithColumn(x => x.Scenario, x => x.Delete()));" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDocumentBuilder MainTabConfiguration(this IDocumentBuilder builder, T args) where T : IfrsPartition", + "\n => builder.WithTable( config => config .AtBeginning() ", + "\n .WithName(Main) ", + "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", + "\n .WithColumn(x => x.Id, x => x.Delete()));" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Dimensions" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDocumentBuilder PortfolioConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : Portfolio", + "\n => builder.WithTable(config => { ", + "\n if(DependsOnType != default)", + "\n config = config.DependsOn(DependsOnType); ", + "\n return config .AtBeginning() ", + "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", + "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete());", + "\n });" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDocumentBuilder GroupofContractConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : GroupOfContract", + "\n => builder.WithTable(config => { ", + "\n if(DependsOnType != default)", + "\n config = config.DependsOn(DependsOnType); ", + "\n if(typeof(T).Name == nameof(GroupOfInsuranceContract))", + "\n config = config.WithColumn(x => x.Partner, x => x.Delete());", + "\n return config .AtBeginning() ", + "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", + "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.ContractualCurrency, x => x.Delete())", + "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete())", + "\n .WithColumn(x => x.LineOfBusiness, x => x.Delete())", + "\n .WithColumn(x => x.OciType, x => x.Delete())", + "\n .WithColumn(x => x.ValuationApproach, x => x.Delete());", + "\n });" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node State" + ] + }, + { + "cell_type": "code", + "source": [ + "using DocumentFormat.OpenXml.Spreadsheet;" + ] + }, + { + "cell_type": "code", + "source": [ + "public record HelperState { public string State {get; init;} }" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IExcelDocumentBuilder DataNodeStateConfiguration (this IExcelDocumentBuilder builder, DataNodeState[] data)", + "\n => builder", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(config => config ", + "\n .AtBeginning() ", + "\n .WithSource(source => data.AsQueryable())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Month, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n .WithColumn(x => x.State, y => y.WithDataValidation(z => z.WithReferenceTo(t => t.State)))", + "\n );" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IExcelDocumentBuilder StateEnumConfiguration (this IExcelDocumentBuilder builder)", + "\n{", + "\n var helperState = new[] {new HelperState {State = \"Active\"}, new HelperState {State = \"Inactive\"} }; ", + "\n return builder.WithTable( config => config .WithSheetVisibility(SheetStateValues.Hidden)", + "\n //.WithColumn(x => x.State, z => z.WithNamedRange(y => y.WithName(\"HelperState_State\")))", + "\n .WithColumn(x => x.State, z => z.WithDefaultNamedRange())", + "\n .WithSource(source => helperState.AsQueryable()) );", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Node Parameter" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IExcelDocumentBuilder DataNodeParameterConfiguration (this IExcelDocumentBuilder builder, Dictionary data)", + "\n => builder", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(config => config ", + "\n .AtBeginning() ", + "\n .WithSource(source => data[nameof(InterDataNodeParameter)].Cast().AsQueryable())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Month, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n )", + "\n .WithTable(config => config ", + "\n .AtBeginning() ", + "\n .WithSource(source => data[nameof(SingleDataNodeParameter)].Cast().AsQueryable())", + "\n .WithColumn(x => x.DataNode, x => x.WithHeader(\"DataNode\"))", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Month, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n );" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Report Configurations" + ] + }, + { + "cell_type": "code", + "source": [ + "using Systemorph.Vertex.Pivot.Reporting.Builder;" + ] + }, + { + "cell_type": "code", + "source": [ + "public static ReportBuilder WithGridOptionsForIfrsVariable", + "\n(this ReportBuilder reportBuilder, int reportHeight = 650)", + "\n{", + "\n return reportBuilder.WithGridOptions(go => go.WithColumns(cols => cols.Modify(\"Value\", c => c.WithWidth(300)", + "\n .WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", + "\n .WithRows(rows => rows.Where(r => !r.RowGroup.SystemName.EndsWith(\"NullGroup\")).ToList())", + "\n .WithAutoGroupColumn(c => c.WithWidth(250) with { Pinned = \"left\" }) with { Height = reportHeight, GroupDefaultExpanded = 2, OnGridReady = null }", + "\n );", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Utility Methods Class" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This class contains:", + "\n- EqualityComparer" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class Utils {", + "\n public static void EqualityComparer (T[] collection1, T[] collection2) ", + "\n {", + "\n collection1.Length.Should().Be(collection2.Length);", + "\n var type = typeof(T);", + "\n var properties = type.GetProperties().Where(p => p.Name != \"Id\").ToArray();", + "\n if(properties.Count() == 0) {", + "\n bool isEqual = Enumerable.SequenceEqual(collection1, collection2);", + "\n isEqual.Should().Be(true);", + "\n }", + "\n foreach(var item1 in collection1) {", + "\n var item2 = collection2.Where(x => ", + "\n properties.All(prop => {", + "\n var propType = prop.PropertyType;", + "\n var val = prop.GetValue(item1);", + "\n var otherVal = prop.GetValue(x);", + "\n if(val == null && otherVal == null) return true;", + "\n else if((val != null && otherVal == null) || (val == null && otherVal != null)) return false;", + "\n else return Convert.ChangeType(otherVal, propType).Equals( Convert.ChangeType(val, propType) );", + "\n })", + "\n );", + "\n item2.Count().Should().NotBe(0);", + "\n }", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "// TODO: find a better arrangement to these methods", + "\nstatic var NumericalPrecisionEqualityChecker = 1.0E-10;", + "\n", + "\nstatic bool CheckEquality(this double[] arr1, double[] arr2) ", + "\n{", + "\n if(arr1.Length != arr2.Length) return false;", + "\n for(int i = 0; i < arr1.Length; i++) {", + "\n double d1 = arr1[i];", + "\n double d2 = arr2[i];", + "\n if(Math.Abs(d1) < NumericalPrecisionEqualityChecker && Math.Abs(d1) < NumericalPrecisionEqualityChecker) continue;", + "\n if(Math.Abs( (d1 - d2) / d1 ) > NumericalPrecisionEqualityChecker) return false;", + "\n }", + "\n return true;", + "\n}", + "\n", + "\nstatic bool CheckEquality(this IEnumerable arr1, double[] arr2) => CheckEquality(arr1.ToArray(), arr2);", + "\nstatic bool CheckEquality(this double[] arr1, IEnumerable arr2) => CheckEquality(arr1, arr2.ToArray());", + "\nstatic bool CheckEquality(this IEnumerable arr1, IEnumerable arr2) => CheckEquality(arr1.ToArray(), arr2.ToArray());", + "\nstatic bool CheckEquality(this double d1, double d2) => CheckEquality(d1.RepeatOnce(), d2.RepeatOnce());", + "\n", + "\nstatic bool CheckEquality(this double? d1, double? d2) ", + "\n{", + "\n if(d1 == null && d2 == null) return true;", + "\n else return CheckEquality((double)d1, (double)d2);", + "\n}", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## ToIdentityString" + ] + }, + { + "cell_type": "code", + "source": [ + "using System.Text;", + "\npublic static string ToIdentityString(this T v)", + "\n where T : class", + "\n{", + "\n StringBuilder sb = new StringBuilder();", + "\n var propertyInfos = v.GetType()", + "\n .GetProperties()", + "\n .Where(x => Attribute.IsDefined(x, typeof(IdentityPropertyAttribute)))", + "\n .OrderByDescending(x => x.PropertyType.Name).ThenByDescending(x => x.Name)", + "\n .Select(x => sb.Append(x.Name).Append(\":\").Append(v.GetType().GetProperty(x.Name)?.GetValue(v, null)).Append(\", \"));", + "\n", + "\nreturn propertyInfos.Select(p => p.ToString()).ToArray().Last();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## GetPreviousIdentities" + ] + }, + { + "cell_type": "code", + "source": [ + "public static Dictionary> GetPreviousIdentities(IEnumerable identities)", + "\n{", + "\n var bopNovelties = identities.Where(id => id.AocType == AocTypes.BOP).Select(id => id.Novelty);", + "\n var previousStep = (new string[]{Novelties.N,Novelties.I,Novelties.C})", + "\n .ToDictionary(n => n, n => bopNovelties.Contains(n) ? new AocStep(AocTypes.BOP,n) : null);", + "\n return identities.Where(id => id.AocType != AocTypes.BOP)", + "\n .ToDictionary(x => x, x => {var ret = x.AocType == AocTypes.CL ? previousStep.Where(kvp => kvp.Value != null).Select(kvp => kvp.Value).ToArray() ", + "\n : previousStep[x.Novelty].RepeatOnce();", + "\n previousStep[x.Novelty] = new AocStep(x.AocType, x.Novelty);", + "\n return ret;});", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## GetReferenceAocStepForCalculated" + ] + }, + { + "cell_type": "code", + "source": [ + "public static AocStep GetReferenceAocStepForCalculated(this IEnumerable identities, Dictionary aocConfigurationByAocStep, AocStep identityAocStep)", + "\n{", + "\n return identities.LastOrDefault(aocStep => aocConfigurationByAocStep[aocStep].DataType != DataType.Calculated", + "\n && aocConfigurationByAocStep[aocStep].DataType != DataType.CalculatedTelescopic", + "\n && aocConfigurationByAocStep[aocStep].Order < aocConfigurationByAocStep[identityAocStep].Order", + "\n && aocStep.Novelty == identityAocStep.Novelty) ", + "\n ?? new AocStep(default, default);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Change Sign Rules" + ] + }, + { + "cell_type": "code", + "source": [ + "public static int GetSign((string AocType, string AmountType, string EstimateType, bool IsReinsurance) variable, Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", + "\n{", + "\n var isActual = (new string[] { EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.A }).Contains(variable.EstimateType) ? -1 : 1;", + "\n return isActual;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# EstimateType And AmountType" + ] + }, + { + "cell_type": "code", + "source": [ + "public static Dictionary> GetAmountTypesByEstimateType(Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", + "\n{", + "\n return new Dictionary>(){", + "\n {EstimateTypes.RA, new string[]{}.ToHashSet()},", + "\n {EstimateTypes.C, new string[]{}.ToHashSet()},", + "\n {EstimateTypes.L, new string[]{}.ToHashSet()},", + "\n {EstimateTypes.LR, new string[]{}.ToHashSet()},", + "\n };", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Technical Margin EstimateType" + ] + }, + { + "cell_type": "code", + "source": [ + "public static HashSet GetTechnicalMarginEstimateType()", + "\n{", + "\n return new []{EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, }.ToHashSet();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Discount and Cumulate" + ] + }, + { + "cell_type": "code", + "source": [ + "public static double[] ComputeDiscountAndCumulate(this double[] nominalValues, double[] monthlyDiscounting, PeriodType periodType) ", + "\n{ ", + "\n if(nominalValues == null) return Enumerable.Empty().ToArray();", + "\n ", + "\n var ret = new double[nominalValues.Length];", + "\n ", + "\n if(periodType == PeriodType.BeginningOfPeriod)", + "\n {", + "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", + "\n ret[i] = nominalValues[i] + GetElementOrDefault(ret, i + 1) * GetElementOrDefault(monthlyDiscounting, i/12);", + "\n return ret;", + "\n }", + "\n ", + "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", + "\n ret[i] = ( nominalValues[i] + GetElementOrDefault(ret, i + 1) ) * GetElementOrDefault(monthlyDiscounting, i/12);", + "\n ", + "\n return ret;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static double[] ComputeDiscountAndCumulateWithCreditDefaultRisk(this double[] nominalValues, double[] monthlyDiscounting, double nonPerformanceRiskRate) //Is it correct that NonPerformanceRiskRate is a double? Should it be an array that takes as input tau/t?", + "\n{ ", + "\n return Enumerable.Range(0, nominalValues.Length)", + "\n .Select( t => Enumerable.Range(t, nominalValues.Length-t)", + "\n .Select( tau => nominalValues[tau] * Math.Pow(GetElementOrDefault(monthlyDiscounting, t/12), tau-t+1) * (Math.Exp(-nonPerformanceRiskRate*(tau-t)) - 1) )", + "\n .Sum() )", + "\n .ToArray();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Configuration" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Nodes" + ] + }, + { + "cell_type": "code", + "source": [ + "public GroupOfInsuranceContract ExtendGroupOfContract(GroupOfInsuranceContract gic, IDataRow datarow) => gic;" + ] + }, + { + "cell_type": "code", + "source": [ + "public GroupOfReinsuranceContract ExtendGroupOfContract(GroupOfReinsuranceContract gric, IDataRow datarow) => gric;" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] } \ No newline at end of file From f9dd2597486a0ec0d513280f9dc4dc1db089f382 Mon Sep 17 00:00:00 2001 From: sbusato <103484221+sbusato@users.noreply.github.com> Date: Thu, 6 Oct 2022 14:07:20 +0200 Subject: [PATCH 05/43] Merge pull request #37 from Systemorph/ReorderGlobalMetadata Reorder notebooks global metadata --- Constants/Consts.ipynb | 10 +++++----- Constants/Enums.ipynb | 10 +++++----- Constants/Validations.ipynb | 10 +++++----- DataModel/DataStructure.ipynb | 10 +++++----- Database/Configure.ipynb | 10 +++++----- Database/Schema Delete.ipynb | 10 +++++----- Export/MapTemplate.ipynb | 10 +++++----- Import/ImportResultPreview.ipynb | 10 +++++----- Import/ImportScopeCalculation.ipynb | 10 +++++----- Import/ImportStorage.ipynb | 10 +++++----- Import/Importers.ipynb | 10 +++++----- Initialization/InitSystemorphBaseToMemory.ipynb | 10 +++++----- Initialization/InitSystemorphToDatabase.ipynb | 10 +++++----- Initialization/InitSystemorphToMemory.ipynb | 10 +++++----- InputFormatDescription.ipynb | 10 +++++----- OverviewCalculationEngine.ipynb | 10 +++++----- Report/ReportConfigurationAndUtils.ipynb | 10 +++++----- Report/ReportScopes.ipynb | 10 +++++----- Report/ReportStorage.ipynb | 10 +++++----- Report/Reports.ipynb | 10 +++++----- Test/AocStructureTest.ipynb | 10 +++++----- Test/ExportIfrsVariable.ipynb | 10 +++++----- Test/ExportReportVariables.ipynb | 10 +++++----- Test/IfrsVariablesTest.ipynb | 10 +++++----- Test/ImportStorageTest.ipynb | 10 +++++----- Test/MapTemplateAndImportTest.ipynb | 10 +++++----- Test/QueriesTest.ipynb | 10 +++++----- Test/ReportStorageTest.ipynb | 10 +++++----- Test/ReportVariablesTest.ipynb | 10 +++++----- Test/ReportVariablesTestBase.ipynb | 10 +++++----- Test/SpecificationsFinancialPerformance.ipynb | 10 +++++----- Test/SpecificationsImportActuals.ipynb | 10 +++++----- Test/SpecificationsImportCashflows.ipynb | 10 +++++----- Test/SpecificationsSetup.ipynb | 10 +++++----- Test/SpecificationsTechnicalMargin.ipynb | 10 +++++----- Test/TechnicalMarginTest.ipynb | 10 +++++----- Test/Tests.ipynb | 10 +++++----- Utils/ApplicationMessage.ipynb | 10 +++++----- Utils/UtilityMethods.ipynb | 10 +++++----- 39 files changed, 195 insertions(+), 195 deletions(-) diff --git a/Constants/Consts.ipynb b/Constants/Consts.ipynb index 12992f46..808308c2 100644 --- a/Constants/Consts.ipynb +++ b/Constants/Consts.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False", "toc-showmarkdowntxt": "False" diff --git a/Constants/Enums.ipynb b/Constants/Enums.ipynb index 63b1b56f..04c87848 100644 --- a/Constants/Enums.ipynb +++ b/Constants/Enums.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False", "toc-showmarkdowntxt": "False" diff --git a/Constants/Validations.ipynb b/Constants/Validations.ipynb index 18f30a6f..d1b09cc0 100644 --- a/Constants/Validations.ipynb +++ b/Constants/Validations.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False", "toc-showmarkdowntxt": "False" diff --git a/DataModel/DataStructure.ipynb b/DataModel/DataStructure.ipynb index 871ff938..55885f24 100644 --- a/DataModel/DataStructure.ipynb +++ b/DataModel/DataStructure.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False", "toc-showmarkdowntxt": "False" diff --git a/Database/Configure.ipynb b/Database/Configure.ipynb index edca53dd..9b23844f 100644 --- a/Database/Configure.ipynb +++ b/Database/Configure.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False", "toc-showmarkdowntxt": "False" diff --git a/Database/Schema Delete.ipynb b/Database/Schema Delete.ipynb index e3e1eb69..f1f25629 100644 --- a/Database/Schema Delete.ipynb +++ b/Database/Schema Delete.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "documentInfo": "{\r\n \"authors\": [\r\n \"Peter Kunszt\"\r\n ],\r\n \"contributors\": [],\r\n \"tags\": [\r\n \"storage\",\r\n \"database\",\r\n \"persistence\",\r\n \"dependency\"\r\n ],\r\n \"title\": \"Multiple Storages with Persistence\",\r\n \"description\": \"Demo the usage of database backend to resolve a data dependency.\",\r\n \"createdDate\": \"Jan. 2022\",\r\n \"publishedDate\": \"Jan. 2022\",\r\n \"changelog\": [\r\n {\r\n \"version\": \"1.0\",\r\n \"description\": \"Initial Notebook\"\r\n }\r\n ]\r\n }", "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" } }, "nbformat": 4, diff --git a/Export/MapTemplate.ipynb b/Export/MapTemplate.ipynb index 1f91daa0..9d6cc89b 100644 --- a/Export/MapTemplate.ipynb +++ b/Export/MapTemplate.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Import/ImportResultPreview.ipynb b/Import/ImportResultPreview.ipynb index 22cd4398..ba23909b 100644 --- a/Import/ImportResultPreview.ipynb +++ b/Import/ImportResultPreview.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Import/ImportScopeCalculation.ipynb b/Import/ImportScopeCalculation.ipynb index b932e924..b9949cc3 100644 --- a/Import/ImportScopeCalculation.ipynb +++ b/Import/ImportScopeCalculation.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Import/ImportStorage.ipynb b/Import/ImportStorage.ipynb index ea1af2cc..ae040ef3 100644 --- a/Import/ImportStorage.ipynb +++ b/Import/ImportStorage.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Import/Importers.ipynb b/Import/Importers.ipynb index eb140724..808b4cbe 100644 --- a/Import/Importers.ipynb +++ b/Import/Importers.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False", "toc-showmarkdowntxt": "False" diff --git a/Initialization/InitSystemorphBaseToMemory.ipynb b/Initialization/InitSystemorphBaseToMemory.ipynb index 097ddb40..d28022d0 100644 --- a/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/Initialization/InitSystemorphBaseToMemory.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Initialization/InitSystemorphToDatabase.ipynb b/Initialization/InitSystemorphToDatabase.ipynb index 8dba5617..c994f78b 100644 --- a/Initialization/InitSystemorphToDatabase.ipynb +++ b/Initialization/InitSystemorphToDatabase.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Initialization/InitSystemorphToMemory.ipynb b/Initialization/InitSystemorphToMemory.ipynb index 80f655a5..884cc8fd 100644 --- a/Initialization/InitSystemorphToMemory.ipynb +++ b/Initialization/InitSystemorphToMemory.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/InputFormatDescription.ipynb b/InputFormatDescription.ipynb index 02152194..857d2cc9 100644 --- a/InputFormatDescription.ipynb +++ b/InputFormatDescription.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/OverviewCalculationEngine.ipynb b/OverviewCalculationEngine.ipynb index db79df0c..a4ba1b36 100644 --- a/OverviewCalculationEngine.ipynb +++ b/OverviewCalculationEngine.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Report/ReportConfigurationAndUtils.ipynb b/Report/ReportConfigurationAndUtils.ipynb index 61e8193f..575ece44 100644 --- a/Report/ReportConfigurationAndUtils.ipynb +++ b/Report/ReportConfigurationAndUtils.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Report/ReportScopes.ipynb b/Report/ReportScopes.ipynb index 719b2f66..bc470121 100644 --- a/Report/ReportScopes.ipynb +++ b/Report/ReportScopes.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Report/ReportStorage.ipynb b/Report/ReportStorage.ipynb index 477fc0bb..655f0888 100644 --- a/Report/ReportStorage.ipynb +++ b/Report/ReportStorage.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Report/Reports.ipynb b/Report/Reports.ipynb index a79b4e9a..36b8aa3e 100644 --- a/Report/Reports.ipynb +++ b/Report/Reports.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/AocStructureTest.ipynb b/Test/AocStructureTest.ipynb index e0b1a671..1dbad859 100644 --- a/Test/AocStructureTest.ipynb +++ b/Test/AocStructureTest.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/ExportIfrsVariable.ipynb b/Test/ExportIfrsVariable.ipynb index bdd3aa38..9d21556c 100644 --- a/Test/ExportIfrsVariable.ipynb +++ b/Test/ExportIfrsVariable.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/ExportReportVariables.ipynb b/Test/ExportReportVariables.ipynb index a079be72..96db0b99 100644 --- a/Test/ExportReportVariables.ipynb +++ b/Test/ExportReportVariables.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/IfrsVariablesTest.ipynb b/Test/IfrsVariablesTest.ipynb index ab282217..1a40358a 100644 --- a/Test/IfrsVariablesTest.ipynb +++ b/Test/IfrsVariablesTest.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/ImportStorageTest.ipynb b/Test/ImportStorageTest.ipynb index 8f9d5663..effe2de0 100644 --- a/Test/ImportStorageTest.ipynb +++ b/Test/ImportStorageTest.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/MapTemplateAndImportTest.ipynb b/Test/MapTemplateAndImportTest.ipynb index e7837a9f..cdb93e65 100644 --- a/Test/MapTemplateAndImportTest.ipynb +++ b/Test/MapTemplateAndImportTest.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/QueriesTest.ipynb b/Test/QueriesTest.ipynb index 490565f0..3c102747 100644 --- a/Test/QueriesTest.ipynb +++ b/Test/QueriesTest.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/ReportStorageTest.ipynb b/Test/ReportStorageTest.ipynb index 4d728148..acb1f22c 100644 --- a/Test/ReportStorageTest.ipynb +++ b/Test/ReportStorageTest.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/ReportVariablesTest.ipynb b/Test/ReportVariablesTest.ipynb index eb31bd44..fb6904bf 100644 --- a/Test/ReportVariablesTest.ipynb +++ b/Test/ReportVariablesTest.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/ReportVariablesTestBase.ipynb b/Test/ReportVariablesTestBase.ipynb index 77732e98..4f320987 100644 --- a/Test/ReportVariablesTestBase.ipynb +++ b/Test/ReportVariablesTestBase.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/SpecificationsFinancialPerformance.ipynb b/Test/SpecificationsFinancialPerformance.ipynb index 6cf10521..44816ee6 100644 --- a/Test/SpecificationsFinancialPerformance.ipynb +++ b/Test/SpecificationsFinancialPerformance.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/SpecificationsImportActuals.ipynb b/Test/SpecificationsImportActuals.ipynb index cb0b1acb..d71638e8 100644 --- a/Test/SpecificationsImportActuals.ipynb +++ b/Test/SpecificationsImportActuals.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/SpecificationsImportCashflows.ipynb b/Test/SpecificationsImportCashflows.ipynb index eac7cd32..b392feef 100644 --- a/Test/SpecificationsImportCashflows.ipynb +++ b/Test/SpecificationsImportCashflows.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False", "toc-showmarkdowntxt": "False", diff --git a/Test/SpecificationsSetup.ipynb b/Test/SpecificationsSetup.ipynb index d112b3d2..15228d6f 100644 --- a/Test/SpecificationsSetup.ipynb +++ b/Test/SpecificationsSetup.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/SpecificationsTechnicalMargin.ipynb b/Test/SpecificationsTechnicalMargin.ipynb index 83eaaba1..13c6c98b 100644 --- a/Test/SpecificationsTechnicalMargin.ipynb +++ b/Test/SpecificationsTechnicalMargin.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/TechnicalMarginTest.ipynb b/Test/TechnicalMarginTest.ipynb index 9a79f348..827833ed 100644 --- a/Test/TechnicalMarginTest.ipynb +++ b/Test/TechnicalMarginTest.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Test/Tests.ipynb b/Test/Tests.ipynb index 538dbf00..ba71bfbc 100644 --- a/Test/Tests.ipynb +++ b/Test/Tests.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, diff --git a/Utils/ApplicationMessage.ipynb b/Utils/ApplicationMessage.ipynb index a41569e3..2bc8ec97 100644 --- a/Utils/ApplicationMessage.ipynb +++ b/Utils/ApplicationMessage.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False", "toc-showmarkdowntxt": "False" diff --git a/Utils/UtilityMethods.ipynb b/Utils/UtilityMethods.ipynb index c3706f06..3436c3e7 100644 --- a/Utils/UtilityMethods.ipynb +++ b/Utils/UtilityMethods.ipynb @@ -1,16 +1,16 @@ { "metadata": { - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, "authors": [], "kernelspec": { "display_name": "Formula Framework", "language": "C#", "name": "C#" }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, "toc-autonumbering": "True", "toc-showcode": "False" }, From e07f57827271242879c5cbb6a02ae607a5197fbe Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Thu, 6 Oct 2022 16:47:38 +0200 Subject: [PATCH 06/43] Break utils nb (#33) * working on reports doc * metadata * break down utils * remove preview * update references to utils * fix image paths * reset doc around reports * fixing test + a ton of metadata * Cleanup redundant comments and import /Tests/TestHelper in SpecificationsFinancialPerformance * Move Export.ipynb inside the Export folder, fix import /Export/Export statement and comments cleanup in Utils/Extensions.ipynb * Empty commit to refresh the meta-data * Remove all *.orig files Co-authored-by: nnikolopoulos --- Export/Export.ipynb | 206 ++++ Export/MapTemplate.ipynb | 20 +- Import/ImportResultPreview.ipynb | 250 ----- Import/ImportScopeCalculation.ipynb | 2 +- Import/ImportStorage.ipynb | 4 +- InputFormatDescription.ipynb | 12 +- OverviewCalculationEngine.ipynb | 2 +- Report/ReportConfigurationAndUtils.ipynb | 26 +- Report/Reports.ipynb | 30 +- Test/MapTemplateAndImportTest.ipynb | 76 +- Test/QueriesTest.ipynb | 2 +- Test/SpecificationsFinancialPerformance.ipynb | 12 + Test/SpecificationsSetup.ipynb | 9 +- Test/Tests.ipynb | 2 +- Utils/Extensions.ipynb | 147 +++ Utils/ImportCalculationMethods.ipynb | 185 ++++ Utils/Queries.ipynb | 320 +++++++ Utils/TestHelper.ipynb | 113 +++ Utils/UtilityMethods.ipynb | 899 ------------------ 19 files changed, 1133 insertions(+), 1184 deletions(-) create mode 100644 Export/Export.ipynb delete mode 100644 Import/ImportResultPreview.ipynb create mode 100644 Utils/Extensions.ipynb create mode 100644 Utils/ImportCalculationMethods.ipynb create mode 100644 Utils/Queries.ipynb create mode 100644 Utils/TestHelper.ipynb delete mode 100644 Utils/UtilityMethods.ipynb diff --git a/Export/Export.ipynb b/Export/Export.ipynb new file mode 100644 index 00000000..e3fa8ad4 --- /dev/null +++ b/Export/Export.ipynb @@ -0,0 +1,206 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!import \"../DataModel/DataStructure\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Main Tab" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDocumentBuilder MainTabConfigurationWoScenario(this IDocumentBuilder builder, T args) where T : IfrsPartition", + "\n => builder.WithTable( config => config .AtBeginning() ", + "\n .WithName(Main) ", + "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n .WithColumn(x => x.Scenario, x => x.Delete()));" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDocumentBuilder MainTabConfiguration(this IDocumentBuilder builder, T args) where T : IfrsPartition", + "\n => builder.WithTable( config => config .AtBeginning() ", + "\n .WithName(Main) ", + "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", + "\n .WithColumn(x => x.Id, x => x.Delete()));" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Porfolio" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDocumentBuilder PortfolioConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : Portfolio", + "\n => builder.WithTable(config => { ", + "\n if(DependsOnType != default)", + "\n config = config.DependsOn(DependsOnType); ", + "\n return config .AtBeginning() ", + "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", + "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete());", + "\n });" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Group of Contract" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDocumentBuilder GroupofContractConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : GroupOfContract", + "\n => builder.WithTable(config => { ", + "\n if(DependsOnType != default)", + "\n config = config.DependsOn(DependsOnType); ", + "\n if(typeof(T).Name == nameof(GroupOfInsuranceContract))", + "\n config = config.WithColumn(x => x.Partner, x => x.Delete());", + "\n return config .AtBeginning() ", + "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", + "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.ContractualCurrency, x => x.Delete())", + "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete())", + "\n .WithColumn(x => x.LineOfBusiness, x => x.Delete())", + "\n .WithColumn(x => x.OciType, x => x.Delete())", + "\n .WithColumn(x => x.ValuationApproach, x => x.Delete());", + "\n });" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Data Node State" + ] + }, + { + "cell_type": "code", + "source": [ + "using DocumentFormat.OpenXml.Spreadsheet;" + ] + }, + { + "cell_type": "code", + "source": [ + "public record HelperState { public string State {get; init;} }" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IExcelDocumentBuilder DataNodeStateConfiguration (this IExcelDocumentBuilder builder, DataNodeState[] data)", + "\n => builder", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(config => config ", + "\n .AtBeginning() ", + "\n .WithSource(source => data.AsQueryable())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Month, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n .WithColumn(x => x.State, y => y.WithDataValidation(z => z.WithReferenceTo(t => t.State)))", + "\n );" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IExcelDocumentBuilder StateEnumConfiguration (this IExcelDocumentBuilder builder)", + "\n{", + "\n var helperState = new[] {new HelperState {State = \"Active\"}, new HelperState {State = \"Inactive\"} }; ", + "\n return builder.WithTable( config => config .WithSheetVisibility(SheetStateValues.Hidden)", + "\n //.WithColumn(x => x.State, z => z.WithNamedRange(y => y.WithName(\"HelperState_State\")))", + "\n .WithColumn(x => x.State, z => z.WithDefaultNamedRange())", + "\n .WithSource(source => helperState.AsQueryable()) );", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Data Node Parameter" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IExcelDocumentBuilder DataNodeParameterConfiguration (this IExcelDocumentBuilder builder, Dictionary data)", + "\n => builder", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(x => x.Delete())", + "\n .WithTable(config => config ", + "\n .AtBeginning() ", + "\n .WithSource(source => data[nameof(InterDataNodeParameter)].Cast().AsQueryable())", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Month, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n )", + "\n .WithTable(config => config ", + "\n .AtBeginning() ", + "\n .WithSource(source => data[nameof(SingleDataNodeParameter)].Cast().AsQueryable())", + "\n .WithColumn(x => x.DataNode, x => x.WithHeader(\"DataNode\"))", + "\n .WithColumn(x => x.Partition, x => x.Delete())", + "\n .WithColumn(x => x.Month, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n .WithColumn(x => x.Year, x => x.Delete())", + "\n .WithColumn(x => x.Id, x => x.Delete())", + "\n );" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/Export/MapTemplate.ipynb b/Export/MapTemplate.ipynb index 9d6cc89b..2f6034eb 100644 --- a/Export/MapTemplate.ipynb +++ b/Export/MapTemplate.ipynb @@ -38,34 +38,34 @@ { "cell_type": "markdown", "source": [ - "# Import dependencies" + "# Select Initialization" ] }, { - "cell_type": "code", + "cell_type": "markdown", "source": [ - "#!import \"../Utils/UtilityMethods\"" + "Choose to run the Map Template either with the set of Systemorph data in memory or with the data present in the Database. Uncomment the desired option." ] }, { - "cell_type": "markdown", + "cell_type": "code", "source": [ - "# Select Initialization" + "/* The DataSource is configured and connected to real database */", + "\n//#!eval-notebook \"../Database/Configure\"", + "\n/* The Systemorph set of dimensions + mockdata are dispatched to the unconfigured in-memory DataSource */", + "\n#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" ] }, { "cell_type": "markdown", "source": [ - "Choose to run the Map Template either with the set of Systemorph data in memory or with the data present in the Database. Uncomment the desired option." + "# Import dependencies" ] }, { "cell_type": "code", "source": [ - "/* The DataSource is configured and connected to real database */", - "\n//#!eval-notebook \"Database/Configure\"", - "\n/* The Systemorph set of dimensions + mockdata are dispatched to the unconfigured in-memory DataSource */", - "\n#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + "#!import \"../Export/Export\"" ] }, { diff --git a/Import/ImportResultPreview.ipynb b/Import/ImportResultPreview.ipynb deleted file mode 100644 index ba23909b..00000000 --- a/Import/ImportResultPreview.ipynb +++ /dev/null @@ -1,250 +0,0 @@ -{ - "metadata": { - "authors": [], - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "# Temporary for debugging (initialize data and construct/initialize storage)" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"../Test/SpecificationsSetup\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\nGiven the current status of the implementation, in order to display Actual reports it is necessary to set Actual format in the Args while to display Cashflow it is necessary to set Cashflow format." - ] - }, - { - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;", - "\nvar economicBasis = \"L\" ;" - ] - }, - { - "cell_type": "code", - "source": [ - "var UniversePreview = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" - ] - }, - { - "cell_type": "code", - "source": [ - "var importStorage = UniversePreview.GetStorage();" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import Preview" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Present Value" - ] - }, - { - "cell_type": "code", - "source": [ - "var identities = UniversePreview.GetScopes(importStorage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);" - ] - }, - { - "cell_type": "code", - "source": [ - "var pvs = UniversePreview.GetScopes(identities, o => o.WithStorage(importStorage)).SelectMany(x => x.PvCurrent.Concat(x.PvLocked));" - ] - }, - { - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(pvs", - "\n //.Where(x => x.DataNode == \"DTR1.1\")", - "\n )", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.EconomicBasis)", - "\n //.GroupColumnsBy(x => x.AmountType)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n //VariableType", - "\n //.GroupColumnsBy(x => x.DataNode)", - "\n //.GroupColumnsBy(x => x.Novelty)", - "\n .WithGridOptionsForIfrsVariable(720)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Risk Adjustment" - ] - }, - { - "cell_type": "code", - "source": [ - "var ras = UniversePreview.GetScopes(identities).SelectMany(x => x.RaCurrent.Concat(x.RaLocked));" - ] - }, - { - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(ras)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.EconomicBasis)", - "\n //.GroupRowsBy(x => x.DataNode)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n //VariableType", - "\n //.GroupColumnsBy(x => x.DataNode)", - "\n //.GroupColumnsBy(x => x.Novelty)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Actuals" - ] - }, - { - "cell_type": "code", - "source": [ - "var actuals = UniversePreview.GetScopes(identities).SelectMany(x => x.Actual);" - ] - }, - { - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(actuals)", - "\n .WithQuerySource(Workspace)", - "\n .GroupRowsBy(x => x.AmountType)", - "\n //.GroupColumnsBy(x => x.DataNode)", - "\n .WithGridOptionsForIfrsVariable(550)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Advance, Overdue Actuals" - ] - }, - { - "cell_type": "code", - "source": [ - "var aoActuals = UniversePreview.GetScopes(identities).SelectMany(x => x.AdvanceActual.Concat(x.OverdueActual));" - ] - }, - { - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(aoActuals)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupColumnsBy(x => x.EstimateType)", - "\n .GroupColumnsBy(x => x.AmountType)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable(300)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Deferrable Actuals" - ] - }, - { - "cell_type": "code", - "source": [ - "var deferrableActuals = UniversePreview.GetScopes(identities).SelectMany(x => x.DeferrableActual);" - ] - }, - { - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(deferrableActuals)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable(350)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Csm Lc LoReCo" - ] - }, - { - "cell_type": "code", - "source": [ - "var csm = UniversePreview.GetScopes(identities).SelectMany(x => x.Csms);", - "\nvar loss = UniversePreview.GetScopes(identities).SelectMany(x => x.Loss);", - "\nvar csmLcLoReCo = Enumerable.Empty().Concat(csm).Concat(loss);" - ] - }, - { - "cell_type": "code", - "source": [ - "Report", - "\n .ForObjects(csmLcLoReCo", - "\n //.Where(x => x.DataNode == \"DT1.1\")", - "\n )", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupColumnsBy(x => x.EstimateType)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file diff --git a/Import/ImportScopeCalculation.ipynb b/Import/ImportScopeCalculation.ipynb index b9949cc3..4f8e78f5 100644 --- a/Import/ImportScopeCalculation.ipynb +++ b/Import/ImportScopeCalculation.ipynb @@ -404,7 +404,7 @@ "\n- For the **Locked-in** economic basis, the yield curve used is the latest available as per end of the DataNode's inception year;", "\n- Whereas for the **Current** economic base, the yield curve used is the latest available as per the current period.", "\n", - "\nThe algorithm which retrieves the latest available yield curve is [here](../Utils/UtilityMethods#yield-curve)." + "\nThe algorithm which retrieves the latest available yield curve is [here](../Utils/Queries#yield-curve)." ] }, { diff --git a/Import/ImportStorage.ipynb b/Import/ImportStorage.ipynb index ae040ef3..291e0e0b 100644 --- a/Import/ImportStorage.ipynb +++ b/Import/ImportStorage.ipynb @@ -32,6 +32,7 @@ "\n- [IfrsVariables](../DataModel/DataStructure)", "\n- [Projection Configuration](../DataModel/DataStructure)", "\n- [YieldCurve](../DataModel/DataStructure)", + "\n- [DataNodeParameters](../DataModel/DataStructure)", "\n- [AocType](../DataModel/DataStructure)", "\n- [AmountType](../DataModel/DataStructure)", "\n- [CalculationType](../DataModel/DataStructure)", @@ -43,7 +44,8 @@ { "cell_type": "code", "source": [ - "#!import \"../Utils/UtilityMethods\"" + "#!import \"../Utils/ImportCalculationMethods\"", + "\n#!import \"../Utils/Queries\"" ] }, { diff --git a/InputFormatDescription.ipynb b/InputFormatDescription.ipynb index 857d2cc9..bee76506 100644 --- a/InputFormatDescription.ipynb +++ b/InputFormatDescription.ipynb @@ -28,7 +28,7 @@ "\n# The Cashflows File Structure ", "\n", "\n", - "\n
" + "\n
" ] }, { @@ -56,7 +56,7 @@ "\n# The Actuals File Structure ", "\n", "\n", - "\n
" + "\n
" ] }, { @@ -80,7 +80,7 @@ "\n# The Openings File Structure ", "\n", "\n", - "\n
" + "\n
" ] }, { @@ -96,6 +96,12 @@ "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ] + }, + { + "cell_type": "markdown", + "source": [ + "" + ] } ] } \ No newline at end of file diff --git a/OverviewCalculationEngine.ipynb b/OverviewCalculationEngine.ipynb index a4ba1b36..d3d3e77b 100644 --- a/OverviewCalculationEngine.ipynb +++ b/OverviewCalculationEngine.ipynb @@ -34,7 +34,7 @@ "source": [ "# Introduction", "\n", - "\nThe Systemorph's IFRS 17 Calculation Engine is a solution to conduct all the essential IFRS 17 calculations based on some key inpute: modeled future **cashflows** and actual amounts, for a **groups of insurance contracts** and other relevant parameters (Yield Curve, Fx, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\nThe Systemorph's IFRS 17 Calculation Engine is a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts, for a **groups of insurance contracts** and other relevant parameters (Yield Curve, Fx, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", "\n", "\nThis notebook provides an **overview** of Systemorph's IFRS 17 Calculation Engine with brief introductions to all the main steps.", "\n", diff --git a/Report/ReportConfigurationAndUtils.ipynb b/Report/ReportConfigurationAndUtils.ipynb index 575ece44..d482e339 100644 --- a/Report/ReportConfigurationAndUtils.ipynb +++ b/Report/ReportConfigurationAndUtils.ipynb @@ -26,7 +26,7 @@ { "cell_type": "code", "source": [ - "#!import \"../Utils/UtilityMethods\"" + "#!import \"../Utils/Queries\"" ] }, { @@ -51,6 +51,12 @@ "\n with { Height = reportHeight, GroupDefaultExpanded = groupDefaultExpanded, OnGridReady = null } );" ] }, + { + "cell_type": "markdown", + "source": [ + "# Currency methods" + ] + }, { "cell_type": "code", "source": [ @@ -60,6 +66,24 @@ "\n _ => string.Empty };" ] }, + { + "cell_type": "code", + "source": [ + "public static double GetCurrencyToGroupFx(Dictionary> exchangeRates, string currency, FxPeriod fxPeriod, string groupCurrency)", + "\n{", + "\n if(currency == groupCurrency)", + "\n return 1;", + "\n", + "\n if(!exchangeRates.TryGetValue(currency, out var currencyToGroup))", + "\n ApplicationMessage.Log(Error.ExchangeRateCurrency, currency);", + "\n", + "\n if(!currencyToGroup.TryGetValue(fxPeriod, out var currencyToGroupFx))", + "\n ApplicationMessage.Log(Error.ExchangeRateNotFound, currency, fxPeriod.ToString());", + "\n", + "\n return currencyToGroupFx;", + "\n}" + ] + }, { "cell_type": "markdown", "source": [ diff --git a/Report/Reports.ipynb b/Report/Reports.ipynb index 36b8aa3e..91d3d680 100644 --- a/Report/Reports.ipynb +++ b/Report/Reports.ipynb @@ -103,7 +103,6 @@ "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args =", "\n //((2020, 12), reportingNodeRoot, null,CurrencyType.Contractual)", "\n ((2021, 3), reportingNodeRoot, null,CurrencyType.Contractual)", - "\n //((2021, 12), reportingNodeRoot, null,CurrencyType.Contractual)", "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Functional)", "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Group)", "\n ;", @@ -115,7 +114,28 @@ { "cell_type": "markdown", "source": [ - "# Present Value" + "# Data Constellation", + "\n", + "\nWe have " + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Present Value", + "\n", + "\nPresent values of the best estimate of future cashflows are shown here in an Analysis of Change report.", + "\n", + "\nThe report view can be modified with the Slice options for the columns by changing the SliceColumnBy inputs in the next command cell.", + "\nThe figures displayed in the report are automatically aggregated to meet the granularity desired by the user.", + "\n", + "\nCurrently, the data is sliced by :", + "\n- CurrencyType", + "\n- LiabilityType", + "\n- EconomicBasis", + "\n", + "\nFor example one can add \"GroupOfContract\" to separate the contributions of the individual Group of Contracts.", + "\n
We suggest to add this slice between the \"LiabilityType\" and the \"EconomicBasis\" as the the order of the inputs corresponds to the order of the columns shown in the report to expand the data." ] }, { @@ -126,7 +146,7 @@ "\n )", "\n .WithQuerySource(DataSource)", "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\", \"EconomicBasis\") //\"GroupOfContract\"", "\n .ReportGridOptions()", "\n .ToReport()" ] @@ -362,7 +382,9 @@ { "cell_type": "markdown", "source": [ - "# Financial Performance" + "# Financial Performance", + "\n", + "\nUse the expand and collapse buttons in the report rows to change the granularity of the figures displayed." ] }, { diff --git a/Test/MapTemplateAndImportTest.ipynb b/Test/MapTemplateAndImportTest.ipynb index cdb93e65..6dc5c63c 100644 --- a/Test/MapTemplateAndImportTest.ipynb +++ b/Test/MapTemplateAndImportTest.ipynb @@ -26,7 +26,8 @@ { "cell_type": "code", "source": [ - "#!eval-notebook \"../Utils/UtilityMethods\"" + "#!import \"../Export/Export\"", + "\n#!import \"../Utils/TestHelper\"" ] }, { @@ -132,8 +133,27 @@ "\n .MainTabConfigurationWoScenario(partition)", "\n.ExecuteAsync();", "\n", - "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", - "\n", + "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);" + ] + }, + { + "cell_type": "code", + "source": [ + "await Export.ToExcel(filename)", + "\n .WithSource(Workspace)", + "\n .PortfolioConfiguration()", + "\n .PortfolioConfiguration()", + "\n .GroupofContractConfiguration(typeof(ReinsurancePortfolio))", + "\n .GroupofContractConfiguration(typeof(InsurancePortfolio))", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "// Run this only after having imported the file exported in the above cell.", + "\n/*", "\n// check that exporter generates only the desired columns ", "\nvar extension = \".xlsx\";", "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", @@ -162,8 +182,7 @@ "\nUtils.EqualityComparer(rps, Workspace.Query().ToArray());", "\nUtils.EqualityComparer(gics, Workspace.Query().ToArray());", "\nUtils.EqualityComparer(grics, Workspace.Query().ToArray());", - "\n", - "\n" + "\n*/" ] }, { @@ -202,8 +221,25 @@ "\n .MainTabConfigurationWoScenario(partition)", "\n.ExecuteAsync();", "\n", - "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", - "\n", + "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);" + ] + }, + { + "cell_type": "code", + "source": [ + "await Export.ToExcel(filename)", + "\n .WithSource(Workspace)", + "\n .StateEnumConfiguration() ", + "\n .DataNodeStateConfiguration(dataNodeStates)", + "\n .MainTabConfigurationWoScenario(partition)", + "\n.ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "// Run this only after having imported the file exported in the above cell.", + "\n/*", "\n// check that exporter generates only the desired columns ", "\nvar extension = \".xlsx\";", "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", @@ -223,7 +259,8 @@ "\nawait UploadDataNodeStateToWorkspaceAsync(filename+\".xlsx\");", "\n", "\n// Workspace is empty because ValidateDataNodeStatesAsync removes the entry, since this is already present in the DataSource.", - "\nWorkspace.Query().ToArray().Should().BeEmpty();" + "\nWorkspace.Query().ToArray().Should().BeEmpty();", + "\n*/" ] }, { @@ -265,8 +302,24 @@ "\n .MainTabConfiguration(partition)", "\n.ExecuteAsync();", "\n", - "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);", - "\n//-----------------------------------------------------------------", + "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);" + ] + }, + { + "cell_type": "code", + "source": [ + "await Export.ToExcel(filename)", + "\n .WithSource(Workspace)", + "\n .DataNodeParameterConfiguration(dataNodeParameters)", + "\n .MainTabConfiguration(partition)", + "\n.ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "// Run this only after having imported the file exported in the above cell.", + "\n/*", "\n// check that exporter generates only the desired columns ", "\nvar extension = \".xlsx\";", "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", @@ -292,7 +345,8 @@ "\nvar expectedSingleDataNodeParamBm = Workspace.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month).ToArray();", "\nvar expectedInterDataNodeParamBm = Workspace.Query().ToArray();", "\nUtils.EqualityComparer(singleDataNodeParamBm, expectedSingleDataNodeParamBm);", - "\nUtils.EqualityComparer(interDataNodeParamBm, expectedInterDataNodeParamBm);" + "\nUtils.EqualityComparer(interDataNodeParamBm, expectedInterDataNodeParamBm);", + "\n*/" ] }, { diff --git a/Test/QueriesTest.ipynb b/Test/QueriesTest.ipynb index 3c102747..2eddc72f 100644 --- a/Test/QueriesTest.ipynb +++ b/Test/QueriesTest.ipynb @@ -20,7 +20,7 @@ { "cell_type": "code", "source": [ - "#!eval-notebook \"../Utils/UtilityMethods\"" + "#!eval-notebook \"../Utils/Queries\"" ] }, { diff --git a/Test/SpecificationsFinancialPerformance.ipynb b/Test/SpecificationsFinancialPerformance.ipynb index 44816ee6..219121be 100644 --- a/Test/SpecificationsFinancialPerformance.ipynb +++ b/Test/SpecificationsFinancialPerformance.ipynb @@ -240,6 +240,18 @@ "### Non Financial" ] }, + { + "cell_type": "markdown", + "source": [ + "Import `CheckEquality`" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Utils/TestHelper\"" + ] + }, { "cell_type": "markdown", "source": [ diff --git a/Test/SpecificationsSetup.ipynb b/Test/SpecificationsSetup.ipynb index 15228d6f..f4d8ab6f 100644 --- a/Test/SpecificationsSetup.ipynb +++ b/Test/SpecificationsSetup.ipynb @@ -17,10 +17,17 @@ "nbformat": 4, "nbformat_minor": 5, "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Specifications Setup

" + ] + }, { "cell_type": "code", "source": [ - "#!import \"../Import/ImportScopeCalculation\"" + "#!import \"../Import/ImportScopeCalculation\"", + "\n#!import \"../Utils/TestHelper\"" ] }, { diff --git a/Test/Tests.ipynb b/Test/Tests.ipynb index ba71bfbc..40b15ba1 100644 --- a/Test/Tests.ipynb +++ b/Test/Tests.ipynb @@ -98,7 +98,7 @@ { "cell_type": "code", "source": [ - "//#!eval-notebook \"MapTemplateAndImportTest\"" + "#!eval-notebook \"MapTemplateAndImportTest\"" ] }, { diff --git a/Utils/Extensions.ipynb b/Utils/Extensions.ipynb new file mode 100644 index 00000000..9e0adcb9 --- /dev/null +++ b/Utils/Extensions.ipynb @@ -0,0 +1,147 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!import \"../DataModel/DataStructure\"", + "\n#!import \"ApplicationMessage\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Enumerable Extensions" + ] + }, + { + "cell_type": "code", + "source": [ + "// because the default(T) is something else than the first/last element. What about \"static T GetValidElement(this IList array, int index)\"? ", + "\nstatic T GetElementOrDefault(this ICollection array, int index)", + "\n{ ", + "\n var count = array.Count;", + "\n if (array == null || count == 0)", + "\n return default(T);", + "\n", + "\n return index < 0", + "\n ? array.ElementAt(0) // should this case be removed?", + "\n : index < count", + "\n ? array.ElementAt(index)", + "\n : array.ElementAt(count -1);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static Dictionary ToDictionaryGrouped(this IEnumerable source, Func keySelector, Func, TResult> elementSelector) => source.GroupBy(keySelector).ToDictionary(g => g.Key, elementSelector);" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDataCube SelectToDataCube(this IEnumerable source, Func whereClause, Func selector) => source.Where(whereClause).Select(selector).ToDataCube();" + ] + }, + { + "cell_type": "code", + "source": [ + "public static IDataCube SelectToDataCube(this IEnumerable source, Func selector) => source.SelectToDataCube(x => true, selector);" + ] + }, + { + "cell_type": "code", + "source": [ + "public static double[] Prune (this IEnumerable source, double precision = Precision) => source.Reverse().SkipWhile(x => Math.Abs(x) < precision).Reverse().ToArray();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# String Extensions" + ] + }, + { + "cell_type": "code", + "source": [ + "using System.Globalization;" + ] + }, + { + "cell_type": "code", + "source": [ + "public static double CheckStringForExponentialAndConvertToDouble (this string s)", + "\n{ ", + "\n if (s == null) return default;", + "\n if (double.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out var doubleValue)) return doubleValue;", + "\n else { ApplicationMessage.Log(Error.ParsingScientificNotation, s); return 1; }", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Enum Extentions" + ] + }, + { + "cell_type": "code", + "source": [ + "public static bool Contains(this T value, T lookingForFlag) ", + "\n where T : struct", + "\n{", + "\n int intValue = (int) (object) value;", + "\n int intLookingForFlag = (int) (object) lookingForFlag;", + "\n return ((intValue & intLookingForFlag) == intLookingForFlag);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# ToIdentityString" + ] + }, + { + "cell_type": "code", + "source": [ + "using System.Text;", + "\npublic static string ToIdentityString(this T v)", + "\n where T : class", + "\n{", + "\n StringBuilder sb = new StringBuilder();", + "\n var propertyInfos = v.GetType()", + "\n .GetProperties()", + "\n .Where(x => Attribute.IsDefined(x, typeof(IdentityPropertyAttribute)))", + "\n .OrderByDescending(x => x.PropertyType.Name).ThenByDescending(x => x.Name)", + "\n .Select(x => sb.Append(x.Name).Append(\":\").Append(v.GetType().GetProperty(x.Name)?.GetValue(v, null)).Append(\", \"));", + "\n", + "\nreturn propertyInfos.Select(p => p.ToString()).ToArray().Last();", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/Utils/ImportCalculationMethods.ipynb b/Utils/ImportCalculationMethods.ipynb new file mode 100644 index 00000000..ec78d688 --- /dev/null +++ b/Utils/ImportCalculationMethods.ipynb @@ -0,0 +1,185 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!import \"./Extensions\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Get Previous Identities" + ] + }, + { + "cell_type": "code", + "source": [ + "public static Dictionary> GetPreviousIdentities(IEnumerable identities)", + "\n{", + "\n var bopNovelties = identities.Where(id => id.AocType == AocTypes.BOP).Select(id => id.Novelty);", + "\n var previousStep = (new string[]{Novelties.N,Novelties.I,Novelties.C})", + "\n .ToDictionary(n => n, n => bopNovelties.Contains(n) ? new AocStep(AocTypes.BOP,n) : null);", + "\n return identities.Where(id => id.AocType != AocTypes.BOP)", + "\n .ToDictionary(x => x, x => {var ret = x.AocType == AocTypes.CL ? previousStep.Where(kvp => kvp.Value != null).Select(kvp => kvp.Value).ToArray() ", + "\n : previousStep[x.Novelty].RepeatOnce();", + "\n previousStep[x.Novelty] = new AocStep(x.AocType, x.Novelty);", + "\n return ret;});", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Get Reference AocStep for calculated steps" + ] + }, + { + "cell_type": "code", + "source": [ + "public static AocStep GetReferenceAocStepForCalculated(this IEnumerable identities, Dictionary aocConfigurationByAocStep, AocStep identityAocStep)", + "\n{", + "\n return identities.LastOrDefault(aocStep => aocConfigurationByAocStep[aocStep].DataType != DataType.Calculated", + "\n && aocConfigurationByAocStep[aocStep].DataType != DataType.CalculatedTelescopic", + "\n && aocConfigurationByAocStep[aocStep].Order < aocConfigurationByAocStep[identityAocStep].Order", + "\n && aocStep.Novelty == identityAocStep.Novelty) ", + "\n ?? new AocStep(default, default);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Discount and Cumulate" + ] + }, + { + "cell_type": "code", + "source": [ + "public static double[] ComputeDiscountAndCumulate(this double[] nominalValues, double[] monthlyDiscounting, PeriodType periodType) ", + "\n{ ", + "\n if(nominalValues == null) return Enumerable.Empty().ToArray();", + "\n ", + "\n var ret = new double[nominalValues.Length];", + "\n ", + "\n if(periodType == PeriodType.BeginningOfPeriod)", + "\n {", + "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", + "\n ret[i] = nominalValues[i] + GetElementOrDefault(ret, i + 1) * GetElementOrDefault(monthlyDiscounting, i/12);", + "\n return ret;", + "\n }", + "\n ", + "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", + "\n ret[i] = ( nominalValues[i] + GetElementOrDefault(ret, i + 1) ) * GetElementOrDefault(monthlyDiscounting, i/12);", + "\n ", + "\n return ret;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static double[] ComputeDiscountAndCumulateWithCreditDefaultRisk(this double[] nominalValues, double[] monthlyDiscounting, double nonPerformanceRiskRate) //Is it correct that NonPerformanceRiskRate is a double? Should it be an array that takes as input tau/t?", + "\n{ ", + "\n return Enumerable.Range(0, nominalValues.Length)", + "\n .Select( t => Enumerable.Range(t, nominalValues.Length-t)", + "\n .Select( tau => nominalValues[tau] * Math.Pow(GetElementOrDefault(monthlyDiscounting, t/12), tau-t+1) * (Math.Exp(-nonPerformanceRiskRate*(tau-t)) - 1) )", + "\n .Sum() )", + "\n .ToArray();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Import Configuration " + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Data Nodes" + ] + }, + { + "cell_type": "code", + "source": [ + "public GroupOfInsuranceContract ExtendGroupOfContract(GroupOfInsuranceContract gic, IDataRow datarow) => gic;" + ] + }, + { + "cell_type": "code", + "source": [ + "public GroupOfReinsuranceContract ExtendGroupOfContract(GroupOfReinsuranceContract gric, IDataRow datarow) => gric;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Change Sign Rules" + ] + }, + { + "cell_type": "code", + "source": [ + "public static int GetSign((string AocType, string AmountType, string EstimateType, bool IsReinsurance) variable, Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", + "\n{", + "\n var isActual = (new string[] { EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.A }).Contains(variable.EstimateType) ? -1 : 1;", + "\n return isActual;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## EstimateType And AmountType" + ] + }, + { + "cell_type": "code", + "source": [ + "public static Dictionary> GetAmountTypesByEstimateType(Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", + "\n{", + "\n return new Dictionary>(){", + "\n {EstimateTypes.RA, new string[]{}.ToHashSet()},", + "\n {EstimateTypes.C, new string[]{}.ToHashSet()},", + "\n {EstimateTypes.L, new string[]{}.ToHashSet()},", + "\n {EstimateTypes.LR, new string[]{}.ToHashSet()},", + "\n };", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Technical Margin EstimateType" + ] + }, + { + "cell_type": "code", + "source": [ + "public static HashSet GetTechnicalMarginEstimateType()", + "\n{", + "\n return new []{EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, }.ToHashSet();", + "\n}" + ] + } + ] +} \ No newline at end of file diff --git a/Utils/Queries.ipynb b/Utils/Queries.ipynb new file mode 100644 index 00000000..02105032 --- /dev/null +++ b/Utils/Queries.ipynb @@ -0,0 +1,320 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!import \"./Extensions\"" + ] + }, + { + "cell_type": "code", + "source": [ + "using System.Linq.Expressions;" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Exchange Rates" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>> GetExchangeRatesDictionaryAsync(this IQuerySource querySource, int year, int month)", + "\n => (await querySource.Query()", + "\n .Where(x => x.Year == year - 1 && x.Month == MonthInAYear && x.FxType == FxType.Spot ||", + "\n x.Year == year && x.Month == month)", + "\n .ToArrayAsync())", + "\n .ToDictionaryGrouped(x => x.Currency,", + "\n x => x.ToDictionary(y => (y.Year, y.Month, y.FxType) switch", + "\n {", + "\n (_, _, _) when y.Year == year - 1 && y.Month == MonthInAYear && y.FxType == FxType.Spot => FxPeriod.BeginningOfPeriod,", + "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Average => FxPeriod.Average,", + "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Spot => FxPeriod.EndOfPeriod", + "\n },", + "\n y => y.FxToGroupCurrency));" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Current and Previous Parameters" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task LoadParameterAsync(", + "\n this IQuerySource querySource,", + "\n int year,", + "\n int month,", + "\n Expression> filterExpression = null ) ", + "\n where T : IWithYearAndMonth", + "\n{", + "\n return await querySource.Query()", + "\n .Where(x => x.Year == year && x.Month <= month || x.Year < year)", + "\n .Where(filterExpression?? (Expression>)(x => true))", + "\n .ToArrayAsync();", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadCurrentParameterAsync (", + "\n this IQuerySource querySource,", + "\n Args args,", + "\n Func identityExpression,", + "\n Expression> filterExpression = null ) ", + "\n where T : IWithYearAndMonth", + "\n{", + "\n return (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression))", + "\n .GroupBy(identityExpression)", + "\n .Select(y => y.OrderByDescending(x => x.Year)", + "\n .ThenByDescending(x => x.Month)", + "\n .FirstOrDefault())", + "\n .ToDictionary(identityExpression);", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>> LoadCurrentAndPreviousParameterAsync (", + "\n this IQuerySource querySource,", + "\n Args args,", + "\n Func identityExpression,", + "\n Expression> filterExpression = null ) ", + "\n where T : IWithYearAndMonth", + "\n{", + "\n var parameters = (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression)).GroupBy(identityExpression);", + "\n ", + "\n var ret = new Dictionary>();", + "\n foreach(var p in parameters)", + "\n {", + "\n var inner = ret.GetOrAdd(p.Key, _ => new Dictionary());", + "\n", + "\n var currentCandidate = p.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", + "\n var previousCandidate = p.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", + "\n ", + "\n inner.Add(CurrentPeriod, currentCandidate != null ? currentCandidate : previousCandidate);", + "\n inner.Add(PreviousPeriod, previousCandidate != null ? previousCandidate : currentCandidate);", + "\n }", + "\n return ret;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Yield Curve" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Locked-in" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadLockedInYieldCurveAsync(this IQuerySource querySource, Args args, ", + "\n IEnumerable dataNodes)", + "\n{", + "\n var lockedInYieldCurveByGoc = new Dictionary();", + "\n foreach (var dn in dataNodes.Where(x => x.ValuationApproach == ValuationApproaches.BBA))", + "\n {", + "\n var argsNew = args with {Year = dn.Year, Month = dn.Month};", + "\n var loadedYc = (await querySource.LoadCurrentParameterAsync(argsNew, x => x.Currency, x => x.Currency == dn.ContractualCurrency));", + "\n ", + "\n if(!loadedYc.TryGetValue(dn.ContractualCurrency, out var lockedYc))", + "\n ApplicationMessage.Log(Error.YieldCurveNotFound, dn.ContractualCurrency, argsNew.Year.ToString(), argsNew.Month.ToString());", + "\n ", + "\n lockedInYieldCurveByGoc[dn.DataNode] = lockedYc;", + "\n }", + "\n ", + "\n return lockedInYieldCurveByGoc;", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Current" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>> LoadCurrentYieldCurveAsync(this IQuerySource querySource, Args args, ", + "\n IEnumerable dataNodes)", + "\n{", + "\n var contractualCurrenciesInScope = dataNodes.Select(dn => dn.ContractualCurrency).ToHashSet();", + "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, ", + "\n x => x.Currency,", + "\n x => contractualCurrenciesInScope.Contains(x.Currency)", + "\n ));", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Data Node State" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadDataNodeStateAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode))", + "\n .Where(x => x.Value[CurrentPeriod].State != State.Inactive)", + "\n .ToDictionary(x => x.Key, x => x.Value[CurrentPeriod]);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Data Nodes" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadDataNodesAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n var dataNodeStates = await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", + "\n var activeDataNodes = dataNodeStates.Where(kvp => kvp.Value[CurrentPeriod].State != State.Inactive).Select(kvp => kvp.Key);", + "\n ", + "\n return (await querySource.Query().Where(dn => activeDataNodes.Contains(dn.SystemName)).ToArrayAsync())", + "\n .ToDictionary(dn => dn.SystemName, dn => {", + "\n var dnCurrentState = dataNodeStates[dn.SystemName][CurrentPeriod];", + "\n var dnPreviousState = dataNodeStates[dn.SystemName][PreviousPeriod];", + "\n return new DataNodeData(){Year = dnPreviousState.Year, ", + "\n Month = dnPreviousState.Month,", + "\n State = dnCurrentState.State,", + "\n PreviousState = dnPreviousState.State,", + "\n DataNode = dn.SystemName,", + "\n ContractualCurrency = dn.ContractualCurrency,", + "\n FunctionalCurrency = dn.FunctionalCurrency,", + "\n LineOfBusiness = dn.LineOfBusiness,", + "\n ValuationApproach = dn.ValuationApproach,", + "\n OciType = dn.OciType,", + "\n Portfolio = dn.Portfolio,", + "\n AnnualCohort = dn.AnnualCohort,", + "\n LiabilityType = dn.LiabilityType,", + "\n Profitability = dn.Profitability,", + "\n Partner = dn.Partner,", + "\n IsReinsurance = dn.GetType() == typeof(GroupOfReinsuranceContract),", + "\n };", + "\n }", + "\n );", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Data Node Parameters" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Single data Node" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>> LoadSingleDataNodeParametersAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n return await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Inter data Node" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task>>> LoadInterDataNodeParametersAsync(this IQuerySource querySource, Args args)", + "\n{", + "\n var identityExpressions = new Func[]{x => x.DataNode, x => x.LinkedDataNode,};", + "\n var parameterArray = (await querySource.LoadParameterAsync(args.Year, args.Month));", + "\n var parameters = identityExpressions.SelectMany(ie => parameterArray.GroupBy(ie));", + "\n ", + "\n return parameters.SelectMany(p => p", + "\n .GroupBy(x => x.DataNode != p.Key ? x.DataNode : x.LinkedDataNode)", + "\n .Select(gg =>", + "\n {", + "\n var currentCandidate = gg.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", + "\n var previousCandidate = gg.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", + "\n return (key: p.Key,", + "\n currentPeriod: currentCandidate != null ? currentCandidate : previousCandidate,", + "\n previousPeriod: previousCandidate != null ? previousCandidate : currentCandidate);", + "\n })", + "\n )", + "\n .ToDictionaryGrouped(x => x.key,", + "\n x => new Dictionary>{ {CurrentPeriod, x.Select(y => y.currentPeriod).ToHashSet()},", + "\n {PreviousPeriod, x.Select(y => y.previousPeriod).ToHashSet()}});", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Aoc Step Configuration" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadAocStepConfigurationAsync(this IQuerySource querySource, int year, int month)", + "\n => (await querySource.LoadParameterAsync(year, month))", + "\n .GroupBy(x => (x.AocType, x.Novelty), ", + "\n (k, v) => v.OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).First()); " + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> LoadAocStepConfigurationAsDictionaryAsync(this IQuerySource querySource, int year, int month) ", + "\n => (await querySource.LoadAocStepConfigurationAsync(year, month))", + "\n .ToDictionary(x => new AocStep(x.AocType, x.Novelty)); " + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/Utils/TestHelper.ipynb b/Utils/TestHelper.ipynb new file mode 100644 index 00000000..a627b204 --- /dev/null +++ b/Utils/TestHelper.ipynb @@ -0,0 +1,113 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!import \"../DataModel/DataStructure\"" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class Utils {", + "\n public static void EqualityComparer (T[] collection1, T[] collection2) ", + "\n {", + "\n collection1.Length.Should().Be(collection2.Length);", + "\n var type = typeof(T);", + "\n var properties = type.GetProperties().Where(p => p.Name != \"Id\").ToArray();", + "\n if(properties.Count() == 0) {", + "\n bool isEqual = Enumerable.SequenceEqual(collection1, collection2);", + "\n isEqual.Should().Be(true);", + "\n }", + "\n foreach(var item1 in collection1) {", + "\n var item2 = collection2.Where(x => ", + "\n properties.All(prop => {", + "\n var propType = prop.PropertyType;", + "\n var val = prop.GetValue(item1);", + "\n var otherVal = prop.GetValue(x);", + "\n if(val == null && otherVal == null) return true;", + "\n else if((val != null && otherVal == null) || (val == null && otherVal != null)) return false;", + "\n else return Convert.ChangeType(otherVal, propType).Equals( Convert.ChangeType(val, propType) );", + "\n })", + "\n );", + "\n item2.Count().Should().NotBe(0);", + "\n }", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "static var NumericalPrecisionEqualityChecker = 1.0E-10;", + "\n", + "\nstatic bool CheckEquality(this double[] arr1, double[] arr2) ", + "\n{", + "\n if(arr1.Length != arr2.Length) return false;", + "\n for(int i = 0; i < arr1.Length; i++) {", + "\n double d1 = arr1[i];", + "\n double d2 = arr2[i];", + "\n if(Math.Abs(d1) < NumericalPrecisionEqualityChecker && Math.Abs(d1) < NumericalPrecisionEqualityChecker) continue;", + "\n if(Math.Abs( (d1 - d2) / d1 ) > NumericalPrecisionEqualityChecker) return false;", + "\n }", + "\n return true;", + "\n}", + "\n", + "\nstatic bool CheckEquality(this IEnumerable arr1, double[] arr2) => CheckEquality(arr1.ToArray(), arr2);", + "\nstatic bool CheckEquality(this double[] arr1, IEnumerable arr2) => CheckEquality(arr1, arr2.ToArray());", + "\nstatic bool CheckEquality(this IEnumerable arr1, IEnumerable arr2) => CheckEquality(arr1.ToArray(), arr2.ToArray());", + "\nstatic bool CheckEquality(this double d1, double d2) => CheckEquality(d1.RepeatOnce(), d2.RepeatOnce());", + "\n", + "\nstatic bool CheckEquality(this double? d1, double? d2) ", + "\n{", + "\n if(d1 == null && d2 == null) return true;", + "\n else return CheckEquality((double)d1, (double)d2);", + "\n}", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# IfrsVariable Report configuration" + ] + }, + { + "cell_type": "code", + "source": [ + "using Systemorph.Vertex.Pivot.Reporting.Builder;" + ] + }, + { + "cell_type": "code", + "source": [ + "public static ReportBuilder WithGridOptionsForIfrsVariable", + "\n(this ReportBuilder reportBuilder, int reportHeight = 650)", + "\n{", + "\n return reportBuilder.WithGridOptions(go => go.WithColumns(cols => cols.Modify(\"Value\", c => c.WithWidth(300)", + "\n .WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", + "\n .WithRows(rows => rows.Where(r => !r.RowGroup.SystemName.EndsWith(\"NullGroup\")).ToList())", + "\n .WithAutoGroupColumn(c => c.WithWidth(250) with { Pinned = \"left\" }) with { Height = reportHeight, GroupDefaultExpanded = 2, OnGridReady = null }", + "\n );", + "\n}" + ] + } + ] +} \ No newline at end of file diff --git a/Utils/UtilityMethods.ipynb b/Utils/UtilityMethods.ipynb deleted file mode 100644 index 3436c3e7..00000000 --- a/Utils/UtilityMethods.ipynb +++ /dev/null @@ -1,899 +0,0 @@ -{ - "metadata": { - "authors": [], - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "cell_type": "code", - "source": [ - "#!import \"../DataModel/DataStructure\"", - "\n#!import \"./ApplicationMessage\"" - ] - }, - { - "cell_type": "code", - "source": [ - "using System.Linq.Expressions;" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Math Functions" - ] - }, - { - "cell_type": "code", - "source": [ - "static double DivideOrDefault(double numerator, double denominator, double defaultValue = default) => Math.Abs(denominator) > double.Epsilon ? numerator / denominator : defaultValue;" - ] - }, - { - "cell_type": "code", - "source": [ - "// because the default(T) is something else than the first/last element. What about \"static T GetValidElement(this IList array, int index)\"? ", - "\nstatic T GetElementOrDefault(this ICollection array, int index)", - "\n{ ", - "\n var count = array.Count;", - "\n if (array == null || count == 0)", - "\n return default(T);", - "\n", - "\n return index < 0", - "\n ? array.ElementAt(0) // should this case be removed?", - "\n : index < count", - "\n ? array.ElementAt(index)", - "\n : array.ElementAt(count -1);", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Enumerable Extensions" - ] - }, - { - "cell_type": "code", - "source": [ - "public static Dictionary ToDictionaryGrouped(this IEnumerable source, Func keySelector, Func, TResult> elementSelector) => source.GroupBy(keySelector).ToDictionary(g => g.Key, elementSelector);" - ] - }, - { - "cell_type": "code", - "source": [ - "public static IDataCube SelectToDataCube(this IEnumerable source, Func whereClause, Func selector) => source.Where(whereClause).Select(selector).ToDataCube();" - ] - }, - { - "cell_type": "code", - "source": [ - "public static IDataCube SelectToDataCube(this IEnumerable source, Func selector) => source.SelectToDataCube(x => true, selector);" - ] - }, - { - "cell_type": "code", - "source": [ - "public static double[] Prune (this IEnumerable source, double precision = Precision) => source.Reverse().SkipWhile(x => Math.Abs(x) < precision).Reverse().ToArray();" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# String Extensions" - ] - }, - { - "cell_type": "code", - "source": [ - "using System.Globalization;" - ] - }, - { - "cell_type": "code", - "source": [ - "public static double CheckStringForExponentialAndConvertToDouble (this string s)", - "\n{ ", - "\n if (s == null) return default;", - "\n if (double.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out var doubleValue)) return doubleValue;", - "\n else { ApplicationMessage.Log(Error.ParsingScientificNotation, s); return 1; }", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Enum Extentions" - ] - }, - { - "cell_type": "code", - "source": [ - "public static bool Contains(this T value, T lookingForFlag) ", - "\n where T : struct", - "\n{", - "\n int intValue = (int) (object) value;", - "\n int intLookingForFlag = (int) (object) lookingForFlag;", - "\n return ((intValue & intLookingForFlag) == intLookingForFlag);", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Queries" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## FX" - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task>> GetExchangeRatesDictionaryAsync(this IQuerySource querySource, int year, int month)", - "\n => (await querySource.Query()", - "\n .Where(x => x.Year == year - 1 && x.Month == MonthInAYear && x.FxType == FxType.Spot ||", - "\n x.Year == year && x.Month == month)", - "\n .ToArrayAsync())", - "\n .ToDictionaryGrouped(x => x.Currency,", - "\n x => x.ToDictionary(y => (y.Year, y.Month, y.FxType) switch", - "\n {", - "\n (_, _, _) when y.Year == year - 1 && y.Month == MonthInAYear && y.FxType == FxType.Spot => FxPeriod.BeginningOfPeriod,", - "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Average => FxPeriod.Average,", - "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Spot => FxPeriod.EndOfPeriod", - "\n },", - "\n y => y.FxToGroupCurrency));" - ] - }, - { - "cell_type": "code", - "source": [ - "public static double GetCurrencyToGroupFx(Dictionary> exchangeRates, string currency, FxPeriod fxPeriod, string groupCurrency)", - "\n{", - "\n if(currency == groupCurrency)", - "\n return 1;", - "\n", - "\n if(!exchangeRates.TryGetValue(currency, out var currencyToGroup))", - "\n ApplicationMessage.Log(Error.ExchangeRateCurrency, currency);", - "\n", - "\n if(!currencyToGroup.TryGetValue(fxPeriod, out var currencyToGroupFx))", - "\n ApplicationMessage.Log(Error.ExchangeRateNotFound, currency, fxPeriod.ToString());", - "\n", - "\n return currencyToGroupFx;", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Current and Previous Parameters" - ] - }, - { - "cell_type": "markdown", - "source": [ - "TODOs:", - "\n
    ", - "\n
  • DataNodes Query: After merging with the new import storage, define IsFirstPeriod property.
  • ", - "\n
  • Once Scenario is defined as a simple property (e.g. in DataNodeState), introduce concept of Priority in LoadCurrentAndPreviousParameterAsync query (see ParameterResultsEntityQueryExtensions in IfrsGeneric).
  • ", - "\n
" - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task LoadParameterAsync(", - "\n this IQuerySource querySource,", - "\n int year,", - "\n int month,", - "\n Expression> filterExpression = null ) ", - "\n where T : IWithYearAndMonth", - "\n{", - "\n return await querySource.Query()", - "\n .Where(x => x.Year == year && x.Month <= month || x.Year < year)", - "\n .Where(filterExpression?? (Expression>)(x => true))", - "\n .ToArrayAsync();", - "\n}" - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task> LoadCurrentParameterAsync (", - "\n this IQuerySource querySource,", - "\n Args args,", - "\n Func identityExpression,", - "\n Expression> filterExpression = null ) ", - "\n where T : IWithYearAndMonth", - "\n{", - "\n return (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression))", - "\n .GroupBy(identityExpression)", - "\n .Select(y => y.OrderByDescending(x => x.Year)", - "\n .ThenByDescending(x => x.Month)", - "\n .FirstOrDefault())", - "\n .ToDictionary(identityExpression);", - "\n}" - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task>> LoadCurrentAndPreviousParameterAsync (", - "\n this IQuerySource querySource,", - "\n Args args,", - "\n Func identityExpression,", - "\n Expression> filterExpression = null ) ", - "\n where T : IWithYearAndMonth", - "\n{", - "\n var parameters = (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression)).GroupBy(identityExpression);", - "\n ", - "\n var ret = new Dictionary>();", - "\n foreach(var p in parameters)", - "\n {", - "\n var inner = ret.GetOrAdd(p.Key, _ => new Dictionary());", - "\n", - "\n var currentCandidate = p.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", - "\n var previousCandidate = p.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", - "\n ", - "\n inner.Add(CurrentPeriod, currentCandidate != null ? currentCandidate : previousCandidate);", - "\n inner.Add(PreviousPeriod, previousCandidate != null ? previousCandidate : currentCandidate);", - "\n }", - "\n return ret;", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Yield Curve" - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task> LoadLockedInYieldCurveAsync(this IQuerySource querySource, Args args, ", - "\n IEnumerable dataNodes)", - "\n{", - "\n var lockedInYieldCurveByGoc = new Dictionary();", - "\n foreach (var dn in dataNodes.Where(x => x.ValuationApproach == ValuationApproaches.BBA))", - "\n {", - "\n var argsNew = args with {Year = dn.Year, Month = dn.Month};", - "\n var loadedYc = (await querySource.LoadCurrentParameterAsync(argsNew, x => x.Currency, x => x.Currency == dn.ContractualCurrency));", - "\n ", - "\n if(!loadedYc.TryGetValue(dn.ContractualCurrency, out var lockedYc))", - "\n ApplicationMessage.Log(Error.YieldCurveNotFound, dn.ContractualCurrency, argsNew.Year.ToString(), argsNew.Month.ToString());", - "\n ", - "\n lockedInYieldCurveByGoc[dn.DataNode] = lockedYc;", - "\n }", - "\n ", - "\n return lockedInYieldCurveByGoc;", - "\n}" - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task>> LoadCurrentYieldCurveAsync(this IQuerySource querySource, Args args, ", - "\n IEnumerable dataNodes)", - "\n{", - "\n var contractualCurrenciesInScope = dataNodes.Select(dn => dn.ContractualCurrency).ToHashSet();", - "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, ", - "\n x => x.Currency,", - "\n x => contractualCurrenciesInScope.Contains(x.Currency)", - "\n ));", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Data Node State" - ] - }, - { - "cell_type": "code", - "source": [ - "//TODO : remove this method and clean up in queriesTest. We need a new test for LoadDataNodes.", - "\npublic static async Task> LoadDataNodeStateAsync(this IQuerySource querySource, Args args)", - "\n{", - "\n //This querySource is partitioned", - "\n return (await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode))", - "\n .Where(x => x.Value[CurrentPeriod].State != State.Inactive)", - "\n .ToDictionary(x => x.Key, x => x.Value[CurrentPeriod]);", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Data Nodes" - ] - }, - { - "cell_type": "code", - "source": [ - "// TODO: the name of this method is strange, one expects DataNodes in return but instead obtains DataNodeData...", - "\npublic static async Task> LoadDataNodesAsync(this IQuerySource querySource, Args args) //How do we force the user to provide here a partitioned source? IWorkspace?", - "\n{", - "\n var dataNodeStates = await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", - "\n var activeDataNodes = dataNodeStates.Where(kvp => kvp.Value[CurrentPeriod].State != State.Inactive).Select(kvp => kvp.Key);", - "\n ", - "\n return (await querySource.Query().Where(dn => activeDataNodes.Contains(dn.SystemName)).ToArrayAsync())", - "\n .ToDictionary(dn => dn.SystemName, dn => {", - "\n var dnCurrentState = dataNodeStates[dn.SystemName][CurrentPeriod];", - "\n var dnPreviousState = dataNodeStates[dn.SystemName][PreviousPeriod];", - "\n return new DataNodeData(){Year = dnPreviousState.Year, ", - "\n Month = dnPreviousState.Month,", - "\n State = dnCurrentState.State,", - "\n PreviousState = dnPreviousState.State,", - "\n //from Group of Contract", - "\n DataNode = dn.SystemName,", - "\n ContractualCurrency = dn.ContractualCurrency,", - "\n FunctionalCurrency = dn.FunctionalCurrency,", - "\n LineOfBusiness = dn.LineOfBusiness,", - "\n ValuationApproach = dn.ValuationApproach,", - "\n OciType = dn.OciType,", - "\n Portfolio = dn.Portfolio,", - "\n AnnualCohort = dn.AnnualCohort,", - "\n LiabilityType = dn.LiabilityType,", - "\n Profitability = dn.Profitability,", - "\n Partner = dn.Partner,", - "\n IsReinsurance = dn.GetType() == typeof(GroupOfReinsuranceContract),", - "\n };", - "\n }", - "\n );", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Data Node Parameters" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Single data Node" - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task>> LoadSingleDataNodeParametersAsync(this IQuerySource querySource, Args args)", - "\n{", - "\n return await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Inter data Node" - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task>>> LoadInterDataNodeParametersAsync(this IQuerySource querySource, Args args)", - "\n{", - "\n var identityExpressions = new Func[]{x => x.DataNode, x => x.LinkedDataNode,};", - "\n var parameterArray = (await querySource.LoadParameterAsync(args.Year, args.Month));", - "\n var parameters = identityExpressions.SelectMany(ie => parameterArray.GroupBy(ie));", - "\n ", - "\n return parameters.SelectMany(p => p", - "\n .GroupBy(x => x.DataNode != p.Key ? x.DataNode : x.LinkedDataNode)", - "\n .Select(gg =>", - "\n {", - "\n var currentCandidate = gg.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", - "\n var previousCandidate = gg.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", - "\n return (key: p.Key,", - "\n currentPeriod: currentCandidate != null ? currentCandidate : previousCandidate,", - "\n previousPeriod: previousCandidate != null ? previousCandidate : currentCandidate);", - "\n })", - "\n )", - "\n .ToDictionaryGrouped(x => x.key,", - "\n x => new Dictionary>{ {CurrentPeriod, x.Select(y => y.currentPeriod).ToHashSet()},", - "\n {PreviousPeriod, x.Select(y => y.previousPeriod).ToHashSet()}});", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Aoc Step Configuration" - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task> LoadAocStepConfigurationAsync(this IQuerySource querySource, int year, int month)", - "\n => (await querySource.LoadParameterAsync(year, month)).GroupBy(x => (x.AocType, x.Novelty), (k, v) => v.OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).First()); " - ] - }, - { - "cell_type": "code", - "source": [ - "public static async Task> LoadAocStepConfigurationAsDictionaryAsync(this IQuerySource querySource, int year, int month) => (await querySource.LoadAocStepConfigurationAsync(year, month)).ToDictionary(x => new AocStep(x.AocType, x.Novelty)); " - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Export Configurations" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Main Tab" - ] - }, - { - "cell_type": "code", - "source": [ - "public static IDocumentBuilder MainTabConfigurationWoScenario(this IDocumentBuilder builder, T args) where T : IfrsPartition", - "\n => builder.WithTable( config => config .AtBeginning() ", - "\n .WithName(Main) ", - "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", - "\n .WithColumn(x => x.Id, x => x.Delete())", - "\n .WithColumn(x => x.Scenario, x => x.Delete()));" - ] - }, - { - "cell_type": "code", - "source": [ - "public static IDocumentBuilder MainTabConfiguration(this IDocumentBuilder builder, T args) where T : IfrsPartition", - "\n => builder.WithTable( config => config .AtBeginning() ", - "\n .WithName(Main) ", - "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", - "\n .WithColumn(x => x.Id, x => x.Delete()));" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Dimensions" - ] - }, - { - "cell_type": "code", - "source": [ - "public static IDocumentBuilder PortfolioConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : Portfolio", - "\n => builder.WithTable(config => { ", - "\n if(DependsOnType != default)", - "\n config = config.DependsOn(DependsOnType); ", - "\n return config .AtBeginning() ", - "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", - "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete());", - "\n });" - ] - }, - { - "cell_type": "code", - "source": [ - "public static IDocumentBuilder GroupofContractConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : GroupOfContract", - "\n => builder.WithTable(config => { ", - "\n if(DependsOnType != default)", - "\n config = config.DependsOn(DependsOnType); ", - "\n if(typeof(T).Name == nameof(GroupOfInsuranceContract))", - "\n config = config.WithColumn(x => x.Partner, x => x.Delete());", - "\n return config .AtBeginning() ", - "\n .WithColumn(x => x.DisplayName, x => x.AtBeginning())", - "\n .WithColumn(x => x.SystemName, x => x.AtBeginning())", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.ContractualCurrency, x => x.Delete())", - "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete())", - "\n .WithColumn(x => x.LineOfBusiness, x => x.Delete())", - "\n .WithColumn(x => x.OciType, x => x.Delete())", - "\n .WithColumn(x => x.ValuationApproach, x => x.Delete());", - "\n });" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Data Node State" - ] - }, - { - "cell_type": "code", - "source": [ - "using DocumentFormat.OpenXml.Spreadsheet;" - ] - }, - { - "cell_type": "code", - "source": [ - "public record HelperState { public string State {get; init;} }" - ] - }, - { - "cell_type": "code", - "source": [ - "public static IExcelDocumentBuilder DataNodeStateConfiguration (this IExcelDocumentBuilder builder, DataNodeState[] data)", - "\n => builder", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(config => config ", - "\n .AtBeginning() ", - "\n .WithSource(source => data.AsQueryable())", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.Month, x => x.Delete())", - "\n .WithColumn(x => x.Year, x => x.Delete())", - "\n .WithColumn(x => x.Id, x => x.Delete())", - "\n .WithColumn(x => x.State, y => y.WithDataValidation(z => z.WithReferenceTo(t => t.State)))", - "\n );" - ] - }, - { - "cell_type": "code", - "source": [ - "public static IExcelDocumentBuilder StateEnumConfiguration (this IExcelDocumentBuilder builder)", - "\n{", - "\n var helperState = new[] {new HelperState {State = \"Active\"}, new HelperState {State = \"Inactive\"} }; ", - "\n return builder.WithTable( config => config .WithSheetVisibility(SheetStateValues.Hidden)", - "\n //.WithColumn(x => x.State, z => z.WithNamedRange(y => y.WithName(\"HelperState_State\")))", - "\n .WithColumn(x => x.State, z => z.WithDefaultNamedRange())", - "\n .WithSource(source => helperState.AsQueryable()) );", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Data Node Parameter" - ] - }, - { - "cell_type": "code", - "source": [ - "public static IExcelDocumentBuilder DataNodeParameterConfiguration (this IExcelDocumentBuilder builder, Dictionary data)", - "\n => builder", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(x => x.Delete())", - "\n .WithTable(config => config ", - "\n .AtBeginning() ", - "\n .WithSource(source => data[nameof(InterDataNodeParameter)].Cast().AsQueryable())", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.Month, x => x.Delete())", - "\n .WithColumn(x => x.Id, x => x.Delete())", - "\n .WithColumn(x => x.Year, x => x.Delete())", - "\n )", - "\n .WithTable(config => config ", - "\n .AtBeginning() ", - "\n .WithSource(source => data[nameof(SingleDataNodeParameter)].Cast().AsQueryable())", - "\n .WithColumn(x => x.DataNode, x => x.WithHeader(\"DataNode\"))", - "\n .WithColumn(x => x.Partition, x => x.Delete())", - "\n .WithColumn(x => x.Month, x => x.Delete())", - "\n .WithColumn(x => x.Year, x => x.Delete())", - "\n .WithColumn(x => x.Year, x => x.Delete())", - "\n .WithColumn(x => x.Id, x => x.Delete())", - "\n );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Report Configurations" - ] - }, - { - "cell_type": "code", - "source": [ - "using Systemorph.Vertex.Pivot.Reporting.Builder;" - ] - }, - { - "cell_type": "code", - "source": [ - "public static ReportBuilder WithGridOptionsForIfrsVariable", - "\n(this ReportBuilder reportBuilder, int reportHeight = 650)", - "\n{", - "\n return reportBuilder.WithGridOptions(go => go.WithColumns(cols => cols.Modify(\"Value\", c => c.WithWidth(300)", - "\n .WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", - "\n .WithRows(rows => rows.Where(r => !r.RowGroup.SystemName.EndsWith(\"NullGroup\")).ToList())", - "\n .WithAutoGroupColumn(c => c.WithWidth(250) with { Pinned = \"left\" }) with { Height = reportHeight, GroupDefaultExpanded = 2, OnGridReady = null }", - "\n );", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Utility Methods Class" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This class contains:", - "\n- EqualityComparer" - ] - }, - { - "cell_type": "code", - "source": [ - "public static class Utils {", - "\n public static void EqualityComparer (T[] collection1, T[] collection2) ", - "\n {", - "\n collection1.Length.Should().Be(collection2.Length);", - "\n var type = typeof(T);", - "\n var properties = type.GetProperties().Where(p => p.Name != \"Id\").ToArray();", - "\n if(properties.Count() == 0) {", - "\n bool isEqual = Enumerable.SequenceEqual(collection1, collection2);", - "\n isEqual.Should().Be(true);", - "\n }", - "\n foreach(var item1 in collection1) {", - "\n var item2 = collection2.Where(x => ", - "\n properties.All(prop => {", - "\n var propType = prop.PropertyType;", - "\n var val = prop.GetValue(item1);", - "\n var otherVal = prop.GetValue(x);", - "\n if(val == null && otherVal == null) return true;", - "\n else if((val != null && otherVal == null) || (val == null && otherVal != null)) return false;", - "\n else return Convert.ChangeType(otherVal, propType).Equals( Convert.ChangeType(val, propType) );", - "\n })", - "\n );", - "\n item2.Count().Should().NotBe(0);", - "\n }", - "\n }", - "\n}" - ] - }, - { - "cell_type": "code", - "source": [ - "// TODO: find a better arrangement to these methods", - "\nstatic var NumericalPrecisionEqualityChecker = 1.0E-10;", - "\n", - "\nstatic bool CheckEquality(this double[] arr1, double[] arr2) ", - "\n{", - "\n if(arr1.Length != arr2.Length) return false;", - "\n for(int i = 0; i < arr1.Length; i++) {", - "\n double d1 = arr1[i];", - "\n double d2 = arr2[i];", - "\n if(Math.Abs(d1) < NumericalPrecisionEqualityChecker && Math.Abs(d1) < NumericalPrecisionEqualityChecker) continue;", - "\n if(Math.Abs( (d1 - d2) / d1 ) > NumericalPrecisionEqualityChecker) return false;", - "\n }", - "\n return true;", - "\n}", - "\n", - "\nstatic bool CheckEquality(this IEnumerable arr1, double[] arr2) => CheckEquality(arr1.ToArray(), arr2);", - "\nstatic bool CheckEquality(this double[] arr1, IEnumerable arr2) => CheckEquality(arr1, arr2.ToArray());", - "\nstatic bool CheckEquality(this IEnumerable arr1, IEnumerable arr2) => CheckEquality(arr1.ToArray(), arr2.ToArray());", - "\nstatic bool CheckEquality(this double d1, double d2) => CheckEquality(d1.RepeatOnce(), d2.RepeatOnce());", - "\n", - "\nstatic bool CheckEquality(this double? d1, double? d2) ", - "\n{", - "\n if(d1 == null && d2 == null) return true;", - "\n else return CheckEquality((double)d1, (double)d2);", - "\n}", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## ToIdentityString" - ] - }, - { - "cell_type": "code", - "source": [ - "using System.Text;", - "\npublic static string ToIdentityString(this T v)", - "\n where T : class", - "\n{", - "\n StringBuilder sb = new StringBuilder();", - "\n var propertyInfos = v.GetType()", - "\n .GetProperties()", - "\n .Where(x => Attribute.IsDefined(x, typeof(IdentityPropertyAttribute)))", - "\n .OrderByDescending(x => x.PropertyType.Name).ThenByDescending(x => x.Name)", - "\n .Select(x => sb.Append(x.Name).Append(\":\").Append(v.GetType().GetProperty(x.Name)?.GetValue(v, null)).Append(\", \"));", - "\n", - "\nreturn propertyInfos.Select(p => p.ToString()).ToArray().Last();", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## GetPreviousIdentities" - ] - }, - { - "cell_type": "code", - "source": [ - "public static Dictionary> GetPreviousIdentities(IEnumerable identities)", - "\n{", - "\n var bopNovelties = identities.Where(id => id.AocType == AocTypes.BOP).Select(id => id.Novelty);", - "\n var previousStep = (new string[]{Novelties.N,Novelties.I,Novelties.C})", - "\n .ToDictionary(n => n, n => bopNovelties.Contains(n) ? new AocStep(AocTypes.BOP,n) : null);", - "\n return identities.Where(id => id.AocType != AocTypes.BOP)", - "\n .ToDictionary(x => x, x => {var ret = x.AocType == AocTypes.CL ? previousStep.Where(kvp => kvp.Value != null).Select(kvp => kvp.Value).ToArray() ", - "\n : previousStep[x.Novelty].RepeatOnce();", - "\n previousStep[x.Novelty] = new AocStep(x.AocType, x.Novelty);", - "\n return ret;});", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## GetReferenceAocStepForCalculated" - ] - }, - { - "cell_type": "code", - "source": [ - "public static AocStep GetReferenceAocStepForCalculated(this IEnumerable identities, Dictionary aocConfigurationByAocStep, AocStep identityAocStep)", - "\n{", - "\n return identities.LastOrDefault(aocStep => aocConfigurationByAocStep[aocStep].DataType != DataType.Calculated", - "\n && aocConfigurationByAocStep[aocStep].DataType != DataType.CalculatedTelescopic", - "\n && aocConfigurationByAocStep[aocStep].Order < aocConfigurationByAocStep[identityAocStep].Order", - "\n && aocStep.Novelty == identityAocStep.Novelty) ", - "\n ?? new AocStep(default, default);", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Change Sign Rules" - ] - }, - { - "cell_type": "code", - "source": [ - "public static int GetSign((string AocType, string AmountType, string EstimateType, bool IsReinsurance) variable, Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", - "\n{", - "\n var isActual = (new string[] { EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.A }).Contains(variable.EstimateType) ? -1 : 1;", - "\n return isActual;", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# EstimateType And AmountType" - ] - }, - { - "cell_type": "code", - "source": [ - "public static Dictionary> GetAmountTypesByEstimateType(Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", - "\n{", - "\n return new Dictionary>(){", - "\n {EstimateTypes.RA, new string[]{}.ToHashSet()},", - "\n {EstimateTypes.C, new string[]{}.ToHashSet()},", - "\n {EstimateTypes.L, new string[]{}.ToHashSet()},", - "\n {EstimateTypes.LR, new string[]{}.ToHashSet()},", - "\n };", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Technical Margin EstimateType" - ] - }, - { - "cell_type": "code", - "source": [ - "public static HashSet GetTechnicalMarginEstimateType()", - "\n{", - "\n return new []{EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, }.ToHashSet();", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Discount and Cumulate" - ] - }, - { - "cell_type": "code", - "source": [ - "public static double[] ComputeDiscountAndCumulate(this double[] nominalValues, double[] monthlyDiscounting, PeriodType periodType) ", - "\n{ ", - "\n if(nominalValues == null) return Enumerable.Empty().ToArray();", - "\n ", - "\n var ret = new double[nominalValues.Length];", - "\n ", - "\n if(periodType == PeriodType.BeginningOfPeriod)", - "\n {", - "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", - "\n ret[i] = nominalValues[i] + GetElementOrDefault(ret, i + 1) * GetElementOrDefault(monthlyDiscounting, i/12);", - "\n return ret;", - "\n }", - "\n ", - "\n for (var i = nominalValues.Length - 1; i >= 0; i--)", - "\n ret[i] = ( nominalValues[i] + GetElementOrDefault(ret, i + 1) ) * GetElementOrDefault(monthlyDiscounting, i/12);", - "\n ", - "\n return ret;", - "\n}" - ] - }, - { - "cell_type": "code", - "source": [ - "public static double[] ComputeDiscountAndCumulateWithCreditDefaultRisk(this double[] nominalValues, double[] monthlyDiscounting, double nonPerformanceRiskRate) //Is it correct that NonPerformanceRiskRate is a double? Should it be an array that takes as input tau/t?", - "\n{ ", - "\n return Enumerable.Range(0, nominalValues.Length)", - "\n .Select( t => Enumerable.Range(t, nominalValues.Length-t)", - "\n .Select( tau => nominalValues[tau] * Math.Pow(GetElementOrDefault(monthlyDiscounting, t/12), tau-t+1) * (Math.Exp(-nonPerformanceRiskRate*(tau-t)) - 1) )", - "\n .Sum() )", - "\n .ToArray();", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import Configuration" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Data Nodes" - ] - }, - { - "cell_type": "code", - "source": [ - "public GroupOfInsuranceContract ExtendGroupOfContract(GroupOfInsuranceContract gic, IDataRow datarow) => gic;" - ] - }, - { - "cell_type": "code", - "source": [ - "public GroupOfReinsuranceContract ExtendGroupOfContract(GroupOfReinsuranceContract gric, IDataRow datarow) => gric;" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file From 5c0d5d3872bc209582e2f0c0beadfd0b410c8583 Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Fri, 7 Oct 2022 14:57:52 +0200 Subject: [PATCH 07/43] Merge pull request #38 from Systemorph/FXinPl Include FX to FP --- Files/DimensionsAndPartitions.csv | 6 +- Report/ReportScopes.ipynb | 32 +- Test/SpecificationsFinancialPerformance.ipynb | 319 +++++++++++++++++- 3 files changed, 335 insertions(+), 22 deletions(-) diff --git a/Files/DimensionsAndPartitions.csv b/Files/DimensionsAndPartitions.csv index 80f592bd..b6ad39bb 100644 --- a/Files/DimensionsAndPartitions.csv +++ b/Files/DimensionsAndPartitions.csv @@ -202,8 +202,10 @@ ISE12,Non Financial LIC Changes,ISE,23,,,,,,,, IFIE,Insurance Finance Income/Expense,PNL,24,,,,,,,, IFIE1,Financial LRC Changes,IFIE,25,,,,,,,, IFIE2,Financial LIC Changes,IFIE,26,,,,,,,, -OCI1,Financial LRC Changes,OCI,27,,,,,,,, -OCI2,Financial LIC Changes,OCI,28,,,,,,,, +IFIE3,FX Changes,IFIE,27,,,,,,,, +OCI1,Financial LRC Changes,OCI,28,,,,,,,, +OCI2,Financial LIC Changes,OCI,29,,,,,,,, +OCI3,FX Changes,OCI,30,,,,,,,, ,,,,,,,,,,, @@Profitability,,,,,,,,,,, SystemName,DisplayName,,,,,,,,,, diff --git a/Report/ReportScopes.ipynb b/Report/ReportScopes.ipynb index bc470121..ae87b53d 100644 --- a/Report/ReportScopes.ipynb +++ b/Report/ReportScopes.ipynb @@ -546,7 +546,7 @@ "\n };", "\n ", "\n private IDataCube NonFinancialFcfDeltas => FcfDeltas", - "\n .Filter((\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")); ", + "\n .Filter((\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\")); ", "\n ", "\n IDataCube FpNonFinancial => -1 * NonFinancialFcfDeltas", "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", @@ -568,10 +568,20 @@ "\n FcfDeltas.Filter((\"VariableType\", AocTypes.YCU)) +", "\n FcfDeltas.Filter((\"VariableType\", AocTypes.CRU));", "\n ", + "\n IDataCube FpFx => -1 * FcfDeltas", + "\n .Filter((\"VariableType\", AocTypes.FX))", + "\n .AggregateOver(nameof(Novelty))", + "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = \"IFIE3\"});", + "\n ", "\n IDataCube FpFinancial => -1 * FinancialFcfDeltas", "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeFpFinancial});", "\n", + "\n IDataCube OciFx => (FcfDeltas - CurrentFcfDeltas)", + "\n .Filter((\"VariableType\", AocTypes.FX))", + "\n .AggregateOver(nameof(Novelty))", + "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = \"OCI3\"});", + "\n", "\n IDataCube OciFinancial => (FcfDeltas - CurrentFcfDeltas)", "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeOciFinancial});", @@ -616,10 +626,14 @@ "\n IDataCube Amortization => -1 * Csm.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = variableType.amortization });", "\n ", "\n IDataCube NonFinancialChanges => -1 * Csm", - "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", + "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\"))", "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = variableType.nonFinancial });", - "\n ", + "\n", + "\n IDataCube Fx => -1 * Csm.Filter((\"VariableType\", AocTypes.FX))", + "\n .AggregateOver(nameof(Novelty))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE3\" });", + "\n", "\n IDataCube FinancialChanges => -1 * (Csm.Filter((\"VariableType\", AocTypes.IA)) +", "\n Csm.Filter((\"VariableType\", AocTypes.YCU)) +", "\n Csm.Filter((\"VariableType\", AocTypes.CRU)) )", @@ -655,10 +669,14 @@ "\n IDataCube Amortization => -1 * Lc.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = \"ISE9\" });", "\n ", "\n IDataCube NonFinancialChanges => -1 * Lc", - "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", + "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\"))", "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE11\" });", "\n ", + "\n IDataCube Fx => -1 * Lc.Filter((\"VariableType\", AocTypes.FX))", + "\n .AggregateOver(nameof(Novelty))", + "\n .SelectToDataCube(v => v with { VariableType = \"IFIE3\" });", + "\n", "\n IDataCube FinancialChanges => -1 * (Lc.Filter((\"VariableType\", AocTypes.IA)) +", "\n Lc.Filter((\"VariableType\", AocTypes.YCU)) +", "\n Lc.Filter((\"VariableType\", AocTypes.CRU)) )", @@ -694,10 +712,14 @@ "\n IDataCube Amortization => -1 * Loreco.Filter((\"VariableType\", AocTypes.AM)).SelectToDataCube(v => v with { VariableType = \"ISE8\" });", "\n ", "\n IDataCube NonFinancialChanges => -1 * Loreco", - "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"))", + "\n .Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\"))", "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE11\" });", "\n ", + "\n IDataCube Fx => -1 * Loreco.Filter((\"VariableType\", AocTypes.FX))", + "\n .AggregateOver(nameof(Novelty))", + "\n .SelectToDataCube(v => v with { VariableType = \"IFIE3\" });", + "\n", "\n IDataCube FinancialChanges => -1 * (Loreco.Filter((\"VariableType\", AocTypes.IA)) +", "\n Loreco.Filter((\"VariableType\", AocTypes.YCU)) +", "\n Loreco.Filter((\"VariableType\", AocTypes.CRU)) )", diff --git a/Test/SpecificationsFinancialPerformance.ipynb b/Test/SpecificationsFinancialPerformance.ipynb index 219121be..e52a0f5e 100644 --- a/Test/SpecificationsFinancialPerformance.ipynb +++ b/Test/SpecificationsFinancialPerformance.ipynb @@ -88,7 +88,7 @@ { "cell_type": "code", "source": [ - "var currencyType = CurrencyType.Contractual ;" + "var currencyType = CurrencyType.Functional ;" ] }, { @@ -301,7 +301,8 @@ "source": [ "var expectedDeltaFCF_nonFinancial = deltaFCF.Filter((\"VariableType\", \"!IA\"), ", "\n (\"VariableType\", \"!YCU\"), ", - "\n (\"VariableType\", \"!CRU\") ).Aggregate().Value;" + "\n (\"VariableType\", \"!CRU\"), ", + "\n (\"VariableType\", \"!FX\") ).Aggregate().Value;" ] }, { @@ -382,7 +383,63 @@ { "cell_type": "markdown", "source": [ - "### Other Comprehensive Income" + "### FX" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed value for the FX contribution to the Fulfillment Cashflows (FCF) is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaFCF_Fx = Test.GetScopes(identities).Aggregate()", + "\n .FpFx.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaFCF_Fx" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The independent recalculation of this value reads" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaFCF_Fx = deltaFCF.Filter((\"VariableType\", \"FX\")).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaFCF_Fx" + ] + }, + { + "cell_type": "markdown", + "source": [ + "taking the minus sign into account" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaFCF_Fx.CheckEquality( -computedDeltaFCF_Fx ).Should().Be(true);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n### Other Comprehensive Income" ] }, { @@ -463,6 +520,83 @@ "expectedDeltaFCF_OCI.CheckEquality( computedDeltaFCF_OCI ).Should().Be(true);" ] }, + { + "cell_type": "markdown", + "source": [ + "### FX Other Comprehensive Income" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The FX impact on the Other Comprehensive Income is calculated using the same formulas defined [above](#oci) but is presented separately in the Financial Performance.", + "\n", + "\nThe computed value for the FX contribution to the Other Comprehensive Income (OCI) is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedFxFCF_OCI = Test.GetScopes(identities).Aggregate()", + "\n .OciFx.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedFxFCF_OCI" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The OCI contribution is zero when the OCI option is disabled for the [target Group of Contract](#report).", + "\n", + "\nHere below we follow the steps to calculate independently the FX OCI contribution " + ] + }, + { + "cell_type": "code", + "source": [ + "var FxFCF_Locked = deltaFCF.Filter((\"VariableType\", AocTypes.FX)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "var FxFCF_Current = FCFs_current.Filter((\"VariableType\", AocTypes.FX)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedFxFCF_OCI = FxFCF_Locked - FxFCF_Current;" + ] + }, + { + "cell_type": "code", + "source": [ + "FxFCF_Locked" + ] + }, + { + "cell_type": "code", + "source": [ + "FxFCF_Current" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedFxFCF_OCI" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedFxFCF_OCI.CheckEquality( computedFxFCF_OCI ).Should().Be(true);" + ] + }, { "cell_type": "markdown", "source": [ @@ -528,7 +662,7 @@ { "cell_type": "code", "source": [ - "var expectedDeltaCSM_nonFinancial = deltaCSM.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate().Value;" + "var expectedDeltaCSM_nonFinancial = deltaCSM.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\")).Aggregate().Value;" ] }, { @@ -571,7 +705,7 @@ { "cell_type": "markdown", "source": [ - "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" + "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only Interest Accretion, Yield Curve Update and Credit Risk Update terms" ] }, { @@ -595,6 +729,55 @@ "expectedDeltaCSM_Financial.CheckEquality( -computedDeltaCSM_Financial ).Should().Be(true);" ] }, + { + "cell_type": "markdown", + "source": [ + "### FX" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed value for the FX change of the CSM is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaCSM_Fx = Test.GetScopes(identities).Aggregate()", + "\n .Fx.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaCSM_Fx" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the FX term" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaCSM_Fx = deltaCSM.Filter((\"VariableType\", AocTypes.FX)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaCSM_Fx" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaCSM_Fx.CheckEquality( -computedDeltaCSM_Fx ).Should().Be(true);" + ] + }, { "cell_type": "markdown", "source": [ @@ -654,13 +837,13 @@ { "cell_type": "markdown", "source": [ - "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" + "The non Financial contribution is calculated subtracting the Amortization, Interest Accretion, Yield Curve Update, Credit Risk Update, Fx terms:" ] }, { "cell_type": "code", "source": [ - "var expectedDeltaLC_nonFinancial = deltaLC.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate().Value;" + "var expectedDeltaLC_nonFinancial = deltaLC.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\")).Aggregate().Value;" ] }, { @@ -703,7 +886,7 @@ { "cell_type": "markdown", "source": [ - "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" + "This value can be independently computed starting from the $\\Delta\\text{LC}$, and considering only the Interest Accretion, Yield Curve Update, Credit Risk Update terms" ] }, { @@ -727,6 +910,55 @@ "expectedDeltaLC_Financial.CheckEquality( -computedDeltaLC_Financial ).Should().Be(true);" ] }, + { + "cell_type": "markdown", + "source": [ + "### FX" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed value for the FX change of the LC is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaLC_Fx = Test.GetScopes(identities).Aggregate()", + "\n .Fx.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaLC_Fx" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the $\\Delta\\text{LC}$, and considering only the FX term" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaLC_Fx = deltaLC.Filter((\"VariableType\", AocTypes.FX)).Aggregate().Value;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLC_Fx" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLC_Fx.CheckEquality( -computedDeltaLC_Fx ).Should().Be(true);" + ] + }, { "cell_type": "markdown", "source": [ @@ -794,7 +1026,7 @@ { "cell_type": "code", "source": [ - "var expectedDeltaLORECO_nonFinancial = deltaLORECO.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\")).Aggregate()?.Value?? 0;" + "var expectedDeltaLORECO_nonFinancial = deltaLORECO.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\")).Aggregate()?.Value?? 0;" ] }, { @@ -837,7 +1069,7 @@ { "cell_type": "markdown", "source": [ - "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the Interest Accretion term" + "This value can be independently computed starting from the $\\Delta\\text{LoReCo}$, and considering only the Interest Accretion, Yield Curve Update, Credit Risk Update terms" ] }, { @@ -861,6 +1093,55 @@ "expectedDeltaLORECO_Financial.CheckEquality( -computedDeltaLORECO_Financial ).Should().Be(true);" ] }, + { + "cell_type": "markdown", + "source": [ + "### FX" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The computed value for the FX change of the LoReCo is" + ] + }, + { + "cell_type": "code", + "source": [ + "var computedDeltaLORECO_Fx = Test.GetScopes(identities).Aggregate()", + "\n .Fx.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "computedDeltaLORECO_Fx" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This value can be independently computed starting from the $\\Delta\\text{LoReCo}$, and considering only the FX term" + ] + }, + { + "cell_type": "code", + "source": [ + "var expectedDeltaLORECO_Fx = deltaLORECO.Filter((\"VariableType\", AocTypes.FX)).Aggregate()?.Value?? 0;" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_Fx" + ] + }, + { + "cell_type": "code", + "source": [ + "expectedDeltaLORECO_Fx.CheckEquality( -computedDeltaLORECO_Fx ).Should().Be(true);" + ] + }, { "cell_type": "markdown", "source": [ @@ -1123,10 +1404,11 @@ "\n$$", "\n\\text{IFIE} = \\left\\{", "\n\\begin{array}{ll}", - "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} ~~,", + "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} + \\Delta\\text{FCF FX} + \\Delta\\text{CSM FX} + \\Delta\\text{LC FX} ~~,", "\n& \\text{for Insurance contracts} \\\\[0.2cm]", "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} ", - "\n+ \\Delta\\text{LoReCo Financial} ~~, ", + "\n+ \\Delta\\text{LoReCo Financial} + \\Delta\\text{FCF FX} + \\Delta\\text{CSM FX} + \\Delta\\text{LC FX} ", + "\n+ \\Delta\\text{LoReCo FX} ~~, ", "\n& \\text{for Re-Insurance contracts}", "\n\\end{array}", "\n\\right.", @@ -1142,12 +1424,19 @@ "\nif(groupOfContract.Partner == null) ", "\n IFIE = - expectedDeltaFCF_Financial ", "\n - expectedDeltaCSM_Financial", - "\n - expectedDeltaLC_Financial;", + "\n - expectedDeltaLC_Financial", + "\n - expectedDeltaFCF_Fx ", + "\n - expectedDeltaCSM_Fx", + "\n - expectedDeltaLC_Fx;", "\nelse", "\n IFIE = - expectedDeltaFCF_Financial ", "\n - expectedDeltaCSM_Financial", "\n - expectedDeltaLC_Financial", - "\n - expectedDeltaLORECO_Financial;" + "\n - expectedDeltaLORECO_Financial", + "\n - expectedDeltaFCF_Fx ", + "\n - expectedDeltaCSM_Fx", + "\n - expectedDeltaLC_Fx", + "\n - expectedDeltaLORECO_Fx;" ] }, { @@ -1177,7 +1466,7 @@ { "cell_type": "code", "source": [ - "var OCI = expectedDeltaFCF_OCI;" + "var OCI = expectedDeltaFCF_OCI + expectedFxFCF_OCI;" ] }, { From 76a9c82415778ce1a4335338fa746dee7de49207 Mon Sep 17 00:00:00 2001 From: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Fri, 7 Oct 2022 16:14:43 +0200 Subject: [PATCH 08/43] Rename calculation type with estimate type (#34) * Replace CalculationType with EstimateType * Correct estimateType capitalization error in Test/SpecificationsImportCashflows.ipynb * Clean up notebooks spaces * Empty commit to refresh the meta-data * Cleanup comments in Import/ImportStorage.ipynb * Fix capitalization in Importers & ImportStorage NB * Fix column order in csv * Add blank cell DataNodeParameters link --- Constants/Consts.ipynb | 11 +-- Constants/Validations.ipynb | 3 +- DataModel/DataStructure.ipynb | 25 ++----- Files/DimensionsAndPartitions.csv | 39 +++++----- Import/ImportScopeCalculation.ipynb | 74 +++++++++---------- Import/ImportStorage.ipynb | 10 +-- Import/Importers.ipynb | 14 ++-- .../InitSystemorphBaseToMemory.ipynb | 1 - Initialization/InitSystemorphToDatabase.ipynb | 1 - InputFormatDescription.ipynb | 6 -- Test/AocStructureTest.ipynb | 26 +++---- Test/SpecificationsImportCashflows.ipynb | 20 ++--- Test/SpecificationsSetup.ipynb | 2 +- Test/SpecificationsTechnicalMargin.ipynb | 6 +- 14 files changed, 99 insertions(+), 139 deletions(-) diff --git a/Constants/Consts.ipynb b/Constants/Consts.ipynb index 808308c2..79179ff2 100644 --- a/Constants/Consts.ipynb +++ b/Constants/Consts.ipynb @@ -169,22 +169,13 @@ "\n}" ] }, - { - "cell_type": "code", - "source": [ - "public static class CalculationTypes{", - "\n public const string BE = nameof(BE); //Best Estimate", - "\n public const string CU = nameof(CU); //Coverage Units", - "\n public const string RA = nameof(RA); //Risk Adjustment", - "\n}" - ] - }, { "cell_type": "code", "source": [ "public static class EstimateTypes{", "\n public const string BE = nameof(BE); //Best Estimate", "\n public const string RA = nameof(RA); //Risk Adjustment", + "\n public const string CU = nameof(CU); //Coverage Units", "\n public const string A = nameof(A); //Actuals", "\n public const string AA = nameof(AA); //Advance Actuals", "\n public const string OA = nameof(OA); //Overdue Actuals", diff --git a/Constants/Validations.ipynb b/Constants/Validations.ipynb index d1b09cc0..56dec561 100644 --- a/Constants/Validations.ipynb +++ b/Constants/Validations.ipynb @@ -57,7 +57,7 @@ "\n // Partition", "\n PartitionNotFound, ParsedPartitionNotFound, PartititionNameNotFound, PartitionTypeNotFound,", "\n // Dimensions", - "\n AmountTypeNotFound, EstimateTypeNotFound,CalculationTypeNotFound, ReportingNodeNotFound, AocTypeMapNotFound, AocTypeNotFound, PortfolioGicNotFound, PortfolioGricNotFound, ", + "\n AmountTypeNotFound, EstimateTypeNotFound, ReportingNodeNotFound, AocTypeMapNotFound, AocTypeNotFound, PortfolioGicNotFound, PortfolioGricNotFound, ", "\n InvalidAmountTypeEstimateType, MultipleTechnicalMarginOpening,", "\n // Exchange Rate", "\n ExchangeRateNotFound, ExchangeRateCurrency,", @@ -103,7 +103,6 @@ "\n // Dimensions", "\n (Error.AmountTypeNotFound , 1) => $\"AmountType {s[0]} not found.\",", "\n (Error.EstimateTypeNotFound , 1) => $\"EstimateType {s[0]} not found.\",", - "\n (Error.CalculationTypeNotFound , 1) => $\"CalculationType {s[0]} not found.\",", "\n (Error.ReportingNodeNotFound , 1) => $\"Reporting Node {s[0]} not found.\",", "\n (Error.AocTypeNotFound , 1) => $\"AocType {s[0]} not found.\",", "\n (Error.AocTypeMapNotFound , 2) => $\"AocType {s[0]} and Novelty {s[1]} combination not defined in the mapping.\",", diff --git a/DataModel/DataStructure.ipynb b/DataModel/DataStructure.ipynb index 55885f24..98114494 100644 --- a/DataModel/DataStructure.ipynb +++ b/DataModel/DataStructure.ipynb @@ -305,24 +305,6 @@ "\npublic record DeferrableAmountType : AmountType {}" ] }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Calculation Type", - "\nThis dimension is used to distinguish between e.g. **Best Estimate** values and **Risk Adjustment** values:" - ] - }, - { - "cell_type": "code", - "source": [ - "public record CalculationType : KeyedOrderedDimension {", - "\n [Display(Order = 10)]", - "\n [Dimension(typeof(PeriodType))]", - "\n public PeriodType PeriodType { get; init; }", - "\n}" - ] - }, { "cell_type": "markdown", "source": [ @@ -364,6 +346,9 @@ "\n ", "\n [Display(Order = 120)]", "\n public StructureType StructureType { get; init; }", + "\n", + "\n [Dimension(typeof(PeriodType))]", + "\n public PeriodType PeriodType { get; init; }", "\n}" ] }, @@ -1443,9 +1428,9 @@ "\n public double[] Values { get; init; }", "\n ", "\n [NotVisible]", - "\n [Dimension(typeof(CalculationType))]", + "\n [Dimension(typeof(EstimateType))]", "\n [IdentityProperty]", - "\n public string CalculationType { get; init; }", + "\n public string EstimateType { get; init; }", "\n}" ] }, diff --git a/Files/DimensionsAndPartitions.csv b/Files/DimensionsAndPartitions.csv index b6ad39bb..4c2662b4 100644 --- a/Files/DimensionsAndPartitions.csv +++ b/Files/DimensionsAndPartitions.csv @@ -65,12 +65,6 @@ AM,C,Calculated,6,EndOfPeriod,NotApplicable,NotApplicable,NotApplicable,EndOfPer FX,C,Calculated,0,NotApplicable,NotApplicable,NotApplicable,NotApplicable,NotApplicable,210,1900,1 EOP,C,Calculated,6,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,220,1900,1 ,,,,,,,,,,, -@@CalculationType,,,,,,,,,,, -SystemName,DisplayName,PeriodType,Order,,,,,,,, -BE,Best Estimate,EndOfPeriod,10,,,,,,,, -RA,Risk Adjustment,EndOfPeriod,20,,,,,,,, -CU,Coverage Unit,EndOfPeriod,30,,,,,,,, -,,,,,,,,,,, @@CreditRiskRating,,,,,,,,,,, SystemName,DisplayName,,,,,,,,,, AAA,AAA,,,,,,,,,, @@ -115,22 +109,23 @@ L,Locked-in,10,,,,,,,,, C,Current,20,,,,,,,,, ,,,,,,,,,,, @@EstimateType,,,,,,,,,,, -SystemName,DisplayName,Order,StructureType,InputSource,ExternalId0,ExternalId1,ExternalId2,,,, -BE,Best Estimate of Present Value,1,AoC,4,,,,,,, -RA,Risk Adjustment,10,AoC,4,,,,,,, -C,Contractual Service Margin,20,AoC,7,,,,,,, -L,Loss Component,30,AoC,7,,,,,,, -LR,Loss Recovery Component,40,AoC,7,,,,,,, -PL,Profit and Loss,50,None,7,,,,,,, -AA,Advance Actuals,60,AoC,3,PayablePR,ReceivableNIC,ReceivableICO,,,, -OA,Overdue Actuals,70,AoC,3,ReceivablePR,PayableNIC,PayableICO,,,, -DA,Deferrable Actuals,80,AoC,3,,,,,,, -A,Actuals,90,None,2,,,,,,, -F,Factors,100,None,4,,,,,,, -AAPA,Advance Actuals,110,None,2,,,,,,, -OAPA,Overdue Actuals,120,None,2,,,,,,, -APA,Actuals,130,None,2,,,,,,, -BEPA,Best Estimate of Present Value,140,None,4,,,,,,, +SystemName,DisplayName,Order,StructureType,InputSource,PeriodType,ExternalId0,ExternalId1,ExternalId2,,, +BE,Best Estimate of Present Value,1,AoC,4,,,,EndOfPeriod,,, +RA,Risk Adjustment,10,AoC,4,,,,EndOfPeriod,,, +CU,CoverageUnit,15,AoC,4,,,,EndOfPeriod,,, +C,Contractual Service Margin,20,AoC,7,,,,NotApplicable,,, +L,Loss Component,30,AoC,7,,,,NotApplicable,,, +LR,Loss Recovery Component,40,AoC,7,,,,NotApplicable,,, +PL,Profit and Loss,50,None,7,,,,NotApplicable,,, +AA,Advance Actuals,60,AoC,3,PayablePR,ReceivableNIC,ReceivableICO,NotApplicable,,, +OA,Overdue Actuals,70,AoC,3,ReceivablePR,PayableNIC,PayableICO,NotApplicable,,, +DA,Deferrable Actuals,80,AoC,3,,,,NotApplicable,,, +A,Actuals,90,None,2,,,,NotApplicable,,, +F,Factors,100,None,4,,,,NotApplicable,,, +AAPA,Advance Actuals,110,None,2,,,,NotApplicable,,, +OAPA,Overdue Actuals,120,None,2,,,,NotApplicable,,, +APA,Actuals,130,None,2,,,,NotApplicable,,, +BEPA,Best Estimate of Present Value,140,None,4,,,,NotApplicable,,, ,,,,,,,,,,, @@LiabilityType,,,,,,,,,,, SystemName,DisplayName,,,,,,,,,, diff --git a/Import/ImportScopeCalculation.ipynb b/Import/ImportScopeCalculation.ipynb index 4f8e78f5..ce766089 100644 --- a/Import/ImportScopeCalculation.ipynb +++ b/Import/ImportScopeCalculation.ipynb @@ -464,20 +464,20 @@ { "cell_type": "code", "source": [ - "public interface NominalCashflow : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "public interface NominalCashflow : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", "\n{", "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.CF)", "\n .WithApplicability(x => x.Identity.AmountType == AmountTypes.CDR));", "\n", "\n AocStep referenceAocStep => GetScope(Identity.Id).Value;", - "\n double[] Values => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, Identity.AmountType, Identity.CalculationType, Identity.AccidentYear);", + "\n double[] Values => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, Identity.AmountType, Identity.EstimateType, Identity.AccidentYear);", "\n}", "\n", "\npublic interface CreditDefaultRiskNominalCashflow : NominalCashflow", "\n{", "\n private double[] NominalClaimsCashflow => GetStorage().GetClaims()", - "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.CalculationType, Identity.AccidentYear))", + "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.EstimateType, Identity.AccidentYear))", "\n .Aggregate();", "\n ", "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", @@ -494,7 +494,7 @@ "\npublic interface AllClaimsCashflow : NominalCashflow", "\n{", "\n double[] NominalCashflow.Values => GetStorage().GetClaims()", - "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.CalculationType, Identity.AccidentYear))", + "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.EstimateType, Identity.AccidentYear))", "\n .Aggregate();", "\n}" ] @@ -547,9 +547,9 @@ { "cell_type": "code", "source": [ - "public interface DiscountedCashflow : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? Accidentyear), ImportStorage>", + "public interface DiscountedCashflow : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? Accidentyear), ImportStorage>", "\n{", - "\n private PeriodType periodType => GetStorage().GetPeriodType(Identity.AmountType, Identity.CalculationType); ", + "\n private PeriodType periodType => GetStorage().GetPeriodType(Identity.AmountType, Identity.EstimateType); ", "\n ", "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR));", @@ -604,7 +604,7 @@ { "cell_type": "code", "source": [ - "public interface TelescopicDifference : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? Accidentyear), ImportStorage>", + "public interface TelescopicDifference : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? Accidentyear), ImportStorage>", "\n{", "\n [NotVisible]", "\n string EconomicBasis => GetContext();", @@ -612,7 +612,7 @@ "\n ", "\n private double[] PreviousValues => (GetScope((Identity.Id, Identity.AmountType)))", "\n .Values", - "\n .Select(aoc => GetScope((Identity.Id with {AocType = aoc.AocType, Novelty = aoc.Novelty}, Identity.AmountType, Identity.CalculationType, Identity.Accidentyear)).Values)", + "\n .Select(aoc => GetScope((Identity.Id with {AocType = aoc.AocType, Novelty = aoc.Novelty}, Identity.AmountType, Identity.EstimateType, Identity.Accidentyear)).Values)", "\n .Where(cf => cf.Count() > 0)", "\n .Aggregate();", "\n ", @@ -654,7 +654,7 @@ { "cell_type": "code", "source": [ - "public interface IWithGetValueFromValues : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "public interface IWithGetValueFromValues : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", "\n{", "\n private int shift => GetStorage().GetShift(0);//Identity.Id.ProjectionPeriod", "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.Id.ProjectionPeriod", @@ -701,7 +701,7 @@ { "cell_type": "code", "source": [ - "public interface IWithInterestAccretion : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "public interface IWithInterestAccretion : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", "\n{", "\n private double[] parentDiscountedValues => GetScope(Identity).Values; ", "\n private double[] parentNominalValues => GetScope(Identity).Values;", @@ -709,7 +709,7 @@ "\n ", "\n double[] GetInterestAccretion() ", "\n {", - "\n var periodType = GetStorage().GetPeriodType(Identity.AmountType, Identity.CalculationType);", + "\n var periodType = GetStorage().GetPeriodType(Identity.AmountType, Identity.EstimateType);", "\n var ret = new double[parentDiscountedValues.Length];", "\n ", "\n switch (periodType) {", @@ -727,7 +727,7 @@ "\n }", "\n}", "\n", - "\npublic interface IWithInterestAccretionForCreditRisk : IScope<(ImportIdentity Id, string AmountType, string CalculationType, int? AccidentYear), ImportStorage>", + "\npublic interface IWithInterestAccretionForCreditRisk : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", "\n{", "\n private double[] nominalClaimsCashflow => GetScope(Identity).Values;", "\n private double[] nominalValuesCreditRisk => -1 * GetScope(Identity with {Id = Identity.Id with {AocType = AocTypes.CF}}).Values;", @@ -806,7 +806,7 @@ "\n", "\npublic interface ComputePresentValueWithIfrsVariable : PresentValue", "\n{", - "\n double PresentValue.Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.CalculationType, EconomicBasis, Identity.AccidentYear); //unify CalculationType and EstimateTypeGet", + "\n double PresentValue.Value => GetStorage().GetValue(Identity.Id, Identity.AmountType, Identity.EstimateType, EconomicBasis, Identity.AccidentYear);", "\n double[] PresentValue.Values => Enumerable.Empty().ToArray();", "\n}", "\n", @@ -887,15 +887,15 @@ "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", "\n string EconomicBasis => EconomicBases.L;", "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.BE;", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.BE;", "\n ", "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", "\n ", "\n [NotVisible]", "\n PresentValue[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", "\n .SelectMany(at => accidentYears", - "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", + "\n .Select(ay => GetScope((Identity, at, EstimateType, ay), o => o.WithContext(EconomicBasis))))", "\n .ToArray();", "\n double Value => PresentValues.Aggregate().Value;", "\n}", @@ -905,15 +905,15 @@ "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", "\n string EconomicBasis => EconomicBases.C;", "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.BE;", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.BE;", "\n ", "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray();", "\n ", "\n [NotVisible]", "\n PresentValue[] PresentValues => GetScope(Identity.DataNode).BeAmountTypes", "\n .SelectMany(at => accidentYears", - "\n .Select(ay => GetScope((Identity, at, CalculationType, ay), o => o.WithContext(EconomicBasis))))", + "\n .Select(ay => GetScope((Identity, at, EstimateType, ay), o => o.WithContext(EconomicBasis))))", "\n .ToArray();", "\n ", "\n double Value => PresentValues.Aggregate().Value;", @@ -947,12 +947,12 @@ "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", "\n string EconomicBasis => EconomicBases.L;", "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.RA;", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.RA;", "\n ", "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", "\n ", - "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray();", + "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, EstimateType, ay), o => o.WithContext(EconomicBasis))).ToArray();", "\n ", "\n double Value => PresentValues.Aggregate().Value;", "\n}", @@ -961,12 +961,12 @@ "\n [IdentityProperty][NotVisible][Dimension(typeof(EconomicBasis))]", "\n string EconomicBasis => EconomicBases.C;", "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.RA;", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.RA;", "\n ", "\n private int?[] accidentYears => GetStorage().GetAccidentYears(Identity.DataNode).ToArray(); ", "\n ", - "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, CalculationType, ay), o => o.WithContext(EconomicBasis))).ToArray(); ", + "\n PresentValue[] PresentValues => accidentYears.Select(ay => GetScope((Identity, (string)null, EstimateType, ay), o => o.WithContext(EconomicBasis))).ToArray(); ", "\n ", "\n double Value => PresentValues.Aggregate().Value;", "\n}" @@ -1000,10 +1000,10 @@ "\n{ ", "\n [NotVisible] string EconomicBasis => GetContext();", "\n ", - "\n [IdentityProperty][NotVisible][Dimension(typeof(CalculationType))]", - "\n string CalculationType => CalculationTypes.CU;", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.CU;", "\n ", - "\n double[] Values => GetScope((Identity, (string)null, CalculationType, (int?)null)).Values;", + "\n double[] Values => GetScope((Identity, (string)null, EstimateType, (int?)null)).Values;", "\n}" ] }, @@ -1034,7 +1034,7 @@ "source": [ "public interface MonthlyAmortizationFactorCashflow : IScope", "\n{", - "\n private double[] NominalCuCashflow => GetScope((Identity with {AocType = AocTypes.CL}, (string)null, CalculationTypes.CU, (int?)null)).Values;", + "\n private double[] NominalCuCashflow => GetScope((Identity with {AocType = AocTypes.CL}, (string)null, EstimateTypes.CU, (int?)null)).Values;", "\n private double[] DiscountedCuCashflow => GetScope(Identity with {AocType = AocTypes.CL}, o => o.WithContext(EconomicBasis)).Values;", "\n ", "\n [NotVisible] string EconomicBasis => GetContext();", @@ -1086,7 +1086,7 @@ "\n", "\npublic interface AmfFromIfrsVariable : CurrentPeriodAmortizationFactor", "\n{", - "\n double CurrentPeriodAmortizationFactor.Value => GetStorage().GetValue(Identity, (string)null, EstimateType, EconomicBasis, (int?)null); //unify CalculationType and EstimateTypeGet", + "\n double CurrentPeriodAmortizationFactor.Value => GetStorage().GetValue(Identity, (string)null, EstimateType, EconomicBasis, (int?)null);", "\n}" ] }, @@ -1497,7 +1497,7 @@ "\n ", "\n double Value => GetScope(Identity.DataNode).BeAmountTypes", "\n .Except(GetStorage().GetNonAttributableAmountType())", - "\n .Sum(at => GetScope((Identity, at, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) +", + "\n .Sum(at => GetScope((Identity, at, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) +", "\n GetScope(Identity).Value;", "\n ", "\n double AggregatedValue => GetScope((Identity, InputSource.Cashflow)).Values", @@ -1550,12 +1550,12 @@ "\n ", "\n private double attributableExpenseAndCommissions => GetStorage().GetAttributableExpenseAndCommissionAmountType().Sum(d =>", "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", - "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, d, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", + "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, d, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, d, EstimateTypes.A, (int?)null)).Value);", "\n", "\n private double investmentClaims => GetStorage().GetInvestmentClaims().Sum(ic =>", "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", - "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, ic, CalculationTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", + "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, ic, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.A, (int?)null)).Value - ", "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.AA, (int?)null)).Value -", "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.OA, (int?)null)).Value);", @@ -1875,7 +1875,7 @@ "public interface ComputeAllScopes: IScope //ComputeIfrsVariable", "\n{", "\n IEnumerable PvLocked => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", - "\n EstimateType = x.Identity.CalculationType, ", + "\n EstimateType = x.Identity.EstimateType, ", "\n DataNode = x.Identity.Id.DataNode, ", "\n AocType = x.Identity.Id.AocType, ", "\n Novelty = x.Identity.Id.Novelty, ", @@ -1885,7 +1885,7 @@ "\n Partition = GetStorage().TargetPartition", "\n });", "\n IEnumerable PvCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", - "\n EstimateType = x.Identity.CalculationType, ", + "\n EstimateType = x.Identity.EstimateType, ", "\n DataNode = x.Identity.Id.DataNode, ", "\n AocType = x.Identity.Id.AocType, ", "\n Novelty = x.Identity.Id.Novelty, ", @@ -1895,7 +1895,7 @@ "\n Partition = GetStorage().TargetPartition", "\n });", "\n IEnumerable RaCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", - "\n EstimateType = x.Identity.CalculationType, ", + "\n EstimateType = x.Identity.EstimateType, ", "\n DataNode = x.Identity.Id.DataNode, ", "\n AocType = x.Identity.Id.AocType, ", "\n Novelty = x.Identity.Id.Novelty, ", @@ -1905,7 +1905,7 @@ "\n Partition = GetStorage().TargetPartition", "\n });", "\n IEnumerable RaLocked => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", - "\n EstimateType = x.Identity.CalculationType, ", + "\n EstimateType = x.Identity.EstimateType, ", "\n DataNode = x.Identity.Id.DataNode, ", "\n AocType = x.Identity.Id.AocType, ", "\n Novelty = x.Identity.Id.Novelty, ", diff --git a/Import/ImportStorage.ipynb b/Import/ImportStorage.ipynb index 291e0e0b..8dc36adc 100644 --- a/Import/ImportStorage.ipynb +++ b/Import/ImportStorage.ipynb @@ -35,7 +35,7 @@ "\n- [DataNodeParameters](../DataModel/DataStructure)", "\n- [AocType](../DataModel/DataStructure)", "\n- [AmountType](../DataModel/DataStructure)", - "\n- [CalculationType](../DataModel/DataStructure)", + "\n- [EstimateType](../DataModel/DataStructure)", "\n- [DataNodes](../DataModel/DataStructure)", "\n", "\nSuch storage is then passed to calculations defined in the corresponding [Import Scopes](./ImportScopeCalculation)." @@ -105,7 +105,6 @@ "\n //Dimensions", "\n public Dictionary AmountTypeDimension { get; private set; }", "\n public Dictionary NoveltyDimension { get; private set; }", - "\n public Dictionary CalculationTypeDimension { get; private set; }", "\n public Dictionary EstimateTypeDimension { get; private set; }", "\n public Dictionary> EstimateTypesByImportFormat { get; private set; }", "\n public Dictionary ExperienceAdjustEstimateTypeMapping { get; private set; } ", @@ -128,7 +127,6 @@ "\n EstimateTypeDimension = estimateTypes.ToDictionary(x => x.SystemName);", "\n AmountTypeDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", "\n NoveltyDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", - "\n CalculationTypeDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", "\n ", "\n ExperienceAdjustEstimateTypeMapping = new Dictionary{{EstimateTypes.A, EstimateTypes.APA}, {EstimateTypes.AA, EstimateTypes.AAPA}, {EstimateTypes.OA, EstimateTypes.OAPA}}; //TODO move this logic", "\n ", @@ -296,10 +294,10 @@ "\n public int GetShift(int projectionPeriod) => ProjectionConfiguration[projectionPeriod].Shift;", "\n public int GetTimeStep(int projectionPeriod) => ProjectionConfiguration[projectionPeriod].TimeStep;", "\n ", - "\n public PeriodType GetPeriodType(string amountType, string calculationType) => ", + "\n public PeriodType GetPeriodType(string amountType, string estimateType) => ", "\n amountType != null && AmountTypeDimension.TryGetValue(amountType, out var at) ", "\n ? at.PeriodType", - "\n : calculationType != null && CalculationTypeDimension.TryGetValue(calculationType, out var ct) ", + "\n : estimateType != null && EstimateTypeDimension.TryGetValue(estimateType, out var ct) ", "\n ? ct.PeriodType : PeriodType.EndOfPeriod;", "\n", "\n //Variables and Cashflows", @@ -309,7 +307,7 @@ "\n public double[] GetValues(ImportIdentity id, Func whereClause) => GetRawVariables(id.DataNode).Where(v => (v.AocType, v.Novelty) == id.AocStep && whereClause(v)).Aggregate()?.Values ?? Enumerable.Empty().ToArray();", "\n public double GetValue(ImportIdentity id, Func whereClause) => GetIfrsVariables(id.DataNode).Where(v => (v.AocType, v.Novelty) == id.AocStep && whereClause(v)).Aggregate()?.Value ?? 0;", "\n ", - "\n public double[] GetValues(ImportIdentity id, string amountType, string calculationType, int? accidentYear) => GetValues(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.CalculationType == calculationType);", + "\n public double[] GetValues(ImportIdentity id, string amountType, string estimateType, int? accidentYear) => GetValues(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.EstimateType == estimateType);", "\n public double GetValue(ImportIdentity id, string amountType, string estimateType, int? accidentYear) => GetValue(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.EstimateType == estimateType);", "\n public double GetValue(ImportIdentity id, string amountType, string estimateType, string economicBasis, int? accidentYear) => GetValue(id, v => v.AccidentYear == accidentYear && v.AmountType == amountType && v.EstimateType == estimateType && v.EconomicBasis == economicBasis);", "\n ", diff --git a/Import/Importers.ipynb b/Import/Importers.ipynb index 808b4cbe..319f9b9e 100644 --- a/Import/Importers.ipynb +++ b/Import/Importers.ipynb @@ -55,7 +55,7 @@ "\n public Dictionary DataNodeDataBySystemName;", "\n ", "\n // Dimensions", - "\n public Dictionary CalculationType;", + "\n public Dictionary EstimateType;", "\n public Dictionary PvAmountType; ", "\n public HashSet AocTypeMap;", "\n private HashSet estimateTypes;", @@ -128,7 +128,7 @@ "\n ? (await LoadDataNodesAsync(dataSource, args)).Where(kvp => kvp.Value.Year == args.Year).ToDictionary(kvp => kvp.Key, kvp => kvp.Value)", "\n : await LoadDataNodesAsync(dataSource, args);", "\n // Dimensions", - "\n CalculationType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n EstimateType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", "\n PvAmountType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", "\n amountTypes = (await dataSource.Query().ToArrayAsync()).Select(at => at.SystemName).ToHashSet();", "\n estimateTypes = args.ImportFormat switch {", @@ -748,9 +748,9 @@ "\n }", "\n ", "\n var amountTypeFromFile = datarow.Field(nameof(RawVariable.AmountType));", - "\n var isCalculationType = parsingStorage.CalculationType.ContainsKey(amountTypeFromFile);", - "\n var amountType = isCalculationType ? null : amountTypeFromFile;", - "\n var calculationType = isCalculationType ? amountTypeFromFile : CalculationTypes.BE;", + "\n var isEstimateType = parsingStorage.EstimateType.ContainsKey(amountTypeFromFile);", + "\n var amountType = isEstimateType ? null : amountTypeFromFile;", + "\n var estimateType = isEstimateType ? amountTypeFromFile : EstimateTypes.BE;", "\n ", "\n var values = datarow.Table.Columns.Where(c => c.ColumnName.StartsWith(nameof(RawVariable.Values))).OrderBy(c => c.ColumnName.Length).ThenBy(c => c.ColumnName)", "\n .Select(x => datarow.Field(x.ColumnName).CheckStringForExponentialAndConvertToDouble()).Prune();", @@ -763,10 +763,10 @@ "\n AocType = aocType,", "\n Novelty = novelty,", "\n AmountType = amountType,", - "\n CalculationType = calculationType,", + "\n EstimateType = estimateType,", "\n AccidentYear = Int32.TryParse((datarow.Field(nameof(RawVariable.AccidentYear))), out var tempVal)? tempVal : (int?)null,", "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", - "\n Values = Multiply(GetSign((aocType, amountType, calculationType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), values)", + "\n Values = Multiply(GetSign((aocType, amountType, estimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), values)", "\n };", "\n return item;", "\n }, ImportFormats.Cashflow", diff --git a/Initialization/InitSystemorphBaseToMemory.ipynb b/Initialization/InitSystemorphBaseToMemory.ipynb index d28022d0..e7b7b98d 100644 --- a/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/Initialization/InitSystemorphBaseToMemory.ipynb @@ -80,7 +80,6 @@ "\n .WithType()", "\n .WithType()", "\n .WithType()", - "\n .WithType()", "\n .WithType()", "\n .WithType()", "\n .WithType()", diff --git a/Initialization/InitSystemorphToDatabase.ipynb b/Initialization/InitSystemorphToDatabase.ipynb index c994f78b..bb25efb5 100644 --- a/Initialization/InitSystemorphToDatabase.ipynb +++ b/Initialization/InitSystemorphToDatabase.ipynb @@ -70,7 +70,6 @@ "\n .WithType()", "\n .WithType()", "\n .WithType()", - "\n .WithType()", "\n .WithType()", "\n .WithType()", "\n .WithType()", diff --git a/InputFormatDescription.ipynb b/InputFormatDescription.ipynb index bee76506..2e81506f 100644 --- a/InputFormatDescription.ipynb +++ b/InputFormatDescription.ipynb @@ -96,12 +96,6 @@ "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ] - }, - { - "cell_type": "markdown", - "source": [ - "" - ] } ] } \ No newline at end of file diff --git a/Test/AocStructureTest.ipynb b/Test/AocStructureTest.ipynb index 1dbad859..f279ad6f 100644 --- a/Test/AocStructureTest.ipynb +++ b/Test/AocStructureTest.ipynb @@ -223,11 +223,11 @@ "cell_type": "code", "source": [ "var inputRawVariables = new RawVariable[]{", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", "\n};" ] }, @@ -322,11 +322,11 @@ "cell_type": "code", "source": [ "inputRawVariables = new RawVariable[]{", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", "\n};" ] }, @@ -439,9 +439,9 @@ "cell_type": "code", "source": [ "inputRawVariables = new RawVariable[]{", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", - "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", CalculationType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"BOP\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", + "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", "\n};" ] }, diff --git a/Test/SpecificationsImportCashflows.ipynb b/Test/SpecificationsImportCashflows.ipynb index b392feef..481da388 100644 --- a/Test/SpecificationsImportCashflows.ipynb +++ b/Test/SpecificationsImportCashflows.ipynb @@ -383,14 +383,14 @@ "source": [ "var amountTypePR = \"PR\";", "\nvar amountTypeNIC = \"NIC\";", - "\nvar calculationType = \"BE\";", + "\nvar estimateType = \"BE\";", "\nvar accidentYear = (int?)null;" ] }, { "cell_type": "code", "source": [ - "var nominalPR = Test.GetScope((id, amountTypePR, calculationType, accidentYear));" + "var nominalPR = Test.GetScope((id, amountTypePR, estimateType, accidentYear));" ] }, { @@ -402,7 +402,7 @@ { "cell_type": "code", "source": [ - "var nominalNIC = Test.GetScope((id, amountTypeNIC, calculationType, accidentYear));" + "var nominalNIC = Test.GetScope((id, amountTypeNIC, estimateType, accidentYear));" ] }, { @@ -450,7 +450,7 @@ { "cell_type": "code", "source": [ - "var computedDiscountedPR = Test.GetScope((id, amountTypePR, calculationType, accidentYear));" + "var computedDiscountedPR = Test.GetScope((id, amountTypePR, estimateType, accidentYear));" ] }, { @@ -519,7 +519,7 @@ { "cell_type": "code", "source": [ - "var computedDiscountedNIC = Test.GetScope((id, amountTypeNIC, calculationType, accidentYear));" + "var computedDiscountedNIC = Test.GetScope((id, amountTypeNIC, estimateType, accidentYear));" ] }, { @@ -646,7 +646,7 @@ { "cell_type": "code", "source": [ - "var computedDiscountedCRD = Test.GetScope((id, \"CDR\", calculationType, accidentYear));" + "var computedDiscountedCRD = Test.GetScope((id, \"CDR\", estimateType, accidentYear));" ] }, { @@ -676,28 +676,28 @@ { "cell_type": "code", "source": [ - "var nominalNIC = Test.GetScope((id, \"NIC\", calculationType, accidentYear));", + "var nominalNIC = Test.GetScope((id, \"NIC\", estimateType, accidentYear));", "\nnominalNIC" ] }, { "cell_type": "code", "source": [ - "var nominalICO = Test.GetScope((id, \"ICO\", calculationType, accidentYear));", + "var nominalICO = Test.GetScope((id, \"ICO\", estimateType, accidentYear));", "\nnominalICO" ] }, { "cell_type": "code", "source": [ - "var nominalALE = Test.GetScope((id, \"ALE\", calculationType, accidentYear));", + "var nominalALE = Test.GetScope((id, \"ALE\", estimateType, accidentYear));", "\nnominalNIC" ] }, { "cell_type": "code", "source": [ - "var nominalULE = Test.GetScope((id, \"ULE\", calculationType, accidentYear));", + "var nominalULE = Test.GetScope((id, \"ULE\", estimateType, accidentYear));", "\nnominalNIC" ] }, diff --git a/Test/SpecificationsSetup.ipynb b/Test/SpecificationsSetup.ipynb index f4d8ab6f..73244da4 100644 --- a/Test/SpecificationsSetup.ipynb +++ b/Test/SpecificationsSetup.ipynb @@ -88,7 +88,7 @@ "\n", "\npublic static IfrsVariable FromPvToIfrsVariable(this PresentValue scope)", "\n => new IfrsVariable{ EconomicBasis = scope.EconomicBasis, ", - "\n EstimateType = scope.Identity.CalculationType, ", + "\n EstimateType = scope.Identity.EstimateType, ", "\n DataNode = scope.Identity.Id.DataNode, ", "\n AocType = scope.Identity.Id.AocType, ", "\n Novelty = scope.Identity.Id.Novelty, ", diff --git a/Test/SpecificationsTechnicalMargin.ipynb b/Test/SpecificationsTechnicalMargin.ipynb index 13c6c98b..5ef06971 100644 --- a/Test/SpecificationsTechnicalMargin.ipynb +++ b/Test/SpecificationsTechnicalMargin.ipynb @@ -840,7 +840,7 @@ "cell_type": "code", "source": [ "var premiums = premiumAllocationFactor * Test.GetStorage().GetPremiums()", - "\n .Sum(p => referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n .Sum(p => referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.A, (int?)null)).Value)", "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.AA, (int?)null)).Value)", "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.OA, (int?)null)).Value)", @@ -869,7 +869,7 @@ "cell_type": "code", "source": [ "var attributableExpenseAndCommissions = new string[] {AmountTypes.ACA, AmountTypes.AEA}", - "\n .Sum(d => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n .Sum(d => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, EstimateTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, EstimateTypes.A, (int?)null)).Value));" ] }, @@ -895,7 +895,7 @@ "cell_type": "code", "source": [ "var investmentClaims = Test.GetStorage().GetInvestmentClaims()", - "\n .Sum(ic => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, CalculationTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", + "\n .Sum(ic => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.A, (int?)null)).Value)", "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.AA, (int?)null)).Value)", "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.OA, (int?)null)).Value)", From 23591f3645be90e15860c0f55247f716e6b95b6f Mon Sep 17 00:00:00 2001 From: amuolo Date: Mon, 10 Oct 2022 13:55:38 +0200 Subject: [PATCH 09/43] Merge pull request #40 from Systemorph/defaultsStateParameters Default data node state & parameters --- Import/Importers.ipynb | 64 ++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/Import/Importers.ipynb b/Import/Importers.ipynb index 319f9b9e..cbf48bab 100644 --- a/Import/Importers.ipynb +++ b/Import/Importers.ipynb @@ -266,36 +266,32 @@ { "cell_type": "code", "source": [ - "// TODO: think of a better Factory to instantiate DataNode/State/Parameter simultaneously while avoiding public contructors (see Factory Patterns)", - "\n// ATTENTION: this Factory method provides default states and parameters so that it is not mandatory to import them (=> simpler calculation engine). ", - "\n// This method weakness is that these defaults aren't always replaced with the imported values, e,g, when Month > DefaultDataNodeActivationMonth.", - "\n// Therefore they will remain in the DataSource (hopefully without producing any harm).", - "\npublic async Task DataNodeFactoryAsync ()", + "public async Task DataNodeFactoryAsync(string file, string tab, ImportArgs args)", "\n{", - "\n var partition = (Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode));", - "\n var existingGroupOfContracts = await DataSource.Query().Where(x => x.Partition == partition).ToArrayAsync();", - "\n var importedGroupOfContracts = await Workspace.Query().ToArrayAsync();", - "\n var listOfPartitionsWithPeriod = new List();", - "\n ", - "\n foreach (var groupOfContract in importedGroupOfContracts)", - "\n {", - "\n var name = groupOfContract.SystemName;", - "\n if(!existingGroupOfContracts.Any(x => x.SystemName == name))", - "\n {", - "\n var state = new DataNodeState { DataNode = name, Year = groupOfContract.AnnualCohort, Partition = partition };", - "\n var parameter = new SingleDataNodeParameter { DataNode = name, Year = groupOfContract.AnnualCohort, Partition = partition };", - "\n await Workspace.UpdateAsync(state);", - "\n if(groupOfContract is GroupOfInsuranceContract) await Workspace.UpdateAsync(parameter);", - "\n }", - "\n }", - "\n ", - "\n await CommitToDatabase(partition);", - "\n await CommitToDatabase(partition);", - "\n await CommitToDatabase(partition);", - "\n await CommitToDatabase(partition);", - "\n //Hot fix: Disabling default as using Annual Cohort breakes Opening importer logic. ", - "\n //await CommitToDatabase(partition, snapshot: false);", - "\n //await CommitToDatabase(partition, snapshot: false);", + "\n var partition = (await DataSource.Query().Where(p => p.ReportingNode == args.ReportingNode && p.Scenario == null).ToArrayAsync()).SingleOrDefault();", + "\n if(partition == null) { ApplicationMessage.Log(Error.ParsedPartitionNotFound); return; }", + "\n", + "\n var extension = System.IO.Path.GetExtension(file);", + "\n var stream = await Project.FileStorage.ReadAsync(file);", + "\n var target = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).Tables[tab];", + "\n", + "\n var dataNodesImported = target.Rows.Select(x => x.Field(nameof(RawVariable.DataNode))).ToHashSet();", + "\n var dataNodesDefined = await DataSource.Query().Where(x => dataNodesImported.Contains(x.SystemName)).ToArrayAsync();", + "\n var dataNodeStatesDefined = await DataSource.Query().Select(x => x.DataNode).ToArrayAsync();", + "\n var dataNodeParametersDefined = await DataSource.Query().Select(x => x.DataNode).ToArrayAsync(); ", + "\n", + "\n var dataNodeStatesUndefined = dataNodesImported.Where(x => x != null && !dataNodeStatesDefined.Contains(x)).ToHashSet();", + "\n var dataNodeSingleParametersUndefined = dataNodesImported.Where(x => x != null &&", + "\n !dataNodeParametersDefined.Contains(x) && ", + "\n dataNodesDefined.SingleOrDefault(y => y.SystemName == x) is GroupOfInsuranceContract).ToHashSet();", + "\n", + "\n await DataSource.UpdateAsync( dataNodeStatesUndefined.Select(x => ", + "\n new DataNodeState {DataNode = x, Year = args.Year, Month = DefaultDataNodeActivationMonth, State = State.Active, Partition = partition.Id}).ToArray() );", + "\n", + "\n await DataSource.UpdateAsync( dataNodeSingleParametersUndefined.Select(x => ", + "\n new SingleDataNodeParameter {DataNode = x, Year = args.Year, Month = DefaultDataNodeActivationMonth, PremiumAllocation = DefaultPremiumExperienceAdjustmentFactor, Partition = partition.Id}).ToArray() );", + "\n", + "\n await DataSource.CommitAsync();", "\n}" ] }, @@ -491,8 +487,10 @@ "\n{", "\n var log = await UploadDataNodesToWorkspaceAsync(fileName);", "\n var partition = (Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode));", - "\n ", - "\n await DataNodeFactoryAsync(); ", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", "\n return log;", "\n}" ] @@ -784,6 +782,7 @@ "\n{", "\n Activity.Start();", "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Cashflow};", + "\n await DataNodeFactoryAsync(fileName, ImportFormats.Cashflow, args);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", "\n var parsingLog = await ParseCashflowsToWorkspaceAsync(fileName, args);", @@ -886,6 +885,7 @@ "\n{", "\n Activity.Start();", "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Actual};", + "\n await DataNodeFactoryAsync(fileName, ImportFormats.Actual, args);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n", "\n var parsingLog = await ParseActualsToWorkspaceAsync(fileName, args);", @@ -997,6 +997,7 @@ "\n{", "\n Activity.Start();", "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.SimpleValue};", + "\n await DataNodeFactoryAsync(fileName, ImportFormats.SimpleValue, args);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", "\n Guid partitionId = new Guid();", @@ -1026,6 +1027,7 @@ "\n{", "\n Activity.Start();", "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Opening};", + "\n await DataNodeFactoryAsync(fileName, ImportFormats.Opening, args);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", "\n Guid partitionId = new Guid();", From 08a2bc52ffd92fa36be92171aaf47fd2f4ae5ea2 Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Wed, 12 Oct 2022 08:02:54 +0200 Subject: [PATCH 10/43] Merge pull request #42 from Systemorph/ExtractDataProject Extract project for Data --- README.md | 1 - .../Database}/.gitignore | 0 .../Database}/Configure.ipynb | 2 +- .../Database}/Schema Delete.ipynb | 0 .../Export}/MapTemplate.ipynb | 2 +- .../300.ReportingNodes/ReportingNodes.csv | 0 .../DataNodeParameters_CH_2020_12.csv | 0 .../DataNodeStates_CH_2020_12.csv | 0 .../Files}/700.DataNodes/DataNodes_CH.csv | 0 .../800.Parameters/CreditDefaultRate.csv | 0 .../Files}/800.Parameters/ExchangeRate.csv | 0 .../Files}/800.Parameters/PartnerRating.csv | 0 .../Files}/800.Parameters/YieldCurve.csv | 0 .../Actuals_CH_2020_12.csv | 0 .../Actuals_CH_2021_3.csv | 0 .../NominalCashflows_CH_2020_12.csv | 0 .../NominalCashflows_CH_2021_3.csv | 0 .../Openings_CH_2020_12.csv | 0 .../Files}/DimensionsAndPartitions.csv | 32 +- .../Images}/ActualFormat.png | Bin .../Images}/CashflowFormat.png | Bin .../Images}/OpeningFormat.png | Bin .../Images}/SpecificationsCSM.PNG | Bin .../Images}/SpecificationsImportActuals.PNG | Bin .../Images}/SpecificationsImportCashflows.PNG | Bin .../Images}/SpecificationsPL.PNG | Bin .../Images}/Systemorph_logo.png | Bin .../InitSystemorphBaseToMemory.ipynb | 2 +- .../InitSystemorphToDatabase.ipynb | 6 - .../InitSystemorphToMemory.ipynb | 0 .../InputFormatDescription.ipynb | 0 LICENSE => full-ifrs17-template/LICENSE | 0 .../OverviewIFRS17Template.ipynb | 135 ++++++ full-ifrs17-template/README.md | 35 ++ full-ifrs17-template/Report/Reports.ipynb | 402 ++++++++++++++++++ .../Test}/AocStructureTest.ipynb | 0 .../Test}/Data/CashflowComplex.csv | 0 .../Data/DataNodeParameter_Duplicate.csv | 0 .../DataNodeParameter_InvalidDataNode.csv | 0 .../DataNodeParameter_InvalidReinsCov.csv | 0 .../BM_CH_2020_12_A.csv | 0 .../BM_CH_2020_12_AA.csv | 0 .../BM_CH_2020_12_APA.csv | 0 .../BM_CH_2020_12_BE.csv | 0 .../BM_CH_2020_12_BEPA.csv | 0 .../BM_CH_2020_12_C.csv | 0 .../BM_CH_2020_12_DA.csv | 0 .../BM_CH_2020_12_F.csv | 0 .../BM_CH_2020_12_OA.csv | 0 .../BM_CH_2020_12_RA.csv | 0 .../IfrsVariableBenchmarks/BM_CH_2021_3_A.csv | 0 .../BM_CH_2021_3_AA.csv | 0 .../BM_CH_2021_3_AAPA.csv | 0 .../BM_CH_2021_3_APA.csv | 0 .../BM_CH_2021_3_BE.csv | 0 .../BM_CH_2021_3_BEPA.csv | 0 .../IfrsVariableBenchmarks/BM_CH_2021_3_C.csv | 0 .../BM_CH_2021_3_DA.csv | 0 .../IfrsVariableBenchmarks/BM_CH_2021_3_F.csv | 0 .../IfrsVariableBenchmarks/BM_CH_2021_3_L.csv | 0 .../BM_CH_2021_3_LR.csv | 0 .../BM_CH_2021_3_OA.csv | 0 .../BM_CH_2021_3_OAPA.csv | 0 .../BM_CH_2021_3_RA.csv | 0 ...ableBenchmarks_2020_12_CH__Contractual.csv | 0 ...iableBenchmarks_2021_3_CH__Contractual.csv | 0 .../Test}/ExportIfrsVariable.ipynb | 0 .../Test}/ExportReportVariables.ipynb | 0 .../Test}/IfrsVariablesTest.ipynb | 0 .../Test}/ImportStorageTest.ipynb | 0 .../Test}/MapTemplateAndImportTest.ipynb | 7 - .../Test}/QueriesTest.ipynb | 2 +- .../Test}/ReportStorageTest.ipynb | 6 - .../Test}/ReportVariablesTest.ipynb | 18 - .../Test}/ReportVariablesTestBase.ipynb | 8 +- .../SpecificationsFinancialPerformance.ipynb | 19 - .../Test}/SpecificationsImportActuals.ipynb | 42 +- .../Test}/SpecificationsImportCashflows.ipynb | 42 +- .../Test}/SpecificationsSetup.ipynb | 13 +- .../Test}/SpecificationsTechnicalMargin.ipynb | 62 +-- .../Test}/TechnicalMarginTest.ipynb | 0 .../Test}/Tests.ipynb | 0 ifrs17/CalculationEngine.ipynb | 30 ++ {Constants => ifrs17/Constants}/Consts.ipynb | 0 {Constants => ifrs17/Constants}/Enums.ipynb | 0 .../Constants}/Validations.ipynb | 0 .../DataModel}/DataStructure.ipynb | 0 .../Export/ExportConfiguration.ipynb | 0 ifrs17/Images/BigPicture.PNG | Bin 0 -> 38530 bytes ifrs17/Images/Systemorph_logo.png | Bin 0 -> 17061 bytes .../Import}/ImportScopeCalculation.ipynb | 12 +- {Import => ifrs17/Import}/ImportStorage.ipynb | 0 {Import => ifrs17/Import}/Importers.ipynb | 8 +- ifrs17/LICENSE | 21 + .../OverviewCalculationEngine.ipynb | 68 +-- ifrs17/README.md | 31 ++ .../Report}/ReportConfigurationAndUtils.ipynb | 0 {Report => ifrs17/Report}/ReportScopes.ipynb | 0 {Report => ifrs17/Report}/ReportStorage.ipynb | 0 {Report => ifrs17/Report}/Reports.ipynb | 0 .../Utils}/ApplicationMessage.ipynb | 0 {Utils => ifrs17/Utils}/Extensions.ipynb | 0 .../Utils}/ImportCalculationMethods.ipynb | 0 {Utils => ifrs17/Utils}/Queries.ipynb | 0 {Utils => ifrs17/Utils}/TestHelper.ipynb | 0 105 files changed, 780 insertions(+), 226 deletions(-) delete mode 100644 README.md rename {Database => full-ifrs17-template/Database}/.gitignore (100%) rename {Database => full-ifrs17-template/Database}/Configure.ipynb (97%) rename {Database => full-ifrs17-template/Database}/Schema Delete.ipynb (100%) rename {Export => full-ifrs17-template/Export}/MapTemplate.ipynb (99%) rename {Files => full-ifrs17-template/Files}/300.ReportingNodes/ReportingNodes.csv (100%) rename {Files => full-ifrs17-template/Files}/700.DataNodes/DataNodeParameters_CH_2020_12.csv (100%) rename {Files => full-ifrs17-template/Files}/700.DataNodes/DataNodeStates_CH_2020_12.csv (100%) rename {Files => full-ifrs17-template/Files}/700.DataNodes/DataNodes_CH.csv (100%) rename {Files => full-ifrs17-template/Files}/800.Parameters/CreditDefaultRate.csv (100%) rename {Files => full-ifrs17-template/Files}/800.Parameters/ExchangeRate.csv (100%) rename {Files => full-ifrs17-template/Files}/800.Parameters/PartnerRating.csv (100%) rename {Files => full-ifrs17-template/Files}/800.Parameters/YieldCurve.csv (100%) rename {Files => full-ifrs17-template/Files}/900.TransactionalData/Actuals_CH_2020_12.csv (100%) rename {Files => full-ifrs17-template/Files}/900.TransactionalData/Actuals_CH_2021_3.csv (100%) rename {Files => full-ifrs17-template/Files}/900.TransactionalData/NominalCashflows_CH_2020_12.csv (100%) rename {Files => full-ifrs17-template/Files}/900.TransactionalData/NominalCashflows_CH_2021_3.csv (100%) rename {Files => full-ifrs17-template/Files}/900.TransactionalData/Openings_CH_2020_12.csv (100%) rename {Files => full-ifrs17-template/Files}/DimensionsAndPartitions.csv (91%) rename {Images => full-ifrs17-template/Images}/ActualFormat.png (100%) rename {Images => full-ifrs17-template/Images}/CashflowFormat.png (100%) rename {Images => full-ifrs17-template/Images}/OpeningFormat.png (100%) rename {Images => full-ifrs17-template/Images}/SpecificationsCSM.PNG (100%) rename {Images => full-ifrs17-template/Images}/SpecificationsImportActuals.PNG (100%) rename {Images => full-ifrs17-template/Images}/SpecificationsImportCashflows.PNG (100%) rename {Images => full-ifrs17-template/Images}/SpecificationsPL.PNG (100%) rename {Images => full-ifrs17-template/Images}/Systemorph_logo.png (100%) rename {Initialization => full-ifrs17-template/Initialization}/InitSystemorphBaseToMemory.ipynb (98%) rename {Initialization => full-ifrs17-template/Initialization}/InitSystemorphToDatabase.ipynb (97%) rename {Initialization => full-ifrs17-template/Initialization}/InitSystemorphToMemory.ipynb (100%) rename InputFormatDescription.ipynb => full-ifrs17-template/InputFormatDescription.ipynb (100%) rename LICENSE => full-ifrs17-template/LICENSE (100%) create mode 100644 full-ifrs17-template/OverviewIFRS17Template.ipynb create mode 100644 full-ifrs17-template/README.md create mode 100644 full-ifrs17-template/Report/Reports.ipynb rename {Test => full-ifrs17-template/Test}/AocStructureTest.ipynb (100%) rename {Test => full-ifrs17-template/Test}/Data/CashflowComplex.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/DataNodeParameter_Duplicate.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/DataNodeParameter_InvalidDataNode.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/DataNodeParameter_InvalidReinsCov.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv (100%) rename {Test => full-ifrs17-template/Test}/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv (100%) rename {Test => full-ifrs17-template/Test}/ExportIfrsVariable.ipynb (100%) rename {Test => full-ifrs17-template/Test}/ExportReportVariables.ipynb (100%) rename {Test => full-ifrs17-template/Test}/IfrsVariablesTest.ipynb (100%) rename {Test => full-ifrs17-template/Test}/ImportStorageTest.ipynb (100%) rename {Test => full-ifrs17-template/Test}/MapTemplateAndImportTest.ipynb (99%) rename {Test => full-ifrs17-template/Test}/QueriesTest.ipynb (99%) rename {Test => full-ifrs17-template/Test}/ReportStorageTest.ipynb (96%) rename {Test => full-ifrs17-template/Test}/ReportVariablesTest.ipynb (92%) rename {Test => full-ifrs17-template/Test}/ReportVariablesTestBase.ipynb (96%) rename {Test => full-ifrs17-template/Test}/SpecificationsFinancialPerformance.ipynb (99%) rename {Test => full-ifrs17-template/Test}/SpecificationsImportActuals.ipynb (99%) rename {Test => full-ifrs17-template/Test}/SpecificationsImportCashflows.ipynb (99%) rename {Test => full-ifrs17-template/Test}/SpecificationsSetup.ipynb (96%) rename {Test => full-ifrs17-template/Test}/SpecificationsTechnicalMargin.ipynb (98%) rename {Test => full-ifrs17-template/Test}/TechnicalMarginTest.ipynb (100%) rename {Test => full-ifrs17-template/Test}/Tests.ipynb (100%) create mode 100644 ifrs17/CalculationEngine.ipynb rename {Constants => ifrs17/Constants}/Consts.ipynb (100%) rename {Constants => ifrs17/Constants}/Enums.ipynb (100%) rename {Constants => ifrs17/Constants}/Validations.ipynb (100%) rename {DataModel => ifrs17/DataModel}/DataStructure.ipynb (100%) rename Export/Export.ipynb => ifrs17/Export/ExportConfiguration.ipynb (100%) create mode 100644 ifrs17/Images/BigPicture.PNG create mode 100644 ifrs17/Images/Systemorph_logo.png rename {Import => ifrs17/Import}/ImportScopeCalculation.ipynb (99%) rename {Import => ifrs17/Import}/ImportStorage.ipynb (100%) rename {Import => ifrs17/Import}/Importers.ipynb (99%) create mode 100644 ifrs17/LICENSE rename OverviewCalculationEngine.ipynb => ifrs17/OverviewCalculationEngine.ipynb (71%) create mode 100644 ifrs17/README.md rename {Report => ifrs17/Report}/ReportConfigurationAndUtils.ipynb (100%) rename {Report => ifrs17/Report}/ReportScopes.ipynb (100%) rename {Report => ifrs17/Report}/ReportStorage.ipynb (100%) rename {Report => ifrs17/Report}/Reports.ipynb (100%) rename {Utils => ifrs17/Utils}/ApplicationMessage.ipynb (100%) rename {Utils => ifrs17/Utils}/Extensions.ipynb (100%) rename {Utils => ifrs17/Utils}/ImportCalculationMethods.ipynb (100%) rename {Utils => ifrs17/Utils}/Queries.ipynb (100%) rename {Utils => ifrs17/Utils}/TestHelper.ipynb (100%) diff --git a/README.md b/README.md deleted file mode 100644 index 5173f5ae..00000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# IFRS17CalculationEngine \ No newline at end of file diff --git a/Database/.gitignore b/full-ifrs17-template/Database/.gitignore similarity index 100% rename from Database/.gitignore rename to full-ifrs17-template/Database/.gitignore diff --git a/Database/Configure.ipynb b/full-ifrs17-template/Database/Configure.ipynb similarity index 97% rename from Database/Configure.ipynb rename to full-ifrs17-template/Database/Configure.ipynb index 9b23844f..b332a43c 100644 --- a/Database/Configure.ipynb +++ b/full-ifrs17-template/Database/Configure.ipynb @@ -27,7 +27,7 @@ { "cell_type": "code", "source": [ - "#!import \"../DataModel/DataStructure\"" + "#!import \"//ifrs17ce/dev/CalculationEngine\"" ] }, { diff --git a/Database/Schema Delete.ipynb b/full-ifrs17-template/Database/Schema Delete.ipynb similarity index 100% rename from Database/Schema Delete.ipynb rename to full-ifrs17-template/Database/Schema Delete.ipynb diff --git a/Export/MapTemplate.ipynb b/full-ifrs17-template/Export/MapTemplate.ipynb similarity index 99% rename from Export/MapTemplate.ipynb rename to full-ifrs17-template/Export/MapTemplate.ipynb index 2f6034eb..4aa026ea 100644 --- a/Export/MapTemplate.ipynb +++ b/full-ifrs17-template/Export/MapTemplate.ipynb @@ -65,7 +65,7 @@ { "cell_type": "code", "source": [ - "#!import \"../Export/Export\"" + "#!import \"../Export/ExportConfiguration\"" ] }, { diff --git a/Files/300.ReportingNodes/ReportingNodes.csv b/full-ifrs17-template/Files/300.ReportingNodes/ReportingNodes.csv similarity index 100% rename from Files/300.ReportingNodes/ReportingNodes.csv rename to full-ifrs17-template/Files/300.ReportingNodes/ReportingNodes.csv diff --git a/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv b/full-ifrs17-template/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv similarity index 100% rename from Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv rename to full-ifrs17-template/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv diff --git a/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv b/full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv similarity index 100% rename from Files/700.DataNodes/DataNodeStates_CH_2020_12.csv rename to full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv diff --git a/Files/700.DataNodes/DataNodes_CH.csv b/full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv similarity index 100% rename from Files/700.DataNodes/DataNodes_CH.csv rename to full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv diff --git a/Files/800.Parameters/CreditDefaultRate.csv b/full-ifrs17-template/Files/800.Parameters/CreditDefaultRate.csv similarity index 100% rename from Files/800.Parameters/CreditDefaultRate.csv rename to full-ifrs17-template/Files/800.Parameters/CreditDefaultRate.csv diff --git a/Files/800.Parameters/ExchangeRate.csv b/full-ifrs17-template/Files/800.Parameters/ExchangeRate.csv similarity index 100% rename from Files/800.Parameters/ExchangeRate.csv rename to full-ifrs17-template/Files/800.Parameters/ExchangeRate.csv diff --git a/Files/800.Parameters/PartnerRating.csv b/full-ifrs17-template/Files/800.Parameters/PartnerRating.csv similarity index 100% rename from Files/800.Parameters/PartnerRating.csv rename to full-ifrs17-template/Files/800.Parameters/PartnerRating.csv diff --git a/Files/800.Parameters/YieldCurve.csv b/full-ifrs17-template/Files/800.Parameters/YieldCurve.csv similarity index 100% rename from Files/800.Parameters/YieldCurve.csv rename to full-ifrs17-template/Files/800.Parameters/YieldCurve.csv diff --git a/Files/900.TransactionalData/Actuals_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv similarity index 100% rename from Files/900.TransactionalData/Actuals_CH_2020_12.csv rename to full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv diff --git a/Files/900.TransactionalData/Actuals_CH_2021_3.csv b/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv similarity index 100% rename from Files/900.TransactionalData/Actuals_CH_2021_3.csv rename to full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv diff --git a/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv similarity index 100% rename from Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv rename to full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv diff --git a/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv similarity index 100% rename from Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv rename to full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv diff --git a/Files/900.TransactionalData/Openings_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv similarity index 100% rename from Files/900.TransactionalData/Openings_CH_2020_12.csv rename to full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv diff --git a/Files/DimensionsAndPartitions.csv b/full-ifrs17-template/Files/DimensionsAndPartitions.csv similarity index 91% rename from Files/DimensionsAndPartitions.csv rename to full-ifrs17-template/Files/DimensionsAndPartitions.csv index 4c2662b4..bcfe9d1d 100644 --- a/Files/DimensionsAndPartitions.csv +++ b/full-ifrs17-template/Files/DimensionsAndPartitions.csv @@ -110,22 +110,22 @@ C,Current,20,,,,,,,,, ,,,,,,,,,,, @@EstimateType,,,,,,,,,,, SystemName,DisplayName,Order,StructureType,InputSource,PeriodType,ExternalId0,ExternalId1,ExternalId2,,, -BE,Best Estimate of Present Value,1,AoC,4,,,,EndOfPeriod,,, -RA,Risk Adjustment,10,AoC,4,,,,EndOfPeriod,,, -CU,CoverageUnit,15,AoC,4,,,,EndOfPeriod,,, -C,Contractual Service Margin,20,AoC,7,,,,NotApplicable,,, -L,Loss Component,30,AoC,7,,,,NotApplicable,,, -LR,Loss Recovery Component,40,AoC,7,,,,NotApplicable,,, -PL,Profit and Loss,50,None,7,,,,NotApplicable,,, -AA,Advance Actuals,60,AoC,3,PayablePR,ReceivableNIC,ReceivableICO,NotApplicable,,, -OA,Overdue Actuals,70,AoC,3,ReceivablePR,PayableNIC,PayableICO,NotApplicable,,, -DA,Deferrable Actuals,80,AoC,3,,,,NotApplicable,,, -A,Actuals,90,None,2,,,,NotApplicable,,, -F,Factors,100,None,4,,,,NotApplicable,,, -AAPA,Advance Actuals,110,None,2,,,,NotApplicable,,, -OAPA,Overdue Actuals,120,None,2,,,,NotApplicable,,, -APA,Actuals,130,None,2,,,,NotApplicable,,, -BEPA,Best Estimate of Present Value,140,None,4,,,,NotApplicable,,, +BE,Best Estimate of Present Value,1,AoC,4,EndOfPeriod,,,,,, +RA,Risk Adjustment,10,AoC,4,EndOfPeriod,,,,,, +CU,CoverageUnit,15,AoC,4,EndOfPeriod,,,,,, +C,Contractual Service Margin,20,AoC,7,NotApplicable,,,,,, +L,Loss Component,30,AoC,7,NotApplicable,,,,,, +LR,Loss Recovery Component,40,AoC,7,NotApplicable,,,,,, +PL,Profit and Loss,50,None,7,NotApplicable,,,,,, +AA,Advance Actuals,60,AoC,3,NotApplicable,PayablePR,ReceivableNIC,ReceivableICO,,, +OA,Overdue Actuals,70,AoC,3,NotApplicable,ReceivablePR,PayableNIC,PayableICO,,, +DA,Deferrable Actuals,80,AoC,3,NotApplicable,,,,,, +A,Actuals,90,None,2,NotApplicable,,,,,, +F,Factors,100,None,4,NotApplicable,,,,,, +AAPA,Advance Actuals,110,None,2,NotApplicable,,,,,, +OAPA,Overdue Actuals,120,None,2,NotApplicable,,,,,, +APA,Actuals,130,None,2,NotApplicable,,,,,, +BEPA,Best Estimate of Present Value,140,None,4,NotApplicable,,,,,, ,,,,,,,,,,, @@LiabilityType,,,,,,,,,,, SystemName,DisplayName,,,,,,,,,, diff --git a/Images/ActualFormat.png b/full-ifrs17-template/Images/ActualFormat.png similarity index 100% rename from Images/ActualFormat.png rename to full-ifrs17-template/Images/ActualFormat.png diff --git a/Images/CashflowFormat.png b/full-ifrs17-template/Images/CashflowFormat.png similarity index 100% rename from Images/CashflowFormat.png rename to full-ifrs17-template/Images/CashflowFormat.png diff --git a/Images/OpeningFormat.png b/full-ifrs17-template/Images/OpeningFormat.png similarity index 100% rename from Images/OpeningFormat.png rename to full-ifrs17-template/Images/OpeningFormat.png diff --git a/Images/SpecificationsCSM.PNG b/full-ifrs17-template/Images/SpecificationsCSM.PNG similarity index 100% rename from Images/SpecificationsCSM.PNG rename to full-ifrs17-template/Images/SpecificationsCSM.PNG diff --git a/Images/SpecificationsImportActuals.PNG b/full-ifrs17-template/Images/SpecificationsImportActuals.PNG similarity index 100% rename from Images/SpecificationsImportActuals.PNG rename to full-ifrs17-template/Images/SpecificationsImportActuals.PNG diff --git a/Images/SpecificationsImportCashflows.PNG b/full-ifrs17-template/Images/SpecificationsImportCashflows.PNG similarity index 100% rename from Images/SpecificationsImportCashflows.PNG rename to full-ifrs17-template/Images/SpecificationsImportCashflows.PNG diff --git a/Images/SpecificationsPL.PNG b/full-ifrs17-template/Images/SpecificationsPL.PNG similarity index 100% rename from Images/SpecificationsPL.PNG rename to full-ifrs17-template/Images/SpecificationsPL.PNG diff --git a/Images/Systemorph_logo.png b/full-ifrs17-template/Images/Systemorph_logo.png similarity index 100% rename from Images/Systemorph_logo.png rename to full-ifrs17-template/Images/Systemorph_logo.png diff --git a/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb similarity index 98% rename from Initialization/InitSystemorphBaseToMemory.ipynb rename to full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index e7b7b98d..293cb431 100644 --- a/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb @@ -29,7 +29,7 @@ { "cell_type": "code", "source": [ - "#!import \"../Import/Importers\"" + "#!import \"//ifrs17ce/dev/CalculationEngine\"" ] }, { diff --git a/Initialization/InitSystemorphToDatabase.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb similarity index 97% rename from Initialization/InitSystemorphToDatabase.ipynb rename to full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb index bb25efb5..9b7b5ab5 100644 --- a/Initialization/InitSystemorphToDatabase.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb @@ -29,12 +29,6 @@ "#!import \"../Database/Configure\"" ] }, - { - "cell_type": "code", - "source": [ - "#!import \"../Import/Importers\"" - ] - }, { "cell_type": "markdown", "source": [ diff --git a/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb similarity index 100% rename from Initialization/InitSystemorphToMemory.ipynb rename to full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb diff --git a/InputFormatDescription.ipynb b/full-ifrs17-template/InputFormatDescription.ipynb similarity index 100% rename from InputFormatDescription.ipynb rename to full-ifrs17-template/InputFormatDescription.ipynb diff --git a/LICENSE b/full-ifrs17-template/LICENSE similarity index 100% rename from LICENSE rename to full-ifrs17-template/LICENSE diff --git a/full-ifrs17-template/OverviewIFRS17Template.ipynb b/full-ifrs17-template/OverviewIFRS17Template.ipynb new file mode 100644 index 00000000..7145abb7 --- /dev/null +++ b/full-ifrs17-template/OverviewIFRS17Template.ipynb @@ -0,0 +1,135 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

IFRS17 Template - an Overview

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Introduction", + "\n", + "\nThe Systemorph's IFRS 17 Calculation Engine is a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts, for a **groups of insurance contracts** and other relevant parameters (Yield Curve, Fx, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\n", + "\nThis notebook provides an **overview** of Systemorph's Full IFRS 17 Template with brief introductions to all the main steps." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# IFRS 17", + "\n", + "\nIFRS 17 is a new accounting standard for insurance contracts. The previous standard IFRS 4, which is based on nominal accounting, is replaced by the economic accounting standard IFRS 17.", + "\n", + "\nIFRS 17 deals with insurance contracts which are on the liability side of the balance sheet. Other accounting standards deal with other parts of the business, primarily IFRS 9 for invested assets.", + "\n", + "\nInsurance policies need to be allocated to homogeneous groups of insurance contracts (GICs) according to high-level principles established by the IFRS 17 standard, such as contract type, line of business, annual cohort etc. Insurers have some degree of freedom to optmize those GICs, as long as they respect the high-level principles.", + "\n", + "\nInsurance contracts generate different types of cashflows. For example, **Amount Type** is a dimension refering to premiums, claims, expenses of different kinds, etc. for these cashflows. The Calculation Engine presented here expects input files of all the projected cashflows for each GIC, for different regular time points (quarterly or monthly, ...) and corresponding actual amounts observed for a given period. ", + "\n", + "\nEach cashflow is characterized by all the necessary attributes: business unit, start time, amount type, novelty of business etc. and projected cashflow amounts in a regular time grid until the final run-off of all contracts.", + "\n", + "\nIf the entered cashflows are nominal (the usual case), the the present value (PV) of each cashflow is computed using proper yield curves for discounting.", + "\n", + "\nA central element of IFRS 17 is the Analysis of Change (AoC). The present value of the business (future cashflows) changes from the beginning to the end of the accounting period due to different effects, each of them constituting a modeled AoC step.", + "\n", + "\nIn IFRS 17, the value of future profitable business has a component called the Contractual Service Margin (CSM), defined at GIC level. The profit measured as CSM is recognized slowly over time rather than immediately in financial performance statements. On the other hand, a GIC can be onerous and produce a Loss Component (LC) instead, which needs to be recognized immediately.", + "\n", + "\nSeveral reports on the valuation of cashflows, balance sheet and financial performance can be produced, each dealing with different aspects, such as", + "\n - Present Value of Future Cash Flows (PVFCF)", + "\n - Contractual Service Margin (CSM) and Loss Component (LC)", + "\n - Liability for Remaining Coverage (LRC)", + "\n - Liability for Incurred Claims (LIC)", + "\n - Financial Performance", + "\n - Accounting Events" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Data input" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Reporting nodes, dimensions and partitions", + "\n", + "\nSee folders *Files* (DimensionsAndPartitions) and *Files/300.ReportingNodes* (ReportingNodes).", + "\n- **ReportingNodes**: List of business units, often per country, with system name and display name, currency and \"G\" for the whole group", + "\n- **DimensionsAndPartitions**: The many dimensions (21) required to characterize all of the data and results, with system names and display names. This information is quite stable, but some information related to partitions refers to the reporting nodes " + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Groups of insurance and reinsurance contracts", + "\n", + "\nSee folder Files/700.DataNodes. The information is about data nodes, that is Groups of Insurance Contracts (GICs) and Groups of Reinsurance Contracts (GRICs) and portfolios of these.", + "\n- **DataNodes**: List of all GICs and GRICs, each with several attributes and the portfolios to which they belong; an additional attribute of GRICs being the reinsurance partner", + "\n- **DataNodeParameters** *\\_* *\\_* *\\_*: List of those GICs and GRICs that are actually used for the given reporting node/year/month combination with few attributes; if needed, more such files may be added for other reporting node/year/month combinations", + "\n- **DataNodeStates** *\\_* *\\_* *\\_*: Switching data nodes on and off, the normal state is (\"Active\") for all the GICs and GRICs of the reporting node/year/month combination; if needed, more such files may be added for other reporting node/year/month combinations" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Parameters from financial markets", + "\n", + "\nSee folder Files/800.Parameters.", + "\n- **YieldCurve**: List of all yield curves to be used, for different currencies and as-of dates (year/month), using a yearly grid of interest rate maturities extending as far as needed", + "\n- **ExchangeRate**: List of exchange rates to be used, for different currencies and as-of dates (year/month), with a type (Spot/Average); defined as the value of 1 foreign unit expressed in the group currency of the insurance company ", + "\n- **CreditDefaultRate**: For relevant year/month combinations, each with a full list of all credit ratings in S&P notation with their default rate (= probabilty of default within 1 year)", + "\n- **PartnerRating**: For each reinsurance partner of a relevant GRIC, the rating in S&P notation with the as-of date (year/month)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n## Data input: Groups of insurance and reinsurance contracts", + "\n", + "\nSee folder Files/900.TransactionalData.", + "\n- **Actuals** *\\_* *\\_* *\\_*: List of all actual amounts for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types and other attributes; we need at least two such files for the two dates of the Analysis of Change", + "\n- **Openings** *\\_* *\\_* *\\_*: List of the opening amounts for some GICs that are used by the given reporting node. The year/month combination corresponds to the beginning of the planned Analysis of Change period, so only one such file is required. The entries are by EstimateType and AmountType.", + "\n- **NominalCashflows** *\\_* *\\_* *\\_*: List of all projected cash flows for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types, novelty types and other attributes, where the cash flow amounts are given in a regular sequence extending as far as needed; we need at least two such files for the two dates of the Analysis of Change", + "\n", + "\nThe structure of the [Actuals](./InputFormatDescription#actual), [Openings](./InputFormatDescription#opening) and [NominalCashflows](./InputFormatDescription#cashflow) files is explained in a special [notebook](./InputFormatDescription).", + "\n", + "\nThe less usual option of having discounted instead of nominal cash flows in the input is also supported." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Reports", + "\n", + "\nThe production of reports is done by a notebook such as **[Reports](./Report/Reports#report-production)**." + ] + } + ] +} \ No newline at end of file diff --git a/full-ifrs17-template/README.md b/full-ifrs17-template/README.md new file mode 100644 index 00000000..5c22a397 --- /dev/null +++ b/full-ifrs17-template/README.md @@ -0,0 +1,35 @@ +![Systemorph_logo.png](https://portal.systemorph.cloud/api/project/userclone/env/dev/file/download?path=Images/Systemorph_logo.png) + +**Full IFRS 17 Template** + +Systemorph's IFRS 17 [Calculation Engine](https://portal.systemorph.cloud/api/project/ifrs17ce/env/dev/) is a tool to conduct all the essential IFRS 17 calculations given some key figures. +Systemorph's *Full IFRS 17 Template* uses our IFRS 17 Calculation Engine to import several use-cases and show the results. + +# Get Started + +Interact with this *Full IFRS 17 Template* after having cloned the project. + +# Supporting Material + +Check out the [video]() (this is a youtube link to Marketing) + +# Report + +Check out the IFRS 17 reports [here](./Report/Reports) + +# Testing + +If you want a step by step guide into the calculation logic, please go to the "Specification" notebook you are interested in: +- [Cashflow Calculation](./Test/SpecificationsImportCashflows) +- [Actuals Calculation](./Test/SpecificationsImportActuals) +- [Technical Margin Calculation](./Test/SpecificationsTechnicalMargin) +- [Financial Performance Calculation](./Test/SpecificationsFinancialPerformance) + +# Got Questions + +For support around the IFRS17 CalculationEngine you can personally reach out to one of our IFRS17 experts: +- [Dr. Andrea Muolo]() +- [Dr. Davide Colleoni](https://www.linkedin.com/in/davidecolleoni/) +- [Mrs. Sara Busato]() + +If you are interested in adapting the IFRS17 CalculationEngine to your data and would like to start a collaboration with us, you can contact [Wolfgang Maehr]() \ No newline at end of file diff --git a/full-ifrs17-template/Report/Reports.ipynb b/full-ifrs17-template/Report/Reports.ipynb new file mode 100644 index 00000000..1dc742bd --- /dev/null +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -0,0 +1,402 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + }, + "toc-autonumbering": "True", + "toc-showcode": "False" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Reports

", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Infrastructure and Configuration" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Initialize data" + ] + }, + { + "cell_type": "code", + "source": [ + "/* DataSource is configured and connected to real database */", + "\n//#!eval-notebook \"../Database/Configure\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Imports and Configurations" + ] + }, + { + "cell_type": "code", + "source": [ + "var reportStorage = new ReportStorage(Workspace, Report);", + "\nawait reportStorage.InitializeReportIndependentCacheAsync();", + "\nvar mostRecentPartition = (await Workspace.Query().Where(x => x.Scenario == null).OrderBy(x => x.Year).ThenBy(x => x.Month).ToArrayAsync()).Last();", + "\nvar reportingNodeRoot = (await Workspace.Query().Where(x => x.Parent == null).ToArrayAsync()).First().SystemName;", + "\nawait reportStorage.InitializeAsync((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);", + "\nvar identities = reportStorage.GetIdentities((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Calling Scope" + ] + }, + { + "cell_type": "code", + "source": [ + "var universe = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Report Settings and Storage Update" + ] + }, + { + "cell_type": "code", + "source": [ + "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args =", + "\n //((2020, 12), reportingNodeRoot, null,CurrencyType.Contractual)", + "\n ((2021, 3), reportingNodeRoot, null,CurrencyType.Contractual)", + "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Functional)", + "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Group)", + "\n ;", + "\n", + "\nawait reportStorage.InitializeAsync(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);", + "\nidentities = reportStorage.GetIdentities(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Use cases", + "\n", + "\nFor demostration purposes we import data for 7 *Group of Insurance Contract* (GIC) and 4 *Group of Reinsurance Contract* (GRIC). ", + "\n
Data set consists in cashflows, actuals, and parameters.", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Present Value", + "\n", + "\nPresent values of the best estimate of future cashflows are shown here in an Analysis of Change report.", + "\n", + "\nThe report view can be modified with the Slice options for the columns by changing the SliceColumnBy inputs in the next command cell.", + "\nFor example one can add \"GroupOfContract\" to separate the contributions of the individual Group of Contracts.", + "\n
We suggest to add this slice between the \"LiabilityType\" and the \"EconomicBasis\" as the the order of the inputs corresponds to the order of the columns shown in the report to expand the data.", + "\n", + "\nAggregated values are displayed when the data has a finer granularity than the one selected by the report slice options." + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedBestEstimate + universe.GetScopes(identities).Aggregate().CurrentBestEstimate)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\", \"EconomicBasis\") //\"GroupOfContract\"", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Risk Adjustment" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedRiskAdjustment + universe.GetScopes(identities).Aggregate().CurrentRiskAdjustment)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"EconomicBasis\", \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Written", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"AmountType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 450)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Advance, Overdue Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Advance + universe.GetScopes(identities).Aggregate().Overdue)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EstimateType\")", + "\n .ReportGridOptions(reportHeight: 400)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Deferrable Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Deferrals", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 400)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Fulfilment Cashflow" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Fcf ", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")//, \"EstimateType\")//, \"AmountType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Actuarial Experience Adjustment" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().ActuarialExperienceAdjustment", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"EstimateType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"AmountType\" )//\"LiabilityType\", \"EstimateType\")", + "\n .ReportGridOptions(reportHeight: 300, headerColumnWidth: 300)", + "\n .ToReport() " + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LRC Technical Margin" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().LrcTechnicalMargin", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 600)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Contractual Service Margin / Loss Component / Loss Recovery Component" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Csm + universe.GetScopes(identities).Aggregate().Lc + universe.GetScopes(identities).Aggregate().Loreco)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"EstimateType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LRC Actuarial" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LrcActuarial)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"LiabilityType\",\"GroupOfContract\",*/ \"EstimateType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LRC" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lrc)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType),\"GroupOfContract\", \"EstimateType\")", + "\n .ReportGridOptions(300)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LIC Actuarial" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LicActuarial)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", + "\n .ReportGridOptions()", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# LIC" + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lic)", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", + "\n .ReportGridOptions(300)", + "\n .ToReport()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Financial Performance", + "\n", + "\nUse the expand and collapse buttons in the report rows to change the granularity of the figures displayed." + ] + }, + { + "cell_type": "code", + "source": [ + "Report.ForDataCube(universe.GetScopes(identities).Aggregate().FinancialPerformance", + "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", + "\n )", + "\n .WithQuerySource(DataSource)", + "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", + "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", + "\n .ToReport()" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/Test/AocStructureTest.ipynb b/full-ifrs17-template/Test/AocStructureTest.ipynb similarity index 100% rename from Test/AocStructureTest.ipynb rename to full-ifrs17-template/Test/AocStructureTest.ipynb diff --git a/Test/Data/CashflowComplex.csv b/full-ifrs17-template/Test/Data/CashflowComplex.csv similarity index 100% rename from Test/Data/CashflowComplex.csv rename to full-ifrs17-template/Test/Data/CashflowComplex.csv diff --git a/Test/Data/DataNodeParameter_Duplicate.csv b/full-ifrs17-template/Test/Data/DataNodeParameter_Duplicate.csv similarity index 100% rename from Test/Data/DataNodeParameter_Duplicate.csv rename to full-ifrs17-template/Test/Data/DataNodeParameter_Duplicate.csv diff --git a/Test/Data/DataNodeParameter_InvalidDataNode.csv b/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidDataNode.csv similarity index 100% rename from Test/Data/DataNodeParameter_InvalidDataNode.csv rename to full-ifrs17-template/Test/Data/DataNodeParameter_InvalidDataNode.csv diff --git a/Test/Data/DataNodeParameter_InvalidReinsCov.csv b/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidReinsCov.csv similarity index 100% rename from Test/Data/DataNodeParameter_InvalidReinsCov.csv rename to full-ifrs17-template/Test/Data/DataNodeParameter_InvalidReinsCov.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv diff --git a/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv similarity index 100% rename from Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv diff --git a/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv similarity index 100% rename from Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv rename to full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv diff --git a/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv similarity index 100% rename from Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv rename to full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv diff --git a/Test/ExportIfrsVariable.ipynb b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb similarity index 100% rename from Test/ExportIfrsVariable.ipynb rename to full-ifrs17-template/Test/ExportIfrsVariable.ipynb diff --git a/Test/ExportReportVariables.ipynb b/full-ifrs17-template/Test/ExportReportVariables.ipynb similarity index 100% rename from Test/ExportReportVariables.ipynb rename to full-ifrs17-template/Test/ExportReportVariables.ipynb diff --git a/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb similarity index 100% rename from Test/IfrsVariablesTest.ipynb rename to full-ifrs17-template/Test/IfrsVariablesTest.ipynb diff --git a/Test/ImportStorageTest.ipynb b/full-ifrs17-template/Test/ImportStorageTest.ipynb similarity index 100% rename from Test/ImportStorageTest.ipynb rename to full-ifrs17-template/Test/ImportStorageTest.ipynb diff --git a/Test/MapTemplateAndImportTest.ipynb b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb similarity index 99% rename from Test/MapTemplateAndImportTest.ipynb rename to full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb index 6dc5c63c..f82db019 100644 --- a/Test/MapTemplateAndImportTest.ipynb +++ b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb @@ -23,13 +23,6 @@ "

Test Map Template Export and Import

" ] }, - { - "cell_type": "code", - "source": [ - "#!import \"../Export/Export\"", - "\n#!import \"../Utils/TestHelper\"" - ] - }, { "cell_type": "code", "source": [ diff --git a/Test/QueriesTest.ipynb b/full-ifrs17-template/Test/QueriesTest.ipynb similarity index 99% rename from Test/QueriesTest.ipynb rename to full-ifrs17-template/Test/QueriesTest.ipynb index 2eddc72f..ab6ca4d9 100644 --- a/Test/QueriesTest.ipynb +++ b/full-ifrs17-template/Test/QueriesTest.ipynb @@ -20,7 +20,7 @@ { "cell_type": "code", "source": [ - "#!eval-notebook \"../Utils/Queries\"" + "#!import \"../CalculationEngine\"" ] }, { diff --git a/Test/ReportStorageTest.ipynb b/full-ifrs17-template/Test/ReportStorageTest.ipynb similarity index 96% rename from Test/ReportStorageTest.ipynb rename to full-ifrs17-template/Test/ReportStorageTest.ipynb index acb1f22c..5fc57968 100644 --- a/Test/ReportStorageTest.ipynb +++ b/full-ifrs17-template/Test/ReportStorageTest.ipynb @@ -17,12 +17,6 @@ "nbformat": 4, "nbformat_minor": 5, "cells": [ - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Report/ReportStorage\"" - ] - }, { "cell_type": "code", "source": [ diff --git a/Test/ReportVariablesTest.ipynb b/full-ifrs17-template/Test/ReportVariablesTest.ipynb similarity index 92% rename from Test/ReportVariablesTest.ipynb rename to full-ifrs17-template/Test/ReportVariablesTest.ipynb index fb6904bf..cbaca38e 100644 --- a/Test/ReportVariablesTest.ipynb +++ b/full-ifrs17-template/Test/ReportVariablesTest.ipynb @@ -47,24 +47,6 @@ "#!import \"ReportVariablesTestBase\"" ] }, - { - "cell_type": "markdown", - "source": [ - "## Initialize Workspace" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] - }, - { - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ] - }, { "cell_type": "markdown", "source": [ diff --git a/Test/ReportVariablesTestBase.ipynb b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb similarity index 96% rename from Test/ReportVariablesTestBase.ipynb rename to full-ifrs17-template/Test/ReportVariablesTestBase.ipynb index 4f320987..99e9ac16 100644 --- a/Test/ReportVariablesTestBase.ipynb +++ b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb @@ -26,7 +26,13 @@ { "cell_type": "code", "source": [ - "#!import \"../Report/ReportScopes\"" + "#!import \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" ] }, { diff --git a/Test/SpecificationsFinancialPerformance.ipynb b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb similarity index 99% rename from Test/SpecificationsFinancialPerformance.ipynb rename to full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb index e52a0f5e..3cfaff8e 100644 --- a/Test/SpecificationsFinancialPerformance.ipynb +++ b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb @@ -97,13 +97,6 @@ "Import the Report definitions, initialize the Workspace and the Test Suite:" ] }, - { - "cell_type": "code", - "source": [ - "#!import \"../Report/ReportScopes\"", - "\n#!import \"../Report/ReportConfigurationAndUtils\"" - ] - }, { "cell_type": "code", "source": [ @@ -240,18 +233,6 @@ "### Non Financial" ] }, - { - "cell_type": "markdown", - "source": [ - "Import `CheckEquality`" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"../Utils/TestHelper\"" - ] - }, { "cell_type": "markdown", "source": [ diff --git a/Test/SpecificationsImportActuals.ipynb b/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb similarity index 99% rename from Test/SpecificationsImportActuals.ipynb rename to full-ifrs17-template/Test/SpecificationsImportActuals.ipynb index d71638e8..7785ed4a 100644 --- a/Test/SpecificationsImportActuals.ipynb +++ b/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb @@ -34,24 +34,6 @@ "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." ] }, - { - "cell_type": "markdown", - "source": [ - "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"SpecificationsSetup\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, { "cell_type": "markdown", "source": [ @@ -93,6 +75,30 @@ "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" ] }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "source": [ + "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"SpecificationsSetup\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, { "cell_type": "markdown", "source": [ diff --git a/Test/SpecificationsImportCashflows.ipynb b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb similarity index 99% rename from Test/SpecificationsImportCashflows.ipynb rename to full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb index 481da388..7831cbde 100644 --- a/Test/SpecificationsImportCashflows.ipynb +++ b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb @@ -36,24 +36,6 @@ "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." ] }, - { - "cell_type": "markdown", - "source": [ - "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"SpecificationsSetup\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, { "cell_type": "markdown", "source": [ @@ -100,6 +82,30 @@ "Workspace.InitializeFrom(DataSource);" ] }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "source": [ + "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"SpecificationsSetup\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" + ] + }, { "cell_type": "markdown", "source": [ diff --git a/Test/SpecificationsSetup.ipynb b/full-ifrs17-template/Test/SpecificationsSetup.ipynb similarity index 96% rename from Test/SpecificationsSetup.ipynb rename to full-ifrs17-template/Test/SpecificationsSetup.ipynb index 73244da4..335f1ca3 100644 --- a/Test/SpecificationsSetup.ipynb +++ b/full-ifrs17-template/Test/SpecificationsSetup.ipynb @@ -23,13 +23,6 @@ "

Specifications Setup

" ] }, - { - "cell_type": "code", - "source": [ - "#!import \"../Import/ImportScopeCalculation\"", - "\n#!import \"../Utils/TestHelper\"" - ] - }, { "cell_type": "code", "source": [ @@ -97,7 +90,7 @@ "\n Value = scope.Value,", "\n Partition = scope.GetStorage().TargetPartition };", "\n", - "\npublic static IfrsVariable FromCsmToIfrsVariable(this Csm scope)", + "\npublic static IfrsVariable FromCsmToIfrsVariable(this ContractualServiceMaring scope)", "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", "\n DataNode = scope.Identity.DataNode, ", "\n AocType = scope.Identity.AocType, ", @@ -105,7 +98,7 @@ "\n Value = scope.Value,", "\n Partition = scope.GetStorage().TargetPartition };", "\n", - "\npublic static IfrsVariable FromLcToIfrsVariable(this Lc scope)", + "\npublic static IfrsVariable FromLcToIfrsVariable(this LossComponent scope)", "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", "\n DataNode = scope.Identity.DataNode, ", "\n AocType = scope.Identity.AocType, ", @@ -113,7 +106,7 @@ "\n Value = scope.Value,", "\n Partition = scope.GetStorage().TargetPartition };", "\n", - "\npublic static IfrsVariable FromLoReCoToIfrsVariable(this LoReCo scope)", + "\npublic static IfrsVariable FromLoReCoToIfrsVariable(this LossRecoveryComponent scope)", "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", "\n DataNode = scope.Identity.DataNode, ", "\n AocType = scope.Identity.AocType, ", diff --git a/Test/SpecificationsTechnicalMargin.ipynb b/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb similarity index 98% rename from Test/SpecificationsTechnicalMargin.ipynb rename to full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb index 5ef06971..26e2d8f3 100644 --- a/Test/SpecificationsTechnicalMargin.ipynb +++ b/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb @@ -37,59 +37,65 @@ { "cell_type": "markdown", "source": [ - "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + "# Import Data" ] }, { - "cell_type": "code", + "cell_type": "markdown", "source": [ - "#!import \"SpecificationsSetup\"" + "", + "\n## Current Period" ] }, { "cell_type": "markdown", "source": [ - "---" + "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" ] }, { - "cell_type": "markdown", + "cell_type": "code", "source": [ - "# Import Data" + "var year = 2021 ;", + "\nvar month = 3 ;", + "\nvar reportingNode = \"CH\" ;", + "\nvar economicBasis = \"L\" ;" ] }, { "cell_type": "markdown", "source": [ - "", - "\n## Current Period" + "Import the Dimensions, Parameters, Nominal Cashflows, and Actuals from the corresponding csv files in Initialization/Systemorph/" ] }, { - "cell_type": "markdown", + "cell_type": "code", "source": [ - "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" ] }, { - "cell_type": "code", + "cell_type": "markdown", "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;", - "\nvar economicBasis = \"L\" ;" + "---" ] }, { "cell_type": "markdown", "source": [ - "Import the Dimensions, Parameters, Nominal Cashflows, and Actuals from the corresponding csv files in Initialization/Systemorph/" + "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" ] }, { "cell_type": "code", "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + "#!import \"SpecificationsSetup\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "---" ] }, { @@ -1115,8 +1121,8 @@ { "cell_type": "code", "source": [ - "var computedCSM_BoP_I = Test.GetScope(id_BoP_I).Value;", - "\nvar computedLC_BoP_I = Test.GetScope(id_BoP_I).Value;" + "var computedCSM_BoP_I = Test.GetScope(id_BoP_I).Value;", + "\nvar computedLC_BoP_I = Test.GetScope(id_BoP_I).Value;" ] }, { @@ -1190,8 +1196,8 @@ { "cell_type": "code", "source": [ - "var computedCSM_MC_I = Test.GetScope(id_MC_I).Value;", - "\nvar computedLC_MC_I = Test.GetScope(id_MC_I).Value;" + "var computedCSM_MC_I = Test.GetScope(id_MC_I).Value;", + "\nvar computedLC_MC_I = Test.GetScope(id_MC_I).Value;" ] }, { @@ -1441,8 +1447,8 @@ { "cell_type": "code", "source": [ - "var computedCSM_CL_C = Test.GetScope(id_CL_C).Value;", - "\nvar computedLC_CL_C = Test.GetScope(id_CL_C).Value;" + "var computedCSM_CL_C = Test.GetScope(id_CL_C).Value;", + "\nvar computedLC_CL_C = Test.GetScope(id_CL_C).Value;" ] }, { @@ -1638,8 +1644,8 @@ { "cell_type": "code", "source": [ - "var computedCSM_EoP_C = Test.GetScope(id_EoP_C).Value;", - "\nvar computedLC_EoP_C = Test.GetScope(id_EoP_C).Value;" + "var computedCSM_EoP_C = Test.GetScope(id_EoP_C).Value;", + "\nvar computedLC_EoP_C = Test.GetScope(id_EoP_C).Value;" ] }, { @@ -1688,7 +1694,7 @@ { "cell_type": "code", "source": [ - "var csm = allIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "var csm = allIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", "\n .Where(x => Math.Abs(x.Value) >= Precision)", "\n .Select(x => x.FromCsmToIfrsVariable())).ToArray();" ] @@ -1708,7 +1714,7 @@ { "cell_type": "code", "source": [ - "var lc = allInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "var lc = allInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", "\n .Where(x => Math.Abs(x.Value) >= Precision)", "\n .Select(x => x.FromLcToIfrsVariable())).ToArray();" ] @@ -1728,7 +1734,7 @@ { "cell_type": "code", "source": [ - "var loreco = allReInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "var loreco = allReInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", "\n .Where(x => Math.Abs(x.Value) >= Precision)", "\n .Select(x => x.FromLoReCoToIfrsVariable())).ToArray();" ] diff --git a/Test/TechnicalMarginTest.ipynb b/full-ifrs17-template/Test/TechnicalMarginTest.ipynb similarity index 100% rename from Test/TechnicalMarginTest.ipynb rename to full-ifrs17-template/Test/TechnicalMarginTest.ipynb diff --git a/Test/Tests.ipynb b/full-ifrs17-template/Test/Tests.ipynb similarity index 100% rename from Test/Tests.ipynb rename to full-ifrs17-template/Test/Tests.ipynb diff --git a/ifrs17/CalculationEngine.ipynb b/ifrs17/CalculationEngine.ipynb new file mode 100644 index 00000000..d6a34d5e --- /dev/null +++ b/ifrs17/CalculationEngine.ipynb @@ -0,0 +1,30 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!import \"DataModel/DataStructure\"", + "\n#!import \"Report/ReportScopes\"", + "\n#!import \"Import/Importers\"", + "\n#!import \"Export/ExportConfiguration\"", + "\n#!import \"Utils/TestHelper\"", + "\n#!import \"Utils/ImportCalculationMethods\"" + ] + } + ] +} \ No newline at end of file diff --git a/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb similarity index 100% rename from Constants/Consts.ipynb rename to ifrs17/Constants/Consts.ipynb diff --git a/Constants/Enums.ipynb b/ifrs17/Constants/Enums.ipynb similarity index 100% rename from Constants/Enums.ipynb rename to ifrs17/Constants/Enums.ipynb diff --git a/Constants/Validations.ipynb b/ifrs17/Constants/Validations.ipynb similarity index 100% rename from Constants/Validations.ipynb rename to ifrs17/Constants/Validations.ipynb diff --git a/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb similarity index 100% rename from DataModel/DataStructure.ipynb rename to ifrs17/DataModel/DataStructure.ipynb diff --git a/Export/Export.ipynb b/ifrs17/Export/ExportConfiguration.ipynb similarity index 100% rename from Export/Export.ipynb rename to ifrs17/Export/ExportConfiguration.ipynb diff --git a/ifrs17/Images/BigPicture.PNG b/ifrs17/Images/BigPicture.PNG new file mode 100644 index 0000000000000000000000000000000000000000..9e7bfe681aa1819381f918930245e7053bb9f9e7 GIT binary patch literal 38530 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 SK+msRX97EO`l-Q%oBs@> z&pYqDpU2~I=g!=jxpSxPz2Clk7DjtU@C*b3p+Q6hq(LC0RS@XG!zakVFSRwq%)mbn zY@~(xK!ts;)`0&!G~kus1%Zk~P%gC|0snt$DWYTp0-?OP{rdnE8;=J9@o_)|cx4^c zw-WZkrdjtZ6oNlRc_nz!A*nqa1^=^gT~kBlqCfgn5i|bfF9@dV#*=*1&-jYKAIk>w z65-gHtr?={X#YG+%37yYL72Y)@q)k){!suX`~QCfk1rN&E_gh<2c1iK+;8OWM~42o zK3$kN+B@AGo2Pw?V$OiSi<>&uU+CwMdXg%c+OLyPouTz(?w`BSp1MLdA6?m*l#+_j zneU(-;z+&1oo^H+wW$rhRT)(J!k{MVnHQ7 zZ+>Lo53yv>Zb)L)Z8kWojyfhBK$+9;p ztmolcm`D7_UC&J>F;lB*663MhgL^7m{?V)~;|7_plg^P6Cu`kaKHJAdqK~_%hexhjQDs%|bPz)PaN(529J;rJ2}5^kx#c z@jZzTq|02tKa|S`#kK8mJ3pTz^1YI#eobauPI7Gmd3--6V>@ueQm50iT6``>!SNUD z9pr?t`>$HWOA8ykltpRmk~+V`OXtQMTP97qpWfm9Y{PHlJn0!iXy>>vjy2yD7_nct z1tBNkGToC6XV$P49I6c|3u%0uoV^ob2f?hXS-;3}=t%cmJ$|Ba-__T@U z{6)U|=%uRm!2Q$}pHb!#T(ohn9%L#VoT$eX$otJpb`#xCEffQ^z#s@ zW;OF_Us-^o@7Lk^2s9oDPtGj;nMS?hA%bZ|xuKLL-`m z8(q%_unm%tZioETH(C}c&!RAz+1^tbf*pTm^>z`7_d>rzC(Jy`*s5f4Ez`C5Zg8qsC^y}50k4dO}YGPEihXePkIxY*| zSH-t32Ly`K*%HfYO?Idna+q6*(;#D5wJ4y!gMe5)qgDD}6+jfmnmM~ANW|lQ)t~Iw z5Un9w5l(2_5Ba2Yv3Zt0U#e$t1%Tc552`7wS_tl7rr*%@`z6;GI1eSZhp$70pbZIc z4(}kEQ-`|9z@`s@7ub2THx@MSMn$6DK|ZZ)hJe*{%A^aE+O5?yQxjiybuozNAq`f%gL|6&;BnuHNwqWaA#By^BZ(LuWRn-Y zXOyUv1U->bxmLbB2XFZj6RmmuS2P}anN8*1~n2*fEkqCgKrUi8=PNu59JUH z46*n=S|ry~qumD%#k0Np*>ii%)~QzXK)>2FeC<6;&zTGd>P;!uJ(sJv4E`i)GQ(c6 zAB}@-`oK7xRd;|-H=7~--2B4kYV?6X zF_iOeB2%xcy&#M4&V#$1)|1FLAFm~b{$ydFX+L(j1CN8W-OXKPh68;2;UmZ&K87FG zoeX^=9@aYTe)jxsM6$+tQm&4H-GKY6W(Y^l9 zYNlm7hC@-vvN7{&e}Uy+2{UgdX6FO+%DKjxd9Ij~m9(KB?$E}uv^9BZma_@bl4$ev z=IahD|05W1wcE!ed}a6)`Z3XA_ADScqZQfe4(SKWar;;U?>fJNc06rX>u-^AtpDf{ z0MT&n^-;v?&?4fPaHrqYw0o`@IMkNab>G^@bDtFX{c{^tVfPz<{Pm*w z_SKe9VfP8GA8#OGb8%UHGT`)suvzcv3Qb__a5b0d`+y_$b*h>WOIs8l#qK~L#TVN8 zZbN12N`2m%$8~jWJN+7pUia2-8ePcBL-!)p=tjPU*>{b@-#w6_o#QToctWNYvhxWBK&7F}gHFpI+Y^%x}`;cHG1; z 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", + "public interface ContractualServiceMaring : IScope", "\n{", "\n [NotVisible]string EstimateType => EstimateTypes.C;", "\n ", @@ -1842,7 +1842,7 @@ { "cell_type": "code", "source": [ - "public interface Lc : IScope", + "public interface LossComponent : IScope", "\n{", "\n [NotVisible]string EstimateType => EstimateTypes.L;", "\n ", @@ -1853,7 +1853,7 @@ { "cell_type": "code", "source": [ - "public interface LoReCo : IScope", + "public interface LossRecoveryComponent : IScope", "\n{ ", "\n [NotVisible]string EstimateType => EstimateTypes.LR;", "\n ", @@ -1998,7 +1998,7 @@ "\n ", "\n IEnumerable Csms => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", "\n ? Enumerable.Empty()", - "\n : GetScope(Identity).RepeatOnce()", + "\n : GetScope(Identity).RepeatOnce()", "\n .Where(x => Math.Abs(x.Value) >= Precision)", "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", "\n DataNode = x.Identity.DataNode,", @@ -2011,7 +2011,7 @@ "\n IEnumerable Loss => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", "\n ? Enumerable.Empty()", "\n : Identity.IsReinsurance ", - "\n ? GetScope(Identity).RepeatOnce()", + "\n ? GetScope(Identity).RepeatOnce()", "\n .Where(x => Math.Abs(x.Value) >= Precision)", "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", "\n DataNode = x.Identity.DataNode,", @@ -2020,7 +2020,7 @@ "\n Value = x.Value,", "\n Partition = GetStorage().TargetPartition", "\n })", - "\n : GetScope(Identity).RepeatOnce()", + "\n : GetScope(Identity).RepeatOnce()", "\n .Where(x => Math.Abs(x.Value) >= Precision)", "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", "\n DataNode = x.Identity.DataNode,", diff --git a/Import/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb similarity index 100% rename from Import/ImportStorage.ipynb rename to ifrs17/Import/ImportStorage.ipynb diff --git a/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb similarity index 99% rename from Import/Importers.ipynb rename to ifrs17/Import/Importers.ipynb index cbf48bab..34ab4202 100644 --- a/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -266,7 +266,7 @@ { "cell_type": "code", "source": [ - "public async Task DataNodeFactoryAsync(string file, string tab, ImportArgs args)", + "public async Task DataNodeFactoryAsync (string file, string tab, ImportArgs args)", "\n{", "\n var partition = (await DataSource.Query().Where(p => p.ReportingNode == args.ReportingNode && p.Scenario == null).ToArrayAsync()).SingleOrDefault();", "\n if(partition == null) { ApplicationMessage.Log(Error.ParsedPartitionNotFound); return; }", @@ -274,12 +274,13 @@ "\n var extension = System.IO.Path.GetExtension(file);", "\n var stream = await Project.FileStorage.ReadAsync(file);", "\n var target = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).Tables[tab];", + "\n ", "\n", "\n var dataNodesImported = target.Rows.Select(x => x.Field(nameof(RawVariable.DataNode))).ToHashSet();", "\n var dataNodesDefined = await DataSource.Query().Where(x => dataNodesImported.Contains(x.SystemName)).ToArrayAsync();", "\n var dataNodeStatesDefined = await DataSource.Query().Select(x => x.DataNode).ToArrayAsync();", "\n var dataNodeParametersDefined = await DataSource.Query().Select(x => x.DataNode).ToArrayAsync(); ", - "\n", + "\n ", "\n var dataNodeStatesUndefined = dataNodesImported.Where(x => x != null && !dataNodeStatesDefined.Contains(x)).ToHashSet();", "\n var dataNodeSingleParametersUndefined = dataNodesImported.Where(x => x != null &&", "\n !dataNodeParametersDefined.Contains(x) && ", @@ -290,7 +291,7 @@ "\n", "\n await DataSource.UpdateAsync( dataNodeSingleParametersUndefined.Select(x => ", "\n new SingleDataNodeParameter {DataNode = x, Year = args.Year, Month = DefaultDataNodeActivationMonth, PremiumAllocation = DefaultPremiumExperienceAdjustmentFactor, Partition = partition.Id}).ToArray() );", - "\n", + "\n ", "\n await DataSource.CommitAsync();", "\n}" ] @@ -491,6 +492,7 @@ "\n await CommitToDatabase(partition);", "\n await CommitToDatabase(partition);", "\n await CommitToDatabase(partition);", + "\n ", "\n return log;", "\n}" ] diff --git a/ifrs17/LICENSE b/ifrs17/LICENSE new file mode 100644 index 00000000..e0b8588d --- /dev/null +++ b/ifrs17/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Systemorph + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/OverviewCalculationEngine.ipynb b/ifrs17/OverviewCalculationEngine.ipynb similarity index 71% rename from OverviewCalculationEngine.ipynb rename to ifrs17/OverviewCalculationEngine.ipynb index d3d3e77b..108756ef 100644 --- a/OverviewCalculationEngine.ipynb +++ b/ifrs17/OverviewCalculationEngine.ipynb @@ -23,12 +23,6 @@ "

IFRS17 Calculation Engine - an Overview

" ] }, - { - "cell_type": "markdown", - "source": [ - "Version of 01 Sep 2022" - ] - }, { "cell_type": "markdown", "source": [ @@ -78,13 +72,11 @@ "cell_type": "markdown", "source": [ "", - "\n# Data Model, Data Input, Data Import", + "\n# Data Model, Data Import", "\n", "\nThe IFRS 17 calculations are based on a well-defined **data model**. The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model.", "\n", - "\nInput files as listed below are used to provide the necessary information on the business to be modeled. These files are part of the IFRS 17 Calculation Engine and can be used as templates for users intending to model their own business and adapt some files accordingly. ", - "\n", - "\nThe IFRS 17 calculations start by importing the data input files, and the more complex logic of the IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." + "\nThe IFRS 17 calculations start by importing data input files, and the more complex logic of the IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." ] }, { @@ -102,58 +94,6 @@ "\nMany abbreviations and acronyms used later in the documentation and the code are the **system names**, where the corresponding display names can be found together with the attributes." ] }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Reporting nodes, dimensions and partitions", - "\n", - "\nSee folders *Files* (DimensionsAndPartitions) and *Files/300.ReportingNodes* (ReportingNodes).", - "\n- **ReportingNodes**: List of business units, often per country, with system name and display name, currency and \"G\" for the whole group", - "\n- **DimensionsAndPartitions**: The many dimensions (21) required to characterize all of the data and results, with system names and display names. This information is quite stable, but some information related to partitions refers to the reporting nodes " - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Groups of insurance and reinsurance contracts", - "\n", - "\nSee folder Files/700.DataNodes. The information is about data nodes, that is Groups of Insurance Contracts (GICs) and Groups of Reinsurance Contracts (GRICs) and portfolios of these.", - "\n- **DataNodes**: List of all GICs and GRICs, each with several attributes and the portfolios to which they belong; an additional attribute of GRICs being the reinsurance partner", - "\n- **DataNodeParameters** *\\_* *\\_* *\\_*: List of those GICs and GRICs that are actually used for the given reporting node/year/month combination with few attributes; if needed, more such files may be added for other reporting node/year/month combinations", - "\n- **DataNodeStates** *\\_* *\\_* *\\_*: Switching data nodes on and off, the normal state is (\"Active\") for all the GICs and GRICs of the reporting node/year/month combination; if needed, more such files may be added for other reporting node/year/month combinations" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Parameters from financial markets", - "\n", - "\nSee folder Files/800.Parameters.", - "\n- **YieldCurve**: List of all yield curves to be used, for different currencies and as-of dates (year/month), using a yearly grid of interest rate maturities extending as far as needed", - "\n- **ExchangeRate**: List of exchange rates to be used, for different currencies and as-of dates (year/month), with a type (Spot/Average); defined as the value of 1 foreign unit expressed in the group currency of the insurance company ", - "\n- **CreditDefaultRate**: For relevant year/month combinations, each with a full list of all credit ratings in S&P notation with their default rate (= probabilty of default within 1 year)", - "\n- **PartnerRating**: For each reinsurance partner of a relevant GRIC, the rating in S&P notation with the as-of date (year/month)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Groups of insurance and reinsurance contracts", - "\n", - "\nSee folder Files/900.TransactionalData.", - "\n- **Actuals** *\\_* *\\_* *\\_*: List of all actual amounts for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types and other attributes; we need at least two such files for the two dates of the Analysis of Change", - "\n- **Openings** *\\_* *\\_* *\\_*: List of the opening amounts for some GICs that are used by the given reporting node. The year/month combination corresponds to the beginning of the planned Analysis of Change period, so only one such file is required. The entries are by EstimateType and AmountType.", - "\n- **NominalCashflows** *\\_* *\\_* *\\_*: List of all projected cash flows for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types, novelty types and other attributes, where the cash flow amounts are given in a regular sequence extending as far as needed; we need at least two such files for the two dates of the Analysis of Change", - "\n", - "\nThe structure of the [Actuals](./InputFormatDescription#actual), [Openings](./InputFormatDescription#opening) and [NominalCashflows](./InputFormatDescription#cashflow) files is explained in a special [notebook](./InputFormatDescription).", - "\n", - "\nThe less usual option of having discounted instead of nominal cash flows in the input is also supported." - ] - }, { "cell_type": "markdown", "source": [ @@ -213,9 +153,7 @@ "\n", "\nSome reports of ReportScopes just present existing data from the database, namely the imported data and the results already calculated using the methods of [ImportScopes](#model-calc).", "\n", - "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#financial-performance).", - "\n", - "\nWhile the ReportScopes notebook provides the calculation formulas for different reports, the production of reports is done by a notebook such as **[Reports](./Report/Reports#report-production)** which imports ReportScopes." + "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#financial-performance)." ] }, { diff --git a/ifrs17/README.md b/ifrs17/README.md new file mode 100644 index 00000000..4447c0c3 --- /dev/null +++ b/ifrs17/README.md @@ -0,0 +1,31 @@ +![Systemorph_logo.png](https://portal.systemorph.cloud/api/project/ifrs17ce/env/dev/file/download?path=Images/Systemorph_logo.png) + + +**IFRS17 Calculation Engine** + +Systemorph's IFRS 17 Calculation Engine is a tool to conduct all the essential IFRS 17 calculations given some key figures, future cashflows and actual amounts, for groups of insurance contracts and other basic information. The result is a set of reports needed for IFRS 17 accounting and management information. + +# Get started + +Systemorph portal allows Users to create their own projects powered by the Vertex 10 technology. + +## Overview + +![BigPicture.png](https://portal.systemorph.cloud/api/project/ifrs17ce/env/dev/file/download?path=Images/BigPicture.png) + + +If you want to know more about the Calculation Engine than just its standard technical use, you are recommended to look at [OverviewCalculationEngine](OverviewCalculationEngine). +You will be introduced to +- [DataModel](./DataModel/DataStructure) with links to detailed description of individual data types, dimensions and partitions employed +- [Calculation](./Import/ImportScopeCalculation) with in detail description using mathematical formulas and links to supporting material +- [Reports](./Report/ReportScopes) for data analysis and drill down to the lowest data granularity. With links to discover the calculation of the [Financial Performance](./Report/ReportScopes#ifrs-17-financial-performance) + + +## Got Questions + +For support around the IFRS17 CalculationEngine you can personally reach out to one of our IFRS17 experts: +- [Dr. Andrea Muolo]() +- [Dr. Davide Colleoni](https://www.linkedin.com/in/davidecolleoni/) +- [Mrs. Sara Busato]() + +If you are interested in adapting the IFRS17 CalculationEngine to your data and would like to start a collaboration with us, you can contact [Wolfgang Maehr]() \ No newline at end of file diff --git a/Report/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb similarity index 100% rename from Report/ReportConfigurationAndUtils.ipynb rename to ifrs17/Report/ReportConfigurationAndUtils.ipynb diff --git a/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb similarity index 100% rename from Report/ReportScopes.ipynb rename to ifrs17/Report/ReportScopes.ipynb diff --git a/Report/ReportStorage.ipynb b/ifrs17/Report/ReportStorage.ipynb similarity index 100% rename from Report/ReportStorage.ipynb rename to ifrs17/Report/ReportStorage.ipynb diff --git a/Report/Reports.ipynb b/ifrs17/Report/Reports.ipynb similarity index 100% rename from Report/Reports.ipynb rename to ifrs17/Report/Reports.ipynb diff --git a/Utils/ApplicationMessage.ipynb b/ifrs17/Utils/ApplicationMessage.ipynb similarity index 100% rename from Utils/ApplicationMessage.ipynb rename to ifrs17/Utils/ApplicationMessage.ipynb diff --git a/Utils/Extensions.ipynb b/ifrs17/Utils/Extensions.ipynb similarity index 100% rename from Utils/Extensions.ipynb rename to ifrs17/Utils/Extensions.ipynb diff --git a/Utils/ImportCalculationMethods.ipynb b/ifrs17/Utils/ImportCalculationMethods.ipynb similarity index 100% rename from Utils/ImportCalculationMethods.ipynb rename to ifrs17/Utils/ImportCalculationMethods.ipynb diff --git a/Utils/Queries.ipynb b/ifrs17/Utils/Queries.ipynb similarity index 100% rename from Utils/Queries.ipynb rename to ifrs17/Utils/Queries.ipynb diff --git a/Utils/TestHelper.ipynb b/ifrs17/Utils/TestHelper.ipynb similarity index 100% rename from Utils/TestHelper.ipynb rename to ifrs17/Utils/TestHelper.ipynb From 3974104482213f8fcc06e0f6dbbc4b9ddec1544c Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Fri, 14 Oct 2022 16:53:11 +0200 Subject: [PATCH 11/43] Merge pull request #44 from Systemorph/UpdatePackageAndFixCsm update packages and fix csm with bm --- .../BM_CH_2020_12_C.csv | 32 ++-- .../BM_CH_2020_12_DA.csv | 25 ++- .../BM_CH_2020_12_F.csv | 19 ++- .../IfrsVariableBenchmarks/BM_CH_2021_3_C.csv | 59 ++++--- .../BM_CH_2021_3_DA.csv | 33 ++-- .../IfrsVariableBenchmarks/BM_CH_2021_3_F.csv | 17 +- .../IfrsVariableBenchmarks/BM_CH_2021_3_L.csv | 7 +- .../BM_CH_2021_3_LR.csv | 4 +- ...ableBenchmarks_2020_12_CH__Contractual.csv | 82 +++++----- ...iableBenchmarks_2021_3_CH__Contractual.csv | 151 +++++++++--------- .../Test/IfrsVariablesTest.ipynb | 16 +- full-ifrs17-template/Test/QueriesTest.ipynb | 12 +- .../Test/SpecificationsImportCashflows.ipynb | 4 +- ifrs17/DataModel/DataStructure.ipynb | 20 +-- ifrs17/Import/ImportScopeCalculation.ipynb | 18 ++- ifrs17/Import/Importers.ipynb | 4 +- ifrs17/Utils/ApplicationMessage.ipynb | 2 +- 17 files changed, 257 insertions(+), 248 deletions(-) diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv index cf8c8f5f..061f2e7e 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv @@ -1,40 +1,40 @@ @@Main -Month,ReportingNode,Scenario,Year -12,CH,,2020 +ReportingNode,Year,Month,Scenario +CH,2020,12, @@C AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,AM,DTR1.1,,C,C,24.228134693791258 +,,AM,DTR1.1,,C,C,46.24958203305145 ,,IA,DT1.3,,C,N,0.08233273235018213 ,,BOP,DT1.3,,C,N,139.90849210284577 -,,EOP,DT1.3,,C,C,82.02271122089925 -,,AM,DT1.3,,C,C,-42.968113614296705 +,,EOP,DT1.3,,C,C,42.9681136142967 +,,AM,DT1.3,,C,C,-82.02271122089925 ,,EA,DT1.3,,C,C,-15 ,,EA,DT1.1,,C,C,-15 -,,AM,DT1.1,,C,C,-42.968113614296705 -,,EOP,DT1.1,,C,C,82.02271122089925 +,,AM,DT1.1,,C,C,-82.02271122089925 +,,EOP,DT1.1,,C,C,42.9681136142967 ,,BOP,DT1.1,,C,N,139.90849210284577 ,,IA,DT1.1,,C,N,0.08233273235018213 ,,EA,DT2.1,,C,C,-15 -,,AM,DT2.1,,C,C,-42.968113614296705 -,,EOP,DT2.1,,C,C,82.02271122089925 +,,AM,DT2.1,,C,C,-82.02271122089925 +,,EOP,DT2.1,,C,C,42.9681136142967 ,,BOP,DT2.1,,C,N,139.90849210284577 ,,IA,DT2.1,,C,N,0.08233273235018213 -,,EOP,DTR1.1,,C,C,-46.24958203305145 +,,EOP,DTR1.1,,C,C,-24.22813469379126 ,,BOP,DTR1.1,,C,N,-70.43538016962212 ,,IA,DTR1.1,,C,N,-0.04233655722058882 -,,AM,DTR2.1,,C,C,24.228134693791258 -,,EOP,DTR2.1,,C,C,-46.24958203305145 +,,AM,DTR2.1,,C,C,46.24958203305145 +,,EOP,DTR2.1,,C,C,-24.22813469379126 ,,BOP,DTR2.1,,C,N,-70.43538016962212 ,,IA,DTR2.1,,C,N,-0.04233655722058882 ,,BOP,DT3.1,,C,I,72.2 ,,EA,DT3.1,,C,C,-15 -,,AM,DT3.1,,C,C,-67.83795828214956 -,,EOP,DT3.1,,C,C,129.49726655304642 +,,AM,DT3.1,,C,C,-129.49726655304642 +,,EOP,DT3.1,,C,C,67.83795828214957 ,,IA,DT3.1,,C,I,0.14440000000001615 ,,BOP,DT3.1,,C,N,139.90849210284577 ,,IA,DT3.1,,C,N,0.08233273235018213 ,,EA,DT4.1,,C,C,-15 -,,AM,DT4.1,,C,C,-42.968113614296705 -,,EOP,DT4.1,,C,C,82.02271122089925 +,,AM,DT4.1,,C,C,-82.02271122089925 +,,EOP,DT4.1,,C,C,42.9681136142967 ,,BOP,DT4.1,,C,N,139.90849210284577 ,,IA,DT4.1,,C,N,0.08233273235018213 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv index 0b2eb99d..900aadb2 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv @@ -1,21 +1,20 @@ -$$Default @@Main -Month,ReportingNode,Scenario,Year -12,CH,,2020 +ReportingNode,Year,Month,Scenario +CH,2020,12, @@DA AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,EOP,DT1.3,,DA,C,-9.843447868559382 -,,AM,DT1.3,,DA,C,5.156552131440618 +,,EOP,DT1.3,,DA,C,-5.156552131440618 +,,AM,DT1.3,,DA,C,9.843447868559382 ,,CF,DT1.3,,DA,C,-15 ,,CF,DT1.1,,DA,C,-15 -,,AM,DT1.1,,DA,C,5.156552131440618 -,,EOP,DT1.1,,DA,C,-9.843447868559382 +,,AM,DT1.1,,DA,C,9.843447868559382 +,,EOP,DT1.1,,DA,C,-5.156552131440618 ,,CF,DT2.1,,DA,C,-15 -,,AM,DT2.1,,DA,C,5.156552131440618 -,,EOP,DT2.1,,DA,C,-9.843447868559382 +,,AM,DT2.1,,DA,C,9.843447868559382 +,,EOP,DT2.1,,DA,C,-5.156552131440618 ,,CF,DT3.1,,DA,C,-15 -,,AM,DT3.1,,DA,C,5.156552131440618 -,,EOP,DT3.1,,DA,C,-9.843447868559382 +,,AM,DT3.1,,DA,C,9.843447868559382 +,,EOP,DT3.1,,DA,C,-5.156552131440618 ,,CF,DT4.1,,DA,C,-15 -,,AM,DT4.1,,DA,C,5.156552131440618 -,,EOP,DT4.1,,DA,C,-9.843447868559382 \ No newline at end of file +,,AM,DT4.1,,DA,C,9.843447868559382 +,,EOP,DT4.1,,DA,C,-5.156552131440618 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv index 91b1b7f4..8c0006b2 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv @@ -1,17 +1,16 @@ -$$Default @@Main -Month,ReportingNode,Scenario,Year -12,CH,,2020 +ReportingNode,Year,Month,Scenario +CH,2020,12, @@F AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,AM,DT1.1,L,F,C,0.3437701420960412 +,,AM,DT1.1,L,F,C,0.6562298579039588 ,,AM,DT1.2,L,F,C,1 -,,AM,DT1.3,L,F,C,0.3437701420960412 -,,AM,DT2.1,L,F,C,0.3437701420960412 +,,AM,DT1.3,L,F,C,0.6562298579039588 +,,AM,DT2.1,L,F,C,0.6562298579039588 ,,AM,DT2.2,L,F,C,1 -,,AM,DTR1.1,L,F,C,0.3437701420960412 +,,AM,DTR1.1,L,F,C,0.6562298579039588 ,,AM,DTR1.2,L,F,C,1 -,,AM,DTR2.1,L,F,C,0.3437701420960412 +,,AM,DTR2.1,L,F,C,0.6562298579039588 ,,AM,DTR2.2,L,F,C,1 -,,AM,DT3.1,L,F,C,0.3437701420960412 -,,AM,DT4.1,L,F,C,0.3437701420960412 \ No newline at end of file +,,AM,DT3.1,L,F,C,0.6562298579039588 +,,AM,DT4.1,L,F,C,0.6562298579039588 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv index 965e5e6f..fdf3a318 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv @@ -1,55 +1,54 @@ @@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 +ReportingNode,Year,Month,Scenario +CH,2021,3, @@C AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value ,,CL,DT2.1,,C,C,-87.43135554903122 -,,IA,DT2.1,,C,I,0.09388697662967685 +,,IA,DT2.1,,C,I,0.07437430623754743 ,,MC,DT2.1,,C,I,105.89201388261736 -,,EOP,DT2.1,,C,C,18.374757965777995 -,,AM,DT2.1,,C,C,-38.60249856533708 +,,EOP,DT2.1,,C,C,12.129509556366447 +,,AM,DT2.1,,C,C,-5.773636697753954 ,,EA,DT2.1,,C,C,-43.599999999999994 -,,BOP,DT2.1,,C,I,82.02271122089925 +,,BOP,DT2.1,,C,I,42.9681136142967 ,,CL,DT1.3,,C,C,-87.43135554903122 -,,BOP,DT1.1,,C,I,82.02271122089925 +,,BOP,DT1.1,,C,I,42.9681136142967 ,,EA,DT1.1,,C,C,-43.599999999999994 -,,AM,DT1.1,,C,C,-38.60249856533708 -,,EOP,DT1.1,,C,C,18.374757965777995 +,,AM,DT1.1,,C,C,-5.773636697753954 +,,EOP,DT1.1,,C,C,12.129509556366447 ,,MC,DT1.1,,C,I,105.89201388261736 -,,IA,DT1.1,,C,I,0.09388697662967685 +,,IA,DT1.1,,C,I,0.07437430623754743 ,,CL,DT1.1,,C,C,-87.43135554903122 -,,BOP,DT1.3,,C,I,82.02271122089925 +,,BOP,DT1.3,,C,I,42.9681136142967 ,,EA,DT1.3,,C,C,-50 -,,AM,DT1.3,,C,C,-34.26645281902704 -,,EOP,DT1.3,,C,C,16.31080371208803 +,,AM,DT1.3,,C,C,-3.7096824440639895 +,,EOP,DT1.3,,C,C,7.793463810056405 ,,MC,DT1.3,,C,I,105.89201388261736 -,,IA,DT1.3,,C,I,0.09388697662967685 -,,BOP,DTR1.1,,C,I,-46.24958203305145 -,,AM,DTR1.1,,C,C,38.316584766326955 -,,EOP,DTR1.1,,C,C,-18.238663229656325 +,,IA,DT1.3,,C,I,0.07437430623754743 +,,BOP,DTR1.1,,C,I,-24.22813469379126 +,,AM,DTR1.1,,C,C,11.133355649364928 +,,EOP,DTR1.1,,C,C,-23.389442532110124 ,,MC,DTR1.1,,C,I,-52.92295262051829 -,,IA,DTR1.1,,C,I,-0.04954912095471157 +,,IA,DTR1.1,,C,I,-0.03854664570667637 ,,CRU,DTR1.1,,C,I,-0.5933128558860402 ,,CL,DTR1.1,,C,C,43.26014863442721 -,,BOP,DTR2.1,,C,I,-46.24958203305145 -,,AM,DTR2.1,,C,C,38.316584766326955 -,,EOP,DTR2.1,,C,C,-18.238663229656325 +,,BOP,DTR2.1,,C,I,-24.22813469379126 +,,AM,DTR2.1,,C,C,11.133355649364928 +,,EOP,DTR2.1,,C,C,-23.389442532110124 ,,MC,DTR2.1,,C,I,-52.92295262051829 -,,IA,DTR2.1,,C,I,-0.04954912095471157 +,,IA,DTR2.1,,C,I,-0.03854664570667637 ,,CRU,DTR2.1,,C,I,-0.5933128558860402 ,,CL,DTR2.1,,C,C,43.26014863442721 -,,BOP,DT3.1,,C,I,129.49726655304642 -,,EA,DT3.1,,C,C,-43.599999999999994 -,,AM,DT3.1,,C,C,-51.96181825867143 +,,BOP,DT3.1,,C,I,67.83795828214957 +,,EA,DT3.1,,C,C,-33.87170342894083 ,,MC,DT3.1,,C,I,105.89201388261736 -,,IA,DT3.1,,C,I,0.11760647207910604 +,,IA,DT3.1,,C,I,0.08679991324534386 ,,CL,DT3.1,,C,C,-139.94506864907146 -,,BOP,DT4.1,,C,I,82.02271122089925 +,,BOP,DT4.1,,C,I,42.9681136142967 ,,EA,DT4.1,,C,C,-51.599999999999994 -,,AM,DT4.1,,C,C,-96.83022811966929 -,,EOP,DT4.1,,C,C,46.091109943532146 +,,AM,DT4.1,,C,C,-33.48998867550812 +,,EOP,DT4.1,,C,C,70.35723911069866 ,,MC,DT4.1,,C,I,105.89201388261736 -,,IA,DT4.1,,C,I,0.09388697662967685 +,,IA,DT4.1,,C,I,0.07437430623754743 ,,BOP,DT4.1,,C,N,8.004653973154419 ,,IA,DT4.1,,C,N,0.0003356307173485902 ,,EV,DT4.1,,C,N,-1.4922636208166304 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv index 437c7cf1..be7fcf90 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv @@ -1,25 +1,24 @@ -$$Default @@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 +ReportingNode,Year,Month,Scenario +CH,2021,3, @@DA AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,EOP,DT2.1,,DA,C,-8.011834360099684 -,,AM,DT2.1,,DA,C,16.831613508459697 -,,BOP,DT2.1,,DA,I,-9.843447868559382 +,,EOP,DT2.1,,DA,C,-13.656208145282752 +,,AM,DT2.1,,DA,C,6.500343986157867 +,,BOP,DT2.1,,DA,I,-5.156552131440618 ,,CF,DT2.1,,DA,C,-15 ,,CF,DT1.1,,DA,C,-15 -,,BOP,DT1.1,,DA,I,-9.843447868559382 -,,AM,DT1.1,,DA,C,16.831613508459697 -,,EOP,DT1.1,,DA,C,-8.011834360099684 +,,BOP,DT1.1,,DA,I,-5.156552131440618 +,,AM,DT1.1,,DA,C,6.500343986157867 +,,EOP,DT1.1,,DA,C,-13.656208145282752 ,,CF,DT1.3,,DA,C,-15 -,,BOP,DT1.3,,DA,I,-9.843447868559382 -,,AM,DT1.3,,DA,C,16.831613508459697 -,,EOP,DT1.3,,DA,C,-8.011834360099684 +,,BOP,DT1.3,,DA,I,-5.156552131440618 +,,AM,DT1.3,,DA,C,6.500343986157867 +,,EOP,DT1.3,,DA,C,-13.656208145282752 ,,CF,DT3.1,,DA,C,-15 -,,BOP,DT3.1,,DA,I,-9.843447868559382 -,,AM,DT3.1,,DA,C,24.84344786855938 +,,BOP,DT3.1,,DA,I,-5.156552131440618 +,,AM,DT3.1,,DA,C,20.15655213144062 ,,CF,DT4.1,,DA,C,-15 -,,BOP,DT4.1,,DA,I,-9.843447868559382 -,,AM,DT4.1,,DA,C,16.831613508459697 -,,EOP,DT4.1,,DA,C,-8.011834360099684 \ No newline at end of file +,,BOP,DT4.1,,DA,I,-5.156552131440618 +,,AM,DT4.1,,DA,C,6.500343986157867 +,,EOP,DT4.1,,DA,C,-13.656208145282752 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv index c443cf93..f7419efa 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv @@ -1,17 +1,16 @@ -$$Default @@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 +ReportingNode,Year,Month,Scenario +CH,2021,3, @@F AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,AM,DT1.1,L,F,C,0.6775071478609433 +,,AM,DT1.1,L,F,C,0.32249285213905665 ,,AM,DT1.2,L,F,C,1 -,,AM,DT1.3,L,F,C,0.6775071478609433 -,,AM,DT2.1,L,F,C,0.6775071478609433 +,,AM,DT1.3,L,F,C,0.32249285213905665 +,,AM,DT2.1,L,F,C,0.32249285213905665 ,,AM,DT2.2,L,F,C,1 -,,AM,DTR1.1,L,F,C,0.6775071478609433 +,,AM,DTR1.1,L,F,C,0.32249285213905665 ,,AM,DTR1.2,L,F,C,1 -,,AM,DTR2.1,L,F,C,0.6775071478609433 +,,AM,DTR2.1,L,F,C,0.32249285213905665 ,,AM,DTR2.2,L,F,C,1 ,,AM,DT3.1,L,F,C,1 -,,AM,DT4.1,L,F,C,0.6775071478609433 \ No newline at end of file +,,AM,DT4.1,L,F,C,0.32249285213905665 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv index b4ae0c7e..9a6831e3 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv @@ -1,7 +1,6 @@ -$$Default @@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 +ReportingNode,Year,Month,Scenario +CH,2021,3, @@L AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value ,,CL,DT2.1,,L,C,-87.43135554903122 @@ -16,6 +15,8 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,,BOP,DT1.3,,L,N,31.958738976731105 ,,IA,DT1.3,,L,N,0.016300537999407044 ,,EV,DT1.3,,L,N,55.45631603430072 +,,EA,DT3.1,,L,C,9.728296571059161 +,,AM,DT3.1,,L,C,-9.728296571059161 ,,BOP,DT3.1,,L,N,31.958738976731105 ,,IA,DT3.1,,L,N,0.016300537999407044 ,,EV,DT3.1,,L,N,55.45631603430072 diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv index 93205b6d..0596dea4 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv @@ -1,6 +1,6 @@ @@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 +ReportingNode,Year,Month,Scenario +CH,2021,3, @@LR AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value ,,BOP,DTR1.1,,LR,N,-15.684995728561214 diff --git a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv index 8b78df02..80bfedb2 100644 --- a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv +++ b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv @@ -34,19 +34,19 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339294988556,OCI1 0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.675549694236,OCI1 0,PR,2020,USD,L,BEPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,320,IR6 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-42.968113614296705,AM +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271122089925,AM 0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849210284577,BOP 0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122089925,EOP +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.9681136142967,EOP 0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233273235018213,IA 0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233273235018213,IFIE1 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.968113614296705,IR3 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122089925,IR3 0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447868559382,AM 0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447868559382,EOP -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.156552131440618,IR4 -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131440618,ISE6 +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131440618,EOP +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447868559382,IR4 +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447868559382,ISE6 0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP 0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP 0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF @@ -119,19 +119,19 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339294988556,OCI1 0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.675549694236,OCI1 0,PR,2020,USD,L,BEPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR6 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-42.968113614296705,AM +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271122089925,AM 0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849210284577,BOP 0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122089925,EOP +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.9681136142967,EOP 0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233273235018213,IA 0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233273235018213,IFIE1 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.968113614296705,IR3 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122089925,IR3 0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447868559382,AM 0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447868559382,EOP -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.156552131440618,IR4 -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131440618,ISE6 +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131440618,EOP +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447868559382,IR4 +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447868559382,ISE6 0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP 0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP 0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF @@ -176,19 +176,19 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 0,PR,2020,USD,L,BEPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,320,IR6 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-42.968113614296705,AM +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-82.02271122089925,AM 0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,139.90849210284577,BOP 0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,82.02271122089925,EOP +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,42.9681136142967,EOP 0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.08233273235018213,IA 0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.08233273235018213,IFIE1 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,42.968113614296705,IR3 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,82.02271122089925,IR3 0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,9.843447868559382,AM 0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-9.843447868559382,EOP -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,5.156552131440618,IR4 -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.156552131440618,ISE6 +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.156552131440618,EOP +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,9.843447868559382,IR4 +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-9.843447868559382,ISE6 0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP 0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP 0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF @@ -260,21 +260,21 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.6339294988556,OCI1 0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.675549694236,OCI1 0,PR,2020,USD,L,BEPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,320,IR6 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-67.83795828214956,AM +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-129.49726655304642,AM 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,72.2,BOP 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,139.90849210284577,BOP 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,129.49726655304642,EOP +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.83795828214956,EOP 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.14440000000001615,IA 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.08233273235018213,IA 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.22673273235019828,IFIE1 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.83795828214956,IR3 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,129.49726655304642,IR3 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.843447868559382,AM 0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.843447868559382,EOP -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,5.156552131440618,IR4 -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5.156552131440618,ISE6 +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5.156552131440618,EOP +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.843447868559382,IR4 +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.843447868559382,ISE6 0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP 0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.5,EOP 0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.8752944598663,BOP @@ -323,19 +323,19 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,399.6339294988556,OCI1 0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-299.675549694236,OCI1 0,PR,2020,USD,L,BEPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,320,IR6 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-42.968113614296705,AM +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-82.02271122089925,AM 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,139.90849210284577,BOP 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,82.02271122089925,EOP +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,42.9681136142967,EOP 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.08233273235018213,IA 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.08233273235018213,IFIE1 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,42.968113614296705,IR3 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,82.02271122089925,IR3 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,5.156552131440618,AM +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.843447868559382,AM 0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-9.843447868559382,EOP -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,5.156552131440618,IR4 -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5.156552131440618,ISE6 +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5.156552131440618,EOP +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.843447868559382,IR4 +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-9.843447868559382,ISE6 0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.8752944598663,BOP 0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.8752944598663,BOP 0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF @@ -388,13 +388,13 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.8169647494278,OCI1 0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.837774847118,OCI1 0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11527160395201003,OCI1 -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,24.228134693791258,AM +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,46.24958203305145,AM 0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-70.43538016962212,BOP -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-46.249582033051446,EOP +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-24.228134693791258,EOP 0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04233655722058882,IA 0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04233655722058882,IFIE1 0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,70.43538016962212,ISE10 -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-24.228134693791258,ISE7 +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-46.24958203305145,ISE7 0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP 0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP 0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF @@ -482,13 +482,13 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,24.228134693791258,AM +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,46.24958203305145,AM 0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-70.43538016962212,BOP -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-46.249582033051446,EOP +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-24.228134693791258,EOP 0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.04233655722058882,IA 0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.04233655722058882,IFIE1 0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,70.43538016962212,ISE10 -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-24.228134693791258,ISE7 +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-46.24958203305145,ISE7 0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP 0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP 0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF diff --git a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv index f9cba291..bef760f1 100644 --- a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv +++ b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv @@ -76,22 +76,22 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.3283233358608868,YCU 0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.22380254636726704,YCU 0,PR,2020,USD,L,BEPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,96,IR6 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.60249856533708,AM -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,82.02271122089925,BOP -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.773636697753954,AM +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.9681136142967,BOP +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903121,CL 0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-43.599999999999994,EA -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,18.374757965778002,EOP -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.09388697662967685,IA -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09388697662967685,IFIE1 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,38.60249856533708,IR3 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,25.139341666413856,IR5 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,12.129509556366443,EOP +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.07437430623754743,IA +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.07437430623754743,IFIE1 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.773636697753954,IR3 +0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,25.13934166641384,IR5 0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.831613508459697,AM -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986157867,AM +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.156552131440618,BOP 0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.011834360099684,EOP -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.831613508459697,IR4 -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-16.831613508459697,ISE6 +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.656208145282752,EOP +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986157867,IR4 +0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.500343986157867,ISE6 0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.958738976731105,BOP 0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903124,CL 0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP @@ -251,22 +251,22 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.3283233358608868,YCU 0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.22380254636726704,YCU 0,PR,2020,USD,L,BEPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,120,IR6 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-34.26645281902704,AM -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,82.02271122089925,BOP -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-3.7096824440639895,AM +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.9681136142967,BOP +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903121,CL 0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-50,EA -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.31080371208803,EOP -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.09388697662967685,IA -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09388697662967685,IFIE1 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,34.26645281902704,IR3 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,31.53934166641386,IR5 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.793463810056409,EOP +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.07437430623754743,IA +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.07437430623754743,IFIE1 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3.7096824440639895,IR3 +0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,31.539341666413847,IR5 0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.831613508459697,AM -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986157867,AM +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.156552131440618,BOP 0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.011834360099684,EOP -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,16.831613508459697,IR4 -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-16.831613508459697,ISE6 +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.656208145282752,EOP +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986157867,IR4 +0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.500343986157867,ISE6 0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.958738976731105,BOP 0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903122,CL 0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP @@ -375,22 +375,22 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.3283233358608868,YCU 0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.22380254636726704,YCU 0,PR,2020,USD,L,BEPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,96,IR6 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-38.60249856533708,AM -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,82.02271122089925,BOP -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.773636697753954,AM +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,42.9681136142967,BOP +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135554903121,CL 0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-43.599999999999994,EA -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,18.374757965778002,EOP -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.09388697662967685,IA -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.09388697662967685,IFIE1 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,38.60249856533708,IR3 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,25.139341666413856,IR5 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,12.129509556366443,EOP +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.07437430623754743,IA +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.07437430623754743,IFIE1 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,5.773636697753954,IR3 +0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,25.13934166641384,IR5 0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,16.831613508459697,AM -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6.500343986157867,AM +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.156552131440618,BOP 0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-8.011834360099686,EOP -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,16.831613508459697,IR4 -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-16.831613508459697,ISE6 +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-13.65620814528275,EOP +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6.500343986157867,IR4 +0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6.500343986157867,ISE6 0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,31.958738976731105,BOP 0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135554903122,CL 0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,EOP @@ -554,29 +554,30 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.3283233358608868,YCU 0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.22380254636726704,YCU 0,PR,2020,USD,L,BEPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,96,IR6 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-51.96181825867143,AM -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,129.49726655304642,BOP +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,67.83795828214957,BOP 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-139.94506864907146,CL -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-43.599999999999994,EA +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-33.87170342894083,EA 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.11760647207910604,IA -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.11760647207910604,IFIE1 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,51.96181825867143,IR3 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,77.65305476645409,IR5 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.08679991324534386,IA +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.08679991324534386,IFIE1 +0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.92475819539493,IR5 0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,24.84344786855938,AM -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655213144062,AM +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.156552131440618,BOP 0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF 0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,24.84344786855938,IR4 -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-24.84344786855938,ISE6 +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655213144062,IR4 +0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-20.15655213144062,ISE6 +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.728296571059161,AM 0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,31.958738976731105,BOP 0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-87.43135554903122,CL +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.728296571059161,EA 0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP 0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,55.45631603430072,EV 0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.016300537999407044,IA 0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.016300537999407044,IFIE1 -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.016300537999399012,ISE11 +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.71199603305977,ISE11 +0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.728296571059161,ISE9 0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP 0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,3,CF 0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,2.5,EOP @@ -684,24 +685,24 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.3283233358608868,YCU 0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.22380254636726704,YCU 0,PR,2020,USD,L,BEPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,104,IR6 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-96.83022811966929,AM -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,82.02271122089925,BOP +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-33.48998867550812,AM +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,42.9681136142967,BOP 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,8.004653973154419,BOP 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-51.599999999999994,EA -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,46.09110994353215,EOP +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,70.35723911069861,EOP 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.4922636208166304,EV -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.09388697662967685,IA +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.07437430623754743,IA 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.0003356307173485902,IA -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.09422260734702544,IFIE1 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,96.83022811966929,IR3 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.07470993695489601,IFIE1 +0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,33.48998867550812,IR3 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-60.80440423495516,IR5 0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,16.831613508459697,AM -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-9.843447868559382,BOP +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.500343986157867,AM +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.156552131440618,BOP 0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.011834360099684,EOP -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,16.831613508459697,IR4 -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-16.831613508459697,ISE6 +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-13.656208145282752,EOP +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.500343986157867,IR4 +0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6.500343986157867,ISE6 0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,CF 0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1,EOP 0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,IR1 @@ -730,8 +731,8 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-7.486276372201601,OCI1 0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.5142516904975025,OCI1 0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.02238025463672244,YCU -0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,CF 0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF +0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,CF 0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,ISE1 0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 0,PR,2020,USD,,AA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,CF @@ -808,15 +809,15 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.1641616679304434,YCU 0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11190127318363352,YCU 0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8.349412781047394E-05,YCU -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,38.316584766326955,AM -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-46.24958203305145,BOP +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,11.133355649364928,AM +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-24.22813469379126,BOP 0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863442721,CL 0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.5933128558860402,CRU -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-18.238663229656325,EOP -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04954912095471157,IA -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.6428619768407517,IFIE1 +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-23.389442532110124,EOP +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.03854664570667637,IA +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.6318595015927165,IFIE1 0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,9.662803986091077,ISE10 -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-38.316584766326955,ISE7 +0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.133355649364928,ISE7 0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-52.92295262051829,MC 0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-15.684995728561214,BOP 0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863442721,CL @@ -999,15 +1000,15 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.1641616679304434,YCU 0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11190127318363352,YCU 0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8.349412781047394E-05,YCU -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,38.316584766326955,AM -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-46.24958203305145,BOP +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,11.133355649364928,AM +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-24.22813469379126,BOP 0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863442721,CL 0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.5933128558860402,CRU -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-18.238663229656325,EOP -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.04954912095471157,IA -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.6428619768407517,IFIE1 +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-23.389442532110124,EOP +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.03854664570667637,IA +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.6318595015927165,IFIE1 0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,9.662803986091077,ISE10 -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-38.316584766326955,ISE7 +0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.133355649364928,ISE7 0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-52.92295262051829,MC 0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-15.684995728561214,BOP 0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863442721,CL diff --git a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb index 1a40358a..98187848 100644 --- a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb +++ b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb @@ -211,9 +211,13 @@ { "cell_type": "code", "source": [ - "var errorList = new List();", - "\n", - "\nforeach (var g in bmFiles.GroupBy(x => (ReportingNode: x.ReportingNode, Year: x.Year, Month: x.Month)))", + "var errorList = new List();" + ] + }, + { + "cell_type": "code", + "source": [ + "foreach (var g in bmFiles.GroupBy(x => (ReportingNode: x.ReportingNode, Year: x.Year, Month: x.Month)))", "\n{", "\n var reportingNode = g.Key.ReportingNode;", "\n var year = g.Key.Year;", @@ -235,7 +239,7 @@ "\n var extension = System.IO.Path.GetExtension(bmfile.FileName);", "\n var stream = await Project.FileStorage.ReadAsync(bmfile.FileName);", "\n //Read Bm csv", - "\n var bmDataTable = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync());", + "\n var bmDataTable = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet;", "\n", "\n var mainTab = bmDataTable.Tables[Main].Rows.First();", "\n if(!ValidateMainTab(mainTab, reportingNode, year, month))", @@ -247,8 +251,10 @@ "\n //Get the computed Data", "\n var computedVariables = computedVariablesByEstimateType.TryGetValue(bmTableName, out var ret) ? ret : Enumerable.Empty();", "\n ", + "\n if(!computedVariables.Any()) ", + "\n errorList.Add(new BenchmarkTestResult(\"No variables are computed for EstimateType: \" + bmTableName, 0, 0));", "\n //CompareAgainstBm", - "\n if (bmVariables.Any() || computedVariables.Any()) //TODO we are adding duplicates here", + "\n if (bmVariables.Any() && computedVariables.Any()) //TODO we are adding duplicates here", "\n errorList = errorList.Concat(CompareAgainstBm(errorList, bmVariables, computedVariables)).ToList();", "\n }", "\n}", diff --git a/full-ifrs17-template/Test/QueriesTest.ipynb b/full-ifrs17-template/Test/QueriesTest.ipynb index ab6ca4d9..8fdabb4a 100644 --- a/full-ifrs17-template/Test/QueriesTest.ipynb +++ b/full-ifrs17-template/Test/QueriesTest.ipynb @@ -20,7 +20,7 @@ { "cell_type": "code", "source": [ - "#!import \"../CalculationEngine\"" + "#!import \"//ifrs17ce/dev/CalculationEngine\"" ] }, { @@ -168,12 +168,13 @@ "source": [ "public async Task CheckLoadDataNodeStateAsync(Args args, IEnumerable testData, bool isExpectedToBeActive)", "\n{", + "\n await Workspace.Partition.SetAsync(args);", "\n await Workspace.UpdateAsync(testData);", "\n var isActive = (await Workspace.LoadDataNodeStateAsync(args)).Keys.Contains(gic);", "\n ", "\n isActive.Should().Be(isExpectedToBeActive);", "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n Workspace.Reset(x => x.ResetCurrentPartitions());", "\n}" ] }, @@ -210,6 +211,7 @@ "\n double expectedCurrentFirstYcValue,", "\n double expectedLockedFirstYcValue)", "\n{", + "\n await Workspace.Partition.SetAsync(args);", "\n await Workspace.UpdateAsync(testData);", "\n await Workspace.UpdateAsync(new ReportingNode[]{new ReportingNode{Currency=\"EUR\",SystemName=\"CH\"}});", "\n ", @@ -217,8 +219,7 @@ "\n var eurLockedYieldCurve = (await LoadLockedInYieldCurveAsync(Workspace, args, dataNodes));", "\n var eurCurrentYieldCurve = (await LoadCurrentYieldCurveAsync(Workspace, args, dataNodes));", "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n Workspace.Reset(x => x.ResetCurrentPartitions());", "\n ", "\n var errors = new List();", "\n var currentPrevPeriod = eurCurrentYieldCurve[\"EUR\"][PreviousPeriod].Values.First();", @@ -271,6 +272,7 @@ "\n int? currentYear = null)", "\n{", "\n currentYear = currentYear ?? previousYear;", + "\n await Workspace.Partition.SetAsync(args);", "\n await Workspace.UpdateAsync(testData);", "\n ", "\n var interDataNodeParameters = await LoadInterDataNodeParametersAsync(Workspace, args);", @@ -345,7 +347,7 @@ "\n }", "\n }", "\n ", - "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", + "\n Workspace.Reset(x => x.ResetCurrentPartitions());", "\n ", "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", "\n}" diff --git a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb index 7831cbde..4be8de77 100644 --- a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb +++ b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb @@ -1824,7 +1824,7 @@ "\nwhile the AMF related to the current period is", "\n", "\n$$", - "\n\\text{AMF} = \\prod _{t = \\text{S}}^{\\text{S}+\\text{TS}} \\text{AMF}^{\\text{Monthly}}_t ~.", + "\n\\text{AMF} = 1 - \\prod _{t = \\text{S}}^{\\text{S}+\\text{TS}-1} \\text{AMF}^{\\text{Monthly}}_t ~.", "\n$$", "\n", "\nwhere the shift S and Time Step TS for the [current period](#year-and-period) are" @@ -1949,7 +1949,7 @@ { "cell_type": "code", "source": [ - "var expectedCurrentPeriodAmortizationFactor = expectedMonthlyAmortizationFactor.Skip(shift).Take(timeStep).Aggregate(1d, (x, y) => x * y);" + "var expectedCurrentPeriodAmortizationFactor = 1d - expectedMonthlyAmortizationFactor.Skip(shift).Take(timeStep).Aggregate(1d, (x, y) => x * y);" ] }, { diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index 98114494..f5fcf571 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -43,16 +43,16 @@ { "cell_type": "code", "source": [ - "#r \"nuget:Systemorph.Workspace,1.2.0\"", - "\n#r \"nuget:Systemorph.Scopes,1.2.4\"", - "\n#r \"nuget:Systemorph.Import,1.3.0\"", - "\n#r \"nuget:Systemorph.Test,1.2.4\"", - "\n#r \"nuget:Systemorph.Export,1.3.0\"", - "\n#r \"nuget:Systemorph.DataSetReader,1.3.0\"", - "\n#r \"nuget:Systemorph.DataSource,1.2.0\"", - "\n#r \"nuget:Systemorph.DataSource.Conversions,1.2.0\"", - "\n#r \"nuget:Systemorph.Reporting,1.2.4\"", - "\n#r \"nuget:Systemorph.DomainDesigner,1.3.0\"" + "#r \"nuget:Systemorph.Workspace,1.4.1\"", + "\n#r \"nuget:Systemorph.Scopes,1.4.0\"", + "\n#r \"nuget:Systemorph.Import,1.4.0\"", + "\n#r \"nuget:Systemorph.Test,1.4.0\"", + "\n#r \"nuget:Systemorph.Export,1.4.0\"", + "\n#r \"nuget:Systemorph.DataSetReader,1.4.0\"", + "\n#r \"nuget:Systemorph.DataSource,1.4.1\"", + "\n#r \"nuget:Systemorph.DataSource.Conversions,1.4.1\"", + "\n#r \"nuget:Systemorph.Reporting,1.4.0\"", + "\n#r \"nuget:Systemorph.DomainDesigner,1.4.0\"" ] }, { diff --git a/ifrs17/Import/ImportScopeCalculation.ipynb b/ifrs17/Import/ImportScopeCalculation.ipynb index 803483c1..ee63b100 100644 --- a/ifrs17/Import/ImportScopeCalculation.ipynb +++ b/ifrs17/Import/ImportScopeCalculation.ipynb @@ -1055,10 +1055,12 @@ "For a certain projection period - defined by the Shift, $S$, and the Time-Step, $TS$, parameters - the Amortization Factor is then given by the product of the corresponding monthly amortization factors:", "\n", "\n$$", - "\nAF = \\prod _{i = S}^{TS} \\text{Monthly }AF_i ~.", + "\nAF = 1 - \\prod _{i = S}^{S + TS - 1} \\text{Monthly }AF_i ~.", "\n$$", "\n", - "\nEach GIC will have his own AF." + "\nEach GIC will have his own AF.", + "\n", + "\nIn order to run off the business of a given Group of Contract one should provide a cashflow of 0s for the AocStep with AocType CL and Novelty C. When computing the AF this results in the product of the monthly amortization factors of the period to be 1. In this case, the computed AF does not follow the formula above but is 1 allowing for the full release of the Technical Margin in the AM AocStep." ] }, { @@ -1073,15 +1075,17 @@ "\n ", "\n private int shift => GetStorage().GetShift(0);//Identity.ProjectionPeriod", "\n private int timeStep => GetStorage().GetTimeStep(0);//Identity.ProjectionPeriod", - "\n ", - "\n [NotVisible] string EconomicBasis => GetContext();", - "\n ", - "\n string EstimateType => EstimateTypes.F;", - "\n double Value => GetScope(Identity)", + "\n private double amortizedFactor => GetScope(Identity)", "\n .MonthlyAmortizationFactors", "\n .Skip(shift)", "\n .Take(timeStep)", "\n .Aggregate(1d, (x, y) => x * y);", + "\n [NotVisible] string EconomicBasis => GetContext();", + "\n ", + "\n string EstimateType => EstimateTypes.F;", + "\n double Value => Math.Abs(amortizedFactor - 1d) > Precision", + "\n ? 1d - amortizedFactor", + "\n : 1d;", "\n}", "\n", "\npublic interface AmfFromIfrsVariable : CurrentPeriodAmortizationFactor", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index 34ab4202..4b2d2a5a 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -273,7 +273,7 @@ "\n", "\n var extension = System.IO.Path.GetExtension(file);", "\n var stream = await Project.FileStorage.ReadAsync(file);", - "\n var target = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).Tables[tab];", + "\n var target = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet.Tables[tab];", "\n ", "\n", "\n var dataNodesImported = target.Rows.Select(x => x.Field(nameof(RawVariable.DataNode))).ToHashSet();", @@ -332,7 +332,7 @@ "\n{", "\n var extension = System.IO.Path.GetExtension(file);", "\n var stream = await Project.FileStorage.ReadAsync(file);", - "\n var mainTab = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).Tables[Main];", + "\n var mainTab = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet.Tables[Main];", "\n ", "\n if(mainTab == null) ApplicationMessage.Log(Error.NoMainTab);", "\n if(mainTab.Rows.Count() == 0) ApplicationMessage.Log(Error.IncompleteMainTab);", diff --git a/ifrs17/Utils/ApplicationMessage.ipynb b/ifrs17/Utils/ApplicationMessage.ipynb index 2bc8ec97..d5b26c8b 100644 --- a/ifrs17/Utils/ApplicationMessage.ipynb +++ b/ifrs17/Utils/ApplicationMessage.ipynb @@ -27,7 +27,7 @@ { "cell_type": "code", "source": [ - "#r \"nuget:Systemorph.Activities,1.2.3\"" + "#r \"nuget:Systemorph.Activities,1.4.0\"" ] }, { From 1573f4743f7eee9eeb9abecb7a98a898dfa4f282 Mon Sep 17 00:00:00 2001 From: amuolo Date: Tue, 18 Oct 2022 00:53:38 +0200 Subject: [PATCH 12/43] Merge pull request #43 from Systemorph/defaultAocConfig Default aoc configuration with format --- full-ifrs17-template/Constants/Consts.ipynb | 28 ++ .../InitSystemorphBaseToMemory.ipynb | 10 +- full-ifrs17-template/Test/Tests.ipynb | 6 - ifrs17/Constants/Consts.ipynb | 3 + ifrs17/Constants/Validations.ipynb | 6 +- ifrs17/Import/Importers.ipynb | 111 +++++- ifrs17/Test/AocConfigurationTest.ipynb | 328 ++++++++++++++++++ .../Test/QueriesTest.ipynb | 2 +- ifrs17/Test/Tests.ipynb | 37 ++ ifrs17/Utils/ApplicationMessage.ipynb | 2 +- 10 files changed, 517 insertions(+), 16 deletions(-) create mode 100644 full-ifrs17-template/Constants/Consts.ipynb create mode 100644 ifrs17/Test/AocConfigurationTest.ipynb rename {full-ifrs17-template => ifrs17}/Test/QueriesTest.ipynb (99%) create mode 100644 ifrs17/Test/Tests.ipynb diff --git a/full-ifrs17-template/Constants/Consts.ipynb b/full-ifrs17-template/Constants/Consts.ipynb new file mode 100644 index 00000000..f39ab144 --- /dev/null +++ b/full-ifrs17-template/Constants/Consts.ipynb @@ -0,0 +1,28 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "var projectName = \"ifrs17ce\";", + "\nvar environmentName = \"dev\";", + "\nvar notebookName = \"CalculationEngine\";", + "\nvar calculationEngine = $\"#!import \\\"//{projectName}/{environmentName}/{notebookName}\\\"\";" + ] + } + ] +} \ No newline at end of file diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index 293cb431..cf90dac4 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb @@ -29,7 +29,8 @@ { "cell_type": "code", "source": [ - "#!import \"//ifrs17ce/dev/CalculationEngine\"" + "#!import \"../Constants/Consts\"", + "\n#!eval calculationEngine" ] }, { @@ -77,7 +78,6 @@ "\n .WithType()", "\n .WithType()", "\n .WithType()", - "\n .WithType()", "\n .WithType()", "\n .WithType()", "\n .WithType()", @@ -97,6 +97,12 @@ "\n .ExecuteAsync()" ] }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\").WithFormat(\"AocConfiguration\").WithTarget(DataSource).ExecuteAsync()" + ] + }, { "cell_type": "code", "source": [ diff --git a/full-ifrs17-template/Test/Tests.ipynb b/full-ifrs17-template/Test/Tests.ipynb index 40b15ba1..47f5ea85 100644 --- a/full-ifrs17-template/Test/Tests.ipynb +++ b/full-ifrs17-template/Test/Tests.ipynb @@ -41,12 +41,6 @@ "#!eval-notebook \"ReportStorageTest\"" ] }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"QueriesTest\"" - ] - }, { "cell_type": "code", "source": [ diff --git a/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb index 79179ff2..423a41b4 100644 --- a/ifrs17/Constants/Consts.ipynb +++ b/ifrs17/Constants/Consts.ipynb @@ -198,9 +198,12 @@ "public static class AocTypes{", "\n public const string BOP = nameof(BOP);", "\n public const string MC = nameof(MC);", + "\n public const string PC = nameof(PC);", "\n public const string RCU = nameof(RCU);", "\n public const string CF = nameof(CF);", "\n public const string IA = nameof(IA);", + "\n public const string AU = nameof(AU);", + "\n public const string FAU = nameof(FAU);", "\n public const string YCU = nameof(YCU);", "\n public const string CRU = nameof(CRU);", "\n public const string WO = nameof(WO);", diff --git a/ifrs17/Constants/Validations.ipynb b/ifrs17/Constants/Validations.ipynb index 56dec561..afd2e82e 100644 --- a/ifrs17/Constants/Validations.ipynb +++ b/ifrs17/Constants/Validations.ipynb @@ -53,7 +53,8 @@ "source": [ "public enum Error { ", "\n // Import", - "\n NoMainTab, IncompleteMainTab, ParsingScientificNotation, ValueTypeNotFound, ValueTypeNotValid, AocTypeNotValid,", + "\n NoMainTab, IncompleteMainTab, ParsingScientificNotation, ValueTypeNotFound, ValueTypeNotValid, ", + "\n AocTypeNotValid, AocTypeCompulsoryNotFound, AocTypePositionNotSupported, AocConfigurationOrderNotUnique,", "\n // Partition", "\n PartitionNotFound, ParsedPartitionNotFound, PartititionNameNotFound, PartitionTypeNotFound,", "\n // Dimensions", @@ -95,6 +96,9 @@ "\n (Error.ValueTypeNotFound , _) => $\"Value Type not found.\",", "\n (Error.ValueTypeNotValid , 1) => $\"The Value Type {s[0]} is invalid.\",", "\n (Error.AocTypeNotValid , 1) => $\"The parsed AocType {s[0]} is invalid.\",", + "\n (Error.AocTypeCompulsoryNotFound , _) => $\"Not all compulsory AocTypes have been imported.\",", + "\n (Error.AocTypePositionNotSupported , 1) => $\"The position of the AocType {s[0]} is not supported.\",", + "\n (Error.AocConfigurationOrderNotUnique , _) => $\"Two or more Aoc Configurations have the same Order.\",", "\n // Partition", "\n (Error.PartitionNotFound , _) => $\"Partition do not found.\",", "\n (Error.ParsedPartitionNotFound , 1) => $\"Parsed partition not available: ReportingNode {s[0]}.\",", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index 4b2d2a5a..f2963181 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -266,7 +266,7 @@ { "cell_type": "code", "source": [ - "public async Task DataNodeFactoryAsync (string file, string tab, ImportArgs args)", + "public async Task DataNodeFactoryAsync(string file, string tab, ImportArgs args)", "\n{", "\n var partition = (await DataSource.Query().Where(p => p.ReportingNode == args.ReportingNode && p.Scenario == null).ToArrayAsync()).SingleOrDefault();", "\n if(partition == null) { ApplicationMessage.Log(Error.ParsedPartitionNotFound); return; }", @@ -274,13 +274,12 @@ "\n var extension = System.IO.Path.GetExtension(file);", "\n var stream = await Project.FileStorage.ReadAsync(file);", "\n var target = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet.Tables[tab];", - "\n ", "\n", "\n var dataNodesImported = target.Rows.Select(x => x.Field(nameof(RawVariable.DataNode))).ToHashSet();", "\n var dataNodesDefined = await DataSource.Query().Where(x => dataNodesImported.Contains(x.SystemName)).ToArrayAsync();", "\n var dataNodeStatesDefined = await DataSource.Query().Select(x => x.DataNode).ToArrayAsync();", "\n var dataNodeParametersDefined = await DataSource.Query().Select(x => x.DataNode).ToArrayAsync(); ", - "\n ", + "\n", "\n var dataNodeStatesUndefined = dataNodesImported.Where(x => x != null && !dataNodeStatesDefined.Contains(x)).ToHashSet();", "\n var dataNodeSingleParametersUndefined = dataNodesImported.Where(x => x != null &&", "\n !dataNodeParametersDefined.Contains(x) && ", @@ -291,7 +290,7 @@ "\n", "\n await DataSource.UpdateAsync( dataNodeSingleParametersUndefined.Select(x => ", "\n new SingleDataNodeParameter {DataNode = x, Year = args.Year, Month = DefaultDataNodeActivationMonth, PremiumAllocation = DefaultPremiumExperienceAdjustmentFactor, Partition = partition.Id}).ToArray() );", - "\n ", + "\n", "\n await DataSource.CommitAsync();", "\n}" ] @@ -319,6 +318,109 @@ "\n}" ] }, + { + "cell_type": "markdown", + "source": [ + "### Analysis of Change Configuration" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The Analysis of Change configuration is parsed from the input file and complemented with defaults to allow for an easy insertion of new AOC steps. ", + "\n", + "\nAfter having checked that the AocTypes loaded in the target DataSource are including all the compulsory ones, default configurations are generated on the basis of the AocTypes ordering. ", + "\n", + "\nThe following categories have been identified based on the *Order* of the novel AOC step:", + "\n", + "\n| Category | Default added with same configuration of |", + "\n| --------------------- | ----------------------------------------------------- |", + "\n| Order < RCU | MC with Novelty I |", + "\n| RCU < Order < CF | RCU with Novelty I |", + "\n| IA < Order < YCU | AU with both Novelty I and N |", + "\n| CRU < Order < WO | EV with Novelty I and N |", + "\n| WO < Order < CL | WO with Novelty C (only for Import Source = Actual) |", + "\n", + "\nThe new Aoc Configurations are created with the same order of the Aoc Types. " + ] + }, + { + "cell_type": "code", + "source": [ + "Import.DefineFormat(\"AocConfiguration\", async (options, dataSet) => {", + "\n Activity.Start();", + "\n var workspace = Workspace.CreateNew();", + "\n workspace.InitializeFrom(options.TargetDataSource);", + "\n", + "\n var aocTypes = await options.TargetDataSource.Query().OrderBy(x => x.Order).ToArrayAsync();", + "\n var aocTypesCompulsory = typeof(AocTypes).GetFields().Select(x => (string)x.Name);", + "\n if(aocTypesCompulsory.Where(x => !aocTypes.Select(x => x.SystemName).Contains(x)).Any()) {", + "\n ApplicationMessage.Log(Error.AocTypeCompulsoryNotFound);", + "\n return Activity.Finish().RepeatOnce();", + "\n }", + "\n ", + "\n var logConfig = await Import.FromDataSet(dataSet).WithType().WithTarget(workspace).ExecuteAsync();", + "\n if(logConfig.Errors.Any()) return logConfig.RepeatOnce(); ", + "\n", + "\n var orderByName = aocTypes.ToDictionary(x => x.SystemName, x => x.Order);", + "\n var aocConfigs = (await workspace.Query().ToArrayAsync())", + "\n .GroupBy(x => (x.AocType, x.Novelty))", + "\n .Select(y => y.OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault())", + "\n .ToDictionary(x => (x.AocType, x.Novelty));", + "\n var aocOrder = aocConfigs.ToDictionary(x => x.Key, x => x.Value.Order);", + "\n var newAocTypes = orderByName.Keys.Where(x => !aocConfigs.Keys.Contains((x, Novelties.I)) && ", + "\n !aocConfigs.Keys.Contains((x, Novelties.N)) && ", + "\n !aocConfigs.Keys.Contains((x, Novelties.C)) && ", + "\n !aocTypes.Any(y => y.Parent == x) &&", + "\n !aocTypesCompulsory.Contains(x)).ToArray();", + "\n", + "\n foreach(var newAocType in newAocTypes) {", + "\n if(orderByName[newAocType] < orderByName[AocTypes.RCU])", + "\n {", + "\n var step = (AocTypes.MC, Novelties.I);", + "\n await workspace.UpdateAsync( aocConfigs[step] with { AocType = newAocType, DataType = DataType.Optional, Order = ++aocOrder[step] }); ", + "\n }", + "\n else if(orderByName[newAocType] > orderByName[AocTypes.RCU] && orderByName[newAocType] < orderByName[AocTypes.CF]) ", + "\n {", + "\n var step = (AocTypes.RCU, Novelties.I);", + "\n await workspace.UpdateAsync( aocConfigs[step] with { AocType = newAocType, DataType = DataType.Optional, Order = ++aocOrder[step] });", + "\n }", + "\n else if(orderByName[newAocType] > orderByName[AocTypes.IA] && orderByName[newAocType] < orderByName[AocTypes.YCU]) ", + "\n {", + "\n foreach (var novelty in new[]{Novelties.I, Novelties.N}) {", + "\n var step = (AocTypes.AU, novelty);", + "\n var order = orderByName[newAocType] < orderByName[AocTypes.AU]? ++aocOrder[(AocTypes.IA, novelty)] : ++aocOrder[(AocTypes.AU, novelty)];", + "\n await workspace.UpdateAsync( aocConfigs[step] with { AocType = newAocType, DataType = DataType.Optional, Order = order } );", + "\n }", + "\n }", + "\n else if(orderByName[newAocType] > orderByName[AocTypes.CRU] && orderByName[newAocType] < orderByName[AocTypes.WO])", + "\n {", + "\n var stepI = (AocTypes.EV, Novelties.I);", + "\n var orderI = orderByName[newAocType] < orderByName[AocTypes.EV]? ++aocOrder[(AocTypes.CRU, Novelties.I)] : ++aocOrder[(AocTypes.EV, Novelties.I)];", + "\n await workspace.UpdateAsync( aocConfigs[stepI] with { AocType = newAocType, DataType = DataType.Optional, Order = orderI } );", + "\n", + "\n var stepN = (AocTypes.EV, Novelties.N);", + "\n var orderN = orderByName[newAocType] < orderByName[AocTypes.EV]? ++aocOrder[(AocTypes.AU, Novelties.N)] : ++aocOrder[(AocTypes.EV, Novelties.N)];", + "\n await workspace.UpdateAsync( aocConfigs[stepN] with { AocType = newAocType, DataType = DataType.Optional, Order = orderN } );", + "\n }", + "\n else if(orderByName[newAocType] > orderByName[AocTypes.WO] && orderByName[newAocType] < orderByName[AocTypes.CL])", + "\n {", + "\n var step = (AocTypes.WO, Novelties.C);", + "\n await workspace.UpdateAsync( aocConfigs[step] with { AocType = newAocType, DataType = DataType.Optional, Order = ++aocOrder[step] } );", + "\n }", + "\n else", + "\n ApplicationMessage.Log(Error.AocTypePositionNotSupported);", + "\n };", + "\n", + "\n var aocConfigsFinal = await workspace.Query().ToArrayAsync();", + "\n if(aocConfigsFinal.GroupBy(x => x.Order).Any(x => x.Count() > 1))", + "\n ApplicationMessage.Log(Error.AocConfigurationOrderNotUnique);", + "\n", + "\n await workspace.CommitToTargetAsync(options.TargetDataSource);", + "\n return new[] {Activity.Finish(),logConfig}; ", + "\n});" + ] + }, { "cell_type": "markdown", "source": [ @@ -492,7 +594,6 @@ "\n await CommitToDatabase(partition);", "\n await CommitToDatabase(partition);", "\n await CommitToDatabase(partition);", - "\n ", "\n return log;", "\n}" ] diff --git a/ifrs17/Test/AocConfigurationTest.ipynb b/ifrs17/Test/AocConfigurationTest.ipynb new file mode 100644 index 00000000..501b0574 --- /dev/null +++ b/ifrs17/Test/AocConfigurationTest.ipynb @@ -0,0 +1,328 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Test Aoc Configuration

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../CalculationEngine\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Workspace Initialization " + ] + }, + { + "cell_type": "code", + "source": [ + "string novelties = ", + "\n@\"@@Novelty", + "\nSystemName,DisplayName,Parent,Order", + "\nI,In Force,,1", + "\nN,New Business,,10", + "\nC,Combined,,20\";" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromString(novelties).WithType().WithTarget(DataSource).ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "var workspace = Workspace.CreateNew();", + "\nworkspace.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Canonical Aoc Types and Configurations" + ] + }, + { + "cell_type": "code", + "source": [ + "string canonicalAocTypes = ", + "\n@\"@@AocType,,,,,,,,,,,", + "\nSystemName,DisplayName,Parent,Order,,,,,,,,", + "\nBOP,Opening Balance,,10,,,,,,,,", + "\nMC,Model Correction,,20,,,,,,,,", + "\nPC,Portfolio Changes,,30,,,,,,,,", + "\nRCU,Reinsurance Coverage Update,PC,40,,,,,,,,", + "\nCF,Cash flow,,50,,,,,,,,", + "\nIA,Interest Accretion,,60,,,,,,,,", + "\nAU,Assumption Update,,70,,,,,,,,", + "\nFAU,Financial Assumption Update,,80,,,,,,,,", + "\nYCU,Yield Curve Update,FAU,90,,,,,,,,", + "\nCRU,Credit Risk Update,FAU,100,,,,,,,,", + "\nEV,Experience Variance,,110,,,,,,,,", + "\nWO,Write-Off,,120,,,,,,,,", + "\nCL,Combined Liabilities,,130,,,,,,,,", + "\nEA,Experience Adjustment,,140,,,,,,,,", + "\nAM,Amortization,,150,,,,,,,,", + "\nFX,FX Impact,,160,,,,,,,,", + "\nEOP,Closing Balance,,170,,,,,,,,\";" + ] + }, + { + "cell_type": "code", + "source": [ + "string canonicalAocConfig = ", + "\n@\"@@AocConfiguration,,,,,,,,,,,", + "\nAocType,Novelty,DataType,InputSource,FxPeriod,YcPeriod,CdrPeriod,ValuationPeriod,RcPeriod,Order,Year,Month", + "\nBOP,I,Optional,7,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,10,1900,1", + "\nMC,I,Optional,4,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,20,1900,1", + "\nRCU,I,Calculated,4,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,BeginningOfPeriod,EndOfPeriod,30,1900,1", + "\nCF,I,Calculated,4,Average,NotApplicable,BeginningOfPeriod,Delta,EndOfPeriod,40,1900,1", + "\nIA,I,Calculated,5,Average,BeginningOfPeriod,BeginningOfPeriod,Delta,EndOfPeriod,50,1900,1", + "\nAU,I,Optional,4,EndOfPeriod,BeginningOfPeriod,BeginningOfPeriod,EndOfPeriod,EndOfPeriod,60,1900,1", + "\nYCU,I,CalculatedTelescopic,4,EndOfPeriod,EndOfPeriod,BeginningOfPeriod,EndOfPeriod,EndOfPeriod,70,1900,1", + "\nCRU,I,CalculatedTelescopic,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,80,1900,1", + "\nEV,I,Optional,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,90,1900,1", + "\nBOP,N,Optional,4,Average,EndOfPeriod,EndOfPeriod,BeginningOfPeriod,EndOfPeriod,95,1900,1", + "\nCF,N,Calculated,4,Average,NotApplicable,EndOfPeriod,Delta,EndOfPeriod,110,1900,1", + "\nIA,N,Calculated,4,Average,EndOfPeriod,EndOfPeriod,Delta,EndOfPeriod,120,1900,1", + "\nAU,N,Optional,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,130,1900,1", + "\nEV,N,Optional,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,140,1900,1", + "\nCF,C,Optional,2,Average,NotApplicable,NotApplicable,NotApplicable,NotApplicable,160,1900,1", + "\nWO,C,Optional,2,Average,NotApplicable,NotApplicable,NotApplicable,NotApplicable,170,1900,1", + "\nCL,C,Mandatory,4,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,180,1900,1", + "\nEA,C,Calculated,4,EndOfPeriod,NotApplicable,NotApplicable,NotApplicable,EndOfPeriod,190,1900,1", + "\nAM,C,Calculated,6,EndOfPeriod,NotApplicable,NotApplicable,NotApplicable,EndOfPeriod,200,1900,1", + "\nFX,C,Calculated,0,NotApplicable,NotApplicable,NotApplicable,NotApplicable,NotApplicable,210,1900,1", + "\nEOP,C,Calculated,6,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,220,1900,1\";" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test" + ] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckAocConfigurationDefault(AocType[] newAocTypes)", + "\n{", + "\n await workspace.DeleteAsync( await workspace.Query().ToArrayAsync() );", + "\n await workspace.DeleteAsync( await workspace.Query().ToArrayAsync() );", + "\n await workspace.CommitAsync();", + "\n", + "\n var aocTypeLog = await Import.FromString(canonicalAocTypes).WithType().WithTarget(workspace).ExecuteAsync();", + "\n aocTypeLog.Errors.Any().Should().Be(false);", + "\n", + "\n await workspace.UpdateAsync(newAocTypes);", + "\n await workspace.CommitAsync();", + "\n", + "\n return await Import.FromString(canonicalAocConfig).WithFormat(\"AocConfiguration\").WithTarget(workspace).ExecuteAsync();", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## NewAoc < RCU" + ] + }, + { + "cell_type": "code", + "source": [ + "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 25} } );", + "\naocConfigLog.Errors.Any().Should().Be(false);" + ] + }, + { + "cell_type": "code", + "source": [ + "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", + "\n x.AocType == AocTypes.MC && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 21, DataType = DataType.Optional};", + "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", + "\nnewConfigCalculated.Count().Should().Be(1);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## RCU < NewAoc < CF" + ] + }, + { + "cell_type": "code", + "source": [ + "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 45} } );", + "\naocConfigLog.Errors.Any().Should().Be(false);" + ] + }, + { + "cell_type": "code", + "source": [ + "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", + "\n x.AocType == AocTypes.RCU && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 31, DataType = DataType.Optional};", + "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", + "\nnewConfigCalculated.Count().Should().Be(1);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## IA < NewAoc < YCU" + ] + }, + { + "cell_type": "code", + "source": [ + "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 82} } );", + "\naocConfigLog.Errors.Any().Should().Be(false);" + ] + }, + { + "cell_type": "code", + "source": [ + "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", + "\n x.AocType == AocTypes.AU && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 61, DataType = DataType.Optional};", + "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", + "\nnewConfigCalculated.Count().Should().Be(1);" + ] + }, + { + "cell_type": "code", + "source": [ + "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", + "\n x.AocType == AocTypes.AU && x.Novelty == Novelties.N) with {AocType = \"A1\", Order = 131, DataType = DataType.Optional};", + "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", + "\nnewConfigCalculated.Count().Should().Be(1);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## CRU < NewAoc < EV" + ] + }, + { + "cell_type": "code", + "source": [ + "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 106} } );", + "\naocConfigLog.Errors.Any().Should().Be(false);" + ] + }, + { + "cell_type": "code", + "source": [ + "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", + "\n x.AocType == AocTypes.EV && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 81};", + "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", + "\nnewConfigCalculated.Count().Should().Be(1);" + ] + }, + { + "cell_type": "code", + "source": [ + "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", + "\n x.AocType == AocTypes.EV && x.Novelty == Novelties.N) with {AocType = \"A1\", Order = 131};", + "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", + "\nnewConfigCalculated.Count().Should().Be(1);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## EV < NewAoc < WO" + ] + }, + { + "cell_type": "code", + "source": [ + "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 116} } );", + "\naocConfigLog.Errors.Any().Should().Be(false);" + ] + }, + { + "cell_type": "code", + "source": [ + "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", + "\n x.AocType == AocTypes.EV && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 91};", + "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", + "\nnewConfigCalculated.Count().Should().Be(1);" + ] + }, + { + "cell_type": "code", + "source": [ + "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", + "\n x.AocType == AocTypes.EV && x.Novelty == Novelties.N) with {AocType = \"A1\", Order = 141};", + "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", + "\nnewConfigCalculated.Count().Should().Be(1);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## WO < NewAoc < CL" + ] + }, + { + "cell_type": "code", + "source": [ + "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 125} } );", + "\naocConfigLog.Errors.Any().Should().Be(false);" + ] + }, + { + "cell_type": "code", + "source": [ + "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", + "\n x.AocType == AocTypes.WO && x.Novelty == Novelties.C) with {AocType = \"A1\", Order = 171};", + "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", + "\nnewConfigCalculated.Count().Should().Be(1);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Two or more Aoc Config with same Order" + ] + }, + { + "cell_type": "code", + "source": [ + "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 111},", + "\n new AocType{SystemName = \"A2\", DisplayName = \"a1\", Order = 112},", + "\n new AocType{SystemName = \"A3\", DisplayName = \"a1\", Order = 113},", + "\n new AocType{SystemName = \"A4\", DisplayName = \"a1\", Order = 114},", + "\n new AocType{SystemName = \"A5\", DisplayName = \"a1\", Order = 115} } );", + "\n(aocConfigLog.Errors.First().ToString() == \"ActivityMessageNotification { Message = Two or more Aoc Configurations have the same Order. }\").Should().Be(true);" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/full-ifrs17-template/Test/QueriesTest.ipynb b/ifrs17/Test/QueriesTest.ipynb similarity index 99% rename from full-ifrs17-template/Test/QueriesTest.ipynb rename to ifrs17/Test/QueriesTest.ipynb index 8fdabb4a..07990aa7 100644 --- a/full-ifrs17-template/Test/QueriesTest.ipynb +++ b/ifrs17/Test/QueriesTest.ipynb @@ -20,7 +20,7 @@ { "cell_type": "code", "source": [ - "#!import \"//ifrs17ce/dev/CalculationEngine\"" + "#!import \"../CalculationEngine\"" ] }, { diff --git a/ifrs17/Test/Tests.ipynb b/ifrs17/Test/Tests.ipynb new file mode 100644 index 00000000..e49d0f33 --- /dev/null +++ b/ifrs17/Test/Tests.ipynb @@ -0,0 +1,37 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Tests

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"AocConfigurationTest\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"QueriesTest\"" + ] + } + ] +} \ No newline at end of file diff --git a/ifrs17/Utils/ApplicationMessage.ipynb b/ifrs17/Utils/ApplicationMessage.ipynb index d5b26c8b..a03f0301 100644 --- a/ifrs17/Utils/ApplicationMessage.ipynb +++ b/ifrs17/Utils/ApplicationMessage.ipynb @@ -53,10 +53,10 @@ "\n }", "\n ", "\n public static Object Log (Error e, params string[] s) { log.LogError(Get(e,s)); return null; }", - "\n ", "\n public static Object Log (Warning w, params string[] s) { log.LogWarning(Get(w,s)); return null; }", "\n ", "\n public static bool HasErrors () => activity.HasErrors();", + "\n public static bool HasWarnings () => activity.HasWarnings();", "\n}" ] }, From f57be90f6a9d25219d64e04c8eb6a822445cb14f Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Thu, 20 Oct 2022 13:36:13 +0200 Subject: [PATCH 13/43] Update links (#51) * working on links * read me * remove redundant code * clean up * AocConfiguration ImportFormat * remove reference to init from Overview --- full-ifrs17-template/Export/MapTemplate.ipynb | 12 - .../InitSystemorphBaseToMemory.ipynb | 2 +- .../InputFormatDescription.ipynb | 28 +- full-ifrs17-template/README.md | 19 +- .../SpecificationsFinancialPerformance.ipynb | 4 +- .../Test/SpecificationsImportActuals.ipynb | 4 +- .../Test/SpecificationsImportCashflows.ipynb | 12 +- .../Test/SpecificationsTechnicalMargin.ipynb | 14 +- ifrs17/Constants/Consts.ipynb | 1 + ifrs17/Import/ImportScopeCalculation.ipynb | 78 +--- ifrs17/Import/Importers.ipynb | 2 +- ifrs17/OverviewCalculationEngine.ipynb | 4 +- ifrs17/README.md | 8 +- ifrs17/Report/Reports.ipynb | 410 ------------------ 14 files changed, 61 insertions(+), 537 deletions(-) delete mode 100644 ifrs17/Report/Reports.ipynb diff --git a/full-ifrs17-template/Export/MapTemplate.ipynb b/full-ifrs17-template/Export/MapTemplate.ipynb index 4aa026ea..af901570 100644 --- a/full-ifrs17-template/Export/MapTemplate.ipynb +++ b/full-ifrs17-template/Export/MapTemplate.ipynb @@ -56,18 +56,6 @@ "\n#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" ] }, - { - "cell_type": "markdown", - "source": [ - "# Import dependencies" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"../Export/ExportConfiguration\"" - ] - }, { "cell_type": "markdown", "source": [ diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index cf90dac4..1dc82a4e 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb @@ -100,7 +100,7 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\").WithFormat(\"AocConfiguration\").WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\").WithFormat(ImportFormats.AocConfiguration).WithTarget(DataSource).ExecuteAsync()" ] }, { diff --git a/full-ifrs17-template/InputFormatDescription.ipynb b/full-ifrs17-template/InputFormatDescription.ipynb index 2e81506f..9dd70de5 100644 --- a/full-ifrs17-template/InputFormatDescription.ipynb +++ b/full-ifrs17-template/InputFormatDescription.ipynb @@ -36,16 +36,16 @@ "source": [ "A cashflow file is named **NominalCashflows** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Cashflow**.", "\n", - "\nThe **Main** section contains information such as: Reporting Node, Year, Month and Scenario for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partitions) to which the data belongs.", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month and Scenario for which the data is being imported. This information is used to define the [partition](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#partitions) to which the data belongs.", "\n", "\nThe **Cashflow** section contains the cash flow data. Several pieces of information are required to characterize a cash flow correctly:", - "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- [AocType](./DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [Novelty](./DataModel/DataStructure#novelty) : entered with its SystemName,", + "\n- [DataNode](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AmountType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [AocType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [Novelty](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#novelty) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims.", "\n", - "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](./DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", + "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", "\n
The cash flow is entered in the columns named ValuesN where N goes from 0 to the lenght of cash flow. The Value0 corresponds to January of the Year entered in the **Main** section for every combination of AocType and Novelty. " ] }, @@ -64,12 +64,12 @@ "source": [ "An Actuals file is named **Actuals** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Actual**.", "\n", - "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partition) to which the data belong.", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#partition) to which the data belong.", "\n", "\nThe **Actual** section contains the actuals data. Several pieces of information are required to to characterize an Actuals amount correctly:", - "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AocType](./DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [ValueType](./DataModel/DataStructure#amount-type) : corresponds to AmountType SystemName extended with the ExternalId,", + "\n- [DataNode](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AocType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [ValueType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type) : corresponds to AmountType SystemName extended with the ExternalId,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ] }, @@ -88,12 +88,12 @@ "source": [ "An Openings file is named **Openings** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Opening**. In an AoC for one period, we only need one file with the year/month combination of the beginning of the period. Some GICs do not need any entries in Openings.", "\n", - "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](./DataModel/DataStructure#partition) to which the data belong.", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#partition) to which the data belong.", "\n", "\nThe **Opening** section contains values at opening of an analysis. Several pieces of information are required to to characterize an Opening amount correctly:", - "\n- [DataNode](./DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [EstimateType](./DataModel/DataStructure#estimate-type) : entered with its SystemName,", - "\n- [AmountType](./DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [DataNode](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [EstimateType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [AmountType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ] } diff --git a/full-ifrs17-template/README.md b/full-ifrs17-template/README.md index 5c22a397..682bf0c1 100644 --- a/full-ifrs17-template/README.md +++ b/full-ifrs17-template/README.md @@ -1,21 +1,24 @@ -![Systemorph_logo.png](https://portal.systemorph.cloud/api/project/userclone/env/dev/file/download?path=Images/Systemorph_logo.png) +![Systemorph_logo.png](https://portal.systemorph.cloud/api/project/full-ifrs17-template1/env/dev/file/download?path=Images/Systemorph_logo.png) **Full IFRS 17 Template** Systemorph's IFRS 17 [Calculation Engine](https://portal.systemorph.cloud/api/project/ifrs17ce/env/dev/) is a tool to conduct all the essential IFRS 17 calculations given some key figures. + Systemorph's *Full IFRS 17 Template* uses our IFRS 17 Calculation Engine to import several use-cases and show the results. # Get Started -Interact with this *Full IFRS 17 Template* after having cloned the project. +Interact with this *Full IFRS 17 Template* after having cloned the project # Supporting Material -Check out the [video]() (this is a youtube link to Marketing) +Check out the [video]() (this is a youtube link or the video is embedded) + +Check out our IFRS 17 initiative [here](landing page) # Report -Check out the IFRS 17 reports [here](./Report/Reports) +Check out the IFRS 17 reports computed for our use-cases [here](./Report/Reports) # Testing @@ -27,9 +30,7 @@ If you want a step by step guide into the calculation logic, please go to the "S # Got Questions -For support around the IFRS17 CalculationEngine you can personally reach out to one of our IFRS17 experts: -- [Dr. Andrea Muolo]() -- [Dr. Davide Colleoni](https://www.linkedin.com/in/davidecolleoni/) -- [Mrs. Sara Busato]() +For support around the IFRS 17 CalculationEngine get in contact with our Community: -If you are interested in adapting the IFRS17 CalculationEngine to your data and would like to start a collaboration with us, you can contact [Wolfgang Maehr]() \ No newline at end of file +- [Community]() -link to the community page- +- [Evangelists]() -link to Evangelists page- \ No newline at end of file diff --git a/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb index 3cfaff8e..8be275bc 100644 --- a/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb +++ b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb @@ -218,7 +218,7 @@ { "cell_type": "markdown", "source": [ - "The Fulfillment Cashflow (FCF) corresponds to the sum of the Best Estimate [Present Value](../Import/ImportScopeCalculation#current-and-locked) (PV) and the [Risk Adjustment](../Import/ImportScopeCalculation#risk-adjustment) (RA), both summed over Amounty Types, and both discounted with the Locked-In curve in the BBA valuation approach:", + "The Fulfillment Cashflow (FCF) corresponds to the sum of the Best Estimate [Present Value](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#current-and-locked) (PV) and the [Risk Adjustment](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#risk-adjustment) (RA), both summed over Amounty Types, and both discounted with the Locked-In curve in the BBA valuation approach:", "\n", "\n$$", "\n\\text{FCF}(\\text{AoC}) = \\text{PV Locked}(\\text{AoC})", @@ -1136,7 +1136,7 @@ "source": [ "Based on the results calculated in Section 3, we check here the consistency of the [Financial Performance Report](#report). ", "\n", - "\nFiner granular reconciliations can be performed by following the datails of how each report contributes to the Financial Performance Report. Please, refer to the [Report documentation](../Report/ReportScopes#financial-performance) for all the details. " + "\nFiner granular reconciliations can be performed by following the datails of how each report contributes to the Financial Performance Report. Please, refer to the [Report documentation](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#financial-performance) for all the details. " ] }, { diff --git a/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb b/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb index 7785ed4a..8993aa5c 100644 --- a/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb +++ b/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb @@ -84,7 +84,7 @@ { "cell_type": "markdown", "source": [ - "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + "[Setup IFRS17 Calculation Engine](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation):" ] }, { @@ -155,7 +155,7 @@ "\n3. Amortization (AM) ", "\n4. End of Period (EOP) ", "\n", - "\nWe consider 4 types of Actual values, which are distinguished through their [Estimate Type](../DataModel/DataStructure#estimate-type):", + "\nWe consider 4 types of Actual values, which are distinguished through their [Estimate Type](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#estimate-type):", "\n- Actuals (A)", "\n- Advance Actuals (AA)", "\n- Overdue Actuals (OA)", diff --git a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb index 4be8de77..5034a6ac 100644 --- a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb +++ b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb @@ -91,7 +91,7 @@ { "cell_type": "markdown", "source": [ - "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + "[Setup IFRS17 Calculation Engine](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation):" ] }, { @@ -160,7 +160,7 @@ { "cell_type": "markdown", "source": [ - "Here the correct Yield Curve is chosen among those imported from Initialization/Systemorph/Data.csv according to the [current period](#year-and-period) and the Aoc Step according the [Aoc Configuration](../DataModel/DataStructure#aoc-configuration). In the following we retrieve the desired identity." + "Here the correct Yield Curve is chosen among those imported from Initialization/Systemorph/Data.csv according to the [current period](#year-and-period) and the Aoc Step according the [Aoc Configuration](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-configuration). In the following we retrieve the desired identity." ] }, { @@ -603,7 +603,7 @@ "\n\\text{CDC}_t^{\\text{Amount Type}=\\text{CDR}} = \\sum_{\\tau=t} \\big( \\text{Valid Discount}_{\\frac{t}{12}} \\big)^{\\tau-t+1} \\cdot \\text{Nominal}_\\tau^{\\text{Claim}} \\cdot \\big( e^{-\\gamma(\\tau-t)} -1 \\big)", "\n$$", "\n", - "\nwhere $\\gamma$ is the assumed non-performance probability of the reinsurer to be provided as an [input parameter](../DataModel/DataStructure#credit-default-rate).", + "\nwhere $\\gamma$ is the assumed non-performance probability of the reinsurer to be provided as an [input parameter](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#credit-default-rate).", "\n", "\nThis rate is constant for the whole projection period, that is, $\\gamma$ is not a function of $t$. ", "\nIt effectively amounts to a constant increase in the continuous discount rate by $\\gamma$. " @@ -716,7 +716,7 @@ { "cell_type": "markdown", "source": [ - "Secondly, the correct credit risk rate (parameter $\\gamma$ in the [formula above](#non-performance-risk-adjustment)) is retrieved from the list of imported [Partner Rating](../DataModel/DataStructure) and [Credit Default Rates](../DataModel/DataStructure) relative to the target [Data Node](#year-and-period)'s Partner" + "Secondly, the correct credit risk rate (parameter $\\gamma$ in the [formula above](#non-performance-risk-adjustment)) is retrieved from the list of imported [Partner Rating](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure) and [Credit Default Rates](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure) relative to the target [Data Node](#year-and-period)'s Partner" ] }, { @@ -780,7 +780,7 @@ { "cell_type": "markdown", "source": [ - "For an implementation of these formulas refer to the [ImportScopeCalculation notebook](../Import/ImportScopeCalculation). " + "For an implementation of these formulas refer to the [ImportScopeCalculation notebook](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation). " ] }, { @@ -804,7 +804,7 @@ { "cell_type": "markdown", "source": [ - "The Present Value Base (PVB) values are valid for all [Economic Basis](../DataModel/DataStructure#economic-basis) and depends on the corresponding [AoCType](../DataModel/DataStructure#aoc-type):", + "The Present Value Base (PVB) values are valid for all [Economic Basis](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#economic-basis) and depends on the corresponding [AoCType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-type):", "\n", "\n$$", "\n\\text{PVB}_t \\big(\\text{AoC}\\big) = ", diff --git a/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb b/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb index 26e2d8f3..43191eec 100644 --- a/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb +++ b/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb @@ -83,7 +83,7 @@ { "cell_type": "markdown", "source": [ - "[Setup IFRS17 Calculation Engine](../Import/ImportScopeCalculation):" + "[Setup IFRS17 Calculation Engine](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation):" ] }, { @@ -189,7 +189,7 @@ "cell_type": "markdown", "source": [ "Projected Present Values (PPVs) are calculated for each Amount Type (AT) either with the *locked-in* (L) and with the *current* (C) Yield Curves. While the former is the latest available as per end of the DataNode's inception year, the latter is the latest available as per the current period. ", - "\nPPVs for both Economic Basis L and C have been defined [here](../Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", + "\nPPVs for both Economic Basis L and C have been defined [here](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", "\n", "\nAccording to the BBA methodology, the CSM calculation uses the PV with locked-in Yield Curve simply defined as", "\n", @@ -228,7 +228,7 @@ { "cell_type": "markdown", "source": [ - "Aggregated values are also available as the sum over all [Amount Types](../DataModel/DataStructure#amount-type):", + "Aggregated values are also available as the sum over all [Amount Types](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type):", "\n", "\n$$", "\n\\text{PV Locked Value}(\\text{AoC}) = \\sum_{\\text{AT}} \\text{PV Locked}(\\text{AoC}, \\text{AT})", @@ -270,7 +270,7 @@ { "cell_type": "markdown", "source": [ - "The CSM calculation also uses locked-in Risk Adjustment (RA Locked) which is retrieved from the corresponding Present Value with [Calculation Type](../DataModel/DataStructure#calculation-type) being RA defined [here](../Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", + "The CSM calculation also uses locked-in Risk Adjustment (RA Locked) which is retrieved from the corresponding Present Value with [Calculation Type](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#calculation-type) being RA defined [here](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", "\n", "\nRisk Adjustment values can be written as", "\n", @@ -278,7 +278,7 @@ "\n\\text{RA Locked Value}(\\text{AoC}) = \\text{PV}(\\text{AoC})|_{\\substack{ \\text{Calculation Type = RA} \\\\ \\text{Economic Base = L} }}", "\n$$", "\n", - "\nwhere the imported Cashflows for the RA Calculation Type are already aggregated over all [Amount Types](../DataModel/DataStructure#amount-type)." + "\nwhere the imported Cashflows for the RA Calculation Type are already aggregated over all [Amount Types](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type)." ] }, { @@ -376,7 +376,7 @@ "\n\\right.", "\n$$", "\n", - "\nwhere AMF is the Amortization Factor that is defined [here](../Import/ImportScopeCalculation#amortization-factor) and tested [here](SpecificationsImportCashflows#amortization-factor), with YC being the [Yield Curve](#yield-curves) and TS is the Time-Step, ", + "\nwhere AMF is the Amortization Factor that is defined [here](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#amortization-factor) and tested [here](SpecificationsImportCashflows#amortization-factor), with YC being the [Yield Curve](#yield-curves) and TS is the Time-Step, ", "\nand the Premiums, Attributable Expense and Commissions and Investment Claims terms are given by:", "\n", "\n$$", @@ -392,7 +392,7 @@ "\n\\end{array}", "\n$$", "\n", - "\nThe AoC Type **CF** is implicit for all formulas, PV is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **OA** and **AA** (see details [here](../Import/ImportScopeCalculation#actual-base))." + "\nThe AoC Type **CF** is implicit for all formulas, PV is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **OA** and **AA** (see details [here](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#actual-base))." ] }, { diff --git a/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb index 423a41b4..8c67e92e 100644 --- a/ifrs17/Constants/Consts.ipynb +++ b/ifrs17/Constants/Consts.ipynb @@ -141,6 +141,7 @@ "\n public const string DataNodeParameter = nameof(DataNodeParameter);", "\n public const string SimpleValue = nameof(SimpleValue);", "\n public const string Opening = nameof(Opening);", + "\n public const string AocConfiguration = nameof(AocConfiguration);", "\n}" ] }, diff --git a/ifrs17/Import/ImportScopeCalculation.ipynb b/ifrs17/Import/ImportScopeCalculation.ipynb index ee63b100..c5709d0a 100644 --- a/ifrs17/Import/ImportScopeCalculation.ipynb +++ b/ifrs17/Import/ImportScopeCalculation.ipynb @@ -21,9 +21,13 @@ "cell_type": "markdown", "source": [ "", - "\n

Import Scopes (IFRS17 Methodology Business Logic)

", - "\n", - "\nThis notebook contains the logic used to perform calculations upon import of data (actuals and cashflows). This is also called 'Data Loading' and the concept of Scope is used here to define the logic and provide the means of executing the logic." + "\n

Import Scopes (IFRS17 Methodology Business Logic)

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This notebook contains the logic used to perform calculations upon import of data (actuals and cashflows). This is also called 'Data Loading' and the concept of Scope is used here to define the logic and provide the means of executing the logic." ] }, { @@ -378,9 +382,7 @@ { "cell_type": "markdown", "source": [ - "The exact structure being return depends on the **order** of the AoC Steps (which is set by the [AoC Type](../DataModel/DataStructure#aoc-type)), and on which AoC steps exist.", - "\n", - "\nFor an example of the usage of the AocStep scope see [here](../Test/AocStructureTest)." + "The exact structure being return depends on the **order** of the AoC Steps (which is set by the [AoC Type](../DataModel/DataStructure#aoc-type)), and on which AoC steps exist." ] }, { @@ -443,12 +445,6 @@ "\n}" ] }, - { - "cell_type": "markdown", - "source": [ - "For an example of these calculations see [here](../Test/SpecificationsImportCashflows#interest-and-discount-rates)." - ] - }, { "cell_type": "markdown", "source": [ @@ -505,12 +501,6 @@ "For a given month $i$ they are denoted as $\\rm{Nominal}_i$." ] }, - { - "cell_type": "markdown", - "source": [ - "For an example of nominal cashflow values see [here](../Test/SpecificationsImportCashflows#nominal-cashflow)." - ] - }, { "cell_type": "markdown", "source": [ @@ -574,12 +564,6 @@ "\n}" ] }, - { - "cell_type": "markdown", - "source": [ - "For example calculations for Cumulated Discounted Cashflows see [here](../Test/SpecificationsImportCashflows#cumulated-discounted-cashflow)." - ] - }, { "cell_type": "markdown", "source": [ @@ -620,12 +604,6 @@ "\n}" ] }, - { - "cell_type": "markdown", - "source": [ - "Examples of Telescoping Difference calculations for different AoC steps start [here](../Test/SpecificationsImportCashflows#modelcorrections)." - ] - }, { "cell_type": "markdown", "source": [ @@ -672,12 +650,6 @@ "\n}" ] }, - { - "cell_type": "markdown", - "source": [ - "An example of Projected Present Value calculations can be found [here](../Test/SpecificationsImportCashflows#present-value)." - ] - }, { "cell_type": "markdown", "source": [ @@ -750,12 +722,6 @@ "\n}" ] }, - { - "cell_type": "markdown", - "source": [ - "An example of the Interest Accretion calculations can be found [here](../Test/SpecificationsImportCashflows#interest-accretion)." - ] - }, { "cell_type": "markdown", "source": [ @@ -841,12 +807,6 @@ "\n}" ] }, - { - "cell_type": "markdown", - "source": [ - "An example of the Present Value Base calculations can be found [here](../Test/SpecificationsImportCashflows#present-value)." - ] - }, { "cell_type": "markdown", "source": [ @@ -926,7 +886,7 @@ "", "\n## Risk Adjustment", "\n", - "\nRisk Adjustment values ($\\rm{RA}$) are accessible from the [PV Base](#present-value-base) data and have [Calculation Type](../DataModel/DataStructure#calculation-type) $RA$. In particular, the Locked-In and Current values are given by:", + "\nRisk Adjustment values ($\\rm{RA}$) are accessible from the [PresentValue](#present-value-base) data and have [Estimate Type](../DataModel/DataStructure#estimate-type) $RA$. In particular, the Locked-In and Current values are given by:", "\n", "\n$$", "\n\\text{RA Locked}(\\text{AoC step}) = \\text{PV}(\\text{AoC step})|_{\\text{Calculation Type = RA},~ \\text{Economic Basis = L}}", @@ -990,7 +950,7 @@ "\nThe coverage unit (CU) of a GIC is introduced in the standard as the quantity of the service provided in that GIC. The service is", "\nmeasured by considering the quantity of benefits provided as well as the expected coverage period of the GIC.", "\n", - "\nThe cashflows of coverage units are retrieved from the discounted cashflows with [Calculation Type](../DataModel/DataStructure#calculation-type) CU." + "\nThe cashflows of coverage units are retrieved from the discounted cashflows with [EstimateType](../DataModel/DataStructure#estimate-type) CU." ] }, { @@ -1165,12 +1125,6 @@ "\n}" ] }, - { - "cell_type": "markdown", - "source": [ - "An example of Actual Base figures can be found [here](../Test/SpecificationsImportActuals#base-actual)." - ] - }, { "cell_type": "markdown", "source": [ @@ -1207,7 +1161,7 @@ "", "\n### Advance Actuals", "\n", - "\n**Advance Actuals** are those cashflows with due date inside the reporting period but which occured *before* the reporting period - They include:", + "\nAdvance Actuals are cash flows with due date inside the reporting period but occured *before* the reporting period - They include:", "\n- Receivable Claims", "\n- Receivable Expenses", "\n- Payable Premiums", @@ -1242,7 +1196,7 @@ "", "\n### Overdue Actuals", "\n", - "\n**Overdue Actuals** are those cashflows with due date inside the reporting period but which occur *after* the reporting period - They contain:", + "\nOverdue Actuals are cash flows with due date inside the reporting period but occur *after* the reporting period - They contain:", "\n- Payable Claims", "\n- Payable Expenses", "\n- Receivable Premiums", @@ -1341,12 +1295,6 @@ "\n}" ] }, - { - "cell_type": "markdown", - "source": [ - "An example of Deferrable Actual figures can be found [here](../Test/SpecificationsImportActuals#deferrable-actual)." - ] - }, { "cell_type": "markdown", "source": [ @@ -1480,7 +1428,7 @@ "\n\\big(PV_{\\text{Novelty = I}} + PV_{\\text{Novelty = N}} \\big) - \\big( \\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}}+ \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~,", "\n$$", "\n", - "\nwhere the AoC Step **CF** is implicit for all formulas, $PV$ is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **AA**, and **OA** (see details [here](#actual-values))." + "\nwhere the AoC Step **CF** is implicit for all formulas, $PV$ is the [present value](#present-value) with Estimate Type **BE**, and Actuals have Estimate Types **A**, **AA**, and **OA** (see details [here](#actual-values))." ] }, { diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index f2963181..cd3fe8a0 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -347,7 +347,7 @@ { "cell_type": "code", "source": [ - "Import.DefineFormat(\"AocConfiguration\", async (options, dataSet) => {", + "Import.DefineFormat(ImportFormats.AocConfiguration, async (options, dataSet) => {", "\n Activity.Start();", "\n var workspace = Workspace.CreateNew();", "\n workspace.InitializeFrom(options.TargetDataSource);", diff --git a/ifrs17/OverviewCalculationEngine.ipynb b/ifrs17/OverviewCalculationEngine.ipynb index 108756ef..3045ed95 100644 --- a/ifrs17/OverviewCalculationEngine.ipynb +++ b/ifrs17/OverviewCalculationEngine.ipynb @@ -104,9 +104,7 @@ "\n", "\nHowever, the import as such is conducted by other notebooks which use the methods of ImportStorage and ImportScopeCalculation in a chain of notebook imports:", "\n", - "\nImportStorage --> ImportScopeCalculation --> [Importers](./Import/Importers#importers) --> [InitSystemorphBaseToMemory](./Initialization/InitSystemorphBaseToMemory#init-base-to-memory) --> [InitSystemorphToMemory](./Initialization/InitSystemorphToMemory#init-base-to-memory).", - "\n", - "\nThe latter two notebooks initialize and store the imported and derived data in memory for further usage. To store the data in a physical database, [InitSystemorphToDatabase](./Initialization/InitSystemorphToDatabase#init-to-database) can be employed.", + "\nImportStorage --> ImportScopeCalculation --> [Importers](./Import/Importers#importers) ", "\n", "\nThe calculations of ImportScopeCalculation cover a large part of the IFRS 17 methodology and are explained in the section below." ] diff --git a/ifrs17/README.md b/ifrs17/README.md index 4447c0c3..9891b004 100644 --- a/ifrs17/README.md +++ b/ifrs17/README.md @@ -23,9 +23,7 @@ You will be introduced to ## Got Questions -For support around the IFRS17 CalculationEngine you can personally reach out to one of our IFRS17 experts: -- [Dr. Andrea Muolo]() -- [Dr. Davide Colleoni](https://www.linkedin.com/in/davidecolleoni/) -- [Mrs. Sara Busato]() +For support around the IFRS 17 CalculationEngine get in contact with our Community: -If you are interested in adapting the IFRS17 CalculationEngine to your data and would like to start a collaboration with us, you can contact [Wolfgang Maehr]() \ No newline at end of file +- [Community]() -link to the community page- +- [Evangelists]() -link to Evangelists page- \ No newline at end of file diff --git a/ifrs17/Report/Reports.ipynb b/ifrs17/Report/Reports.ipynb deleted file mode 100644 index 91d3d680..00000000 --- a/ifrs17/Report/Reports.ipynb +++ /dev/null @@ -1,410 +0,0 @@ -{ - "metadata": { - "authors": [], - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "

Reports

", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Infrastructure and Configuration" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Initialize data" - ] - }, - { - "cell_type": "code", - "source": [ - "/* DataSource is configured and connected to real database */", - "\n//#!eval-notebook \"../Database/Configure\"" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] - }, - { - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Imports and Configurations" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"ReportScopes\"" - ] - }, - { - "cell_type": "code", - "source": [ - "var reportStorage = new ReportStorage(Workspace, Report);", - "\nawait reportStorage.InitializeReportIndependentCacheAsync();", - "\nvar mostRecentPartition = (await Workspace.Query().Where(x => x.Scenario == null).OrderBy(x => x.Year).ThenBy(x => x.Month).ToArrayAsync()).Last();", - "\nvar reportingNodeRoot = (await Workspace.Query().Where(x => x.Parent == null).ToArrayAsync()).First().SystemName;", - "\nawait reportStorage.InitializeAsync((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);", - "\nvar identities = reportStorage.GetIdentities((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Calling Scope" - ] - }, - { - "cell_type": "code", - "source": [ - "var universe = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Report Settings and Storage Update" - ] - }, - { - "cell_type": "code", - "source": [ - "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args =", - "\n //((2020, 12), reportingNodeRoot, null,CurrencyType.Contractual)", - "\n ((2021, 3), reportingNodeRoot, null,CurrencyType.Contractual)", - "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Functional)", - "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Group)", - "\n ;", - "\n", - "\nawait reportStorage.InitializeAsync(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);", - "\nidentities = reportStorage.GetIdentities(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Data Constellation", - "\n", - "\nWe have " - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Present Value", - "\n", - "\nPresent values of the best estimate of future cashflows are shown here in an Analysis of Change report.", - "\n", - "\nThe report view can be modified with the Slice options for the columns by changing the SliceColumnBy inputs in the next command cell.", - "\nThe figures displayed in the report are automatically aggregated to meet the granularity desired by the user.", - "\n", - "\nCurrently, the data is sliced by :", - "\n- CurrencyType", - "\n- LiabilityType", - "\n- EconomicBasis", - "\n", - "\nFor example one can add \"GroupOfContract\" to separate the contributions of the individual Group of Contracts.", - "\n
We suggest to add this slice between the \"LiabilityType\" and the \"EconomicBasis\" as the the order of the inputs corresponds to the order of the columns shown in the report to expand the data." - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedBestEstimate + universe.GetScopes(identities).Aggregate().CurrentBestEstimate)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\", \"EconomicBasis\") //\"GroupOfContract\"", - "\n .ReportGridOptions()", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Risk Adjustment" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedRiskAdjustment + universe.GetScopes(identities).Aggregate().CurrentRiskAdjustment)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"EconomicBasis\", \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Actuals" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Written", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"AmountType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 450)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Advance, Overdue Actuals" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Advance + universe.GetScopes(identities).Aggregate().Overdue)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EstimateType\")", - "\n .ReportGridOptions(reportHeight: 400)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Deferrable Actuals" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Deferrals", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 400)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Fulfilment Cashflow" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Fcf ", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")//, \"EstimateType\")//, \"AmountType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Actuarial Experience Adjustment" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().ActuarialExperienceAdjustment", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"EstimateType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"AmountType\" )//\"LiabilityType\", \"EstimateType\")", - "\n .ReportGridOptions(reportHeight: 300, headerColumnWidth: 300)", - "\n .ToReport() " - ] - }, - { - "cell_type": "markdown", - "source": [ - "# LRC Technical Margin" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().LrcTechnicalMargin", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 600)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Contractual Service Margin / Loss Component / Loss Recovery Component" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Csm + universe.GetScopes(identities).Aggregate().Lc + universe.GetScopes(identities).Aggregate().Loreco)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"EstimateType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# LRC Actuarial" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LrcActuarial)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"LiabilityType\",\"GroupOfContract\",*/ \"EstimateType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# LRC" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lrc)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType),\"GroupOfContract\", \"EstimateType\")", - "\n .ReportGridOptions(300)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# LIC Actuarial" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LicActuarial)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# LIC" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lic)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", - "\n .ReportGridOptions(300)", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Financial Performance", - "\n", - "\nUse the expand and collapse buttons in the report rows to change the granularity of the figures displayed." - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().FinancialPerformance", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", - "\n .ToReport()" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file From 8ec67f602f740348185e9c82f1ee40301b609204 Mon Sep 17 00:00:00 2001 From: Daniel Trzesniak Date: Mon, 24 Oct 2022 10:08:30 +0200 Subject: [PATCH 14/43] Simple value test data (#54) * Adding data files * Fix input * Fix input * change to importers test * Fix to sign * Int convention --- .../DataNodeStates_CH_2020_12.csv | 1 + .../Files/700.DataNodes/DataNodes_CH.csv | 12 ++--- .../SimpleValue_CH_2020_12.csv | 44 +++++++++++++++++++ .../InitSystemorphToMemory.ipynb | 6 +++ ifrs17/Import/Importers.ipynb | 22 ++++++---- 5 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 full-ifrs17-template/Files/900.TransactionalData/SimpleValue_CH_2020_12.csv diff --git a/full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv b/full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv index 78802935..14a81d65 100644 --- a/full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv +++ b/full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv @@ -13,6 +13,7 @@ DT2.1,Active, DT2.2,Active, DT3.1,Active, DT4.1,Active, +DT5.1,Active, DTR1.1,Active, DTR1.2,Active, DTR2.1,Active, diff --git a/full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv b/full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv index 54f5657f..8862c011 100644 --- a/full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv +++ b/full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv @@ -1,15 +1,16 @@ @@Main,,,,,, ReportingNode,,,,,, CH,,,,,, -,,,,,, + @@InsurancePortfolio,,,,,, SystemName,DisplayName,ContractualCurrency,LineOfBusiness,ValuationApproach,OciType, -DT,DT complex CF,USD,ANN,BBA,Default, +DT,DT Complex CF,USD,ANN,BBA,Default, DT1,DT1 OCI,USD,ANN,BBA,Default, DT2,DT2 NOCI,USD,ANN,BBA,, DT3,DT3 RunOff,USD,ANN,BBA,Default, DT4,DT4 OCI,USD,ANN,BBA,Default, -,,,,,, +DT5,DT5 Simple Import,USD,ANN,BBA,Default + @@GroupOfInsuranceContract,,,,,, SystemName,DisplayName,InsurancePortfolio,AnnualCohort,LiabilityType,Profitability, GicComplex,Gic test discounting,DT,2020,LRC,P, @@ -20,13 +21,14 @@ DT2.1,DT2.1 NOCI LRC PA 0.8,DT2,2020,LRC,P, DT2.2,DT2.2 NOCI LIC,DT2,2020,LIC,P, DT3.1,DT3.1 Runoff - PA 0.8,DT3,2020,LRC,P, DT4.1,DT4.1 CSM PA 0.8,DT4,2020,LRC,P, -,,,,,, +DT5.1,DT5.1 Simple Import on DT 4.1,DT5,2020,LRC,P, + @@ReinsurancePortfolio,,,,,, SystemName,DisplayName,ContractualCurrency,LineOfBusiness,ValuationApproach,OciType, DTR,DTR complex CF,USD,ANN,BBA,, DTR1,DTR1 OCI,USD,ANN,BBA,Default, DTR2,DTR2 NOCI,USD,ANN,BBA,, -,,,,,, + @@GroupOfReinsuranceContract,,,,,, SystemName,DisplayName,ReinsurancePortfolio,AnnualCohort,LiabilityType,Profitability,Partner GricComplex,Gric test for discounting,DTR,2020,LRC,P,PT1 diff --git a/full-ifrs17-template/Files/900.TransactionalData/SimpleValue_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/SimpleValue_CH_2020_12.csv new file mode 100644 index 00000000..4d80bce3 --- /dev/null +++ b/full-ifrs17-template/Files/900.TransactionalData/SimpleValue_CH_2020_12.csv @@ -0,0 +1,44 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@SimpleValue +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,BOP,DT5.1,L,BE,N,-798.536731161375 +,NIC,BOP,DT5.1,L,BE,N,598.7529445986629 +,PR,BOP,DT5.1,C,BE,N,-798.536731161375 +,NIC,BOP,DT5.1,C,BE,N,598.7529445986629 +,,BOP,DT5.1,C,RA,N,59.8752944598663 +,,BOP,DT5.1,L,RA,N,59.8752944598663 +,,AM,DT5.1,L,F,C,0.6562298579039588 +,PR,EOP,DT5.1,L,BE,C,-399.63392949885525 +,NIC,EOP,DT5.1,L,BE,C,299.67554969423594 +,PR,EOP,DT5.1,C,BE,C,-399.63392949885525 +,NIC,EOP,DT5.1,C,BE,C,299.67554969423594 +,,EOP,DT5.1,C,RA,C,29.967554969423595 +,,EOP,DT5.1,L,RA,C,29.967554969423595 +,PR,IA,DT5.1,L,BE,N,-1.0971983374806105 +,NIC,IA,DT5.1,L,BE,N,0.9226050955731167 +,PR,IA,DT5.1,C,BE,N,-1.0971983374806105 +,NIC,IA,DT5.1,C,BE,N,0.9226050955731167 +,,IA,DT5.1,C,RA,N,0.09226050955731169 +,,IA,DT5.1,L,RA,N,0.09226050955731169 +,PR,CF,DT5.1,L,BE,N,400 +,NIC,CF,DT5.1,L,BE,N,-300 +,PR,CF,DT5.1,C,BE,N,400 +,NIC,CF,DT5.1,C,BE,N,-300 +,,CF,DT5.1,C,RA,N,-30 +,,CF,DT5.1,L,RA,N,-30 +,PR,CF,DT5.1,L,BEPA,N,320 +,PR,CF,DT5.1,,A,C,400 +,NIC,CF,DT5.1,,A,C,-280 +,ACA,CF,DT5.1,,A,C,-10 +,AEA,CF,DT5.1,,A,C,-5 +,PR,CF,DT5.1,,APA,C,320 +,,CF,DT5.1,,DA,C,-15 +,,EA,DT5.1,,C,C,-15 +,,AM,DT5.1,,DA,C,9.843447868559382 +,,AM,DT5.1,,C,C,-82.02271122089925 +,,EOP,DT5.1,,DA,C,-5.156552131440618 +,,EOP,DT5.1,,C,C,42.9681136142967 +,,BOP,DT5.1,,C,N,139.90849210284577 +,,IA,DT5.1,,C,N,0.08233273235018213 \ No newline at end of file diff --git a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb index 884cc8fd..af8c5cf1 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -79,6 +79,12 @@ "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\")" ] }, + { + "cell_type": "code", + "source": [ + "await UploadSimpleValueAsync(\"../Files/900.TransactionalData/SimpleValue_CH_2020_12.csv\")" + ] + }, { "cell_type": "markdown", "source": [ diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index cd3fe8a0..0a85ee43 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -1065,21 +1065,25 @@ "\n EstimateType = estimateType,", "\n EconomicBasis = economicBasis,", "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", - "\n Value = GetSign((aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), parsingStorage.HierarchyCache)", + "\n Value = //GetSign((aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), parsingStorage.HierarchyCache)", + "\n 1 // TODO, we need to adjust the inputs to have the correct sign, so that the default GetSign returns 1.", "\n * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()", "\n };", "\n return iv;", - "\n }, importFormat", + "\n }, importFormat // This should indicate the table name, not the input format", "\n ).WithTarget(Workspace).ExecuteAsync();", "\n ", - "\n HashSet availableEstimateTypes = parsingStorage.TechnicalMarginEstimateTypes;", - "\n var multipleOp = await Workspace.Query().Where(iv => availableEstimateTypes.Contains(iv.EstimateType))", - "\n .GroupBy(iv => iv.DataNode)", - "\n .Where(g => g.Count() > 1).ToArrayAsync();", - "\n //.Select(g => ApplicationMessage.Log(Error.MultipleTechnicalMarginOpening, g.Key));", + "\n // Checking if there are inconsistencies in the TechnicalMarginEstimateTypes --> double entries in the steps where we expect to have unique values", + "\n var invalidVariables = await Workspace.Query()", + "\n .Where(iv => parsingStorage.TechnicalMarginEstimateTypes.Contains(iv.EstimateType))", + "\n .Where(iv => iv.AocType == AocTypes.BOP || iv.AocType == AocTypes.EOP || iv.AocType == AocTypes.AM || iv.AocType == AocTypes.EA)", + "\n .GroupBy(iv => new {iv.DataNode, iv.AocType, iv.Novelty})", + "\n .Where(g => g.Count() > 1)", + "\n .Select(g => g.Key)", + "\n .ToArrayAsync();", "\n ", - "\n foreach (var op in multipleOp)", - "\n ApplicationMessage.Log(Error.MultipleTechnicalMarginOpening, op.Key);", + "\n foreach (var iv in invalidVariables)", + "\n ApplicationMessage.Log(Error.MultipleTechnicalMarginOpening, $\"{iv.DataNode},{iv.AocType},{iv.Novelty}\");", "\n ", "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", "\n targetPartitionByReportingNodeAndPeriodId = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id;", From f7eb0c68585fef35f4ae91228109651c8bbd9a83 Mon Sep 17 00:00:00 2001 From: UMueller1 <108468853+UMueller1@users.noreply.github.com> Date: Wed, 26 Oct 2022 09:05:36 +0200 Subject: [PATCH 15/43] Overview texts (#53) * Overview (Template), revised text * Reports of template with small adjustments * Overview IFRS17, some adjustments --- .../OverviewIFRS17Template.ipynb | 19 ++++++++++++++----- full-ifrs17-template/Report/Reports.ipynb | 14 ++++++++++---- ifrs17/OverviewCalculationEngine.ipynb | 14 ++++++++------ 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/full-ifrs17-template/OverviewIFRS17Template.ipynb b/full-ifrs17-template/OverviewIFRS17Template.ipynb index 7145abb7..026e24e4 100644 --- a/full-ifrs17-template/OverviewIFRS17Template.ipynb +++ b/full-ifrs17-template/OverviewIFRS17Template.ipynb @@ -28,7 +28,9 @@ "source": [ "# Introduction", "\n", - "\nThe Systemorph's IFRS 17 Calculation Engine is a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts, for a **groups of insurance contracts** and other relevant parameters (Yield Curve, Fx, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\nSystemorph's IFRS 17 Calculation Engine is a tool and a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts for **groups of insurance contracts** and other relevant parameters (Yield Curve, FX rates, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\n", + "\nSystemorph's Full IFRS 17 Template provides a complete example of input data and uses the Calculation Engine for the production of IFRS 17 results. Users can adapt this template to their own needs by changing the input data and calculating their own results.", "\n", "\nThis notebook provides an **overview** of Systemorph's Full IFRS 17 Template with brief introductions to all the main steps." ] @@ -41,6 +43,8 @@ "\n", "\nIFRS 17 is a new accounting standard for insurance contracts. The previous standard IFRS 4, which is based on nominal accounting, is replaced by the economic accounting standard IFRS 17.", "\n", + "\nExplanatory **videos** on **IFRS 17** and a **demo application** can be found on Systemorph's website. Some key points are repeated here briefly.", + "\n", "\nIFRS 17 deals with insurance contracts which are on the liability side of the balance sheet. Other accounting standards deal with other parts of the business, primarily IFRS 9 for invested assets.", "\n", "\nInsurance policies need to be allocated to homogeneous groups of insurance contracts (GICs) according to high-level principles established by the IFRS 17 standard, such as contract type, line of business, annual cohort etc. Insurers have some degree of freedom to optmize those GICs, as long as they respect the high-level principles.", @@ -60,8 +64,7 @@ "\n - Contractual Service Margin (CSM) and Loss Component (LC)", "\n - Liability for Remaining Coverage (LRC)", "\n - Liability for Incurred Claims (LIC)", - "\n - Financial Performance", - "\n - Accounting Events" + "\n - Financial Performance" ] }, { @@ -119,7 +122,7 @@ "\n", "\nThe structure of the [Actuals](./InputFormatDescription#actual), [Openings](./InputFormatDescription#opening) and [NominalCashflows](./InputFormatDescription#cashflow) files is explained in a special [notebook](./InputFormatDescription).", "\n", - "\nThe less usual option of having discounted instead of nominal cash flows in the input is also supported." + "\nThe less usual option of having discounted instead of nominal cash flows in the input is supported, but not a subject of this notebook in its current state." ] }, { @@ -128,7 +131,13 @@ "", "\n# Reports", "\n", - "\nThe production of reports is done by a notebook such as **[Reports](./Report/Reports#report-production)**." + "\nAll the reports are produced by running a notebook such as **[Reports](./Report/Reports#report-production)**. Some information on the reporting functionality can also be found there and in the final Reports section of [OverviewIFRS17](../IFRS17/OverviewIFRS17#reports)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "" ] } ] diff --git a/full-ifrs17-template/Report/Reports.ipynb b/full-ifrs17-template/Report/Reports.ipynb index 1dc742bd..4caa201d 100644 --- a/full-ifrs17-template/Report/Reports.ipynb +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -25,6 +25,12 @@ "\n" ] }, + { + "cell_type": "markdown", + "source": [ + "This is the notebook to be run for the production of all the reports." + ] + }, { "cell_type": "markdown", "source": [ @@ -110,8 +116,8 @@ "source": [ "# Use cases", "\n", - "\nFor demostration purposes we import data for 7 *Group of Insurance Contract* (GIC) and 4 *Group of Reinsurance Contract* (GRIC). ", - "\n
Data set consists in cashflows, actuals, and parameters.", + "\nFor demonstration purposes we import data for 7 *Group of Insurance Contract* (GIC) and 4 *Group of Reinsurance Contract* (GRIC). ", + "\n
The data set consists of cashflows, actuals, and parameters.", "\n", "\n" ] @@ -121,11 +127,11 @@ "source": [ "# Present Value", "\n", - "\nPresent values of the best estimate of future cashflows are shown here in an Analysis of Change report.", + "\nPresent values of the best-estimate future cashflows are shown here in an Analysis of Change report.", "\n", "\nThe report view can be modified with the Slice options for the columns by changing the SliceColumnBy inputs in the next command cell.", "\nFor example one can add \"GroupOfContract\" to separate the contributions of the individual Group of Contracts.", - "\n
We suggest to add this slice between the \"LiabilityType\" and the \"EconomicBasis\" as the the order of the inputs corresponds to the order of the columns shown in the report to expand the data.", + "\n
We suggest to add this slice between the \"LiabilityType\" and the \"EconomicBasis\" as the order of the inputs corresponds to the order of the columns shown in the report to expand the data.", "\n", "\nAggregated values are displayed when the data has a finer granularity than the one selected by the report slice options." ] diff --git a/ifrs17/OverviewCalculationEngine.ipynb b/ifrs17/OverviewCalculationEngine.ipynb index 3045ed95..866c5502 100644 --- a/ifrs17/OverviewCalculationEngine.ipynb +++ b/ifrs17/OverviewCalculationEngine.ipynb @@ -20,7 +20,7 @@ { "cell_type": "markdown", "source": [ - "

IFRS17 Calculation Engine - an Overview

" + "

IFRS 17 Calculation Engine - an Overview

" ] }, { @@ -28,7 +28,7 @@ "source": [ "# Introduction", "\n", - "\nThe Systemorph's IFRS 17 Calculation Engine is a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts, for a **groups of insurance contracts** and other relevant parameters (Yield Curve, Fx, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\nSystemorph's IFRS 17 Calculation Engine is a tool and a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts for **groups of insurance contracts** and other relevant parameters (Yield Curve, FX rates, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", "\n", "\nThis notebook provides an **overview** of Systemorph's IFRS 17 Calculation Engine with brief introductions to all the main steps.", "\n", @@ -76,7 +76,7 @@ "\n", "\nThe IFRS 17 calculations are based on a well-defined **data model**. The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model.", "\n", - "\nThe IFRS 17 calculations start by importing data input files, and the more complex logic of the IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." + "\nThe IFRS 17 calculations start by importing data input files, and the more complex IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." ] }, { @@ -91,7 +91,7 @@ "\n", "\nThe [input files](#data-input-dim-nodes) ReportingNodes and especially DimensionsAndPartitions provide an overview of data structures actually used. Some dimensions are hierarchical, so some entries have parent entries.", "\n", - "\nMany abbreviations and acronyms used later in the documentation and the code are the **system names**, where the corresponding display names can be found together with the attributes." + "\nMany abbreviations and acronyms used later in the documentation and the code are the **system names**, where the corresponding display names can be found in the corresponding input files together with the attributes." ] }, { @@ -104,7 +104,9 @@ "\n", "\nHowever, the import as such is conducted by other notebooks which use the methods of ImportStorage and ImportScopeCalculation in a chain of notebook imports:", "\n", - "\nImportStorage --> ImportScopeCalculation --> [Importers](./Import/Importers#importers) ", + "\nImportStorage --> ImportScopeCalculation --> [Importers](./Import/Importers#importers) --> [InitSystemorphBaseToMemory](./Initialization/InitSystemorphBaseToMemory#init-base-to-memory) --> [InitSystemorphToMemory](./Initialization/InitSystemorphToMemory#init-base-to-memory).", + "\n", + "\nThe latter two notebooks initialize and store the imported and derived data in memory for further usage. To store the data in a physical database, [InitSystemorphToDatabase](./Initialization/InitSystemorphToDatabase#init-to-database) can be employed.", "\n", "\nThe calculations of ImportScopeCalculation cover a large part of the IFRS 17 methodology and are explained in the section below." ] @@ -115,7 +117,7 @@ "", "\n# IFRS 17 Model Calculations", "\n", - "\nThe notebook **[ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation)** has all the calculations to be executed upon data import. The methods used are explained there with formulas. The centerpiece is the Analysis of Change (AoC) of the insurance business over one period (here: quarter). The formulas often use acronyms (system names) as explained in the [section](#data-input-dim-nodes) on *DimensionsAndPartitions*.", + "\nThe notebook **[ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation)** has all the calculations to be executed upon data import. The methods used are explained there with formulas. The centerpiece is the Analysis of Change (AoC) of the insurance business over one period (here: quarter). The formulas often use acronyms (system names) as listed in the input file *DimensionsAndPartitions*.", "\n", "\nThe main concepts and parts of ImportScopeCalculation are listed here, with links.", "\n- Structure and sequence of the **[Analysis of Change (AoC)](./Import/ImportScopeCalculation#aoc-step-structure)** steps for the given period", From 459b08829b89ca168570adc171ae3de913a8a339 Mon Sep 17 00:00:00 2001 From: amuolo Date: Thu, 27 Oct 2022 12:01:59 +0200 Subject: [PATCH 16/43] Merge pull request #55 from Systemorph/removalArithmetic removal arithmetics --- full-ifrs17-template/Constants/Consts.ipynb | 2 +- .../InitSystemorphToMemory.ipynb | 2 +- .../Test/IfrsVariablesTest.ipynb | 37 +++++++------------ .../Test/MapTemplateAndImportTest.ipynb | 6 +-- .../SpecificationsFinancialPerformance.ipynb | 13 ++----- .../Test/SpecificationsImportCashflows.ipynb | 20 +++++----- ifrs17/DataModel/DataStructure.ipynb | 21 ++++++----- ifrs17/Import/ImportScopeCalculation.ipynb | 21 ++++++----- ifrs17/Import/Importers.ipynb | 13 ++++--- .../Report/ReportConfigurationAndUtils.ipynb | 5 ++- ifrs17/Report/ReportScopes.ipynb | 15 ++++---- ifrs17/Report/ReportStorage.ipynb | 8 ++-- ifrs17/Utils/ApplicationMessage.ipynb | 13 ++++--- ifrs17/Utils/Extensions.ipynb | 18 ++++----- ifrs17/Utils/TestHelper.ipynb | 15 ++++---- 15 files changed, 99 insertions(+), 110 deletions(-) diff --git a/full-ifrs17-template/Constants/Consts.ipynb b/full-ifrs17-template/Constants/Consts.ipynb index f39ab144..1ef5ee81 100644 --- a/full-ifrs17-template/Constants/Consts.ipynb +++ b/full-ifrs17-template/Constants/Consts.ipynb @@ -25,4 +25,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb index af8c5cf1..c9eb277e 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -82,7 +82,7 @@ { "cell_type": "code", "source": [ - "await UploadSimpleValueAsync(\"../Files/900.TransactionalData/SimpleValue_CH_2020_12.csv\")" + "//await UploadSimpleValueAsync(\"../Files/900.TransactionalData/SimpleValue_CH_2020_12.csv\") TODO: missing benchmarks" ] }, { diff --git a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb index 98187848..50a59c01 100644 --- a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb +++ b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb @@ -142,21 +142,11 @@ "\n var expectedNotComputed = expected.Where(x => Math.Abs(x.Value) > BenchmarkPrecision).Select(x => x.ToIdentityString()).Except(computed.Select(x => x.ToIdentityString()));", "\n var computedNotExpected = computed.Where(x => Math.Abs(x.Value) > BenchmarkPrecision).Select(x => x.ToIdentityString()).Except(expected.Select(x => x.ToIdentityString()));", "\n if (expectedNotComputed.Any())", - "\n {", "\n foreach (var error in expectedNotComputed)", - "\n {", - "\n var message = error.ToIdentityString();", - "\n errors.Add(new BenchmarkTestResult(\"Extra expected variable for: \"+ message));", - "\n }", - "\n }", + "\n errors.Add(new BenchmarkTestResult(\"Extra expected variable for: \" + error));", "\n if (computedNotExpected.Any())", - "\n {", "\n foreach (var error in computedNotExpected)", - "\n {", - "\n var message = error.ToIdentityString();", - "\n errors.Add(new BenchmarkTestResult(\"Extra computed variable for: \"+ message));", - "\n }", - "\n }", + "\n errors.Add(new BenchmarkTestResult(\"Extra computed variable for: \" + error));", "\n ", "\n var misMatchedVariables = expected.Concat(computed).AggregateOver().Where(x => Math.Abs(x.Value) > BenchmarkPrecision);", "\n if (misMatchedVariables.Any())", @@ -211,13 +201,8 @@ { "cell_type": "code", "source": [ - "var errorList = new List();" - ] - }, - { - "cell_type": "code", - "source": [ - "foreach (var g in bmFiles.GroupBy(x => (ReportingNode: x.ReportingNode, Year: x.Year, Month: x.Month)))", + "var errorList = new List();", + "\nforeach (var g in bmFiles.GroupBy(x => (ReportingNode: x.ReportingNode, Year: x.Year, Month: x.Month)))", "\n{", "\n var reportingNode = g.Key.ReportingNode;", "\n var year = g.Key.Year;", @@ -244,13 +229,13 @@ "\n var mainTab = bmDataTable.Tables[Main].Rows.First();", "\n if(!ValidateMainTab(mainTab, reportingNode, year, month))", "\n throw new Exception(\"Metadata and main tab of the Benchmark are different.\");", - "\n ", + "\n", "\n var bmTableName = bmDataTable.Tables.Single(x => x.TableName != Main).TableName;", "\n var bmVariables = bmDataTable.Tables[bmTableName].Rows.Select(x => CreateVariable(x, partition));", - "\n ", + "\n", "\n //Get the computed Data", "\n var computedVariables = computedVariablesByEstimateType.TryGetValue(bmTableName, out var ret) ? ret : Enumerable.Empty();", - "\n ", + "\n", "\n if(!computedVariables.Any()) ", "\n errorList.Add(new BenchmarkTestResult(\"No variables are computed for EstimateType: \" + bmTableName, 0, 0));", "\n //CompareAgainstBm", @@ -264,7 +249,13 @@ { "cell_type": "code", "source": [ - "errorList.Count().Should().Be(0)" + "errorList.Count().Should().Be(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "errorList" ] }, { diff --git a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb index f82db019..e0b58e97 100644 --- a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb +++ b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb @@ -150,7 +150,7 @@ "\n// check that exporter generates only the desired columns ", "\nvar extension = \".xlsx\";", "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", - "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", + "\nvar tables = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet;", "\nvar mainCols = new[]{nameof(PartitionByReportingNode.ReportingNode)};", "\nvar portfolioCols = new[]{nameof(Portfolio.SystemName),nameof(Portfolio.DisplayName),nameof(Portfolio.ContractualCurrency),", "\n nameof(Portfolio.LineOfBusiness),nameof(Portfolio.OciType),nameof(Portfolio.ValuationApproach)};", @@ -236,7 +236,7 @@ "\n// check that exporter generates only the desired columns ", "\nvar extension = \".xlsx\";", "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", - "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", + "\nvar tables = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet;", "\nvar mainCols = new[]{nameof(PartitionByReportingNodeAndPeriod.ReportingNode),", "\n nameof(PartitionByReportingNodeAndPeriod.Year),", "\n nameof(PartitionByReportingNodeAndPeriod.Month)};", @@ -316,7 +316,7 @@ "\n// check that exporter generates only the desired columns ", "\nvar extension = \".xlsx\";", "\nvar stream = await Project.FileStorage.ReadAsync(filename + extension);", - "\nvar tables = await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync();", + "\nvar tables = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet;", "\nvar mainCols = new[]{nameof(PartitionByReportingNodeAndPeriod.ReportingNode),", "\n nameof(PartitionByReportingNodeAndPeriod.Year),", "\n nameof(PartitionByReportingNodeAndPeriod.Month),", diff --git a/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb index 8be275bc..7016fa12 100644 --- a/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb +++ b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb @@ -133,13 +133,8 @@ { "cell_type": "code", "source": [ - "var identities = reportStorage.GetIdentities(period, reportingNode, null, currencyType);" - ] - }, - { - "cell_type": "code", - "source": [ - "identities" + "var identities = reportStorage.GetIdentities(period, reportingNode, null, currencyType);", + "\nidentities" ] }, { @@ -197,8 +192,8 @@ "\n .WithQuerySource(DataSource)", "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", "\n .SliceColumnsBy(CurrencyGrouper(currencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", - "\n .ToReport() with { Height = 600 }" + "\n .WithGridOptions( o => o.WithDefaultColumn( c => c.WithWidth(260) ) with {GroupDefaultExpanded = 3, Height = 900, OnGridReady = null} )", + "\n .ToReport()" ] }, { diff --git a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb index 5034a6ac..12b9fc30 100644 --- a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb +++ b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb @@ -268,14 +268,14 @@ { "cell_type": "code", "source": [ - "var expectedInterest = yearlyYieldCurve.Select( yc => (1 + yc)^( 1.0 / 12.0) );", + "var expectedInterest = yearlyYieldCurve.Select( yc => Math.Pow(1 + yc, 1.0 / 12.0) );", "\nexpectedInterest" ] }, { "cell_type": "code", "source": [ - "from yc in yearlyYieldCurve select (1 + yc)^( 1.0 / 12.0 ) " + "from yc in yearlyYieldCurve select Math.Pow(1 + yc, 1.0 / 12.0)" ] }, { @@ -299,7 +299,7 @@ { "cell_type": "code", "source": [ - "var expectedDiscount = yearlyYieldCurve.Select( yc => (1 + yc)^( -1.0 / 12.0) );", + "var expectedDiscount = yearlyYieldCurve.Select( yc => Math.Pow(1 + yc, -1.0 / 12.0) );", "\nexpectedDiscount" ] }, @@ -710,7 +710,7 @@ { "cell_type": "code", "source": [ - "var nominalClaims = nominalICO.Values + nominalNIC.Values + nominalALE.Values + nominalULE.Values;" + "var nominalClaims = Sum( Sum(nominalICO.Values, nominalNIC.Values), Sum(nominalALE.Values, nominalULE.Values) );" ] }, { @@ -1015,7 +1015,7 @@ { "cell_type": "code", "source": [ - "var expectedPresentValueMC_PR = discountedMC_PR.Values - discountedBoP_PR.Values;" + "var expectedPresentValueMC_PR = Subtract(discountedMC_PR.Values, discountedBoP_PR.Values);" ] }, { @@ -1097,7 +1097,7 @@ { "cell_type": "code", "source": [ - "var expectedPresentValueCF_PR = -1.0 * cfNominalReference_PR.Values;" + "var expectedPresentValueCF_PR = Multiply(-1.0, cfNominalReference_PR.Values);" ] }, { @@ -1428,7 +1428,7 @@ { "cell_type": "code", "source": [ - "var expectedPresentValueYCU_PR = ycReferenceDiscountedEop - discountedYcParent.Values;" + "var expectedPresentValueYCU_PR = Subtract(ycReferenceDiscountedEop, discountedYcParent.Values);" ] }, { @@ -1579,7 +1579,7 @@ { "cell_type": "code", "source": [ - "var expectedPresentValueCRU = cruExpectedDiscountedCDR - discountedCruParent.Values;" + "var expectedPresentValueCRU = Subtract(cruExpectedDiscountedCDR, discountedCruParent.Values);" ] }, { @@ -1648,8 +1648,8 @@ { "cell_type": "code", "source": [ - "var expectedPresentValueCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null)).Values -", - "\n clParents.Select(aocStep => Test.GetScope((idCL with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, \"PR\", \"BE\", (int?)null)).Values).Aggregate();" + "var expectedPresentValueCL_PR = Subtract(Test.GetScope((idCL, \"PR\", \"BE\", (int?)null)).Values,", + "\n clParents.Select(aocStep => Test.GetScope((idCL with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, \"PR\", \"BE\", (int?)null)).Values).Aggregate());" ] }, { diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index f5fcf571..78851b13 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -43,16 +43,17 @@ { "cell_type": "code", "source": [ - "#r \"nuget:Systemorph.Workspace,1.4.1\"", - "\n#r \"nuget:Systemorph.Scopes,1.4.0\"", - "\n#r \"nuget:Systemorph.Import,1.4.0\"", - "\n#r \"nuget:Systemorph.Test,1.4.0\"", - "\n#r \"nuget:Systemorph.Export,1.4.0\"", - "\n#r \"nuget:Systemorph.DataSetReader,1.4.0\"", - "\n#r \"nuget:Systemorph.DataSource,1.4.1\"", - "\n#r \"nuget:Systemorph.DataSource.Conversions,1.4.1\"", - "\n#r \"nuget:Systemorph.Reporting,1.4.0\"", - "\n#r \"nuget:Systemorph.DomainDesigner,1.4.0\"" + "#r \"nuget:Systemorph.Arithmetics,1.5.4\"", + "\n#r \"nuget:Systemorph.Workspace,1.5.0\"", + "\n#r \"nuget:Systemorph.Scopes,1.5.2\"", + "\n#r \"nuget:Systemorph.Import,1.5.0\"", + "\n#r \"nuget:Systemorph.Test,1.5.2\"", + "\n#r \"nuget:Systemorph.Export,1.5.0\"", + "\n#r \"nuget:Systemorph.DataSetReader,1.5.0\"", + "\n#r \"nuget:Systemorph.DataSource,1.5.0\"", + "\n#r \"nuget:Systemorph.DataSource.Conversions,1.5.0\"", + "\n#r \"nuget:Systemorph.Reporting,1.5.2\"", + "\n#r \"nuget:Systemorph.DomainDesigner,1.5.0\"" ] }, { diff --git a/ifrs17/Import/ImportScopeCalculation.ipynb b/ifrs17/Import/ImportScopeCalculation.ipynb index c5709d0a..f172092b 100644 --- a/ifrs17/Import/ImportScopeCalculation.ipynb +++ b/ifrs17/Import/ImportScopeCalculation.ipynb @@ -441,7 +441,7 @@ "\n ", "\n double[] Interest => YearlyYieldCurve.Select(rate => Math.Pow(1d + rate, 1d / 12d) + Perturbation).ToArray(); ", "\n ", - "\n double[] Discount => Interest^(-1);", + "\n double[] Discount => Interest.Select(x => Math.Pow(x, -1)).ToArray();", "\n}" ] }, @@ -484,7 +484,7 @@ "\n ret[i] = Math.Exp(-nonPerformanceRiskRate) * ret.ElementAtOrDefault(i + 1) + NominalClaimsCashflow[i] - NominalClaimsCashflow.ElementAtOrDefault(i + 1);", "\n return ret; } } ", "\n ", - "\n double[] NominalCashflow.Values => PvCdrDecumulated - NominalClaimsCashflow;", + "\n double[] NominalCashflow.Values => Subtract(PvCdrDecumulated, NominalClaimsCashflow);", "\n}", "\n", "\npublic interface AllClaimsCashflow : NominalCashflow", @@ -600,7 +600,7 @@ "\n .Where(cf => cf.Count() > 0)", "\n .Aggregate();", "\n ", - "\n double[] Values => CurrentValues - PreviousValues;", + "\n double[] Values => Subtract(CurrentValues, PreviousValues);", "\n}" ] }, @@ -702,7 +702,7 @@ "\npublic interface IWithInterestAccretionForCreditRisk : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", "\n{", "\n private double[] nominalClaimsCashflow => GetScope(Identity).Values;", - "\n private double[] nominalValuesCreditRisk => -1 * GetScope(Identity with {Id = Identity.Id with {AocType = AocTypes.CF}}).Values;", + "\n private double[] nominalValuesCreditRisk => Multiply(-1, GetScope(Identity with {Id = Identity.Id with {AocType = AocTypes.CF}}).Values);", "\n private double[] monthlyInterestFactor => GetScope(Identity.Id).Interest;", "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", "\n ", @@ -717,7 +717,7 @@ "\n effectCreditRisk[i] = interestOnClaimsCashflow[i] - interestOnClaimsCashflowCreditRisk[i];", "\n }", "\n ", - "\n return effectCreditRisk - nominalValuesCreditRisk;", + "\n return Subtract(effectCreditRisk, nominalValuesCreditRisk);", "\n }", "\n}" ] @@ -785,7 +785,7 @@ "\npublic interface CashflowAocStep : PresentValue", "\n{", "\n [NotVisible]", - "\n double[] PresentValue.Values => -1d * GetScope(Identity).Values;", + "\n double[] PresentValue.Values => Multiply(-1d, GetScope(Identity).Values);", "\n}", "\n", "\npublic interface PresentValueWithInterestAccretion : PresentValue, IWithInterestAccretion", @@ -1337,7 +1337,9 @@ "\n string EstimateType => EstimateTypes.BEPA;", "\n string EconomicBasis => EconomicBases.L;", "\n ", - "\n PresentValue[] ByAmountType => GetStorage().GetPremiums().Select(pr => GetStorage().GetPremiumAllocationFactor(Identity) * GetScope((Identity, pr, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis))).ToArray(); ", + "\n PresentValue[] ByAmountType => GetStorage().GetPremiums().Select(pr => ", + "\n Multiply( GetStorage().GetPremiumAllocationFactor(Identity), ", + "\n GetScope((Identity, pr, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)) ) ).ToArray(); ", "\n}", "\n", "\npublic interface DefaultValueBeExperienceAdjustmentForPremium : BeExperienceAdjustmentForPremium", @@ -1356,9 +1358,8 @@ "\n .WithApplicability(x => x.Identity.AocType != AocTypes.CF));", "\n ", "\n public ActualBase[] ByAmountTypeAndEstimateType => GetStorage().GetPremiums().SelectMany(pr => ", - "\n GetStorage().ExperienceAdjustEstimateTypeMapping.Keys", - "\n .Select(et => GetStorage().GetPremiumAllocationFactor(Identity) * ", - "\n GetScope((Identity, pr, et, (int?)null)))).ToArray(); ", + "\n GetStorage().ExperienceAdjustEstimateTypeMapping.Keys.Select(et => ", + "\n Multiply(GetStorage().GetPremiumAllocationFactor(Identity), GetScope((Identity, pr, et, (int?)null))) ) ).ToArray();", "\n}", "\n", "\npublic interface DefaultValueActualExperienceAdjustmentForPremium : ActualExperienceAdjustmentForPremium", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index 0a85ee43..6be43097 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -356,11 +356,11 @@ "\n var aocTypesCompulsory = typeof(AocTypes).GetFields().Select(x => (string)x.Name);", "\n if(aocTypesCompulsory.Where(x => !aocTypes.Select(x => x.SystemName).Contains(x)).Any()) {", "\n ApplicationMessage.Log(Error.AocTypeCompulsoryNotFound);", - "\n return Activity.Finish().RepeatOnce();", + "\n return Activity.Finish();", "\n }", "\n ", "\n var logConfig = await Import.FromDataSet(dataSet).WithType().WithTarget(workspace).ExecuteAsync();", - "\n if(logConfig.Errors.Any()) return logConfig.RepeatOnce(); ", + "\n if(logConfig.Errors.Any()) return Activity.Finish().Merge(logConfig); ", "\n", "\n var orderByName = aocTypes.ToDictionary(x => x.SystemName, x => x.Order);", "\n var aocConfigs = (await workspace.Query().ToArrayAsync())", @@ -417,7 +417,7 @@ "\n ApplicationMessage.Log(Error.AocConfigurationOrderNotUnique);", "\n", "\n await workspace.CommitToTargetAsync(options.TargetDataSource);", - "\n return new[] {Activity.Finish(),logConfig}; ", + "\n return Activity.Finish().Merge(logConfig); ", "\n});" ] }, @@ -970,7 +970,8 @@ "\n AmountType = amountType,", "\n EstimateType = estimateType,", "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", - "\n Value = Multiply(GetSign((aocType, amountType, estimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()),", + "\n Value = GetSign((aocType, amountType, estimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache) ", + "\n * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble(),", "\n };", "\n return item;", "\n }, ImportFormats.Actual", @@ -1065,8 +1066,8 @@ "\n EstimateType = estimateType,", "\n EconomicBasis = economicBasis,", "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", - "\n Value = //GetSign((aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), parsingStorage.HierarchyCache)", - "\n 1 // TODO, we need to adjust the inputs to have the correct sign, so that the default GetSign returns 1.", + "\n Value = GetSign((aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), parsingStorage.HierarchyCache)", + "\n //1 // TODO, we need to adjust the inputs to have the correct sign, so that the default GetSign returns 1.", "\n * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()", "\n };", "\n return iv;", diff --git a/ifrs17/Report/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb index d482e339..39128784 100644 --- a/ifrs17/Report/ReportConfigurationAndUtils.ipynb +++ b/ifrs17/Report/ReportConfigurationAndUtils.ipynb @@ -32,11 +32,12 @@ { "cell_type": "code", "source": [ - "using Systemorph.Vertex.Pivot.Reporting.Builder;", + "using Systemorph.Vertex.Pivot.Builder;", + "\nusing Systemorph.Vertex.Pivot.Reporting.Builder;", "\nusing System.Collections.Immutable;", "\n", "\npublic static DataCubeReportBuilder, TVariable, TVariable ,TVariable> ReportGridOptions(", - "\n this DataCubeReportBuilder, TVariable, TVariable, TVariable> reportBuilder,", + "\n this DataCubePivotBuilder, TVariable, TVariable, TVariable> reportBuilder,", "\n int reportHeight = 700,", "\n int valueColumnWidth = 250,", "\n int headerColumnWidth = 250,", diff --git a/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb index ae87b53d..d9344d3c 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -140,12 +140,11 @@ "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().EstimateTypesWithoutAoc.Contains(x.Identity.EstimateType)));", "\n ", "\n protected IDataCube Data => GetScope((Identity.ReportIdentity, Identity.EstimateType)).Data", - "\n .SelectToDataCube(x => GetScope((Identity.ReportIdentity.ContractualCurrency, ", - "\n Identity.ReportIdentity.FunctionalCurrency, ", - "\n GetStorage().GetFxPeriod(GetStorage().Args.Period, x.VariableType, x.Novelty),", - "\n (Identity.ReportIdentity.Year, Identity.ReportIdentity.Month),", - "\n Identity.CurrencyType", - "\n )).Fx * x);", + "\n .SelectToDataCube(x => Multiply( GetScope((Identity.ReportIdentity.ContractualCurrency, ", + "\n Identity.ReportIdentity.FunctionalCurrency, ", + "\n GetStorage().GetFxPeriod(GetStorage().Args.Period, x.VariableType, x.Novelty),", + "\n (Identity.ReportIdentity.Year, Identity.ReportIdentity.Month),", + "\n Identity.CurrencyType)).Fx, x ));", "\n ", "\n private IDataCube Eops => Data.Filter((\"VariableType\", AocTypes.EOP));", "\n private IDataCube NotEops => Data.Filter((\"VariableType\", \"!EOP\")); // TODO negation must be hardcoded (also to avoid string concatenation)", @@ -767,8 +766,8 @@ "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.NIC))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE2\" });", "\n ", - "\n private IEnumerable ClaimsIco => WrittenAndAccruals", - "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.ICO));", + "\n private IDataCube ClaimsIco => WrittenAndAccruals", + "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.ICO)).ToDataCube();", "\n ", "\n IDataCube ClaimsIcoToIr => ClaimsIco.SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR2\" });", "\n IDataCube ClaimsIcoToIse => (-1 * ClaimsIco).SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE5\" });", diff --git a/ifrs17/Report/ReportStorage.ipynb b/ifrs17/Report/ReportStorage.ipynb index 655f0888..0c61fe1a 100644 --- a/ifrs17/Report/ReportStorage.ipynb +++ b/ifrs17/Report/ReportStorage.ipynb @@ -94,12 +94,12 @@ "public class ReportStorage {", "\n protected readonly IWorkspace workspace;", "\n private readonly Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchicalDimensionCache;", - "\n private readonly Systemorph.Vertex.Pivot.Reporting.IReportFactory reportFactory;", + "\n private readonly Systemorph.Vertex.Pivot.Builder.Interfaces.IPivotFactory reportFactory;", "\n ", "\n // Current Storage Settings", "\n public ((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args {get; private set;}", "\n ", - "\n // Cache for Aux Data ", + "\n // Cache for Aux Data", "\n private Dictionary<(int year, int month), Dictionary>> exchangeRatesByCurrencyByFxTypeAndPeriod = new(); // Fx Rates", "\n private Dictionary<(int year, int month), Dictionary> fxPeriodsByAocStepAndPeriod = new(); // FxParameter", "\n ", @@ -109,7 +109,7 @@ "\n private Dictionary<((int year, int month) period, string reportingNode, string scenario), Dictionary>>> variablesDictionary = new();", "\n ", "\n // Constructor", - "\n public ReportStorage(IWorkspace workspace, Systemorph.Vertex.Pivot.Reporting.IReportFactory reportFactory) {", + "\n public ReportStorage(IWorkspace workspace, Systemorph.Vertex.Pivot.Builder.Interfaces.IPivotFactory reportFactory) {", "\n this.workspace = workspace;", "\n this.hierarchicalDimensionCache = workspace.ToHierarchicalDimensionCache();", "\n this.reportFactory = reportFactory;", @@ -182,7 +182,7 @@ "\n ", "\n // Other getters", "\n public IWorkspace Workspace => workspace;", - "\n public Systemorph.Vertex.Pivot.Reporting.IReportFactory Report => reportFactory;", + "\n public Systemorph.Vertex.Pivot.Builder.Interfaces.IPivotFactory Report => reportFactory;", "\n", "\n public Systemorph.Vertex.Hierarchies.IHierarchy GetHierarchy() where T : class, IHierarchicalDimension => hierarchicalDimensionCache.Get();", "\n ", diff --git a/ifrs17/Utils/ApplicationMessage.ipynb b/ifrs17/Utils/ApplicationMessage.ipynb index a03f0301..f2253bd6 100644 --- a/ifrs17/Utils/ApplicationMessage.ipynb +++ b/ifrs17/Utils/ApplicationMessage.ipynb @@ -27,7 +27,7 @@ { "cell_type": "code", "source": [ - "#r \"nuget:Systemorph.Activities,1.4.0\"" + "#r \"nuget:Systemorph.Activities,1.5.1\"" ] }, { @@ -41,7 +41,7 @@ "source": [ "using Microsoft.Extensions.Logging;", "\n", - "\npublic class ApplicationMessage {", + "\npublic static class ApplicationMessage {", "\n private static ILogger log;", "\n ", "\n private static IActivityVariable activity;", @@ -87,13 +87,14 @@ "cell_type": "code", "source": [ "public static ActivityLog Merge (this ActivityLog a, ActivityLog b) {", + "\n var errors = a.Errors.Concat(b.Errors).ToList();", "\n return a with { ", + "\n Status = a.Status == ActivityLogStatus.Failed || b.Status == ActivityLogStatus.Failed ? ActivityLogStatus.Failed : ActivityLogStatus.Succeeded,", "\n StartDateTime = a.StartDateTime < b.StartDateTime ? a.StartDateTime : b.StartDateTime,", "\n FinishDateTime = a.FinishDateTime > b.FinishDateTime ? a.FinishDateTime : b.FinishDateTime,", - "\n Errors = a.Errors.Concat(b.Errors).ToList(),", - "\n Warnings = a.Warnings.Concat(b.Warnings).ToList(),", - "\n Infos = a.Infos.Concat(b.Infos).ToList(),", - "\n Status = a.Status == ActivityLogStatus.Failed || b.Status == ActivityLogStatus.Failed ? ActivityLogStatus.Failed : ActivityLogStatus.Succeeded", + "\n Errors = errors,", + "\n Warnings = errors.Any() ? new List() : a.Warnings.Concat(b.Warnings).ToList(),", + "\n Infos = errors.Any() ? new List() : a.Infos.Concat(b.Infos).ToList(),", "\n };", "\n}", "\n", diff --git a/ifrs17/Utils/Extensions.ipynb b/ifrs17/Utils/Extensions.ipynb index 9e0adcb9..0eb9c443 100644 --- a/ifrs17/Utils/Extensions.ipynb +++ b/ifrs17/Utils/Extensions.ipynb @@ -123,17 +123,15 @@ "cell_type": "code", "source": [ "using System.Text;", - "\npublic static string ToIdentityString(this T v)", - "\n where T : class", + "\npublic static string ToIdentityString(this T v) where T : class", "\n{", - "\n StringBuilder sb = new StringBuilder();", - "\n var propertyInfos = v.GetType()", - "\n .GetProperties()", - "\n .Where(x => Attribute.IsDefined(x, typeof(IdentityPropertyAttribute)))", - "\n .OrderByDescending(x => x.PropertyType.Name).ThenByDescending(x => x.Name)", - "\n .Select(x => sb.Append(x.Name).Append(\":\").Append(v.GetType().GetProperty(x.Name)?.GetValue(v, null)).Append(\", \"));", - "\n", - "\nreturn propertyInfos.Select(p => p.ToString()).ToArray().Last();", + "\n StringBuilder sb = new StringBuilder();", + "\n var propertyInfos = v.GetType()", + "\n .GetProperties()", + "\n .Where(x => Attribute.IsDefined(x, typeof(IdentityPropertyAttribute)))", + "\n .OrderByDescending(x => x.PropertyType.Name).ThenByDescending(x => x.Name)", + "\n .Select(x => sb.Append(x.Name).Append(\":\").Append(v.GetType().GetProperty(x.Name)?.GetValue(v, null)).Append(\", \")).ToArray();", + "\n return propertyInfos.Count() == 0? v.ToString() : propertyInfos.Select(p => p.ToString()).ToArray().Last();", "\n}" ] }, diff --git a/ifrs17/Utils/TestHelper.ipynb b/ifrs17/Utils/TestHelper.ipynb index a627b204..9a46850e 100644 --- a/ifrs17/Utils/TestHelper.ipynb +++ b/ifrs17/Utils/TestHelper.ipynb @@ -98,14 +98,15 @@ { "cell_type": "code", "source": [ - "public static ReportBuilder WithGridOptionsForIfrsVariable", - "\n(this ReportBuilder reportBuilder, int reportHeight = 650)", + "public static Systemorph.Vertex.Pivot.Reporting.Builder.ReportBuilder WithGridOptionsForIfrsVariable", + "\n(this Systemorph.Vertex.Pivot.Builder.PivotBuilder reportBuilder, int reportHeight = 650)", "\n{", - "\n return reportBuilder.WithGridOptions(go => go.WithColumns(cols => cols.Modify(\"Value\", c => c.WithWidth(300)", - "\n .WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", - "\n .WithRows(rows => rows.Where(r => !r.RowGroup.SystemName.EndsWith(\"NullGroup\")).ToList())", - "\n .WithAutoGroupColumn(c => c.WithWidth(250) with { Pinned = \"left\" }) with { Height = reportHeight, GroupDefaultExpanded = 2, OnGridReady = null }", - "\n );", + "\n return reportBuilder.WithGridOptions(go => ", + "\n go.WithColumns(cols => cols.Modify(\"Value\", c => c.WithWidth(300)", + "\n .WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", + "\n .WithRows(rows => rows.Where(r => !r.RowGroup.SystemName.EndsWith(\"NullGroup\")).ToList())", + "\n .WithAutoGroupColumn(c => c.WithWidth(250) with { Pinned = \"left\" }) with { Height = reportHeight, GroupDefaultExpanded = 2, OnGridReady = null }", + "\n );", "\n}" ] } From 0c8614d05aad46cd161b87cb78e7f2e2d26f628b Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Mon, 31 Oct 2022 14:39:03 +0100 Subject: [PATCH 17/43] Interactive reports (#58) * Ifrs17ReportScopes * wip * latest * add other reports * start with pv * filter does not work * clean up * clean up reports * clean up * typo * move it ce * remove partition set * adjust reporting * test readme with relative path for image * back to absolute path - bug in the portal - * wip * settle with identities * some more docs * adding rn and period selector --- .../Files/DimensionsAndPartitions.csv | 3 - full-ifrs17-template/Report/Reports.ipynb | 302 ++++++----------- .../Test/SpecificationsSetup.ipynb | 2 +- .../Test/SpecificationsTechnicalMargin.ipynb | 10 +- ifrs17/CalculationEngine.ipynb | 8 +- ifrs17/DataModel/DataStructure.ipynb | 9 - ifrs17/Import/ImportScopeCalculation.ipynb | 4 +- .../Report/ReportConfigurationAndUtils.ipynb | 7 +- ifrs17/Report/ReportMutableScopes.ipynb | 311 ++++++++++++++++++ ifrs17/Report/ReportScopes.ipynb | 10 +- 10 files changed, 442 insertions(+), 224 deletions(-) create mode 100644 ifrs17/Report/ReportMutableScopes.ipynb diff --git a/full-ifrs17-template/Files/DimensionsAndPartitions.csv b/full-ifrs17-template/Files/DimensionsAndPartitions.csv index bcfe9d1d..4f648680 100644 --- a/full-ifrs17-template/Files/DimensionsAndPartitions.csv +++ b/full-ifrs17-template/Files/DimensionsAndPartitions.csv @@ -228,9 +228,6 @@ CH,00000000-0000-0000-0000-000000000001,,,,,,,,,, ReportingNode,Year,Month,Id,,,,,,,, CH,2020,12,10000000-0000-0000-0000-000000000000,,,,,,,, CH,2021,3,20000000-0000-0000-0000-000000000000,,,,,,,, -CH,2021,9,30000000-0000-0000-0000-000000000000,,,,,,,, -CH,2021,12,35000000-0000-0000-0000-000000000000,,,,,,,, -CH,2022,3,40000000-0000-0000-0000-000000000000,,,,,,,, ,,,,,,,,,,, @@ProjectionConfiguration,,,,,,,,,,, SystemName,DisplayName,Shift,TimeStep,,,,,,,, diff --git a/full-ifrs17-template/Report/Reports.ipynb b/full-ifrs17-template/Report/Reports.ipynb index 4caa201d..23a3804b 100644 --- a/full-ifrs17-template/Report/Reports.ipynb +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -28,26 +28,18 @@ { "cell_type": "markdown", "source": [ - "This is the notebook to be run for the production of all the reports." - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Infrastructure and Configuration" + "For demonstration purposes we import here data for 7 *Group of Insurance Contract* (GIC) and 4 *Group of Reinsurance Contract* (GRIC) - the import is triggered in the [Set up data and configuration](#set-up-data-and-configuration).", + "\n
The imported data set consists of cashflows, actuals, and parameters for two consecutive periods (Year 2020-Quarter 4 and Year 2021-Quarter 1)", + "\n
Input files can be found in the **File** directory. You are invited to change them or upload your own. ", + "\n
For simplicity, we import the same transactional data for all GICs and GRICs. Each *Group of Contracts* produces different figures due to differences in parameters such as *Liability Type*, *Oci type* or *Premium allocation factor* to Contractual Service Margin.", + "\n", + "\nFollow the instructions below for a guided interaction with the reports." ] }, { "cell_type": "markdown", "source": [ - "## Initialize data" - ] - }, - { - "cell_type": "code", - "source": [ - "/* DataSource is configured and connected to real database */", - "\n//#!eval-notebook \"../Database/Configure\"" + "# Set up data and configuration" ] }, { @@ -59,77 +51,18 @@ { "cell_type": "code", "source": [ - "Workspace.InitializeFrom(DataSource);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Imports and Configurations" - ] - }, - { - "cell_type": "code", - "source": [ - "var reportStorage = new ReportStorage(Workspace, Report);", - "\nawait reportStorage.InitializeReportIndependentCacheAsync();", - "\nvar mostRecentPartition = (await Workspace.Query().Where(x => x.Scenario == null).OrderBy(x => x.Year).ThenBy(x => x.Month).ToArrayAsync()).Last();", - "\nvar reportingNodeRoot = (await Workspace.Query().Where(x => x.Parent == null).ToArrayAsync()).First().SystemName;", - "\nawait reportStorage.InitializeAsync((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);", - "\nvar identities = reportStorage.GetIdentities((mostRecentPartition.Year, mostRecentPartition.Month), reportingNodeRoot, null, CurrencyType.Contractual);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Calling Scope" - ] - }, - { - "cell_type": "code", - "source": [ - "var universe = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Report Settings and Storage Update" - ] - }, - { - "cell_type": "code", - "source": [ - "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) Args =", - "\n //((2020, 12), reportingNodeRoot, null,CurrencyType.Contractual)", - "\n ((2021, 3), reportingNodeRoot, null,CurrencyType.Contractual)", - "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Functional)", - "\n //((2021, 3), reportingNodeRoot, null,CurrencyType.Group)", - "\n ;", - "\n", - "\nawait reportStorage.InitializeAsync(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);", - "\nidentities = reportStorage.GetIdentities(Args.Period, Args.ReportingNode, Args.Scenario, Args.CurrencyType);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Use cases", - "\n", - "\nFor demonstration purposes we import data for 7 *Group of Insurance Contract* (GIC) and 4 *Group of Reinsurance Contract* (GRIC). ", - "\n
The data set consists of cashflows, actuals, and parameters.", - "\n", - "\n" + "Workspace.InitializeFrom(DataSource);", + "\nifrs17Report.Reset(Workspace)" ] }, { "cell_type": "markdown", "source": [ - "# Present Value", + "# Best Estimate", "\n", - "\nPresent values of the best-estimate future cashflows are shown here in an Analysis of Change report.", + "\nPresent values of the [best-estimate](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#best-estimate) future cashflows are shown here in an Analysis of Change report.", "\n", - "\nThe report view can be modified with the Slice options for the columns by changing the SliceColumnBy inputs in the next command cell.", + "\nThe granularity of the reported figures can be modified by changing the Column Slices options.", "\nFor example one can add \"GroupOfContract\" to separate the contributions of the individual Group of Contracts.", "\n
We suggest to add this slice between the \"LiabilityType\" and the \"EconomicBasis\" as the order of the inputs corresponds to the order of the columns shown in the report to expand the data.", "\n", @@ -139,166 +72,157 @@ { "cell_type": "code", "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedBestEstimate + universe.GetScopes(identities).Aggregate().CurrentBestEstimate)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\", \"EconomicBasis\") //\"GroupOfContract\"", - "\n .ReportGridOptions()", - "\n .ToReport()" + "var pvReport = ifrs17Report.PresentValues;", + "\npvReport.ReportingNode = \"CH\";", + "\npvReport.ReportingPeriod = (2021, 3);", + "\npvReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\npvReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.2\"),(\"LiabilityType\", \"LIC\") }", + "\n(await pvReport.ToReportAsync) with {Height = 720}" ] }, { "cell_type": "markdown", "source": [ - "# Risk Adjustment" + "# Risk Adjustment", + "\n", + "\nPresent values of the [risk adjustment](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#risk-adjustment) future cashflows are shown here.", + "\n", + "\nFilters can be applied to report to isolate a sub-set of the data. They can be used in conjuction to the Slice options. For example, filtering **EconomicBasis** Locked-in together with a slice on the **GroupOfContract** allows to analyse the risk adjustment figures computed with the yield curve at inception for all Group of Contracts." ] }, { "cell_type": "code", "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LockedRiskAdjustment + universe.GetScopes(identities).Aggregate().CurrentRiskAdjustment)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"EconomicBasis\", \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions()", - "\n .ToReport()" + "var raReport = ifrs17Report.RiskAdjustments;", + "\nraReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", + "\nraReport.DataFilter = null;//new [] {(\"GroupOfContract\", \"DT1.2\")};", + "\n(await raReport.ToReportAsync) with {Height = 800}" ] }, { "cell_type": "markdown", "source": [ - "# Actuals" + "# Written Actuals", + "\n", + "\n[Written Actuals](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#written-accrual-deferral) are shown here. ", + "\n", + "\nIn this case, the analysis of change view is replaced with a default slice by the **AmountTypes**. Only the amount type with non zero value are displayed. " ] }, { "cell_type": "code", "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Written", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"AmountType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 450)", - "\n .ToReport()" + "var writtenActualReport = ifrs17Report.WrittenActuals;", + "\nwrittenActualReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", + "\nwrittenActualReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await writtenActualReport.ToReportAsync) with {Height = 400}" ] }, { "cell_type": "markdown", "source": [ - "## Advance, Overdue Actuals" + "## Advance, Overdue Actuals", + "\n", + "\nActuals payed in [Advance](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#written-accrual-deferral)", + "\nor [Overdue](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#written-accrual-deferral) are shown here together in a simplified Analysis of Change. " ] }, { "cell_type": "code", "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Advance + universe.GetScopes(identities).Aggregate().Overdue)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EstimateType\")", - "\n .ReportGridOptions(reportHeight: 400)", - "\n .ToReport()" + "var accrualActualReport = ifrs17Report.AccrualActuals;", + "\naccrualActualReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\naccrualActualReport.DataFilter = null;//new [] {(\"GroupOfContract\", \"DT2.1\")};", + "\n(await accrualActualReport.ToReportAsync) with {Height = 400}" ] }, { "cell_type": "markdown", "source": [ - "## Deferrable Actuals" + "## Deferrable Actuals", + "\n", + "\n[Deferrable Actuals](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#written-accrual-deferral) are shown here. Amortization of the deferrable amount is computed using the Coverage Unit pattern. " ] }, { "cell_type": "code", "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Deferrals", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 400)", - "\n .ToReport()" + "var deferrableActualReport = ifrs17Report.DeferralActuals;", + "\ndeferrableActualReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\ndeferrableActualReport.DataFilter = null;//new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await deferrableActualReport.ToReportAsync) with {Height = 400}" ] }, { "cell_type": "markdown", "source": [ - "# Fulfilment Cashflow" + "# Fulfilment Cashflow", + "\n", + "\nPresent Value of the [Fulfilment Cashflow](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#fulfillment-cashflows) are shown here. ", + "\n
The individual contributions from Best Estimate and Risk Adjustment can be visualized slicing by **EstimateType**" ] }, { "cell_type": "code", "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().Fcf ", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\", \"EconomicBasis\")//, \"EstimateType\")//, \"AmountType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" + "var fulfillmentCashflowsReport = ifrs17Report.FulfillmentCashflows;", + "\nfulfillmentCashflowsReport.ColumnSlices = new string[]{};//\"EstimateType\"", + "\nfulfillmentCashflowsReport.DataFilter = null;// new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await fulfillmentCashflowsReport.ToReportAsync) with {Height = 750}" ] }, { "cell_type": "markdown", "source": [ - "# Actuarial Experience Adjustment" + "# Actuarial Experience Adjustment", + "\n", + "\nA comparison between [Written Actual](#written-actual) and the Releases of the [Best Estimate](#present-value) is reported in the [Actuarial Experience Adjustment](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#experience-adjustment)." ] }, { "cell_type": "code", "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().ActuarialExperienceAdjustment", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"EstimateType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"AmountType\" )//\"LiabilityType\", \"EstimateType\")", - "\n .ReportGridOptions(reportHeight: 300, headerColumnWidth: 300)", - "\n .ToReport() " + "var experienceAdjustmentsReport = ifrs17Report.ExperienceAdjustments;", + "\nexperienceAdjustmentsReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\nexperienceAdjustmentsReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await experienceAdjustmentsReport.ToReportAsync) with {Height = 300}" ] }, { "cell_type": "markdown", "source": [ - "# LRC Technical Margin" + "# LRC Technical Margin", + "\n", + "\nIn the [Technical Margin](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#technical-margin) report we present a unified view on the figures that are allocated to either Contractual Service Margin or to Loss Component. ", + "\n
The Analysis of Change is expanded with few more steps such as **Experience Adjustment** and **Amortization**." ] }, { "cell_type": "code", "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().LrcTechnicalMargin", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 600)", - "\n .ToReport()" + "var technicalMarginsReport = ifrs17Report.TechnicalMargins;", + "\ntechnicalMarginsReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\ntechnicalMarginsReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await technicalMarginsReport.ToReportAsync) with {Height = 600}" ] }, { "cell_type": "markdown", "source": [ - "# Contractual Service Margin / Loss Component / Loss Recovery Component" + "# Contractual Service Margin / Loss Component / Loss Recovery Component", + "\n", + "\nThe Contractual Service Margin (CSM) / Loss Component (LC) / Loss Recovery Component (LR) [report](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#technical-margin) are here shown side by side as the allocation to profit or loss is done at each step of the Analysis of Change. ", + "\n", + "\nA default slice by EstimateType - which distinguish between CSM, LC and LR contributions - is automatically enforced. " ] }, { "cell_type": "code", "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Csm + universe.GetScopes(identities).Aggregate().Lc + universe.GetScopes(identities).Aggregate().Loreco)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"GroupOfContract\", \"EstimateType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" + "var allocatedTechnicalMarginsReport = ifrs17Report.AllocatedTechnicalMargins;", + "\nallocatedTechnicalMarginsReport.ColumnSlices = new string[]{\"GroupOfContract\", \"EstimateType\"};//\"GroupOfContract\", \"AmountType\"", + "\nallocatedTechnicalMarginsReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await allocatedTechnicalMarginsReport.ToReportAsync) with {Height = 700}" ] }, { @@ -310,14 +234,10 @@ { "cell_type": "code", "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LrcActuarial)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"LiabilityType\",\"GroupOfContract\",*/ \"EstimateType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" + "var actuarialLrcReport = ifrs17Report.ActuarialLrc;", + "\nactuarialLrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\nactuarialLrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await actuarialLrcReport.ToReportAsync) with {Height = 750}" ] }, { @@ -329,14 +249,10 @@ { "cell_type": "code", "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lrc)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType),\"GroupOfContract\", \"EstimateType\")", - "\n .ReportGridOptions(300)", - "\n .ToReport()" + "var lrcReport = ifrs17Report.Lrc;", + "\nlrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\nlrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await lrcReport.ToReportAsync) with {Height = 250}" ] }, { @@ -348,14 +264,10 @@ { "cell_type": "code", "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().LicActuarial)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"Novelty\",\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", - "\n .ReportGridOptions()", - "\n .ToReport()" + "var actuarialLicReport = ifrs17Report.ActuarialLic;", + "\nactuarialLicReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\nactuarialLicReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await actuarialLicReport.ToReportAsync) with {Height = 750}" ] }, { @@ -367,14 +279,10 @@ { "cell_type": "code", "source": [ - "Report.ForDataCube((universe.GetScopes(identities).Aggregate().Lic)", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), /*\"GroupOfContract\",*/ \"EstimateType\")", - "\n .ReportGridOptions(300)", - "\n .ToReport()" + "var licReport = ifrs17Report.Lic;", + "\nlicReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\nlicReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await licReport.ToReportAsync) with {Height = 250}" ] }, { @@ -388,14 +296,10 @@ { "cell_type": "code", "source": [ - "Report.ForDataCube(universe.GetScopes(identities).Aggregate().FinancialPerformance", - "\n //.Filter((\"GroupOfContract\", \"DT1.1\"))", - "\n )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", - "\n .SliceColumnsBy(CurrencyGrouper(Args.CurrencyType), \"LiabilityType\",\"GroupOfContract\")", - "\n .ReportGridOptions(reportHeight: 900, headerColumnWidth: 500, groupDefaultExpanded: 3)", - "\n .ToReport()" + "var financialPerformanceReport = ifrs17Report.FinancialPerformance;", + "\nfinancialPerformanceReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", + "\nfinancialPerformanceReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", + "\n(await financialPerformanceReport.ToReportAsync) with { Height = 900, GroupDefaultExpanded = 3}" ] }, { diff --git a/full-ifrs17-template/Test/SpecificationsSetup.ipynb b/full-ifrs17-template/Test/SpecificationsSetup.ipynb index 335f1ca3..b9f1e2f4 100644 --- a/full-ifrs17-template/Test/SpecificationsSetup.ipynb +++ b/full-ifrs17-template/Test/SpecificationsSetup.ipynb @@ -90,7 +90,7 @@ "\n Value = scope.Value,", "\n Partition = scope.GetStorage().TargetPartition };", "\n", - "\npublic static IfrsVariable FromCsmToIfrsVariable(this ContractualServiceMaring scope)", + "\npublic static IfrsVariable FromCsmToIfrsVariable(this ContractualServiceMargin scope)", "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", "\n DataNode = scope.Identity.DataNode, ", "\n AocType = scope.Identity.AocType, ", diff --git a/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb b/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb index 43191eec..f8cc0f73 100644 --- a/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb +++ b/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb @@ -1121,7 +1121,7 @@ { "cell_type": "code", "source": [ - "var computedCSM_BoP_I = Test.GetScope(id_BoP_I).Value;", + "var computedCSM_BoP_I = Test.GetScope(id_BoP_I).Value;", "\nvar computedLC_BoP_I = Test.GetScope(id_BoP_I).Value;" ] }, @@ -1196,7 +1196,7 @@ { "cell_type": "code", "source": [ - "var computedCSM_MC_I = Test.GetScope(id_MC_I).Value;", + "var computedCSM_MC_I = Test.GetScope(id_MC_I).Value;", "\nvar computedLC_MC_I = Test.GetScope(id_MC_I).Value;" ] }, @@ -1447,7 +1447,7 @@ { "cell_type": "code", "source": [ - "var computedCSM_CL_C = Test.GetScope(id_CL_C).Value;", + "var computedCSM_CL_C = Test.GetScope(id_CL_C).Value;", "\nvar computedLC_CL_C = Test.GetScope(id_CL_C).Value;" ] }, @@ -1644,7 +1644,7 @@ { "cell_type": "code", "source": [ - "var computedCSM_EoP_C = Test.GetScope(id_EoP_C).Value;", + "var computedCSM_EoP_C = Test.GetScope(id_EoP_C).Value;", "\nvar computedLC_EoP_C = Test.GetScope(id_EoP_C).Value;" ] }, @@ -1694,7 +1694,7 @@ { "cell_type": "code", "source": [ - "var csm = allIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", + "var csm = allIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", "\n .Where(x => Math.Abs(x.Value) >= Precision)", "\n .Select(x => x.FromCsmToIfrsVariable())).ToArray();" ] diff --git a/ifrs17/CalculationEngine.ipynb b/ifrs17/CalculationEngine.ipynb index d6a34d5e..0936fa66 100644 --- a/ifrs17/CalculationEngine.ipynb +++ b/ifrs17/CalculationEngine.ipynb @@ -19,12 +19,18 @@ "cell_type": "code", "source": [ "#!import \"DataModel/DataStructure\"", - "\n#!import \"Report/ReportScopes\"", + "\n#!import \"Report/ReportMutableScopes\"", "\n#!import \"Import/Importers\"", "\n#!import \"Export/ExportConfiguration\"", "\n#!import \"Utils/TestHelper\"", "\n#!import \"Utils/ImportCalculationMethods\"" ] + }, + { + "cell_type": "code", + "source": [ + "var ifrs17Report = new Ifrs17Reports(Workspace, Scopes, Report);" + ] } ] } \ No newline at end of file diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index 78851b13..4c88153d 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -1056,15 +1056,6 @@ "\n- OCI Type" ] }, - { - "cell_type": "markdown", - "source": [ - "TODOs:", - "\n
    ", - "\n
  • Remove Scenario from Partition and include it as simple property (see Year, Month). Introduce concept of Priority in LoadCurrentAndPreviousParameterAsync query (see ParameterResultsEntityQueryExtensions in IfrsGeneric).
  • ", - "\n
" - ] - }, { "cell_type": "code", "source": [ diff --git a/ifrs17/Import/ImportScopeCalculation.ipynb b/ifrs17/Import/ImportScopeCalculation.ipynb index f172092b..629d2d40 100644 --- a/ifrs17/Import/ImportScopeCalculation.ipynb +++ b/ifrs17/Import/ImportScopeCalculation.ipynb @@ -1784,7 +1784,7 @@ { "cell_type": "code", "source": [ - "public interface ContractualServiceMaring : IScope", + "public interface ContractualServiceMargin : IScope", "\n{", "\n [NotVisible]string EstimateType => EstimateTypes.C;", "\n ", @@ -1951,7 +1951,7 @@ "\n ", "\n IEnumerable Csms => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", "\n ? Enumerable.Empty()", - "\n : GetScope(Identity).RepeatOnce()", + "\n : GetScope(Identity).RepeatOnce()", "\n .Where(x => Math.Abs(x.Value) >= Precision)", "\n .Select(x => new IfrsVariable{ EstimateType = x.EstimateType,", "\n DataNode = x.Identity.DataNode,", diff --git a/ifrs17/Report/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb index 39128784..e380125c 100644 --- a/ifrs17/Report/ReportConfigurationAndUtils.ipynb +++ b/ifrs17/Report/ReportConfigurationAndUtils.ipynb @@ -102,7 +102,6 @@ "source": [ "public static async Task> QueryReportVariablesAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", "\n ", - "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario });", "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario, Year = args.Year, Month = args.Month });", "\n ", "\n return await workspace.Query()", @@ -146,6 +145,12 @@ "\n .ToArrayAsync();", "\n}" ] + }, + { + "cell_type": "code", + "source": [ + "" + ] } ] } \ No newline at end of file diff --git a/ifrs17/Report/ReportMutableScopes.ipynb b/ifrs17/Report/ReportMutableScopes.ipynb new file mode 100644 index 00000000..2cd03b41 --- /dev/null +++ b/ifrs17/Report/ReportMutableScopes.ipynb @@ -0,0 +1,311 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "", + "\n

Report Mutable Scopes

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This notebook contains the set up of mutable scopes used to achieve high interactivity with reports." + ] + }, + { + "cell_type": "markdown", + "source": [ + "# References", + "\nLibraries and other notebooks which are needed for this notebook are imported below." + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"ReportScopes\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Mutable Scope" + ] + }, + { + "cell_type": "markdown", + "source": [ + "The IIfrs17Report mutable scope is created with applicabilities to control how the data for each individual report is retrieved from the [report scopes](./ReportScopes)" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface ReportUniverse : IMutableScopeWithStorage{}" + ] + }, + { + "cell_type": "code", + "source": [ + "[InitializeScope(nameof(InitAsync))]", + "\npublic interface IIfrs17Report : IMutableScope {", + "\n // Infrastructure", + "\n protected IWorkspace workspace => GetStorage().Workspace;", + "\n protected Systemorph.Vertex.Pivot.Builder.Interfaces.IPivotFactory report => GetStorage().Report;", + "\n", + "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity == nameof(PvReport))", + "\n .WithApplicability(x => x.Identity == nameof(RaReport))", + "\n .WithApplicability(x => x.Identity == nameof(WrittenReport))", + "\n .WithApplicability(x => x.Identity == nameof(AccrualReport))", + "\n .WithApplicability(x => x.Identity == nameof(DeferralReport))", + "\n .WithApplicability(x => x.Identity == nameof(FcfReport))", + "\n .WithApplicability(x => x.Identity == nameof(ExpAdjReport))", + "\n .WithApplicability(x => x.Identity == nameof(TmReport))", + "\n .WithApplicability(x => x.Identity == nameof(CsmReport))", + "\n .WithApplicability(x => x.Identity == nameof(ActLrcReport))", + "\n .WithApplicability(x => x.Identity == nameof(LrcReport))", + "\n .WithApplicability(x => x.Identity == nameof(ActLicReport))", + "\n .WithApplicability(x => x.Identity == nameof(LicReport))", + "\n .WithApplicability(x => x.Identity == nameof(FpReport))", + "\n );", + "\n", + "\n // Basic mutable properties", + "\n (int Year, int Month) ReportingPeriod { get; set; }", + "\n int Year => ReportingPeriod.Year;", + "\n int Month => ReportingPeriod.Month;", + "\n string ReportingNode { get; set; }", + "\n string Scenario { get; set; }", + "\n CurrencyType CurrencyType { get; set; }", + "\n ", + "\n ((int Year, int Month) ReportingPeriod, string ReportingNode, string Scenario, CurrencyType) ShowSettings => (ReportingPeriod, ReportingNode, Scenario, CurrencyType);", + "\n ", + "\n // Slice and Dice", + "\n IEnumerable RowSlices { get; set; }", + "\n protected string[] defaultRowSlices => new string[] { };", + "\n protected string[] rowSlices => RowSlices is null ? defaultRowSlices : defaultRowSlices.Concat(RowSlices).ToArray();", + "\n", + "\n IEnumerable ColumnSlices { get; set; }", + "\n protected string[] defaultColumnSlices => new string[] { };", + "\n protected string[] columnSlices => ColumnSlices is null ? defaultColumnSlices : defaultColumnSlices.Where(cs => !ColumnSlices.Contains(cs)).Concat(ColumnSlices).ToArray(); //I can't put a slice before defaultSlices !!!", + "\n protected HashSet<(ReportIdentity, CurrencyType)> GetIdentities() => GetStorage().GetIdentities(ReportingPeriod, ReportingNode, Scenario, CurrencyType);", + "\n ", + "\n // Filter", + "\n IEnumerable<(string filterName, string filterValue)> DataFilter { get; set; }", + "\n protected (string filterName, object filterValue)[] dataFilter => (DataFilter is null ? Enumerable.Empty<(string, object)>() : DataFilter.Select(x => (x.filterName, (object)x.filterValue))).ToArray();", + "\n", + "\n // Scope Initialization", + "\n async Task InitAsync() {", + "\n var mostRecentPartition = (await workspace.Query().Where(x => x.Scenario == null).OrderBy(x => x.Year).ThenBy(x => x.Month).ToArrayAsync()).Last(); ", + "\n ", + "\n ReportingPeriod = (mostRecentPartition.Year, mostRecentPartition.Month);", + "\n ReportingNode = (await workspace.Query().Where(x => x.Parent == null).ToArrayAsync()).First().SystemName; // TODO: change once user permissions are available", + "\n Scenario = null;", + "\n CurrencyType = CurrencyType.Contractual;", + "\n await GetStorage().InitializeReportIndependentCacheAsync();", + "\n }", + "\n public IDataCube GetDataCube() => default;", + "\n protected int headerColumnWidthValue => 250;", + "\n private async Task GetReportTaskAsync() {", + "\n await GetStorage().InitializeAsync(ReportingPeriod, ReportingNode, Scenario, CurrencyType);", + "\n ", + "\n return report.ForDataCube(GetDataCube())", + "\n .WithQuerySource(workspace)", + "\n .SliceRowsBy(rowSlices)", + "\n .SliceColumnsBy(columnSlices)", + "\n .ReportGridOptions(headerColumnWidth: headerColumnWidthValue)", + "\n .ToReport();", + "\n }", + "\n", + "\n Task ToReportAsync => GetReportTaskAsync();", + "\n}", + "\n", + "\npublic interface PvReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] { \"Novelty\", \"VariableType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\", \"EconomicBasis\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? (GetScopes(GetIdentities()).Aggregate().LockedBestEstimate + GetScopes(GetIdentities()).Aggregate().CurrentBestEstimate)", + "\n : (GetScopes(GetIdentities()).Aggregate().LockedBestEstimate + GetScopes(GetIdentities()).Aggregate().CurrentBestEstimate).Filter(dataFilter);", + "\n}", + "\n", + "\npublic interface RaReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] { \"Novelty\", \"VariableType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\", \"EconomicBasis\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().LockedRiskAdjustment + ", + "\n GetScopes(GetIdentities()).Aggregate().CurrentRiskAdjustment", + "\n : GetScopes(GetIdentities()).Aggregate().LockedRiskAdjustment.Filter(dataFilter) + ", + "\n GetScopes(GetIdentities()).Aggregate().CurrentRiskAdjustment.Filter(dataFilter);", + "\n}", + "\n", + "\npublic interface WrittenReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"AmountType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\"};", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().Written", + "\n : GetScopes(GetIdentities()).Aggregate().Written.Filter(dataFilter);", + "\n}", + "\n", + "\npublic interface AccrualReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\"};", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().Advance + ", + "\n GetScopes(GetIdentities()).Aggregate().Overdue", + "\n : GetScopes(GetIdentities()).Aggregate().Advance.Filter(dataFilter) + ", + "\n GetScopes(GetIdentities()).Aggregate().Overdue.Filter(dataFilter);", + "\n}", + "\n", + "\npublic interface DeferralReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().Deferrals", + "\n : GetScopes(GetIdentities()).Aggregate().Deferrals.Filter(dataFilter);", + "\n}", + "\n", + "\npublic interface FcfReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] { \"Novelty\",\"VariableType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\", \"EconomicBasis\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().Fcf", + "\n : GetScopes(GetIdentities()).Aggregate().Fcf.Filter(dataFilter);", + "\n}", + "\n", + "\npublic interface ExpAdjReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"EstimateType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"AmountType\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().ActuarialExperienceAdjustment", + "\n : GetScopes(GetIdentities()).Aggregate().ActuarialExperienceAdjustment.Filter(dataFilter);", + "\n}", + "\npublic interface TmReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\", \"VariableType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType) };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().LrcTechnicalMargin", + "\n : GetScopes(GetIdentities()).Aggregate().LrcTechnicalMargin.Filter(dataFilter);", + "\n}", + "\npublic interface CsmReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\", \"VariableType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().Csm + ", + "\n GetScopes(GetIdentities()).Aggregate().Lc + ", + "\n GetScopes(GetIdentities()).Aggregate().Loreco", + "\n : GetScopes(GetIdentities()).Aggregate().Csm.Filter(dataFilter) + ", + "\n GetScopes(GetIdentities()).Aggregate().Lc.Filter(dataFilter) + ", + "\n GetScopes(GetIdentities()).Aggregate().Loreco.Filter(dataFilter);", + "\n}", + "\npublic interface ActLrcReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\",\"VariableType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().LrcActuarial", + "\n : GetScopes(GetIdentities()).Aggregate().LrcActuarial.Filter(dataFilter);", + "\n}", + "\npublic interface LrcReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().Lrc", + "\n : GetScopes(GetIdentities()).Aggregate().Lrc.Filter(dataFilter);", + "\n}", + "\npublic interface ActLicReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\",\"VariableType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().LicActuarial", + "\n : GetScopes(GetIdentities()).Aggregate().LicActuarial.Filter(dataFilter);", + "\n}", + "\npublic interface LicReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().Lic", + "\n : GetScopes(GetIdentities()).Aggregate().Lic.Filter(dataFilter);", + "\n}", + "\npublic interface FpReport : IIfrs17Report {", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\", \"EstimateType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType),\"LiabilityType\" };", + "\n int IIfrs17Report.headerColumnWidthValue => 500;", + "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", + "\n ? GetScopes(GetIdentities()).Aggregate().FinancialPerformance", + "\n : GetScopes(GetIdentities()).Aggregate().FinancialPerformance.Filter(dataFilter);", + "\n}" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# IFRS 17 Reports" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This class is used to trigger the calculation of the reports and it is exposed to the end-user in the reports." + ] + }, + { + "cell_type": "code", + "source": [ + "public class Ifrs17Reports ", + "\n{", + "\n private Systemorph.Vertex.Scopes.Proxy.IScopeFactory scopes;", + "\n private Systemorph.Vertex.Pivot.Builder.Interfaces.IPivotFactory report;", + "\n private ReportStorage Storage;", + "\n private ReportUniverse reportUniverse;", + "\n ", + "\n //reset", + "\n public void Reset(IWorkspace workspace) => Storage = new ReportStorage(workspace, report);", + "\n", + "\n //constructor", + "\n public Ifrs17Reports (IWorkspace workspace, Systemorph.Vertex.Scopes.Proxy.IScopeFactory scopes, Systemorph.Vertex.Pivot.Builder.Interfaces.IPivotFactory report)", + "\n {", + "\n this.scopes = scopes; ", + "\n this.report = report; ", + "\n Storage = new ReportStorage(workspace, report);", + "\n reportUniverse = scopes.ForSingleton().WithStorage(Storage).ToScope();", + "\n }", + "\n", + "\n public IIfrs17Report PresentValues => reportUniverse.GetScope(nameof(PvReport));", + "\n public IIfrs17Report RiskAdjustments => reportUniverse.GetScope(nameof(RaReport));", + "\n public IIfrs17Report WrittenActuals => reportUniverse.GetScope(nameof(WrittenReport));", + "\n public IIfrs17Report AccrualActuals => reportUniverse.GetScope(nameof(AccrualReport));", + "\n public IIfrs17Report DeferralActuals => reportUniverse.GetScope(nameof(DeferralReport));", + "\n public IIfrs17Report FulfillmentCashflows => reportUniverse.GetScope(nameof(FcfReport));", + "\n public IIfrs17Report ExperienceAdjustments => reportUniverse.GetScope(nameof(ExpAdjReport));", + "\n public IIfrs17Report TechnicalMargins => reportUniverse.GetScope(nameof(TmReport));", + "\n public IIfrs17Report AllocatedTechnicalMargins => reportUniverse.GetScope(nameof(CsmReport));", + "\n public IIfrs17Report ActuarialLrc => reportUniverse.GetScope(nameof(ActLrcReport));", + "\n public IIfrs17Report Lrc => reportUniverse.GetScope(nameof(LrcReport));", + "\n public IIfrs17Report ActuarialLic => reportUniverse.GetScope(nameof(ActLicReport));", + "\n public IIfrs17Report Lic => reportUniverse.GetScope(nameof(LicReport));", + "\n public IIfrs17Report FinancialPerformance => reportUniverse.GetScope(nameof(FpReport));", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb index d9344d3c..f6a51b88 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -21,9 +21,13 @@ "cell_type": "markdown", "source": [ "", - "\n

Report Scopes (IFRS17 Methodology Business Logic)

", - "\n", - "\nThis notebook contains the logic used to perform calculations upon reporting of data." + "\n

Report Scopes (IFRS17 Methodology Business Logic)

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This notebook contains the logic used to perform calculations upon reporting of data." ] }, { From a2496c1c998fa7727af239162bd9084a4871fabd Mon Sep 17 00:00:00 2001 From: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Wed, 2 Nov 2022 21:50:07 +0100 Subject: [PATCH 18/43] New format design in importers (#62) * Define new ImportFormats * Apply import w format in DN, DNS, DP, CF * Apply import w format in A, SV and O * Correct Import statements * Replace abs link with var link * Adjust naming convention * Adjust new import format in full-template --- full-ifrs17-template/Database/Configure.ipynb | 3 +- .../InitSystemorphBaseToMemory.ipynb | 14 +- .../InitSystemorphToDatabase.ipynb | 24 ++-- .../InitSystemorphToMemory.ipynb | 10 +- .../Test/MapTemplateAndImportTest.ipynb | 3 +- .../Test/SpecificationsImportCashflows.ipynb | 2 +- ifrs17/Constants/Consts.ipynb | 2 + ifrs17/Import/Importers.ipynb | 132 +++++++----------- 8 files changed, 82 insertions(+), 108 deletions(-) diff --git a/full-ifrs17-template/Database/Configure.ipynb b/full-ifrs17-template/Database/Configure.ipynb index b332a43c..cbe56388 100644 --- a/full-ifrs17-template/Database/Configure.ipynb +++ b/full-ifrs17-template/Database/Configure.ipynb @@ -27,7 +27,8 @@ { "cell_type": "code", "source": [ - "#!import \"//ifrs17ce/dev/CalculationEngine\"" + "#!import \"../Constants/Consts\"", + "\n#!eval calculationEngine" ] }, { diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index 1dc82a4e..e910c089 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb @@ -128,25 +128,25 @@ { "cell_type": "code", "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/YieldCurve.csv\")" + "await Import.FromFile(\"../Files/800.Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/ExchangeRate.csv\")" + "await Import.FromFile(\"../Files/800.Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/PartnerRating.csv\")" + "await Import.FromFile(\"../Files/800.Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/CreditDefaultRate.csv\")" + "await Import.FromFile(\"../Files/800.Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -158,19 +158,19 @@ { "cell_type": "code", "source": [ - "await UploadDataNodesAsync(\"../Files/700.DataNodes/DataNodes_CH.csv\")" + "await Import.FromFile(\"../Files/700.DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDataNodeStateAsync(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDataNodeParameterAsync(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" ] }, { diff --git a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb index 9b7b5ab5..cc45633d 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb @@ -106,25 +106,25 @@ { "cell_type": "code", "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/YieldCurve.csv\")" + "await Import.FromFile(\"../Files/800.Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/ExchangeRate.csv\")" + "await Import.FromFile(\"../Files/800.Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/PartnerRating.csv\")" + "await Import.FromFile(\"../Files/800.Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDimensionsAsync(\"../Files/800.Parameters/CreditDefaultRate.csv\")" + "await Import.FromFile(\"../Files/800.Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -136,19 +136,19 @@ { "cell_type": "code", "source": [ - "await UploadDataNodesAsync(\"../Files/700.DataNodes/DataNodes_CH.csv\")" + "await Import.FromFile(\"../Files/700.DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDataNodeStateAsync(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadDataNodeParameterAsync(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -160,31 +160,31 @@ { "cell_type": "code", "source": [ - "await UploadOpeningAsync(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" ] }, { diff --git a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb index c9eb277e..1685c887 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -52,31 +52,31 @@ { "cell_type": "code", "source": [ - "await UploadOpeningAsync(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadCashflowsAsync(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await UploadActualAsync(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\")" + "await Import.FromFile(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" ] }, { diff --git a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb index e0b58e97..69f8137a 100644 --- a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb +++ b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb @@ -443,8 +443,7 @@ "source": [ "public async Task CheckErrors(string inputFileName, List errorBms)", "\n{", - "\n var partitionId = new Guid();", - "\n var log = await UploadDataNodeParameterToWorkspaceAsync(inputFileName, partitionId);", + "\n var log = await Import.FromFile(inputFileName).WithFormat(ImportFormats.DataNodeParameter).WithTarget(Workspace).ExecuteAsync();", "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\n errorBms.Intersect(log.Errors.Select(x => x.ToString().Substring(0,x.ToString().Length-2).Substring(40)).ToArray()).Count().Should().Be(errorBms.Count());", "\n}" diff --git a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb index 12b9fc30..d75b5206 100644 --- a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb +++ b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb @@ -116,7 +116,7 @@ "cell_type": "code", "source": [ "var groupOfContract = \"GricComplex\";", - "\nawait UploadCashflowsAsync(\"Data/CashflowComplex.csv\")" + "\nawait Import.FromFile(\"Data/CashflowComplex.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" ] }, { diff --git a/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb index 8c67e92e..d5dafed5 100644 --- a/ifrs17/Constants/Consts.ipynb +++ b/ifrs17/Constants/Consts.ipynb @@ -138,7 +138,9 @@ "public static class ImportFormats{", "\n public const string Cashflow = nameof(Cashflow);", "\n public const string Actual = nameof(Actual);", + "\n public const string DataNode = nameof(DataNode);", "\n public const string DataNodeParameter = nameof(DataNodeParameter);", + "\n public const string DataNodeState = nameof(DataNodeState);", "\n public const string SimpleValue = nameof(SimpleValue);", "\n public const string Opening = nameof(Opening);", "\n public const string AocConfiguration = nameof(AocConfiguration);", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index 6be43097..8a499aa5 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -266,16 +266,14 @@ { "cell_type": "code", "source": [ - "public async Task DataNodeFactoryAsync(string file, string tab, ImportArgs args)", + "public async Task DataNodeFactoryAsync(IDataSet dataSet, string tableName, ImportArgs args)", "\n{", "\n var partition = (await DataSource.Query().Where(p => p.ReportingNode == args.ReportingNode && p.Scenario == null).ToArrayAsync()).SingleOrDefault();", "\n if(partition == null) { ApplicationMessage.Log(Error.ParsedPartitionNotFound); return; }", "\n", - "\n var extension = System.IO.Path.GetExtension(file);", - "\n var stream = await Project.FileStorage.ReadAsync(file);", - "\n var target = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet.Tables[tab];", + "\n var table = dataSet.Tables[tableName];", "\n", - "\n var dataNodesImported = target.Rows.Select(x => x.Field(nameof(RawVariable.DataNode))).ToHashSet();", + "\n var dataNodesImported = table.Rows.Select(x => x.Field(nameof(RawVariable.DataNode))).ToHashSet();", "\n var dataNodesDefined = await DataSource.Query().Where(x => dataNodesImported.Contains(x.SystemName)).ToArrayAsync();", "\n var dataNodeStatesDefined = await DataSource.Query().Select(x => x.DataNode).ToArrayAsync();", "\n var dataNodeParametersDefined = await DataSource.Query().Select(x => x.DataNode).ToArrayAsync(); ", @@ -304,24 +302,7 @@ { "cell_type": "markdown", "source": [ - "## Parse and Upload: Dimensions" - ] - }, - { - "cell_type": "code", - "source": [ - "public async Task UploadDimensionsAsync (string fileName) where T: class ", - "\n{", - "\n await CleanDatabaseAsync();", - "\n var importLog = await Import.FromFile(fileName).WithType().WithTarget(DataSource).ExecuteAsync();", - "\n return importLog;", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Analysis of Change Configuration" + "## Analysis of Change Configuration" ] }, { @@ -430,11 +411,9 @@ { "cell_type": "code", "source": [ - "public async Task GetArgsFromMainAsync(string file)", + "public async Task GetArgsFromMainAsync(IDataSet dataSet)", "\n{", - "\n var extension = System.IO.Path.GetExtension(file);", - "\n var stream = await Project.FileStorage.ReadAsync(file);", - "\n var mainTab = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet.Tables[Main];", + "\n var mainTab = dataSet.Tables[Main];", "\n ", "\n if(mainTab == null) ApplicationMessage.Log(Error.NoMainTab);", "\n if(mainTab.Rows.Count() == 0) ApplicationMessage.Log(Error.IncompleteMainTab);", @@ -471,7 +450,7 @@ { "cell_type": "markdown", "source": [ - "### Parse and Upload: Data Nodes" + "## Parse and Upload: Data Nodes" ] }, { @@ -483,7 +462,7 @@ { "cell_type": "code", "source": [ - "public async Task UploadDataNodesToWorkspaceAsync(string fileName)", + "public async Task UploadDataNodesToWorkspaceAsync(IDataSet dataSet)", "\n{", "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\n Workspace.Initialize(x => x.FromSource(DataSource)", @@ -493,7 +472,7 @@ "\n .DisableInitialization());", "\n ", "\n Activity.Start();", - "\n var args = await GetArgsFromMainAsync(fileName);", + "\n var args = await GetArgsFromMainAsync(dataSet);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", "\n var storage = new ParsingStorage(args, DataSource, Workspace);", @@ -501,7 +480,7 @@ "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", "\n var errors = new List();", - "\n var importLogPortfolios = await Import.FromFile(fileName)", + "\n var importLogPortfolios = await Import.FromDataSet(dataSet)", "\n .WithType((dataset, datarow) => new InsurancePortfolio {", "\n SystemName = datarow.Field(nameof(DataNode.SystemName)),", "\n DisplayName = datarow.Field(nameof(DataNode.DisplayName)),", @@ -526,7 +505,7 @@ "\n .ExecuteAsync();", "\n ", "\n var portfolios = await Workspace.Query().ToDictionaryAsync(x => x.SystemName);", - "\n var importLogGroupOfContracts = await Import.FromFile(fileName)", + "\n var importLogGroupOfContracts = await Import.FromDataSet(dataSet)", "\n .WithType((dataset, datarow) => {", "\n var gicSystemName = datarow.Field(nameof(DataNode.SystemName));", "\n var pf = datarow.Field(nameof(InsurancePortfolio));", @@ -586,16 +565,15 @@ { "cell_type": "code", "source": [ - "public async Task UploadDataNodesAsync(string fileName)", - "\n{", - "\n var log = await UploadDataNodesToWorkspaceAsync(fileName);", + "Import.DefineFormat(ImportFormats.DataNode, async (options, dataSet) => {", + "\n var log = await UploadDataNodesToWorkspaceAsync(dataSet);", "\n var partition = (Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode));", "\n await CommitToDatabase(partition);", "\n await CommitToDatabase(partition);", "\n await CommitToDatabase(partition);", "\n await CommitToDatabase(partition);", "\n return log;", - "\n}" + "\n});" ] }, { @@ -628,7 +606,7 @@ { "cell_type": "code", "source": [ - "public async Task UploadDataNodeStateToWorkspaceAsync(string fileName)", + "public async Task UploadDataNodeStateToWorkspaceAsync(IDataSet dataSet)", "\n{", "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\n Workspace.Initialize(x => x.FromSource(DataSource)", @@ -639,14 +617,14 @@ "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync() );", "\n ", "\n Activity.Start();", - "\n var args = await GetArgsFromMainAsync(fileName);", + "\n var args = await GetArgsFromMainAsync(dataSet);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", "\n var storage = new ParsingStorage(args, DataSource, Workspace);", "\n await storage.InitializeAsync();", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n", - "\n var importLog = await Import.FromFile(fileName).WithType(", + "\n var importLog = await Import.FromDataSet(dataSet).WithType(", "\n (dataset, datarow) => new DataNodeState {", "\n DataNode = datarow.Field(nameof(DataNodeState.DataNode)),", "\n State = (State)Enum.Parse(typeof(State), datarow.Field(nameof(DataNodeState.State))),", @@ -664,12 +642,11 @@ { "cell_type": "code", "source": [ - "public async Task UploadDataNodeStateAsync(string fileName)", - "\n{", - "\n var log = await UploadDataNodeStateToWorkspaceAsync(fileName);", + "Import.DefineFormat(ImportFormats.DataNodeState, async (options, dataSet) => {", + "\n var log = await UploadDataNodeStateToWorkspaceAsync(dataSet);", "\n await CommitToDatabase((Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode)), snapshot: false); ", "\n return log;", - "\n}" + "\n});" ] }, { @@ -681,7 +658,7 @@ { "cell_type": "code", "source": [ - "public async Task UploadDataNodeParameterToWorkspaceAsync(string fileName, Guid targetPartitionByReportingNodeId)", + "public async Task UploadDataNodeParameterToWorkspaceAsync(IDataSet dataSet, Guid targetPartitionByReportingNodeId)", "\n{", "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\n Workspace.Initialize(x => x.FromSource(DataSource)", @@ -692,7 +669,7 @@ "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync() );", "\n ", "\n Activity.Start();", - "\n var args = await GetArgsFromMainAsync(fileName) with {ImportFormat = ImportFormats.DataNodeParameter};", + "\n var args = await GetArgsFromMainAsync(dataSet) with {ImportFormat = ImportFormats.DataNodeParameter};", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n", "\n var storage = new ParsingStorage(args, DataSource, Workspace);", @@ -702,7 +679,7 @@ "\n var singleDataNode = new List();", "\n var interDataNode = new List<(string,string)>();", "\n ", - "\n var importLog = await Import.FromFile(fileName)", + "\n var importLog = await Import.FromDataSet(dataSet)", "\n .WithType( (dataset, datarow) => {", "\n", "\n //read and validate DataNodes", @@ -769,16 +746,15 @@ { "cell_type": "code", "source": [ - "public async Task UploadDataNodeParameterAsync(string fileName)", - "\n{", + "Import.DefineFormat(ImportFormats.DataNodeParameter, async (options, dataSet) => {", "\n Guid partitionId = new Guid();", - "\n var log = await UploadDataNodeParameterToWorkspaceAsync(fileName, partitionId);", + "\n var log = await UploadDataNodeParameterToWorkspaceAsync(dataSet, partitionId);", "\n ", "\n await CommitToDatabase(partitionId, snapshot: false);", "\n await CommitToDatabase(partitionId, snapshot: false); ", "\n ", "\n return log;", - "\n}" + "\n});" ] }, { @@ -813,7 +789,7 @@ { "cell_type": "code", "source": [ - "public async Task ParseCashflowsToWorkspaceAsync(string fileName, ImportArgs args)", + "public async Task ParseCashflowsToWorkspaceAsync(IDataSet dataSet, ImportArgs args)", "\n{", "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\n Workspace.Initialize(x => x.FromSource(DataSource)", @@ -825,7 +801,7 @@ "\n await parsingStorage.InitializeAsync();", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", - "\n var importLog = await Import.FromFile(fileName)", + "\n var importLog = await Import.FromDataSet(dataSet)", "\n .WithType ( (dataset, datarow) => {", "\n var aocType = datarow.Field(nameof(RawVariable.AocType));", "\n var novelty = datarow.Field(nameof(RawVariable.Novelty));", @@ -881,14 +857,13 @@ { "cell_type": "code", "source": [ - "public async Task UploadCashflowsAsync(string fileName)", - "\n{", + "Import.DefineFormat(ImportFormats.Cashflow, async (options, dataSet) => {", "\n Activity.Start();", - "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Cashflow};", - "\n await DataNodeFactoryAsync(fileName, ImportFormats.Cashflow, args);", + "\n var args = (await GetArgsFromMainAsync(dataSet)) with {ImportFormat = ImportFormats.Cashflow};", + "\n await DataNodeFactoryAsync(dataSet, ImportFormats.Cashflow, args);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", - "\n var parsingLog = await ParseCashflowsToWorkspaceAsync(fileName, args);", + "\n var parsingLog = await ParseCashflowsToWorkspaceAsync(dataSet, args);", "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", "\n ", "\n var storage = new ImportStorage(args, DataSource, Workspace);", @@ -910,7 +885,7 @@ "\n filter : x => storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode));", "\n", "\n return Activity.Finish().Merge(parsingLog); ", - "\n}" + "\n});" ] }, { @@ -922,7 +897,7 @@ { "cell_type": "code", "source": [ - "public async Task ParseActualsToWorkspaceAsync(string fileName, ImportArgs args)", + "public async Task ParseActualsToWorkspaceAsync(IDataSet dataSet, ImportArgs args)", "\n{", "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\n Workspace.Initialize(x => x.FromSource(DataSource)", @@ -934,7 +909,7 @@ "\n await parsingStorage.InitializeAsync();", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n", - "\n var importLog = await Import.FromFile(fileName)", + "\n var importLog = await Import.FromDataSet(dataSet)", "\n .WithType ( (dataset, datarow) => {", "\n var dataNode = datarow.Field(nameof(DataNode));", "\n if(!parsingStorage.DataNodeDataBySystemName.TryGetValue(dataNode, out var dataNodeData)) {", @@ -985,14 +960,13 @@ { "cell_type": "code", "source": [ - "public async Task UploadActualAsync(string fileName)", - "\n{", + "Import.DefineFormat(ImportFormats.Actual, async (options, dataSet) => {", "\n Activity.Start();", - "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Actual};", - "\n await DataNodeFactoryAsync(fileName, ImportFormats.Actual, args);", + "\n var args = (await GetArgsFromMainAsync(dataSet)) with {ImportFormat = ImportFormats.Actual};", + "\n await DataNodeFactoryAsync(dataSet, ImportFormats.Actual, args);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n", - "\n var parsingLog = await ParseActualsToWorkspaceAsync(fileName, args);", + "\n var parsingLog = await ParseActualsToWorkspaceAsync(dataSet, args);", "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", "\n", "\n var storage = new ImportStorage(args, DataSource, Workspace);", @@ -1011,7 +985,7 @@ "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode));", "\n", "\n return Activity.Finish().Merge(parsingLog);", - "\n}" + "\n});" ] }, { @@ -1029,7 +1003,7 @@ { "cell_type": "code", "source": [ - "public async Task ParseSimpleValueToWorkspaceAsync(string fileName, ImportArgs args, Guid targetPartitionByReportingNodeAndPeriodId)", + "public async Task ParseSimpleValueToWorkspaceAsync(IDataSet dataSet, ImportArgs args, Guid targetPartitionByReportingNodeAndPeriodId)", "\n{", "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\n Workspace.Initialize(x => x.FromSource(DataSource)", @@ -1042,7 +1016,7 @@ "\n await parsingStorage.InitializeAsync();", "\n if(Activity.HasErrors()) return Activity.Finish(); ", "\n", - "\n var importLog = await Import.FromFile(fileName)", + "\n var importLog = await Import.FromDataSet(dataSet)", "\n .WithType ( (dataset, datarow) => {", "\n var dataNode = parsingStorage.ValidateDataNode(datarow.Field(nameof(DataNode)));", "\n var amountType = parsingStorage.ValidateAmountType(datarow.Field(nameof(IfrsVariable.AmountType)));", @@ -1101,15 +1075,14 @@ { "cell_type": "code", "source": [ - "public async Task UploadSimpleValueAsync(string fileName)", - "\n{", + "Import.DefineFormat(ImportFormats.SimpleValue, async (options, dataSet) => {", "\n Activity.Start();", - "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.SimpleValue};", - "\n await DataNodeFactoryAsync(fileName, ImportFormats.SimpleValue, args);", + "\n var args = (await GetArgsFromMainAsync(dataSet)) with {ImportFormat = ImportFormats.SimpleValue};", + "\n await DataNodeFactoryAsync(dataSet, ImportFormats.SimpleValue, args);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", "\n Guid partitionId = new Guid();", - "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(fileName, args, partitionId);", + "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(dataSet, args, partitionId);", "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", "\n ", "\n Workspace.Query().Select(v => new {v.DataNode, v.AccidentYear}).Distinct();", @@ -1119,7 +1092,7 @@ "\n filter : x => Workspace.Query().Select(v => v.DataNode).Distinct().Contains(x.DataNode));", "\n ", "\n return Activity.Finish().Merge(parsingLog);", - "\n}" + "\n});" ] }, { @@ -1131,15 +1104,14 @@ { "cell_type": "code", "source": [ - "public async Task UploadOpeningAsync(string fileName)", - "\n{", + "Import.DefineFormat(ImportFormats.Opening, async (options, dataSet) => {", "\n Activity.Start();", - "\n var args = (await GetArgsFromMainAsync(fileName)) with {ImportFormat = ImportFormats.Opening};", - "\n await DataNodeFactoryAsync(fileName, ImportFormats.Opening, args);", + "\n var args = (await GetArgsFromMainAsync(dataSet)) with {ImportFormat = ImportFormats.Opening};", + "\n await DataNodeFactoryAsync(dataSet, ImportFormats.Opening, args);", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n ", "\n Guid partitionId = new Guid();", - "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(fileName, args, partitionId);", + "\n var parsingLog = await ParseSimpleValueToWorkspaceAsync(dataSet, args, partitionId);", "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", "\n ", "\n var storage = new ImportStorage(args, DataSource, Workspace);", @@ -1158,7 +1130,7 @@ "\n storage.DataNodesByImportScope[ImportScope.Primary].Contains(x.DataNode ));", "\n", "\n return Activity.Finish().Merge(parsingLog);", - "\n}" + "\n});" ] }, { From 75c5f79079d733b543e921d4563ac93164077e7c Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Thu, 3 Nov 2022 18:23:48 +0100 Subject: [PATCH 19/43] Package update (#65) * update packages * add anchors --- ifrs17/DataModel/DataStructure.ipynb | 23 ++++++++++++----------- ifrs17/Report/ReportScopes.ipynb | 6 ++++-- ifrs17/Utils/ApplicationMessage.ipynb | 2 +- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index 4c88153d..2c3fac39 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -43,17 +43,18 @@ { "cell_type": "code", "source": [ - "#r \"nuget:Systemorph.Arithmetics,1.5.4\"", - "\n#r \"nuget:Systemorph.Workspace,1.5.0\"", - "\n#r \"nuget:Systemorph.Scopes,1.5.2\"", - "\n#r \"nuget:Systemorph.Import,1.5.0\"", - "\n#r \"nuget:Systemorph.Test,1.5.2\"", - "\n#r \"nuget:Systemorph.Export,1.5.0\"", - "\n#r \"nuget:Systemorph.DataSetReader,1.5.0\"", - "\n#r \"nuget:Systemorph.DataSource,1.5.0\"", - "\n#r \"nuget:Systemorph.DataSource.Conversions,1.5.0\"", - "\n#r \"nuget:Systemorph.Reporting,1.5.2\"", - "\n#r \"nuget:Systemorph.DomainDesigner,1.5.0\"" + "#r \"nuget:Systemorph.Arithmetics,1.5.5\"", + "\n#r \"nuget:Systemorph.Workspace,1.5.3\"", + "\n#r \"nuget:Systemorph.Scopes,1.5.5\"", + "\n#r \"nuget:Systemorph.Import,1.5.1\"", + "\n#r \"nuget:Systemorph.Test,1.5.5\"", + "\n#r \"nuget:Systemorph.Export,1.5.1\"", + "\n#r \"nuget:Systemorph.DataSetReader,1.5.1\"", + "\n#r \"nuget:Systemorph.DataSource,1.5.3\"", + "\n#r \"nuget:Systemorph.DataSource.Conversions,1.5.3\"", + "\n#r \"nuget:Systemorph.Reporting,1.5.5\"", + "\n#r \"nuget:Systemorph.DomainDesigner,1.5.1\"", + "\n#r \"nuget:Systemorph.SharePoint,1.5.6\"" ] }, { diff --git a/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb index f6a51b88..b6fd584d 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -379,7 +379,8 @@ { "cell_type": "markdown", "source": [ - "## LIC (Liability for Incurred Claims)", + "", + "\n## LIC (Liability for Incurred Claims)", "\n", "\nLiability of Incurred Claims (LIC) report includes the contributions from [Lic Actuarial](#lic-actuarial) (Fullfilment Cashflow), [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." ] @@ -427,7 +428,8 @@ { "cell_type": "markdown", "source": [ - "## LRC (Liability for Remaining Coverage)", + "", + "\n## LRC (Liability for Remaining Coverage)", "\n", "\nLiability for Remaining Coverage (LRC) report includes all the contributions from [LRC Actuarial](#lrc-actuarial) (Fulfillment Cashflow, Contructual Sevice Margin, Loss Component, Loss Recovery Component) and, [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." ] diff --git a/ifrs17/Utils/ApplicationMessage.ipynb b/ifrs17/Utils/ApplicationMessage.ipynb index f2253bd6..e55e688c 100644 --- a/ifrs17/Utils/ApplicationMessage.ipynb +++ b/ifrs17/Utils/ApplicationMessage.ipynb @@ -27,7 +27,7 @@ { "cell_type": "code", "source": [ - "#r \"nuget:Systemorph.Activities,1.5.1\"" + "#r \"nuget:Systemorph.Activities,1.5.5\"" ] }, { From 64e2243828c8cfab351ba93851860e4cf97cb1f9 Mon Sep 17 00:00:00 2001 From: Daniel Trzesniak Date: Fri, 4 Nov 2022 09:28:25 +0100 Subject: [PATCH 20/43] Fixing AA and OA opening and benchmark simple importer (#57) * Fixing input data * Workaround for bm generation * Fixed GetSign * Inputs * Fixed Importers * add some doc * fixed CU * Dirty fix on signs * undo CU sign * wip * Fix signs * Init * fix * fix * exclude simple value from test * some partial fix * Full fix --- .../Actuals_CH_2020_12.csv | 56 ++-- .../Actuals_CH_2021_3.csv | 114 +++---- .../NominalCashflows_CH_2020_12.csv | 160 +++++----- .../NominalCashflows_CH_2021_3.csv | 296 +++++++++--------- .../Openings_CH_2020_12.csv | 4 +- .../InitSystemorphToMemory.ipynb | 2 +- ...ableBenchmarks_2020_12_CH__Contractual.csv | 59 ++++ .../Test/ExportReportVariables.ipynb | 30 +- .../Test/IfrsVariablesTest.ipynb | 11 +- .../Test/SpecificationsImportCashflows.ipynb | 23 +- ifrs17/Constants/Consts.ipynb | 82 ++--- ifrs17/Import/ImportScopeCalculation.ipynb | 34 +- ifrs17/Import/Importers.ipynb | 7 +- ifrs17/Utils/ImportCalculationMethods.ipynb | 6 +- 14 files changed, 486 insertions(+), 398 deletions(-) diff --git a/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv index 12bfc994..9a97158a 100644 --- a/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv +++ b/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv @@ -3,31 +3,31 @@ ReportingNode,Year,Month,, CH,2020,12,, @@Actual,,,, DataNode,AocType,ValueType,AccidentYear,Value -DT1.1,CF,PR,,-400 -DT1.1,CF,NIC,,280 -DT1.1,CF,ACA,,10 -DT1.1,CF,AEA,,5 -DT1.2,CF,NIC,2020,280 -DT2.1,CF,PR,,-400 -DT2.1,CF,NIC,,280 -DT2.1,CF,ACA,,10 -DT2.1,CF,AEA,,5 -DT1.3,CF,PR,,-400 -DT1.3,CF,NIC,,280 -DT1.3,CF,ACA,,10 -DT1.3,CF,AEA,,5 -DT2.2,CF,NIC,2020,280 -DTR1.1,CF,PR,,200 -DTR1.1,CF,NIC,,-140 -DTR1.2,CF,NIC,2020,-140 -DTR2.1,CF,PR,,200 -DTR2.1,CF,NIC,,-140 -DTR2.2,CF,NIC,2020,-140 -DT3.1,CF,PR,,-400 -DT3.1,CF,NIC,,280 -DT3.1,CF,ACA,,10 -DT3.1,CF,AEA,,5 -DT4.1,CF,PR,,-400 -DT4.1,CF,NIC,,280 -DT4.1,CF,ACA,,10 -DT4.1,CF,AEA,,5 +DT1.1,CF,PR,,400 +DT1.1,CF,NIC,,-280 +DT1.1,CF,ACA,,-10 +DT1.1,CF,AEA,,-5 +DT1.2,CF,NIC,2020,-280 +DT2.1,CF,PR,,400 +DT2.1,CF,NIC,,-280 +DT2.1,CF,ACA,,-10 +DT2.1,CF,AEA,,-5 +DT1.3,CF,PR,,400 +DT1.3,CF,NIC,,-280 +DT1.3,CF,ACA,,-10 +DT1.3,CF,AEA,,-5 +DT2.2,CF,NIC,2020,-280 +DTR1.1,CF,PR,,-200 +DTR1.1,CF,NIC,,140 +DTR1.2,CF,NIC,2020,140 +DTR2.1,CF,PR,,-200 +DTR2.1,CF,NIC,,140 +DTR2.2,CF,NIC,2020,140 +DT3.1,CF,PR,,400 +DT3.1,CF,NIC,,-280 +DT3.1,CF,ACA,,-10 +DT3.1,CF,AEA,,-5 +DT4.1,CF,PR,,400 +DT4.1,CF,NIC,,-280 +DT4.1,CF,ACA,,-10 +DT4.1,CF,AEA,,-5 diff --git a/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv b/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv index d52bae26..e68c8a90 100644 --- a/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv +++ b/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv @@ -3,60 +3,60 @@ ReportingNode,Year,Month,, CH,2021,3,, @@Actual,,,, DataNode,AocType,ValueType,AccidentYear,Value -DT1.1,WO,PayablePR,,-4 -DT1.1,WO,ReceivablePR,,2 -DT1.1,CF,PayablePR,,5 -DT1.1,CF,ReceivablePR,,-3 -DT1.1,CF,PR,,-90 -DT1.1,CF,ICO,,6 -DT1.1,CF,NIC,,70 -DT1.1,CF,ACA,,10 -DT1.1,CF,AEA,,5 -DT1.2,CF,NIC,2020,76 -DT1.3,WO,PayablePR,,-4 -DT1.3,WO,ReceivablePR,,2 -DT1.3,CF,PayablePR,,5 -DT1.3,CF,ReceivablePR,,-3 -DT1.3,CF,PR,,-90 -DT1.3,CF,ICO,,6 -DT1.3,CF,NIC,,70 -DT1.3,CF,ACA,,10 -DT1.3,CF,AEA,,5 -DT2.1,WO,PayablePR,,-4 -DT2.1,WO,ReceivablePR,,2 -DT2.1,CF,PayablePR,,5 -DT2.1,CF,ReceivablePR,,-3 -DT2.1,CF,PR,,-90 -DT2.1,CF,ICO,,6 -DT2.1,CF,NIC,,70 -DT2.1,CF,ACA,,10 -DT2.1,CF,AEA,,5 -DT2.2,CF,NIC,2020,76 -DTR1.1,CF,PayablePR,,-2 -DTR1.1,CF,ReceivablePR,,1.5 -DTR1.1,CF,PR,,45 -DTR1.1,CF,NIC,,-35 -DTR1.2,CF,NIC,2020,-35 -DTR2.1,CF,PayablePR,,-2 -DTR2.1,CF,ReceivablePR,,1.5 -DTR2.1,CF,PR,,45 -DTR2.1,CF,NIC,,-35 -DTR2.2,CF,NIC,2020,-35 -DT3.1,WO,PayablePR,,-4 -DT3.1,WO,ReceivablePR,,2 -DT3.1,CF,PayablePR,,5 -DT3.1,CF,ReceivablePR,,-3 -DT3.1,CF,PR,,-90 -DT3.1,CF,ICO,,6 -DT3.1,CF,NIC,,70 -DT3.1,CF,ACA,,10 -DT3.1,CF,AEA,,5 -DT4.1,WO,PayablePR,,-4 -DT4.1,WO,ReceivablePR,,2 -DT4.1,CF,PayablePR,,5 -DT4.1,CF,ReceivablePR,,-3 -DT4.1,CF,PR,,-90 -DT4.1,CF,ICO,,6 -DT4.1,CF,NIC,,70 -DT4.1,CF,ACA,,10 -DT4.1,CF,AEA,,5 +DT1.1,WO,PayablePR,,4 +DT1.1,WO,ReceivablePR,,-2 +DT1.1,CF,PayablePR,,-5 +DT1.1,CF,ReceivablePR,,3 +DT1.1,CF,PR,,90 +DT1.1,CF,ICO,,-6 +DT1.1,CF,NIC,,-70 +DT1.1,CF,ACA,,-10 +DT1.1,CF,AEA,,-5 +DT1.2,CF,NIC,2020,-76 +DT1.3,WO,PayablePR,,4 +DT1.3,WO,ReceivablePR,,-2 +DT1.3,CF,PayablePR,,-5 +DT1.3,CF,ReceivablePR,,3 +DT1.3,CF,PR,,90 +DT1.3,CF,ICO,,-6 +DT1.3,CF,NIC,,-70 +DT1.3,CF,ACA,,-10 +DT1.3,CF,AEA,,-5 +DT2.1,WO,PayablePR,,4 +DT2.1,WO,ReceivablePR,,-2 +DT2.1,CF,PayablePR,,-5 +DT2.1,CF,ReceivablePR,,3 +DT2.1,CF,PR,,90 +DT2.1,CF,ICO,,-6 +DT2.1,CF,NIC,,-70 +DT2.1,CF,ACA,,-10 +DT2.1,CF,AEA,,-5 +DT2.2,CF,NIC,2020,-76 +DTR1.1,CF,PayablePR,,2 +DTR1.1,CF,ReceivablePR,,-1.5 +DTR1.1,CF,PR,,-45 +DTR1.1,CF,NIC,,35 +DTR1.2,CF,NIC,2020,35 +DTR2.1,CF,PayablePR,,2 +DTR2.1,CF,ReceivablePR,,-1.5 +DTR2.1,CF,PR,,-45 +DTR2.1,CF,NIC,,35 +DTR2.2,CF,NIC,2020,35 +DT3.1,WO,PayablePR,,4 +DT3.1,WO,ReceivablePR,,-2 +DT3.1,CF,PayablePR,,-5 +DT3.1,CF,ReceivablePR,,3 +DT3.1,CF,PR,,90 +DT3.1,CF,ICO,,-6 +DT3.1,CF,NIC,,-70 +DT3.1,CF,ACA,,-10 +DT3.1,CF,AEA,,-5 +DT4.1,WO,PayablePR,,4 +DT4.1,WO,ReceivablePR,,-2 +DT4.1,CF,PayablePR,,-5 +DT4.1,CF,ReceivablePR,,3 +DT4.1,CF,PR,,90 +DT4.1,CF,ICO,,-6 +DT4.1,CF,NIC,,-70 +DT4.1,CF,ACA,,-10 +DT4.1,CF,AEA,,-5 diff --git a/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv index 8808da31..54bd5acd 100644 --- a/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv +++ b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv @@ -3,83 +3,83 @@ ReportingNode,Year,Month,Scenario,,,,,,,,,,,,,,,,,,,,,,,,, CH,2020,12,,,,,,,,,,,,,,,,,,,,,,,,,, @@Cashflow,,,,,,,,,,,,,,,,,,,,,,,,,,,, DataNode,AmountType,AocType,Novelty,AccidentYear,Values0,Values1,Values2,Values3,Values4,Values5,Values6,Values7,Values8,Values9,Values10,Values11,Values12,Values13,Values14,Values15,Values16,Values17,Values18,Values19,Values20,Values21,Values22,Values23 -DT1.1,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT1.1,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT1.1,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT1.1,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT1.1,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT1.1,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT1.1,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT1.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT1.2,NIC,BOP,N,2020,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT1.2,CU,BOP,N,2020,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT1.2,RA,BOP,N,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT1.2,NIC,CL,C,2020,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT1.2,CU,CL,C,2020,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT1.2,RA,CL,C,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT1.3,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT1.3,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT1.3,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT1.3,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT1.3,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT1.3,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT1.3,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT1.3,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT2.1,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT2.1,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT2.1,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT2.1,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT2.1,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT2.1,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT2.1,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT2.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT2.2,NIC,BOP,N,2020,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT2.2,CU,BOP,N,2020,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT2.2,RA,BOP,N,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT2.2,NIC,CL,C,2020,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT2.2,CU,CL,C,2020,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT2.2,RA,CL,C,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DTR1.1,PR,BOP,N,,50,0,0,50,0,0,50,0,0,50,0,0,0,50,0,0,50,0,0,50,0,0,50,0 -DTR1.1,NIC,BOP,N,,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 -DTR1.1,CU,BOP,N,,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 -DTR1.1,RA,BOP,N,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 -DTR1.1,PR,CL,C,,50,0,0,50,0,0,50,0,0,50,0,0,0,50,0,0,50,0,0,50,0,0,50,0 -DTR1.1,NIC,CL,C,,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 -DTR1.1,CU,CL,C,,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 -DTR1.1,RA,CL,C,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 -DTR1.2,NIC,BOP,N,2020,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 -DTR1.2,CU,BOP,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 -DTR1.2,RA,BOP,N,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 -DTR1.2,NIC,CL,C,2020,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 -DTR1.2,CU,CL,C,2020,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 -DTR1.2,RA,CL,C,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 -DTR2.1,PR,BOP,N,,50,0,0,50,0,0,50,0,0,50,0,0,0,50,0,0,50,0,0,50,0,0,50,0 -DTR2.1,NIC,BOP,N,,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 -DTR2.1,CU,BOP,N,,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 -DTR2.1,RA,BOP,N,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 -DTR2.1,PR,CL,C,,50,0,0,50,0,0,50,0,0,50,0,0,0,50,0,0,50,0,0,50,0,0,50,0 -DTR2.1,NIC,CL,C,,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 -DTR2.1,CU,CL,C,,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 -DTR2.1,RA,CL,C,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 -DTR2.2,NIC,BOP,N,2020,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 -DTR2.2,CU,BOP,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 -DTR2.2,RA,BOP,N,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 -DTR2.2,NIC,CL,C,2020,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5,-12.5 -DTR2.2,CU,CL,C,2020,5,5,5,5,5,5,5,5,5,5,5,5,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5 -DTR2.2,RA,CL,C,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25 -DT3.1,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT3.1,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT3.1,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT3.1,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT3.1,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT3.1,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT3.1,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT3.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT4.1,PR,BOP,N,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT4.1,NIC,BOP,N,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT4.1,CU,BOP,N,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT4.1,RA,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 -DT4.1,PR,CL,C,,-100,0,0,-100,0,0,-100,0,0,-100,0,0,0,-100,0,0,-100,0,0,-100,0,0,-100,0 -DT4.1,NIC,CL,C,,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 -DT4.1,CU,CL,C,,10,10,10,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5,5,5,5,5,5,3 -DT4.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5 +DT1.1,PR,BOP,N,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT1.1,NIC,BOP,N,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.1,CU,BOP,N,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.1,RA,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT1.1,PR,CL,C,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT1.1,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.1,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT1.2,NIC,BOP,N,2020,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.2,CU,BOP,N,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.2,RA,BOP,N,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT1.2,NIC,CL,C,2020,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.2,CU,CL,C,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.2,RA,CL,C,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT1.3,PR,BOP,N,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT1.3,NIC,BOP,N,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.3,CU,BOP,N,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.3,RA,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT1.3,PR,CL,C,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT1.3,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.3,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.3,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT2.1,PR,BOP,N,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT2.1,NIC,BOP,N,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT2.1,CU,BOP,N,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT2.1,RA,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT2.1,PR,CL,C,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT2.1,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT2.1,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT2.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT2.2,NIC,BOP,N,2020,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT2.2,CU,BOP,N,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT2.2,RA,BOP,N,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT2.2,NIC,CL,C,2020,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT2.2,CU,CL,C,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT2.2,RA,CL,C,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DTR1.1,PR,BOP,N,,-50,0,0,-50,0,0,-50,0,0,-50,0,0,0,-50,0,0,-50,0,0,-50,0,0,-50,0 +DTR1.1,NIC,BOP,N,,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR1.1,CU,BOP,N,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR1.1,RA,BOP,N,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR1.1,PR,CL,C,,-50,0,0,-50,0,0,-50,0,0,-50,0,0,0,-50,0,0,-50,0,0,-50,0,0,-50,0 +DTR1.1,NIC,CL,C,,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR1.1,CU,CL,C,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR1.1,RA,CL,C,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR1.2,NIC,BOP,N,2020,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR1.2,CU,BOP,N,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR1.2,RA,BOP,N,2020,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR1.2,NIC,CL,C,2020,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR1.2,CU,CL,C,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR1.2,RA,CL,C,2020,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR2.1,PR,BOP,N,,-50,0,0,-50,0,0,-50,0,0,-50,0,0,0,-50,0,0,-50,0,0,-50,0,0,-50,0 +DTR2.1,NIC,BOP,N,,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR2.1,CU,BOP,N,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR2.1,RA,BOP,N,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR2.1,PR,CL,C,,-50,0,0,-50,0,0,-50,0,0,-50,0,0,0,-50,0,0,-50,0,0,-50,0,0,-50,0 +DTR2.1,NIC,CL,C,,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR2.1,CU,CL,C,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR2.1,RA,CL,C,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR2.2,NIC,BOP,N,2020,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR2.2,CU,BOP,N,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR2.2,RA,BOP,N,2020,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR2.2,NIC,CL,C,2020,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR2.2,CU,CL,C,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR2.2,RA,CL,C,2020,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DT3.1,PR,BOP,N,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT3.1,NIC,BOP,N,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT3.1,CU,BOP,N,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT3.1,RA,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT3.1,PR,CL,C,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT3.1,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT3.1,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT3.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT4.1,PR,BOP,N,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT4.1,NIC,BOP,N,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT4.1,CU,BOP,N,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT4.1,RA,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT4.1,PR,CL,C,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT4.1,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT4.1,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT4.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 diff --git a/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv index 7bd3bdce..f8a3818c 100644 --- a/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv +++ b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv @@ -3,156 +3,156 @@ ReportingNode,Year,Month,,,,,,,,,,,,,,,,,,,,,,, CH,2021,3,,,,,,,,,,,,,,,,,,,,,,, @@Cashflow,,,,,,,,,,,,,,,,,,,,,,,,, DataNode,AmountType,AocType,Novelty,AccidentYear,Values0,Values1,Values2,Values3,Values4,Values5,Values6,Values7,Values8,Values9,Values10,Values11,Values12,Values13,Values14,Values15,Values16,Values17,Values18,Values19,Values20 -DT1.1,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 -DT1.1,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 -DT1.1,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 -DT1.1,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 -DT1.1,PR,BOP,N,,0,-10,0,0,-10,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0 -DT1.1,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT1.1,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 -DT1.1,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT1.1,PR,EV,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 -DT1.1,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT1.1,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 -DT1.1,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 -DT1.1,PR,CL,C,,0,-115,0,0,-115,0,0,-115,0,0,-115,0,0,0,0,0,0,0,0,0,0 -DT1.1,ICO,CL,C,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT1.1,NIC,CL,C,,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0 -DT1.1,CU,CL,C,,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 -DT1.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 -DT1.2,NIC,MC,I,2020,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 -DT1.2,CU,MC,I,2020,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 -DT1.2,RA,MC,I,2020,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 -DT1.2,NIC,BOP,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 -DT1.2,RA,BOP,N,2020,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT1.2,NIC,EV,N,2020,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 -DT1.2,RA,EV,N,2020,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 -DT1.2,NIC,CL,C,2020,30,30,30,30,30,30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0 -DT1.2,CU,CL,C,2020,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 -DT1.2,RA,CL,C,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 -DT1.3,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 -DT1.3,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 -DT1.3,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 -DT1.3,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 -DT1.3,PR,BOP,N,,0,-10,0,0,-10,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0 -DT1.3,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT1.3,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 -DT1.3,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT1.3,PR,EV,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 -DT1.3,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT1.3,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 -DT1.3,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 -DT1.3,PR,CL,C,,0,-115,0,0,-115,0,0,-115,0,0,-115,0,0,0,0,0,0,0,0,0,0 -DT1.3,ICO,CL,C,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT1.3,NIC,CL,C,,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0 -DT1.3,CU,CL,C,,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 -DT1.3,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 -DT2.1,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 -DT2.1,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 -DT2.1,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 -DT2.1,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 -DT2.1,PR,BOP,N,,0,-10,0,0,-10,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0 -DT2.1,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT2.1,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 -DT2.1,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT2.1,PR,EV,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 -DT2.1,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT2.1,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 -DT2.1,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 -DT2.1,PR,CL,C,,0,-115,0,0,-115,0,0,-115,0,0,-115,0,0,0,0,0,0,0,0,0,0 -DT2.1,ICO,CL,C,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT2.1,NIC,CL,C,,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0 -DT2.1,CU,CL,C,,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 -DT2.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 -DT2.2,NIC,MC,I,2020,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 -DT2.2,CU,MC,I,2020,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 -DT2.2,RA,MC,I,2020,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 -DT2.2,NIC,BOP,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 -DT2.2,RA,BOP,N,2020,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT2.2,NIC,EV,N,2020,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 -DT2.2,RA,EV,N,2020,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 -DT2.2,NIC,CL,C,2020,30,30,30,30,30,30,30,30,30,30,30,30,0,0,0,0,0,0,0,0,0 -DT2.2,CU,CL,C,2020,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 -DT2.2,RA,CL,C,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 -DTR1.1,PR,MC,I,,0,55,0,0,55,0,0,55,0,0,55,0,0,0,0,0,0,0,0,0,0 -DTR1.1,NIC,MC,I,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 -DTR1.1,CU,MC,I,,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5,0,0,0,0,0,0,0,0,0 -DTR1.1,RA,MC,I,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 -DTR1.1,PR,BOP,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 -DTR1.1,NIC,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 -DTR1.1,RA,BOP,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 -DTR1.1,PR,EV,N,,0,2.5,0,0,2.5,0,0,2.5,0,0,2.5,0,0,0,0,0,0,0,0,0,0 -DTR1.1,NIC,EV,N,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 -DTR1.1,RA,EV,N,,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,0,0,0,0,0,0,0,0,0 -DTR1.1,PR,CL,C,,0,57.5,0,0,57.5,0,0,57.5,0,0,57.5,0,0,0,0,0,0,0,0,0,0 -DTR1.1,NIC,CL,C,,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,0,0,0,0,0,0,0,0,0 -DTR1.1,CU,CL,C,,7.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,2.5,0,0,0,0,0,0,0,0,0 -DTR1.1,RA,CL,C,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,0,0,0,0,0,0,0,0,0 -DTR1.2,NIC,MC,I,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 -DTR1.2,CU,MC,I,2020,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5,0,0,0,0,0,0,0,0,0 -DTR1.2,RA,MC,I,2020,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 -DTR1.2,NIC,BOP,N,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 -DTR1.2,RA,BOP,N,2020,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 -DTR1.2,NIC,EV,N,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 -DTR1.2,RA,EV,N,2020,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,0,0,0,0,0,0,0,0,0 -DTR1.2,NIC,CL,C,2020,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,0,0,0,0,0,0,0,0,0 -DTR1.2,CU,CL,C,2020,7.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,2.5,0,0,0,0,0,0,0,0,0 -DTR1.2,RA,CL,C,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,0,0,0,0,0,0,0,0,0 -DTR2.1,PR,MC,I,,0,55,0,0,55,0,0,55,0,0,55,0,0,0,0,0,0,0,0,0,0 -DTR2.1,NIC,MC,I,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 -DTR2.1,CU,MC,I,,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5,0,0,0,0,0,0,0,0,0 -DTR2.1,RA,MC,I,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 -DTR2.1,PR,BOP,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 -DTR2.1,NIC,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 -DTR2.1,RA,BOP,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 -DTR2.1,PR,EV,N,,0,2.5,0,0,2.5,0,0,2.5,0,0,2.5,0,0,0,0,0,0,0,0,0,0 -DTR2.1,NIC,EV,N,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 -DTR2.1,RA,EV,N,,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,0,0,0,0,0,0,0,0,0 -DTR2.1,PR,CL,C,,0,57.5,0,0,57.5,0,0,57.5,0,0,57.5,0,0,0,0,0,0,0,0,0,0 -DTR2.1,NIC,CL,C,,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,0,0,0,0,0,0,0,0,0 -DTR2.1,CU,CL,C,,7.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,2.5,0,0,0,0,0,0,0,0,0 -DTR2.1,RA,CL,C,,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,0,0,0,0,0,0,0,0,0 -DTR2.2,NIC,MC,I,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 -DTR2.2,CU,MC,I,2020,5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,1.5,0,0,0,0,0,0,0,0,0 -DTR2.2,RA,MC,I,2020,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 -DTR2.2,NIC,BOP,N,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 -DTR2.2,RA,BOP,N,2020,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 -DTR2.2,NIC,EV,N,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 -DTR2.2,RA,EV,N,2020,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,-0.25,0,0,0,0,0,0,0,0,0 -DTR2.2,NIC,CL,C,2020,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,0,0,0,0,0,0,0,0,0 -DTR2.2,CU,CL,C,2020,7.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,2.5,0,0,0,0,0,0,0,0,0 -DTR2.2,RA,CL,C,2020,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,-1.25,0,0,0,0,0,0,0,0,0 -DT3.1,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 -DT3.1,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 -DT3.1,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 -DT3.1,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 -DT3.1,PR,BOP,N,,0,-10,0,0,-10,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0 -DT3.1,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT3.1,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 -DT3.1,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT3.1,PR,EV,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 -DT3.1,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT3.1,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 -DT3.1,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DT1.1,PR,MC,I,,0,110,0,0,110,0,0,110,0,0,110,0,0,0,0,0,0,0,0,0,0 +DT1.1,NIC,MC,I,,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,0,0,0,0,0,0,0,0,0 +DT1.1,CU,MC,I,,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3,0,0,0,0,0,0,0,0,0 +DT1.1,RA,MC,I,,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,0 +DT1.1,PR,BOP,N,,0,10,0,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0 +DT1.1,ICO,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.1,NIC,BOP,N,,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,0,0,0,0,0,0,0,0,0 +DT1.1,RA,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.1,PR,EV,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 +DT1.1,ICO,EV,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.1,NIC,EV,N,,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,0,0,0,0,0,0,0,0,0 +DT1.1,RA,EV,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DT1.1,PR,CL,C,,0,115,0,0,115,0,0,115,0,0,115,0,0,0,0,0,0,0,0,0,0 +DT1.1,ICO,CL,C,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.1,NIC,CL,C,,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,0,0,0,0,0,0,0,0,0 +DT1.1,CU,CL,C,,-15,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-5,0,0,0,0,0,0,0,0,0 +DT1.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DT1.2,NIC,MC,I,2020,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,0,0,0,0,0,0,0,0,0 +DT1.2,CU,MC,I,2020,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3,0,0,0,0,0,0,0,0,0 +DT1.2,RA,MC,I,2020,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,0 +DT1.2,NIC,BOP,N,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 +DT1.2,RA,BOP,N,2020,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.2,NIC,EV,N,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 +DT1.2,RA,EV,N,2020,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DT1.2,NIC,CL,C,2020,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,0,0,0,0,0,0,0,0,0 +DT1.2,CU,CL,C,2020,-15,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-5,0,0,0,0,0,0,0,0,0 +DT1.2,RA,CL,C,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DT1.3,PR,MC,I,,0,110,0,0,110,0,0,110,0,0,110,0,0,0,0,0,0,0,0,0,0 +DT1.3,NIC,MC,I,,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,0,0,0,0,0,0,0,0,0 +DT1.3,CU,MC,I,,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3,0,0,0,0,0,0,0,0,0 +DT1.3,RA,MC,I,,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,0 +DT1.3,PR,BOP,N,,0,10,0,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0 +DT1.3,ICO,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.3,NIC,BOP,N,,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,0,0,0,0,0,0,0,0,0 +DT1.3,RA,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.3,PR,EV,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 +DT1.3,ICO,EV,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.3,NIC,EV,N,,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,0,0,0,0,0,0,0,0,0 +DT1.3,RA,EV,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DT1.3,PR,CL,C,,0,115,0,0,115,0,0,115,0,0,115,0,0,0,0,0,0,0,0,0,0 +DT1.3,ICO,CL,C,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.3,NIC,CL,C,,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,0,0,0,0,0,0,0,0,0 +DT1.3,CU,CL,C,,-15,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-5,0,0,0,0,0,0,0,0,0 +DT1.3,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DT2.1,PR,MC,I,,0,110,0,0,110,0,0,110,0,0,110,0,0,0,0,0,0,0,0,0,0 +DT2.1,NIC,MC,I,,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,0,0,0,0,0,0,0,0,0 +DT2.1,CU,MC,I,,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3,0,0,0,0,0,0,0,0,0 +DT2.1,RA,MC,I,,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,0 +DT2.1,PR,BOP,N,,0,10,0,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0 +DT2.1,ICO,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT2.1,NIC,BOP,N,,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,0,0,0,0,0,0,0,0,0 +DT2.1,RA,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT2.1,PR,EV,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 +DT2.1,ICO,EV,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT2.1,NIC,EV,N,,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,0,0,0,0,0,0,0,0,0 +DT2.1,RA,EV,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DT2.1,PR,CL,C,,0,115,0,0,115,0,0,115,0,0,115,0,0,0,0,0,0,0,0,0,0 +DT2.1,ICO,CL,C,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT2.1,NIC,CL,C,,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,0,0,0,0,0,0,0,0,0 +DT2.1,CU,CL,C,,-15,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-5,0,0,0,0,0,0,0,0,0 +DT2.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DT2.2,NIC,MC,I,2020,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,0,0,0,0,0,0,0,0,0 +DT2.2,CU,MC,I,2020,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3,0,0,0,0,0,0,0,0,0 +DT2.2,RA,MC,I,2020,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,0 +DT2.2,NIC,BOP,N,2020,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,0,0,0,0,0,0,0,0,0 +DT2.2,RA,BOP,N,2020,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT2.2,NIC,EV,N,2020,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,0,0,0,0,0,0,0,0,0 +DT2.2,RA,EV,N,2020,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DT2.2,NIC,CL,C,2020,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,0,0,0,0,0,0,0,0,0 +DT2.2,CU,CL,C,2020,-15,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-5,0,0,0,0,0,0,0,0,0 +DT2.2,RA,CL,C,2020,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR1.1,PR,MC,I,,0,-55,0,0,-55,0,0,-55,0,0,-55,0,0,0,0,0,0,0,0,0,0 +DTR1.1,NIC,MC,I,,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 +DTR1.1,CU,MC,I,,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5,0,0,0,0,0,0,0,0,0 +DTR1.1,RA,MC,I,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DTR1.1,PR,BOP,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 +DTR1.1,NIC,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DTR1.1,RA,BOP,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DTR1.1,PR,EV,N,,0,-2.5,0,0,-2.5,0,0,-2.5,0,0,-2.5,0,0,0,0,0,0,0,0,0,0 +DTR1.1,NIC,EV,N,,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 +DTR1.1,RA,EV,N,,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0,0,0,0,0,0,0,0,0 +DTR1.1,PR,CL,C,,0,-57.5,0,0,-57.5,0,0,-57.5,0,0,-57.5,0,0,0,0,0,0,0,0,0,0 +DTR1.1,NIC,CL,C,,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0 +DTR1.1,CU,CL,C,,-7.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR1.1,RA,CL,C,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,0,0,0,0,0,0,0,0,0 +DTR1.2,NIC,MC,I,2020,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 +DTR1.2,CU,MC,I,2020,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5,0,0,0,0,0,0,0,0,0 +DTR1.2,RA,MC,I,2020,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DTR1.2,NIC,BOP,N,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DTR1.2,RA,BOP,N,2020,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DTR1.2,NIC,EV,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 +DTR1.2,RA,EV,N,2020,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0,0,0,0,0,0,0,0,0 +DTR1.2,NIC,CL,C,2020,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0 +DTR1.2,CU,CL,C,2020,-7.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR1.2,RA,CL,C,2020,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,0,0,0,0,0,0,0,0,0 +DTR2.1,PR,MC,I,,0,-55,0,0,-55,0,0,-55,0,0,-55,0,0,0,0,0,0,0,0,0,0 +DTR2.1,NIC,MC,I,,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 +DTR2.1,CU,MC,I,,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5,0,0,0,0,0,0,0,0,0 +DTR2.1,RA,MC,I,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DTR2.1,PR,BOP,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 +DTR2.1,NIC,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DTR2.1,RA,BOP,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DTR2.1,PR,EV,N,,0,-2.5,0,0,-2.5,0,0,-2.5,0,0,-2.5,0,0,0,0,0,0,0,0,0,0 +DTR2.1,NIC,EV,N,,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 +DTR2.1,RA,EV,N,,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0,0,0,0,0,0,0,0,0 +DTR2.1,PR,CL,C,,0,-57.5,0,0,-57.5,0,0,-57.5,0,0,-57.5,0,0,0,0,0,0,0,0,0,0 +DTR2.1,NIC,CL,C,,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0 +DTR2.1,CU,CL,C,,-7.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR2.1,RA,CL,C,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,0,0,0,0,0,0,0,0,0 +DTR2.2,NIC,MC,I,2020,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 +DTR2.2,CU,MC,I,2020,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5,0,0,0,0,0,0,0,0,0 +DTR2.2,RA,MC,I,2020,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DTR2.2,NIC,BOP,N,2020,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DTR2.2,RA,BOP,N,2020,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DTR2.2,NIC,EV,N,2020,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 +DTR2.2,RA,EV,N,2020,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0,0,0,0,0,0,0,0,0 +DTR2.2,NIC,CL,C,2020,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0 +DTR2.2,CU,CL,C,2020,-7.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR2.2,RA,CL,C,2020,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,0,0,0,0,0,0,0,0,0 +DT3.1,PR,MC,I,,0,110,0,0,110,0,0,110,0,0,110,0,0,0,0,0,0,0,0,0,0 +DT3.1,NIC,MC,I,,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,0,0,0,0,0,0,0,0,0 +DT3.1,CU,MC,I,,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3,0,0,0,0,0,0,0,0,0 +DT3.1,RA,MC,I,,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,0 +DT3.1,PR,BOP,N,,0,10,0,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0 +DT3.1,ICO,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT3.1,NIC,BOP,N,,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,0,0,0,0,0,0,0,0,0 +DT3.1,RA,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT3.1,PR,EV,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 +DT3.1,ICO,EV,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT3.1,NIC,EV,N,,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,0,0,0,0,0,0,0,0,0 +DT3.1,RA,EV,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 DT3.1,PR,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DT3.1,ICO,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DT3.1,NIC,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DT3.1,CU,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DT3.1,RA,CL,C,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -DT4.1,PR,MC,I,,0,-110,0,0,-110,0,0,-110,0,0,-110,0,0,0,0,0,0,0,0,0,0 -DT4.1,NIC,MC,I,,20,20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0 -DT4.1,CU,MC,I,,10,5,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,0 -DT4.1,RA,MC,I,,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 -DT4.1,PR,BOP,N,,0,-20,0,0,-20,0,0,-20,0,0,-20,0,0,0,0,0,0,0,0,0,0 -DT4.1,ICO,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT4.1,NIC,BOP,N,,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0 -DT4.1,RA,BOP,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT4.1,PR,EV,N,,0,-33,0,0,-33,0,0,-33,0,0,-33,0,0,0,0,0,0,0,0,0,0 -DT4.1,ICO,EV,N,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT4.1,NIC,EV,N,,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0 -DT4.1,RA,EV,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 -DT4.1,PR,CL,C,,0,-143,0,0,-143,0,0,-143,0,0,-143,0,0,0,0,0,0,0,0,0,0 -DT4.1,ICO,CL,C,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 -DT4.1,NIC,CL,C,,29,29,29,29,29,29,29,29,29,29,29,29,0,0,0,0,0,0,0,0,0 -DT4.1,CU,CL,C,,15,7,7,7,7,7,7,7,7,7,7,5,0,0,0,0,0,0,0,0,0 -DT4.1,RA,CL,C,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DT4.1,PR,MC,I,,0,110,0,0,110,0,0,110,0,0,110,0,0,0,0,0,0,0,0,0,0 +DT4.1,NIC,MC,I,,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,0,0,0,0,0,0,0,0,0 +DT4.1,CU,MC,I,,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3,0,0,0,0,0,0,0,0,0 +DT4.1,RA,MC,I,,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,0 +DT4.1,PR,BOP,N,,0,20,0,0,20,0,0,20,0,0,20,0,0,0,0,0,0,0,0,0,0 +DT4.1,ICO,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT4.1,NIC,BOP,N,,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,0,0,0,0,0,0,0,0,0 +DT4.1,RA,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT4.1,PR,EV,N,,0,33,0,0,33,0,0,33,0,0,33,0,0,0,0,0,0,0,0,0,0 +DT4.1,ICO,EV,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT4.1,NIC,EV,N,,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,0,0,0,0,0,0,0,0,0 +DT4.1,RA,EV,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DT4.1,PR,CL,C,,0,143,0,0,143,0,0,143,0,0,143,0,0,0,0,0,0,0,0,0,0 +DT4.1,ICO,CL,C,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT4.1,NIC,CL,C,,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,0,0,0,0,0,0,0,0,0 +DT4.1,CU,CL,C,,-15,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-5,0,0,0,0,0,0,0,0,0 +DT4.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 diff --git a/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv index b52ac64c..dab25bf9 100644 --- a/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv +++ b/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv @@ -4,5 +4,5 @@ CH,2020,12,, @@Opening,,,, DataNode,EstimateType,AmountType,AccidentYear,Value DT3.1,C,,,72.2 -DT3.1,AA,PR,,1.5 -DT3.1,OA,PR,,-1.5 +DT3.1,AA,PR,,-1.5 +DT3.1,OA,PR,,1.5 diff --git a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb index 1685c887..057f5088 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -82,7 +82,7 @@ { "cell_type": "code", "source": [ - "//await UploadSimpleValueAsync(\"../Files/900.TransactionalData/SimpleValue_CH_2020_12.csv\") TODO: missing benchmarks" + "await Import.FromFile(\"../Files/900.TransactionalData/SimpleValue_CH_2020_12.csv\").WithFormat(ImportFormats.SimpleValue ).WithTarget(DataSource).ExecuteAsync()" ] }, { diff --git a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv index 80bfedb2..6ed79aac 100644 --- a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv +++ b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv @@ -348,6 +348,65 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateT 0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.875294459866303,IR5 0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.967554969423617,OCI1 0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.967554969423617,OCI1 +0,PR,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,CF +0,NIC,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,CF +0,ACA,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,CF +0,AEA,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,CF +0,PR,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,,APA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-320,IR6 +0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.536731161375,BOP +0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.7529445986629,BOP +0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF +0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF +0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF +0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF +0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.63392949885554,EOP +0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.675549694236,EOP +0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.0971983374806105,IA +0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.9226050955731167,IA +0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,1.0971983374806105,IFIE1 +0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.9226050955731167,IFIE1 +0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,398.536731161375,IR5 +0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-298.7529445986629,IR5 +0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.6339294988556,OCI1 +0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.675549694236,OCI1 +0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,399.6339294988556,OCI1 +0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-299.675549694236,OCI1 +0,PR,2020,USD,L,BEPA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,320,IR6 +0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-82.02271122089925,AM +0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,139.90849210284577,BOP +0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,EA +0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,42.9681136142967,EOP +0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.08233273235018213,IA +0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.08233273235018213,IFIE1 +0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,82.02271122089925,IR3 +0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-124.90849210284577,IR5 +0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.843447868559382,AM +0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,CF +0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5.156552131440618,EOP +0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.843447868559382,IR4 +0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-9.843447868559382,ISE6 +0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.8752944598663,BOP +0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF +0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF +0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.967554969423617,EOP +0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226050955731169,IA +0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.09226050955731169,IFIE1 +0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.875294459866303,IR5 +0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.967554969423617,OCI1 +0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.967554969423617,OCI1 0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF 0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,CF 0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,ISE1 diff --git a/full-ifrs17-template/Test/ExportReportVariables.ipynb b/full-ifrs17-template/Test/ExportReportVariables.ipynb index 96db0b99..65d0e2cb 100644 --- a/full-ifrs17-template/Test/ExportReportVariables.ipynb +++ b/full-ifrs17-template/Test/ExportReportVariables.ipynb @@ -81,7 +81,7 @@ { "cell_type": "code", "source": [ - "var path = \"./Data/ReportVariableBenchmarks/\";" + "//var path = \"./Data/ReportVariableBenchmarks/\";" ] }, { @@ -119,17 +119,33 @@ { "cell_type": "code", "source": [ - "foreach(var args in exportScope){", - "\n var scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", - "\n var bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";", - "\n await Export.ToCsv(path + bmFileName).WithTable(tableConfig => tableConfig.WithSource(source => scopesData.AsQueryable())).ExecuteAsync(); ", - "\n}" + "// foreach(var args in exportScope){", + "\n// var scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", + "\n// var bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";", + "\n// await Export.ToCsv(path + bmFileName).WithTable(tableConfig => tableConfig.WithSource(source => scopesData.AsQueryable())).ExecuteAsync(); ", + "\n// }" ] }, { "cell_type": "code", "source": [ - "" + "var args = exportScope.First();" + ] + }, + { + "cell_type": "code", + "source": [ + "var scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", + "\nvar bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";" + ] + }, + { + "cell_type": "code", + "source": [ + "await Export.ToCsv(bmFileName)", + "\n .WithTable(tableConfig => tableConfig.WithSource(source => scopesData.AsQueryable()))", + "\n .WithSource(Workspace)", + "\n .ExecuteAsync()" ] } ] diff --git a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb index 50a59c01..6e90aee1 100644 --- a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb +++ b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb @@ -80,6 +80,12 @@ "\n};" ] }, + { + "cell_type": "code", + "source": [ + "var excludedDataNodes = new[] {\"DT5.1\"}; // DT5.1 is simple importer and tested at report variable level" + ] + }, { "cell_type": "markdown", "source": [ @@ -217,7 +223,10 @@ "\n var partition = (await DataSource.Query().ToArrayAsync())", "\n .SingleOrDefault(x => x.ReportingNode == reportingNode && x.Year== year && x.Month == month && x.Scenario == scenario)?.Id ?? new Guid();", "\n ", - "\n var computedVariablesByEstimateType = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());", + "\n var computedVariablesByEstimateType = (await DataSource.Query()", + "\n .Where(v => !excludedDataNodes.Contains(v.DataNode))", + "\n .ToArrayAsync())", + "\n .ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());", "\n", "\n foreach (var bmfile in g)", "\n {", diff --git a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb index d75b5206..899f899d 100644 --- a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb +++ b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb @@ -230,9 +230,9 @@ "\n", "\nand", "\n", - "\n\\begin{align}", + "\n$$", "\n\\text{Discount}_i = \\big( 1 + \\text{YC}_i \\big) ^{-\\frac{1}{12}} ~.", - "\n\\end{align}" + "\n$$" ] }, { @@ -477,7 +477,9 @@ "var expectedDiscountedPR = new double[nominalPR.Values.Length];", "\n", "\nEnumerable.Range(0, nominalPR.Values.Length).Reverse()", - "\n .ForEach( i => expectedDiscountedPR[i] = nominalPR.Values[i] + expectedDiscountedPR.GetValidElement(i+1) * expectedDiscount.GetValidElement(i/12) );" + "\n .ForEach( i => expectedDiscountedPR[i] = nominalPR.Values[i] + expectedDiscountedPR.GetValidElement(i+1) * expectedDiscount.GetValidElement(i/12) );", + "\n", + "\nexpectedDiscountedPR = Multiply(-1d, expectedDiscountedPR); // we need a reserve view for comparison" ] }, { @@ -546,7 +548,9 @@ "var expectedDiscountedNIC = new double[nominalNIC.Values.Length];", "\n", "\nEnumerable.Range(0, nominalNIC.Values.Length).Reverse()", - "\n .ForEach( i => expectedDiscountedNIC[i] = ( nominalNIC.Values[i] + expectedDiscountedNIC.GetValidElement(i+1) ) * expectedDiscount.GetValidElement(i/12) );" + "\n .ForEach( i => expectedDiscountedNIC[i] = ( nominalNIC.Values[i] + expectedDiscountedNIC.GetValidElement(i+1) ) * expectedDiscount.GetValidElement(i/12) );", + "\n", + "\nexpectedDiscountedNIC = Multiply(-1d, expectedDiscountedNIC); // we need a reserve view for comparison" ] }, { @@ -748,6 +752,7 @@ "\n nominalClaims[tau] * Math.Pow(expectedDiscount.GetValidElement(t/12), tau-t+1) * (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", "\n ).Sum() );", "\n", + "\nexpectedDiscountedCDR = Multiply(-1d, expectedDiscountedCDR); // we need a reserve view for comparison", "\nexpectedDiscountedCDR" ] }, @@ -1097,7 +1102,7 @@ { "cell_type": "code", "source": [ - "var expectedPresentValueCF_PR = Multiply(-1.0, cfNominalReference_PR.Values);" + "var expectedPresentValueCF_PR = Multiply(1.0, cfNominalReference_PR.Values);" ] }, { @@ -1221,7 +1226,7 @@ { "cell_type": "code", "source": [ - "var expectedPresentValueIA_PR = discountedIaReference_PR.Values.Select((val, index) => ( val - nominalIaReference_PR.Values[index]) * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" + "var expectedPresentValueIA_PR = discountedIaReference_PR.Values.Select((val, index) => ( val - ( -1d * nominalIaReference_PR.Values[index]) ) * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" ] }, { @@ -1422,6 +1427,8 @@ "\n", "\nEnumerable.Range(0, nominalYcParent.Values.Length).Reverse()", "\n .ForEach( i => ycReferenceDiscountedEop[i] = nominalYcParent.Values[i] + ycReferenceDiscountedEop.GetValidElement(i+1) * ycComputedMonthlyRates.Discount.GetValidElement(i/12) );", + "\n", + "\nycReferenceDiscountedEop = Multiply(-1d, ycReferenceDiscountedEop); // we need a reserve view for comparison", "\nycReferenceDiscountedEop" ] }, @@ -1573,6 +1580,8 @@ "\n (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", "\n ).Sum() );", "\n", + "\ncruExpectedDiscountedCDR = Multiply(-1d, cruExpectedDiscountedCDR); // we need a reserve view for comparison", + "\n", "\ncruExpectedDiscountedCDR" ] }, @@ -1900,7 +1909,7 @@ "cell_type": "code", "source": [ "var expectedMonthlyAmortizationFactor = nominalCashflowAmortizationFactorTest.Values.Zip(discountedCashflowAmortizationFactorTest.Values, ", - "\n (nominal, discountedCumulated) => 1 - nominal / discountedCumulated ).ToArray();" + "\n (nominal, discountedCumulated) => 1 - (-nominal) / discountedCumulated ).ToArray();" ] }, { diff --git a/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb index d5dafed5..06a89425 100644 --- a/ifrs17/Constants/Consts.ipynb +++ b/ifrs17/Constants/Consts.ipynb @@ -136,14 +136,16 @@ "cell_type": "code", "source": [ "public static class ImportFormats{", - "\n public const string Cashflow = nameof(Cashflow);", - "\n public const string Actual = nameof(Actual);", - "\n public const string DataNode = nameof(DataNode);", - "\n public const string DataNodeParameter = nameof(DataNodeParameter);", - "\n public const string DataNodeState = nameof(DataNodeState);", - "\n public const string SimpleValue = nameof(SimpleValue);", - "\n public const string Opening = nameof(Opening);", - "\n public const string AocConfiguration = nameof(AocConfiguration);", + "\n public const string Cashflow = nameof(Cashflow); // Importer for Nominal Cashflows", + "\n public const string Actual = nameof(Actual); // Importer for Actuals", + "\n public const string Opening = nameof(Opening); // Importer for Opening Balances (BOP Inforce of CSM/LC)", + "\n public const string SimpleValue = nameof(SimpleValue); // Importer for Simple Values (pre-calculated direct import)", + "\n", + "\n public const string DataNode = nameof(DataNode); // Importer for Data Node", + "\n public const string DataNodeState = nameof(DataNodeState); // Importer for Data Node State", + "\n public const string DataNodeParameter = nameof(DataNodeParameter); // Importer for Data Node Parameters", + "\n", + "\n public const string AocConfiguration = nameof(AocConfiguration); // Importer for Analysis of Change Configuration settings", "\n}" ] }, @@ -176,20 +178,20 @@ "cell_type": "code", "source": [ "public static class EstimateTypes{", - "\n public const string BE = nameof(BE); //Best Estimate", - "\n public const string RA = nameof(RA); //Risk Adjustment", - "\n public const string CU = nameof(CU); //Coverage Units", - "\n public const string A = nameof(A); //Actuals", - "\n public const string AA = nameof(AA); //Advance Actuals", - "\n public const string OA = nameof(OA); //Overdue Actuals", - "\n public const string DA = nameof(DA); //Deferrable Actuals", - "\n public const string C = nameof(C); //Contractual Service Margin", - "\n public const string L = nameof(L); //Loss Component", - "\n public const string LR = nameof(LR); //Loss Recovery", - "\n public const string F = nameof(F); //factors", - "\n public const string FCF = nameof(FCF); //Fulfilment Cash flows", + "\n public const string BE = nameof(BE); //Best Estimate", + "\n public const string RA = nameof(RA); //Risk Adjustment", + "\n public const string CU = nameof(CU); //Coverage Units", + "\n public const string A = nameof(A); //Actuals", + "\n public const string AA = nameof(AA); //Advance Actuals", + "\n public const string OA = nameof(OA); //Overdue Actuals", + "\n public const string DA = nameof(DA); //Deferrable Actuals", + "\n public const string C = nameof(C); //Contractual Service Margin", + "\n public const string L = nameof(L); //Loss Component", + "\n public const string LR = nameof(LR); //Loss Recovery", + "\n public const string F = nameof(F); //Factors", + "\n public const string FCF = nameof(FCF); //Fulfilment Cash flows", "\n public const string BEPA = nameof(BEPA); //Experience Adjusted BE Premium to Csm", - "\n public const string APA = nameof(APA); //Experience Adjusted Written Actual Premium to Csm", + "\n public const string APA = nameof(APA); //Experience Adjusted Written Actual Premium to Csm", "\n public const string AAPA = nameof(AAPA); //Experience Adjusted Advance Actual Premium to Csm", "\n public const string OAPA = nameof(OAPA); //Experience Adjusted Overdue Actual Premium to Csm", "\n}" @@ -199,23 +201,23 @@ "cell_type": "code", "source": [ "public static class AocTypes{", - "\n public const string BOP = nameof(BOP);", - "\n public const string MC = nameof(MC);", - "\n public const string PC = nameof(PC);", - "\n public const string RCU = nameof(RCU);", - "\n public const string CF = nameof(CF);", - "\n public const string IA = nameof(IA);", - "\n public const string AU = nameof(AU);", - "\n public const string FAU = nameof(FAU);", - "\n public const string YCU = nameof(YCU);", - "\n public const string CRU = nameof(CRU);", - "\n public const string WO = nameof(WO);", - "\n public const string EV = nameof(EV);", - "\n public const string CL = nameof(CL);", - "\n public const string EA = nameof(EA);", - "\n public const string AM = nameof(AM);", - "\n public const string FX = nameof(FX);", - "\n public const string EOP = nameof(EOP);", + "\n public const string BOP = nameof(BOP); // Beginning of Period (opening value of an AOC chain)", + "\n public const string MC = nameof(MC); // Model Corrections (changes to the model)", + "\n public const string PC = nameof(PC); // Portfolio Changes", + "\n public const string RCU = nameof(RCU); // Reinsurance Coverage Update", + "\n public const string CF = nameof(CF); // Cashflow (Nominal)", + "\n public const string IA = nameof(IA); // Interest Accretion", + "\n public const string AU = nameof(AU); // Assumptions Update (changes to general assumptions)", + "\n public const string FAU = nameof(FAU); // Financial Assumptions Update (changes to financial assumptions)", + "\n public const string YCU = nameof(YCU); // Yield Curve Update", + "\n public const string CRU = nameof(CRU); // Credit Default Risk Parameters Update", + "\n public const string WO = nameof(WO); // Write-off", + "\n public const string EV = nameof(EV); // Experience Variance", + "\n public const string CL = nameof(CL); // Combined Liabilities (control run where all changes are calculated together for all novelties)", + "\n public const string EA = nameof(EA); // Experience Adjustment", + "\n public const string AM = nameof(AM); // Amortization", + "\n public const string FX = nameof(FX); // Foreing Exchange", + "\n public const string EOP = nameof(EOP); // End of Period (closing value of an AOC chain)", "\n}" ] }, @@ -253,8 +255,8 @@ "\n public const string NE = nameof(NE); //Non Attributable Expenses", "\n public const string ACM = nameof(ACM); //Attributable Commissions Maintenance", "\n public const string AEM = nameof(AEM); //Attributable Expenses Maintenance", - "\n public const string AC = nameof(AC); //Attributable Commissions", - "\n public const string AE = nameof(AE); //Attributable Expenses", + "\n public const string AC = nameof(AC); //Attributable Commissions", + "\n public const string AE = nameof(AE); //Attributable Expenses", "\n}" ] }, diff --git a/ifrs17/Import/ImportScopeCalculation.ipynb b/ifrs17/Import/ImportScopeCalculation.ipynb index 629d2d40..6a5269f3 100644 --- a/ifrs17/Import/ImportScopeCalculation.ipynb +++ b/ifrs17/Import/ImportScopeCalculation.ipynb @@ -529,7 +529,7 @@ "\n\\right.", "\n$$", "\n", - "\nwhere Transaction Period depends on which Best Estimate value is being computed, in particular on what its [Amount Type](../DataModel/DataStructure#amount-type) is (each Amount Type has its own [Period Type](../Constants/Enums)); and $\\text{Valid Discount}$ stands for the fact that in case the Discount Curves are shorter than the required index, then their last element is returned.", + "\nwhere Transaction Period depends on which Best Estimate value is being computed, in particular on what its [Amount Type](../DataModel/DataStructure#amount-type) is (each Amount Type has its own [Period Type](../Constants/Enums)); and $\\text{Valid Discount}$ stands for the fact that in case the Discount Curves are shorter than the required index, then their last element is returned. We also need to flip the sign of the discounted and cumulated values, to create a reserve view and be consistent with the usual [Cashflow Sign Convention](https://en.wikipedia.org/wiki/Cash_flow_sign_convention). ", "\n", "\n
Also here, the Credit Default Risk contribution is calculated separately. Since it is based on Claims, the Period Type is implicitly defined." ] @@ -553,14 +553,14 @@ "\n [NotVisible]", "\n double[] NominalValues => GetScope(Identity).Values;", "\n", - "\n double[] Values => NominalValues.ComputeDiscountAndCumulate(MonthlyDiscounting, periodType);", + "\n double[] Values => Multiply(-1d, NominalValues.ComputeDiscountAndCumulate(MonthlyDiscounting, periodType)); // we need to flip the sign to create a reserve view", "\n}", "\n", "\npublic interface DiscountedCreditRiskCashflow : DiscountedCashflow", "\n{ ", "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", "\n ", - "\n double[] DiscountedCashflow.Values => NominalValues.ComputeDiscountAndCumulateWithCreditDefaultRisk(MonthlyDiscounting, nonPerformanceRiskRate);", + "\n double[] DiscountedCashflow.Values => Multiply(-1d, NominalValues.ComputeDiscountAndCumulateWithCreditDefaultRisk(MonthlyDiscounting, nonPerformanceRiskRate)); // we need to flip the sign to create a reserve view", "\n}" ] }, @@ -675,7 +675,7 @@ "source": [ "public interface IWithInterestAccretion : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", "\n{", - "\n private double[] parentDiscountedValues => GetScope(Identity).Values; ", + "\n private double[] parentDiscountedValues => Multiply(-1d, GetScope(Identity).Values); ", "\n private double[] parentNominalValues => GetScope(Identity).Values;", "\n private double[] monthlyInterestFactor => GetScope(Identity.Id).Interest;", "\n ", @@ -687,11 +687,11 @@ "\n switch (periodType) {", "\n case PeriodType.BeginningOfPeriod :", "\n for (var i = 0; i < parentDiscountedValues.Length; i++)", - "\n ret[i] = (parentDiscountedValues[i] - parentNominalValues[i]) * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", + "\n ret[i] = -1d * (parentDiscountedValues[i] - parentNominalValues[i]) * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", "\n break;", "\n default :", "\n for (var i = 0; i < parentDiscountedValues.Length; i++)", - "\n ret[i] = parentDiscountedValues[i] * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", + "\n ret[i] = -1d * parentDiscountedValues[i] * (GetElementOrDefault(monthlyInterestFactor, i/12) - 1d );", "\n break;", "\n }", "\n ", @@ -717,7 +717,7 @@ "\n effectCreditRisk[i] = interestOnClaimsCashflow[i] - interestOnClaimsCashflowCreditRisk[i];", "\n }", "\n ", - "\n return Subtract(effectCreditRisk, nominalValuesCreditRisk);", + "\n return Subtract(nominalValuesCreditRisk, effectCreditRisk);", "\n }", "\n}" ] @@ -752,13 +752,13 @@ "public interface PresentValue : IWithGetValueFromValues", "\n{ ", "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow", - "\n || x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode))", - "\n .WithApplicability(x => (x.Identity.Id.AocType == AocTypes.BOP && x.Identity.Id.Novelty != Novelties.C) || x.Identity.Id.AocType == AocTypes.EOP)", - "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.CF)", - "\n .WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.IA)", - "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.IA)", - "\n .WithApplicability(x => new string[]{AocTypes.BOP, AocTypes.EA, AocTypes.AM, AocTypes.RCU}.Contains(x.Identity.Id.AocType) ) //add here combination CRU for At !CDR?", + "\n builder.ForScope(s => s", + "\n .WithApplicability(x => x.GetStorage().ImportFormat != ImportFormats.Cashflow || x.GetStorage().IsSecondaryScope(x.Identity.Id.DataNode))", + "\n .WithApplicability(x => (x.Identity.Id.AocType == AocTypes.BOP && x.Identity.Id.Novelty != Novelties.C) || x.Identity.Id.AocType == AocTypes.EOP)", + "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR && x.Identity.Id.AocType == AocTypes.IA)", + "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.IA)", + "\n .WithApplicability(x => new string[]{AocTypes.BOP, AocTypes.EA, AocTypes.AM, AocTypes.RCU}.Contains(x.Identity.Id.AocType) ) //add here combination CRU for At !CDR?", "\n );", "\n ", "\n [NotVisible][IdentityProperty][Dimension(typeof(EconomicBasis))]", @@ -785,7 +785,7 @@ "\npublic interface CashflowAocStep : PresentValue", "\n{", "\n [NotVisible]", - "\n double[] PresentValue.Values => Multiply(-1d, GetScope(Identity).Values);", + "\n double[] PresentValue.Values => GetScope(Identity).Values;", "\n}", "\n", "\npublic interface PresentValueWithInterestAccretion : PresentValue, IWithInterestAccretion", @@ -995,13 +995,13 @@ "public interface MonthlyAmortizationFactorCashflow : IScope", "\n{", "\n private double[] NominalCuCashflow => GetScope((Identity with {AocType = AocTypes.CL}, (string)null, EstimateTypes.CU, (int?)null)).Values;", - "\n private double[] DiscountedCuCashflow => GetScope(Identity with {AocType = AocTypes.CL}, o => o.WithContext(EconomicBasis)).Values;", + "\n private double[] DiscountedCuCashflow => Multiply(-1d, GetScope(Identity with {AocType = AocTypes.CL}, o => o.WithContext(EconomicBasis)).Values);", "\n ", "\n [NotVisible] string EconomicBasis => GetContext();", "\n ", "\n double[] MonthlyAmortizationFactors => Identity.AocType switch {", "\n AocTypes.AM => NominalCuCashflow.Zip(DiscountedCuCashflow, //Extract to an other scope with month in the identity to avoid Zip?", - "\n (nominal, discountedCumulated) => discountedCumulated >= Precision ", + "\n (nominal, discountedCumulated) => Math.Abs(discountedCumulated) >= Precision ", "\n ? 1 - nominal / discountedCumulated ", "\n : 0).ToArray(),", "\n _ => Enumerable.Empty().ToArray(),", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index 8a499aa5..7aeb86d5 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -945,8 +945,7 @@ "\n AmountType = amountType,", "\n EstimateType = estimateType,", "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", - "\n Value = GetSign((aocType, amountType, estimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache) ", - "\n * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble(),", + "\n Value = GetSign((aocType, amountType, estimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache) * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()", "\n };", "\n return item;", "\n }, ImportFormats.Actual", @@ -1040,9 +1039,7 @@ "\n EstimateType = estimateType,", "\n EconomicBasis = economicBasis,", "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", - "\n Value = GetSign((aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), parsingStorage.HierarchyCache)", - "\n //1 // TODO, we need to adjust the inputs to have the correct sign, so that the default GetSign returns 1.", - "\n * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()", + "\n Value = GetSign((aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), parsingStorage.HierarchyCache) * datarow.Field(nameof(IfrsVariable.Value)).CheckStringForExponentialAndConvertToDouble()", "\n };", "\n return iv;", "\n }, importFormat // This should indicate the table name, not the input format", diff --git a/ifrs17/Utils/ImportCalculationMethods.ipynb b/ifrs17/Utils/ImportCalculationMethods.ipynb index ec78d688..b3acb084 100644 --- a/ifrs17/Utils/ImportCalculationMethods.ipynb +++ b/ifrs17/Utils/ImportCalculationMethods.ipynb @@ -139,11 +139,7 @@ { "cell_type": "code", "source": [ - "public static int GetSign((string AocType, string AmountType, string EstimateType, bool IsReinsurance) variable, Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", - "\n{", - "\n var isActual = (new string[] { EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.A }).Contains(variable.EstimateType) ? -1 : 1;", - "\n return isActual;", - "\n}" + "public static int GetSign((string AocType, string AmountType, string EstimateType, bool IsReinsurance) variable, Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache) => 1;" ] }, { From 02d067634b0b76b80b5240496bbc6e6f27bf3605 Mon Sep 17 00:00:00 2001 From: sbusato <103484221+sbusato@users.noreply.github.com> Date: Mon, 7 Nov 2022 09:13:51 +0100 Subject: [PATCH 21/43] Aggregate by in report variable (#67) * included back AggregateBy * included Currency column in ReportVariable benchmarks --- full-ifrs17-template/Report/Reports.ipynb | 2 +- ...ableBenchmarks_2020_12_CH__Contractual.csv | 1192 ++++----- ...iableBenchmarks_2021_3_CH__Contractual.csv | 2228 ++++++++--------- .../SpecificationsFinancialPerformance.ipynb | 2 +- ifrs17/DataModel/DataStructure.ipynb | 11 +- .../Report/ReportConfigurationAndUtils.ipynb | 9 - ifrs17/Report/ReportMutableScopes.ipynb | 30 +- ifrs17/Report/ReportScopes.ipynb | 5 +- 8 files changed, 1739 insertions(+), 1740 deletions(-) diff --git a/full-ifrs17-template/Report/Reports.ipynb b/full-ifrs17-template/Report/Reports.ipynb index 23a3804b..7528d59f 100644 --- a/full-ifrs17-template/Report/Reports.ipynb +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -64,7 +64,6 @@ "\n", "\nThe granularity of the reported figures can be modified by changing the Column Slices options.", "\nFor example one can add \"GroupOfContract\" to separate the contributions of the individual Group of Contracts.", - "\n
We suggest to add this slice between the \"LiabilityType\" and the \"EconomicBasis\" as the order of the inputs corresponds to the order of the columns shown in the report to expand the data.", "\n", "\nAggregated values are displayed when the data has a finer granularity than the one selected by the report slice options." ] @@ -75,6 +74,7 @@ "var pvReport = ifrs17Report.PresentValues;", "\npvReport.ReportingNode = \"CH\";", "\npvReport.ReportingPeriod = (2021, 3);", + "\npvReport.CurrencyType = CurrencyType.Contractual;", "\npvReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\npvReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.2\"),(\"LiabilityType\", \"LIC\") }", "\n(await pvReport.ToReportAsync) with {Height = 720}" diff --git a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv index 6ed79aac..27ef2063 100644 --- a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv +++ b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv @@ -1,596 +1,596 @@ -@@ReportVariable -AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType -0,PR,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF -0,ACA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF -0,AEA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,,APA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-320,IR6 -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.536731161375,BOP -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63392949885554,EOP -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.0971983374806105,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.9226050955731167,IFIE1 -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.536731161375,IR5 -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529445986629,IR5 -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339294988556,OCI1 -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,OCI1 -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339294988556,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.675549694236,OCI1 -0,PR,2020,USD,L,BEPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,320,IR6 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271122089925,AM -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849210284577,BOP -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.9681136142967,EOP -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233273235018213,IA -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233273235018213,IFIE1 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122089925,IR3 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447868559382,AM -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131440618,EOP -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447868559382,IR4 -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447868559382,ISE6 -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226050955731169,IFIE1 -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.875294459866303,IR5 -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,OCI1 -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.967554969423617,OCI1 -2020,NIC,2020,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF -2020,NIC,2020,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.9226050955731167,IFIE2 -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529445986629,ISE12 -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,OCI2 -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-299.675549694236,OCI2 -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226050955731169,IFIE2 -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.875294459866303,ISE12 -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,OCI2 -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.967554969423617,OCI2 -0,AEA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,ACA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF -0,NIC,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF -0,PR,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF -0,PR,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,,APA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-400,IR6 -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.0971983374806105,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.9226050955731167,IFIE1 -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.536731161375,IR5 -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529445986629,IR5 -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339294988556,OCI1 -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.675549694236,OCI1 -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339294988556,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.675549694236,OCI1 -0,PR,2020,USD,L,BEPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR6 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271122089925,AM -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849210284577,BOP -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.9681136142967,EOP -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233273235018213,IA -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233273235018213,IFIE1 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122089925,IR3 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447868559382,AM -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131440618,EOP -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447868559382,IR4 -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447868559382,ISE6 -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226050955731169,IFIE1 -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.875294459866303,IR5 -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.967554969423617,OCI1 -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.967554969423617,OCI1 -0,PR,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,400,CF -0,NIC,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,CF -0,ACA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF -0,AEA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF -0,PR,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,,APA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-320,IR6 -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,1.0971983374806105,IFIE1 -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.9226050955731167,IFIE1 -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,398.536731161375,IR5 -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-298.7529445986629,IR5 -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,PR,2020,USD,L,BEPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,320,IR6 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-82.02271122089925,AM -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,139.90849210284577,BOP -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,42.9681136142967,EOP -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.08233273235018213,IA -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.08233273235018213,IFIE1 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,82.02271122089925,IR3 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,9.843447868559382,AM -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.156552131440618,EOP -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,9.843447868559382,IR4 -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-9.843447868559382,ISE6 -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.09226050955731169,IFIE1 -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-29.875294459866303,IR5 -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -2020,NIC,2020,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,CF -2020,NIC,2020,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,598.7529445986629,BOP -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,598.7529445986629,BOP -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,299.675549694236,EOP -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,299.675549694236,EOP -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.9226050955731167,IA -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.9226050955731167,IA -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.9226050955731167,IFIE2 -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-298.7529445986629,ISE12 -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.8752944598663,BOP -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,29.967554969423617,EOP -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,29.967554969423617,EOP -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226050955731169,IA -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226050955731169,IA -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.09226050955731169,IFIE2 -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-29.875294459866303,ISE12 -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 -0,PR,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,CF -0,NIC,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,CF -0,ACA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF -0,AEA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF -0,PR,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP -0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-1.5,EOP -0,PR,2020,USD,,APA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-320,IR6 -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.0971983374806105,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.9226050955731167,IFIE1 -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,398.536731161375,IR5 -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-298.7529445986629,IR5 -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339294988556,OCI1 -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.675549694236,OCI1 -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.6339294988556,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.675549694236,OCI1 -0,PR,2020,USD,L,BEPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,320,IR6 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-129.49726655304642,AM -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,72.2,BOP -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,139.90849210284577,BOP -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.83795828214956,EOP -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.14440000000001615,IA -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.08233273235018213,IA -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.22673273235019828,IFIE1 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,129.49726655304642,IR3 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.843447868559382,AM -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5.156552131440618,EOP -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.843447868559382,IR4 -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.843447868559382,ISE6 -0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP -0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.5,EOP -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.09226050955731169,IFIE1 -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.875294459866303,IR5 -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.967554969423617,OCI1 -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.967554969423617,OCI1 -0,PR,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,CF -0,NIC,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,CF -0,ACA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF -0,AEA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF -0,PR,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,,APA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-320,IR6 -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1.0971983374806105,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.9226050955731167,IFIE1 -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,398.536731161375,IR5 -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-298.7529445986629,IR5 -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.6339294988556,OCI1 -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.675549694236,OCI1 -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,399.6339294988556,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-299.675549694236,OCI1 -0,PR,2020,USD,L,BEPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,320,IR6 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-82.02271122089925,AM -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,139.90849210284577,BOP -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,42.9681136142967,EOP -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.08233273235018213,IA -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.08233273235018213,IFIE1 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,82.02271122089925,IR3 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.843447868559382,AM -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5.156552131440618,EOP -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.843447868559382,IR4 -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-9.843447868559382,ISE6 -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.09226050955731169,IFIE1 -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.875294459866303,IR5 -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.967554969423617,OCI1 -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.967554969423617,OCI1 -0,PR,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,CF -0,NIC,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,CF -0,ACA,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,CF -0,AEA,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,CF -0,PR,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,,APA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-320,IR6 -0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.536731161375,BOP -0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.7529445986629,BOP -0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF -0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF -0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF -0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF -0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.63392949885554,EOP -0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.675549694236,EOP -0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.0971983374806105,IA -0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.9226050955731167,IA -0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,1.0971983374806105,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.9226050955731167,IFIE1 -0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,398.536731161375,IR5 -0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-298.7529445986629,IR5 -0,PR,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.6339294988556,OCI1 -0,NIC,2020,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.675549694236,OCI1 -0,PR,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,399.6339294988556,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-299.675549694236,OCI1 -0,PR,2020,USD,L,BEPA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,320,IR6 -0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-82.02271122089925,AM -0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,139.90849210284577,BOP -0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,EA -0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,42.9681136142967,EOP -0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.08233273235018213,IA -0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.08233273235018213,IFIE1 -0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,82.02271122089925,IR3 -0,,2020,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-124.90849210284577,IR5 -0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.843447868559382,AM -0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5.156552131440618,EOP -0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.843447868559382,IR4 -0,,2020,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-9.843447868559382,ISE6 -0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.8752944598663,BOP -0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF -0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF -0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.967554969423617,EOP -0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226050955731169,IA -0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.09226050955731169,IFIE1 -0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.875294459866303,IR5 -0,,2020,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.967554969423617,OCI1 -0,,2020,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.967554969423617,OCI1 -0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF -0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,CF -0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,ISE1 -0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.2683655806875,BOP -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647229933145,BOP -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.4811341181992343,BOP -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.2683655806875,BOP -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647229933145,BOP -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.4811341181992343,BOP -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703270529272203,CF -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703270529272203,CF -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696474942777,EOP -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,EOP -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,EOP -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696474942777,EOP -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,EOP -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,EOP -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5485991687403052,IA -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613025477865583,IA -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0011701910454977593,IA -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5485991687403052,IA -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613025477865583,IA -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0011701910454977593,IA -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.5485991687403052,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.4613025477865583,IFIE1 -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.0011701910454977593,IFIE1 -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.2683655806875,ISE10 -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.37647229933145,ISE10 -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11410141290651227,ISE10 -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.8169647494278,OCI1 -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,OCI1 -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,OCI1 -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.8169647494278,OCI1 -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.837774847118,OCI1 -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11527160395201003,OCI1 -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,46.24958203305145,AM -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-70.43538016962212,BOP -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-24.228134693791258,EOP -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04233655722058882,IA -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04233655722058882,IFIE1 -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,70.43538016962212,ISE10 -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-46.24958203305145,ISE7 -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,EOP -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,EOP -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130254778655844,IA -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130254778655844,IA -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.046130254778655844,IFIE1 -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.937647229933152,ISE10 -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,OCI1 -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.983777484711808,OCI1 -2020,NIC,2020,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF -2020,NIC,2020,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647229933145,BOP -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.4811341181992343,BOP -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647229933145,BOP -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.4811341181992343,BOP -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703270529272203,CF -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703270529272203,CF -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,EOP -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,EOP -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,EOP -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,EOP -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613025477865583,IA -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0011701910454977593,IA -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613025477865583,IA -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0011701910454977593,IA -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.4613025477865583,IFIE2 -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.0011701910454977593,IFIE2 -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.37647229933145,ISE12 -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11410141290651227,ISE12 -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.837774847118,OCI2 -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527160395201003,OCI2 -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.837774847118,OCI2 -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11527160395201003,OCI2 -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764722993315,BOP -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,EOP -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,EOP -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130254778655844,IA -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130254778655844,IA -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.046130254778655844,IFIE2 -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.937647229933152,ISE12 -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711808,OCI2 -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.983777484711808,OCI2 -0,PR,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,CF -0,NIC,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF -0,PR,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,ISE1 -0,NIC,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.2683655806875,BOP -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647229933145,BOP -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.4811341181992343,BOP -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.2683655806875,BOP -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647229933145,BOP -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.4811341181992343,BOP -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703270529272203,CF -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703270529272203,CF -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.81696474942777,EOP -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.837774847118,EOP -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527160395201003,EOP -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.81696474942777,EOP -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.837774847118,EOP -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527160395201003,EOP -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.5485991687403052,IA -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613025477865583,IA -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0011701910454977593,IA -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.5485991687403052,IA -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613025477865583,IA -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0011701910454977593,IA -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.5485991687403052,IFIE1 -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.4613025477865583,IFIE1 -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.0011701910454977593,IFIE1 -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-199.2683655806875,ISE10 -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.37647229933145,ISE10 -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.11410141290651227,ISE10 -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,46.24958203305145,AM -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-70.43538016962212,BOP -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-24.228134693791258,EOP -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.04233655722058882,IA -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.04233655722058882,IFIE1 -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,70.43538016962212,ISE10 -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-46.24958203305145,ISE7 -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.983777484711808,EOP -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.983777484711808,EOP -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130254778655844,IA -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130254778655844,IA -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.046130254778655844,IFIE1 -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.937647229933152,ISE10 -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -2020,NIC,2020,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF -2020,NIC,2020,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647229933145,BOP -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.4811341181992343,BOP -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647229933145,BOP -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.4811341181992343,BOP -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703270529272203,CF -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703270529272203,CF -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.837774847118,EOP -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527160395201003,EOP -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.837774847118,EOP -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527160395201003,EOP -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613025477865583,IA -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0011701910454977593,IA -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613025477865583,IA -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0011701910454977593,IA -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.4613025477865583,IFIE2 -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.0011701910454977593,IFIE2 -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.37647229933145,ISE12 -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.11410141290651227,ISE12 -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764722993315,BOP -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.983777484711808,EOP -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.983777484711808,EOP -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130254778655844,IA -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130254778655844,IA -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.046130254778655844,IFIE2 -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.937647229933152,ISE12 -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 \ No newline at end of file +@@ReportVariable,,,,,,,,,,,,,,,,,,,,,, +AccidentYear,AmountType,AnnualCohort,Currency,ContractualCurrency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType +0,PR,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,USD,,APA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-320,IR6 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.5367312,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.097198337,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.922605096,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.5367312,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529446,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339295,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.6755497,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271122,AM +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.9084921,BOP +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.96811361,EOP +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.082332732,IA +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.082332732,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122,IR3 +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.9084921,IR5 +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447869,AM +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131,EOP +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447869,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447869,ISE6 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226051,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529446,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755497,OCI1 +2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.922605096,IFIE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529446,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-299.6755497,OCI2 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226051,IFIE2 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529446,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755497,OCI2 +0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +0,PR,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,USD,,APA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-400,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.097198337,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.922605096,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.5367312,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529446,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339295,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.6755497,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR6 +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271122,AM +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.9084921,BOP +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.96811361,EOP +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.082332732,IA +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.082332732,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122,IR3 +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.9084921,IR5 +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447869,AM +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131,EOP +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447869,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447869,ISE6 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226051,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529446,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755497,OCI1 +0,PR,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,CF +0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF +0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,USD,,APA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-320,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,1.097198337,IFIE1 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.922605096,IFIE1 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,398.5367312,IR5 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-298.7529446,IR5 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-82.02271122,AM +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,139.9084921,BOP +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,42.96811361,EOP +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.082332732,IA +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.082332732,IFIE1 +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,82.02271122,IR3 +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-124.9084921,IR5 +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,9.843447869,AM +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.156552131,EOP +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,9.843447869,IR4 +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-9.843447869,ISE6 +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.09226051,IFIE1 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-29.87529446,IR5 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,CF +2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,598.7529446,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,598.7529446,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,299.6755497,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,299.6755497,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.922605096,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.922605096,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.922605096,IFIE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-298.7529446,ISE12 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,59.87529446,BOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,59.87529446,BOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,29.96755497,EOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,29.96755497,EOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226051,IA +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226051,IA +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.09226051,IFIE2 +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-29.87529446,ISE12 +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 +0,PR,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,CF +0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF +0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-1.5,EOP +0,PR,2020,USD,USD,,APA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-320,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.097198337,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.922605096,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,398.5367312,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-298.7529446,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339295,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755497,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.6339295,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.6755497,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-129.4972666,AM +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,72.2,BOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,139.9084921,BOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.83795828,EOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.1444,IA +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.082332732,IA +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.226732732,IFIE1 +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,129.4972666,IR3 +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-124.9084921,IR5 +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.843447869,AM +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5.156552131,EOP +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.843447869,IR4 +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.843447869,ISE6 +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.5,EOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.09226051,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.87529446,IR5 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755497,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.96755497,OCI1 +0,PR,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,CF +0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF +0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,USD,,APA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-320,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1.097198337,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.922605096,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,398.5367312,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-298.7529446,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.6339295,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.6755497,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,399.6339295,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-299.6755497,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-82.02271122,AM +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,139.9084921,BOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,42.96811361,EOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.082332732,IA +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.082332732,IFIE1 +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,82.02271122,IR3 +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-124.9084921,IR5 +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.843447869,AM +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5.156552131,EOP +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.843447869,IR4 +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-9.843447869,ISE6 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.09226051,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.87529446,IR5 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.96755497,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.96755497,OCI1 +0,PR,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,CF +0,ACA,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,CF +0,AEA,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,ISE4 +0,PR,2020,USD,USD,,APA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-320,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.5367312,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.7529446,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.6339295,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.6755497,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.097198337,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.922605096,IA +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,1.097198337,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.922605096,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,398.5367312,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-298.7529446,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.6339295,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.6755497,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,399.6339295,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-299.6755497,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-82.02271122,AM +0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,139.9084921,BOP +0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,42.96811361,EOP +0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.082332732,IA +0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.082332732,IFIE1 +0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,82.02271122,IR3 +0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-124.9084921,IR5 +0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.843447869,AM +0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5.156552131,EOP +0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.843447869,IR4 +0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-9.843447869,ISE6 +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.87529446,BOP +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.96755497,EOP +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226051,IA +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.09226051,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.87529446,IR5 +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.96755497,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.96755497,OCI1 +0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,ISE1 +0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.2683656,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.3764723,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.481134118,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.2683656,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.3764723,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.481134118,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.367032705,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.367032705,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.8169647,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.8169647,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.548599169,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.461302548,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.001170191,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.548599169,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.461302548,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.001170191,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.548599169,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.461302548,IFIE1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.001170191,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.2683656,ISE10 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.3764723,ISE10 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.114101413,ISE10 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.8169647,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,OCI1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.8169647,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.8377748,OCI1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.115271604,OCI1 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,46.24958203,AM +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-70.43538017,BOP +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-24.22813469,EOP +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.042336557,IA +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.042336557,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,70.43538017,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-46.24958203,ISE7 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764723,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764723,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,EOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130255,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130255,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.046130255,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.93764723,ISE10 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,OCI1 +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.98377748,OCI1 +2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF +2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.3764723,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.481134118,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.3764723,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.481134118,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.367032705,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.367032705,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,EOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,EOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.461302548,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.001170191,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.461302548,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.001170191,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.461302548,IFIE2 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.001170191,IFIE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.3764723,ISE12 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.114101413,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,OCI2 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.8377748,OCI2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.115271604,OCI2 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764723,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764723,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,EOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,EOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130255,IA +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130255,IA +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.046130255,IFIE2 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.93764723,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.98377748,OCI2 +0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,CF +0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF +0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,ISE1 +0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.2683656,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.3764723,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.481134118,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.2683656,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.3764723,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.481134118,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.367032705,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.367032705,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.8169647,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.8377748,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.115271604,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.8169647,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.8377748,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.115271604,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.548599169,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.461302548,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.001170191,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.548599169,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.461302548,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.001170191,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.548599169,IFIE1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.461302548,IFIE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.001170191,IFIE1 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-199.2683656,ISE10 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.3764723,ISE10 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.114101413,ISE10 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,46.24958203,AM +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-70.43538017,BOP +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-24.22813469,EOP +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.042336557,IA +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.042336557,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,70.43538017,ISE10 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-46.24958203,ISE7 +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764723,BOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764723,BOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98377748,EOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98377748,EOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130255,IA +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130255,IA +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.046130255,IFIE1 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.93764723,ISE10 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF +2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.3764723,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.481134118,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.3764723,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.481134118,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.367032705,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.367032705,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.8377748,EOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.115271604,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.8377748,EOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.115271604,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.461302548,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.001170191,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.461302548,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.001170191,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.461302548,IFIE2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.001170191,IFIE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.3764723,ISE12 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.114101413,ISE12 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764723,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764723,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98377748,EOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98377748,EOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130255,IA +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130255,IA +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.046130255,IFIE2 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.93764723,ISE12 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 diff --git a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv index bef760f1..6de7cc3a 100644 --- a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv +++ b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv @@ -1,1114 +1,1114 @@ -@@ReportVariable -AccidentYear,AmountType,AnnualCohort,ContractualCurrency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType -0,PR,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF -0,ICO,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF -0,NIC,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF -0,ACA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF -0,AEA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,,AA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,,AA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-1,EOP -0,PR,2020,USD,,AA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,,AA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,WO -0,PR,2020,USD,,AAPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,IR6 -0,PR,2020,USD,,APA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-72,IR6 -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.963392949885524,BOP -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94808795107775,BOP -0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.908704950657615,BOP -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.87054820092061,BOP -0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF -0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF -0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.77033486392617,EOP -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.78283172777515,EOP -0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.9925114388888,EOP -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.4270877400716,EOP -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.45831803554256,EOP -0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.981321311570433,EOP -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.990014559301141,EV -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719444398,EV -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.975090771307462,EV -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.906606557852164,EV -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.016636168716755634,IA -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.021957804477441785,IA -0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.04147659195731423,IA -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.05473704536112062,IA -0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.19963402460106758,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13174682686465072,IFIE1 -0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.005489451119360446,IFIE1 -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06322865953015,IR5 -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446479332545,IR5 -0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.987021987769438,IR5 -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.863594634929065,OCI1 -0,NIC,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89271796646079,OCI1 -0,ICO,2020,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511438888798,OCI1 -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684175878363,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.217231658693336,OCI1 -0,ICO,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.981321311570433,OCI1 -0,PR,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.3283233358608868,YCU -0,NIC,2020,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.22380254636726704,YCU -0,PR,2020,USD,L,BEPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,96,IR6 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.773636697753954,AM -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.9681136142967,BOP -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903121,CL -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-43.599999999999994,EA -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,12.129509556366443,EOP -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.07437430623754743,IA -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.07437430623754743,IFIE1 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.773636697753954,IR3 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,25.13934166641384,IR5 -0,,2020,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986157867,AM -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.156552131440618,BOP -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.656208145282752,EOP -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986157867,IR4 -0,,2020,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.500343986157867,ISE6 -0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.958738976731105,BOP -0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903124,CL -0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP -0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45631603430072,EV -0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.016300537999407044,IA -0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016300537999407044,IFIE1 -0,,2020,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.016300537999413223,ISE11 -0,PR,2020,USD,,OA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,CF -0,PR,2020,USD,,OA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1,EOP -0,PR,2020,USD,,OA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,IR1 -0,PR,2020,USD,,OA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2,WO -0,PR,2020,USD,,OAPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2.4000000000000004,IR6 -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.481278597221998,EOP -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.453303278926093,EOP -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719444398,EV -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660655785217,EV -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01646835335808134,IFIE1 -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274472555968,IR5 -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372201601,OCI1 -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.5142516904975025,OCI1 -0,,2020,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238025463672244,YCU -2020,NIC,2020,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,CF -2020,NIC,2020,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,ISE2 -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.93510993884719,BOP -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.83818525115076,BOP -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.77534316666396,EOP -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.43963934711303,EOP -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719444399,EV -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.90660655785217,EV -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.027447255596802236,IA -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.06842130670140079,IA -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13723627798401117,IFIE2 -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.037442805555997,ISE12 -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC -2020,NIC,2020,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.900206527571996,OCI2 -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.23591034712291,OCI2 -2020,NIC,2020,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.22380254636726704,YCU -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.481278597221998,EOP -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.453303278926093,EOP -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719444398,EV -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660655785217,EV -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01646835335808134,IFIE2 -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274472555968,ISE12 -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC -2020,,2020,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372201601,OCI2 -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.5142516904975025,OCI2 -2020,,2020,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238025463672244,YCU -0,PR,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF -0,ICO,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF -0,NIC,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF -0,ACA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF -0,AEA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,,AA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,,AA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-1,EOP -0,PR,2020,USD,,AA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,,AA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,WO -0,PR,2020,USD,,AAPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5,IR6 -0,PR,2020,USD,,APA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-90,IR6 -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.963392949885524,BOP -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94808795107775,BOP -0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.908704950657615,BOP -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.87054820092061,BOP -0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF -0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF -0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.77033486392617,EOP -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.78283172777515,EOP -0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.9925114388888,EOP -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.4270877400716,EOP -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.45831803554256,EOP -0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.981321311570433,EOP -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.990014559301141,EV -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719444398,EV -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.975090771307462,EV -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.906606557852164,EV -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.016636168716755634,IA -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.021957804477441785,IA -0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.04147659195731423,IA -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.05473704536112062,IA -0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.19963402460106758,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13174682686465072,IFIE1 -0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.005489451119360446,IFIE1 -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06322865953015,IR5 -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446479332545,IR5 -0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.987021987769438,IR5 -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.863594634929065,OCI1 -0,NIC,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89271796646079,OCI1 -0,ICO,2020,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511438888798,OCI1 -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684175878363,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.217231658693336,OCI1 -0,ICO,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.981321311570433,OCI1 -0,PR,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.3283233358608868,YCU -0,NIC,2020,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.22380254636726704,YCU -0,PR,2020,USD,L,BEPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,120,IR6 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-3.7096824440639895,AM -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.9681136142967,BOP -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903121,CL -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-50,EA -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.793463810056409,EOP -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.07437430623754743,IA -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.07437430623754743,IFIE1 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3.7096824440639895,IR3 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,31.539341666413847,IR5 -0,,2020,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986157867,AM -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.156552131440618,BOP -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.656208145282752,EOP -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986157867,IR4 -0,,2020,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.500343986157867,ISE6 -0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.958738976731105,BOP -0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135554903122,CL -0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP -0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45631603430072,EV -0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.016300537999407044,IA -0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016300537999407044,IFIE1 -0,,2020,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.016300537999399012,ISE11 -0,PR,2020,USD,,OA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,CF -0,PR,2020,USD,,OA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1,EOP -0,PR,2020,USD,,OA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,IR1 -0,PR,2020,USD,,OA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2,WO -0,PR,2020,USD,,OAPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-3,IR6 -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.987021987769438,BOP -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.967637050230152,BOP -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.481278597221998,EOP -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.453303278926093,EOP -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719444398,EV -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660655785217,EV -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451119360446,IA -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261340280154,IA -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01646835335808134,IFIE1 -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274472555968,IR5 -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372201601,OCI1 -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.5142516904975025,OCI1 -0,,2020,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238025463672244,YCU -0,AEA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF -0,ACA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF -0,NIC,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,CF -0,ICO,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,CF -0,PR,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,90,CF -0,PR,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,,AA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF -0,PR,2020,USD,,AA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-1,EOP -0,PR,2020,USD,,AA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,,AA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,4,WO -0,PR,2020,USD,,AAPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,4,IR6 -0,PR,2020,USD,,APA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-72,IR6 -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.963392949885524,BOP -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,47.94808795107775,BOP -0,ICO,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.987021987769438,BOP -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.908704950657615,BOP -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,47.87054820092061,BOP -0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.967637050230152,BOP -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF -0,ICO,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF -0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.77033486392617,EOP -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,260.78283172777515,EOP -0,ICO,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,8.9925114388888,EOP -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.4270877400716,EOP -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,260.45831803554256,EOP -0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,8.981321311570433,EOP -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,14.990014559301141,EV -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,44.96255719444398,EV -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,14.975090771307462,EV -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,44.906606557852164,EV -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.016636168716755634,IA -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.021957804477441785,IA -0,ICO,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.005489451119360446,IA -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.04147659195731423,IA -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.05473704536112062,IA -0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.013684261340280154,IA -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.10384888801926062,IFIE1 -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0.05927647861893748,IFIE1 -0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.013684261340280154,IFIE1 -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-55.102992870764375,IR5 -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,39.157955180074396,IR5 -0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-8.967637050230152,IR5 -0,PR,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,ICO,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,PR,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.3283233358608868,YCU -0,NIC,2020,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.22380254636726704,YCU -0,PR,2020,USD,L,BEPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,96,IR6 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.773636697753954,AM -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,42.9681136142967,BOP -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135554903121,CL -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-43.599999999999994,EA -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,12.129509556366443,EOP -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.07437430623754743,IA -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.07437430623754743,IFIE1 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,5.773636697753954,IR3 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,25.13934166641384,IR5 -0,,2020,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6.500343986157867,AM -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.156552131440618,BOP -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-13.65620814528275,EOP -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6.500343986157867,IR4 -0,,2020,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6.500343986157867,ISE6 -0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,31.958738976731105,BOP -0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135554903122,CL -0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,EOP -0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,55.45631603430072,EV -0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.016300537999407044,IA -0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.016300537999407044,IFIE1 -0,,2020,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0.016300537999399012,ISE11 -0,PR,2020,USD,,OA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,3,CF -0,PR,2020,USD,,OA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,1,EOP -0,PR,2020,USD,,OA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,3,IR1 -0,PR,2020,USD,,OA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-2,WO -0,PR,2020,USD,,OAPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-2.4000000000000004,IR6 -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.987021987769438,BOP -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.967637050230152,BOP -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,22.481278597221998,EOP -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,22.453303278926093,EOP -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.496255719444398,EV -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.490660655785217,EV -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.005489451119360446,IA -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.013684261340280154,IA -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.002282908942278606,IFIE1 -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,7.516534599439783,IR5 -0,,2020,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,3.552713678800501E-15,OCI1 -0,,2020,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.02238025463672244,YCU -2020,NIC,2020,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,CF -2020,NIC,2020,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,ISE2 -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,299.67554969423594,BOP -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,299.67554969423594,BOP -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.93510993884719,BOP -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.83818525115076,BOP -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,269.77534316666396,EOP -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,269.43963934711303,EOP -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,44.96255719444399,EV -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,44.90660655785217,EV -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.10978902238720895,IA -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.10978902238720895,IA -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.027447255596802236,IA -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.06842130670140079,IA -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0.04559221727865731,IFIE2 -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,30.190318129844243,ISE12 -2020,NIC,2020,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93510993884718,MC -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93510993884718,MC -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-1.4210854715202004E-14,OCI2 -2020,NIC,2020,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.22380254636726704,YCU -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,29.967554969423595,BOP -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,29.967554969423595,BOP -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,11.987021987769438,BOP -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,11.967637050230152,BOP -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,22.481278597221998,EOP -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,22.453303278926093,EOP -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.496255719444398,EV -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.490660655785217,EV -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.010978902238720892,IA -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.010978902238720892,IA -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.005489451119360446,IA -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.013684261340280154,IA -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.002282908942278606,IFIE2 -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,7.516534599439783,ISE12 -2020,,2020,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.993510993884719,MC -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.993510993884719,MC -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,3.552713678800501E-15,OCI2 -2020,,2020,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.02238025463672244,YCU -0,PR,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,CF -0,ICO,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,CF -0,NIC,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,CF -0,ACA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF -0,AEA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF -0,PR,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP -0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF -0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2.5,EOP -0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,4,WO -0,PR,2020,USD,,AAPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,4,IR6 -0,PR,2020,USD,,APA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-72,IR6 -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.963392949885524,BOP -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.94808795107775,BOP -0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.987021987769438,BOP -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.908704950657615,BOP -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.87054820092061,BOP -0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.967637050230152,BOP -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF -0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF -0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.77033486392617,CL -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.78283172777515,CL -0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.9925114388888,CL -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.4270877400716,CL -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.45831803554256,CL -0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.981321311570433,CL -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.990014559301141,EV -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.96255719444398,EV -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.975090771307462,EV -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.906606557852164,EV -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.016636168716755634,IA -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.021957804477441785,IA -0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.005489451119360446,IA -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.04147659195731423,IA -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.05473704536112062,IA -0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.013684261340280154,IA -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.19963402460106758,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.13174682686465072,IFIE1 -0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.005489451119360446,IFIE1 -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.8335635234563,IR5 -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.80729652110057,IR5 -0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.005489451119361277,IR5 -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.63392949885525,OCI1 -0,NIC,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.67554969423594,OCI1 -0,ICO,2020,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63392949885525,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755496942359,OCI1 -0,ICO,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 -0,PR,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.3283233358608868,YCU -0,NIC,2020,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.22380254636726704,YCU -0,PR,2020,USD,L,BEPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,96,IR6 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,67.83795828214957,BOP -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-139.94506864907146,CL -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-33.87170342894083,EA -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.08679991324534386,IA -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.08679991324534386,IFIE1 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.92475819539493,IR5 -0,,2020,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655213144062,AM -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.156552131440618,BOP -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655213144062,IR4 -0,,2020,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-20.15655213144062,ISE6 -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.728296571059161,AM -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,31.958738976731105,BOP -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-87.43135554903122,CL -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.728296571059161,EA -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,55.45631603430072,EV -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.016300537999407044,IA -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.016300537999407044,IFIE1 -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.71199603305977,ISE11 -0,,2020,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.728296571059161,ISE9 -0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP -0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,3,CF -0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,2.5,EOP -0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,3,IR1 -0,PR,2020,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2,WO -0,PR,2020,USD,,OAPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2.4000000000000004,IR6 -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.987021987769438,BOP -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.967637050230152,BOP -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.481278597221998,CL -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.453303278926093,CL -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.496255719444398,EV -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.490660655785217,EV -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.005489451119360446,IA -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.013684261340280154,IA -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.01646835335808134,IFIE1 -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.98402332278168,IR5 -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.967554969423603,OCI1 -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.967554969423595,OCI1 -0,,2020,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.02238025463672244,YCU -0,PR,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,CF -0,ICO,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,CF -0,NIC,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,CF -0,ACA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF -0,AEA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF -0,PR,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,,AA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF -0,PR,2020,USD,,AA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-1,EOP -0,PR,2020,USD,,AA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,,AA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,4,WO -0,PR,2020,USD,,AAPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,4,IR6 -0,PR,2020,USD,,APA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-72,IR6 -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.63392949885525,BOP -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.67554969423594,BOP -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.92678589977105,BOP -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.94808795107775,BOP -0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.987021987769438,BOP -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.81740990131523,BOP -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.87054820092061,BOP -0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.967637050230152,BOP -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF -0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF -0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.7144163960125,EOP -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.78283172777515,EOP -0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.9925114388888,EOP -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.28759605939337,EOP -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.45831803554256,EOP -0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.981321311570433,EOP -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.97403785418295,EV -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.96255719444398,EV -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.93523600539941,EV -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.906606557852164,EV -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.18299785588431194,IA -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.10978902238720895,IA -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.03327233743351127,IA -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.021957804477441785,IA -0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.005489451119360446,IA -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.08295318391462846,IA -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.05473704536112062,IA -0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.013684261340280154,IA -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,0.2162701933178232,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.13174682686465072,IFIE1 -0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.005489451119360446,IFIE1 -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.864216703839475,IR5 -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.02446479332545,IR5 -0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.987021987769438,IR5 -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.963392949885474,MC -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93510993884718,MC -0,PR,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.0804868971573,OCI1 -0,NIC,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-38.89271796646079,OCI1 -0,ICO,2020,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.992511438888798,OCI1 -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.65366656053817,OCI1 -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.217231658693336,OCI1 -0,ICO,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.981321311570433,OCI1 -0,PR,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.3283233358608868,YCU -0,NIC,2020,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.22380254636726704,YCU -0,PR,2020,USD,L,BEPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,104,IR6 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-33.48998867550812,AM -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,42.9681136142967,BOP -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,8.004653973154419,BOP -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-51.599999999999994,EA -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,70.35723911069861,EOP -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.4922636208166304,EV -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.07437430623754743,IA -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.0003356307173485902,IA -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.07470993695489601,IFIE1 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,33.48998867550812,IR3 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-60.80440423495516,IR5 -0,,2020,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,105.89201388261736,MC -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.500343986157867,AM -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.156552131440618,BOP -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-13.656208145282752,EOP -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.500343986157867,IR4 -0,,2020,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6.500343986157867,ISE6 -0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,CF -0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1,EOP -0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,IR1 -0,PR,2020,USD,,OA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-2,WO -0,PR,2020,USD,,OAPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-2.4000000000000004,IR6 -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.967554969423595,BOP -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.987021987769438,BOP -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.967637050230152,BOP -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.481278597221998,EOP -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.453303278926093,EOP -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.496255719444398,EV -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.490660655785217,EV -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.010978902238720892,IA -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.005489451119360446,IA -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.013684261340280154,IA -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.01646835335808134,IFIE1 -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.50274472555968,IR5 -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.993510993884719,MC -0,,2020,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-7.486276372201601,OCI1 -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.5142516904975025,OCI1 -0,,2020,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.02238025463672244,YCU -0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF -0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,CF -0,PR,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,ISE1 -0,NIC,2020,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 -0,PR,2020,USD,,AA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,CF -0,PR,2020,USD,,AA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,EOP -0,PR,2020,USD,,AA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,ISE1 -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696474942763,BOP -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777484711797,BOP -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527160395198197,BOP -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696474942763,BOP -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777484711797,BOP -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527160395198197,BOP -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.981696474942762,BOP -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.967554969423595,BOP -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437375980433944,BOP -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.954352475328808,BOP -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909262557538,BOP -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29373948854293713,BOP -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970417989396935,CF -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970417989396935,CF -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.1337106481180328,CF -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.1337106481180328,CF -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.5933128558860402,CRU -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.5923289904108416,CRU -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.38516743196308,EOP -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.88767158333198,EOP -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.9654554759111158,EOP -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.2135438700358,EOP -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.71981967355651,EOP -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.9638544365065973,EOP -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.4950072796505705,EV -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.481278597221994,EV -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16090924598518777,EV -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.487545385653731,EV -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.453303278926086,EV -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16064240608443553,EV -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.09149892794215597,IA -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489451119360447,IA -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.726288250786695E-05,IA -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.09149892794215597,IA -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489451119360447,IA -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.726288250786695E-05,IA -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.008318084358377817,IA -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.013723627798401118,IA -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0002461342988846482,IA -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.020738295978657114,IA -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.03421065335070039,IA -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0006135656595298578,IA -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.09981701230053379,IFIE1 -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.06861813899200558,IFIE1 -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.5936362530674327,IFIE1 -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.531614329765073,ISE10 -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.018721402777999,ISE10 -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.2565476188917011,ISE10 -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.981696474942737,MC -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755496942359,MC -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054320790396418,MC -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.981696474942737,MC -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755496942359,MC -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054320790396418,MC -0,PR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-27.431797317464532,OCI1 -0,NIC,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.950103263785998,OCI1 -0,CDR,2020,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.8501838719591338,OCI1 -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.603420879391816,OCI1 -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.117955173561455,OCI1 -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.8485828325546154,OCI1 -0,PR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.1641616679304434,YCU -0,NIC,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11190127318363352,YCU -0,CDR,2020,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8.349412781047394E-05,YCU -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,11.133355649364928,AM -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-24.22813469379126,BOP -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863442721,CL -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.5933128558860402,CRU -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-23.389442532110124,EOP -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.03854664570667637,IA -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.6318595015927165,IFIE1 -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,9.662803986091077,ISE10 -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.133355649364928,ISE7 -0,,2020,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-52.92295262051829,MC -0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-15.684995728561214,BOP -0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863442721,CL -0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP -0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-27.56724877116518,EV -0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.007904134700818875,IA -0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.007904134700818875,IFIE1 -0,,2020,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.007904134700817522,ISE11 -0,PR,2020,USD,,OA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,CF -0,PR,2020,USD,,OA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,EOP -0,PR,2020,USD,,OA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,ISE1 -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711798,BOP -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711798,BOP -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.993510993884719,BOP -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.983818525115076,BOP -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.240639298610999,EOP -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.226651639463046,EOP -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.248127859722199,EV -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.2453303278926087,EV -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451119360446,IA -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451119360446,IA -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.002744725559680223,IA -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.006842130670140077,IA -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.00823417667904067,IFIE1 -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75137236277984,ISE10 -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.9967554969423595,MC -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.9967554969423595,MC -0,,2020,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.7431381861008006,OCI1 -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.7571258452487513,OCI1 -0,,2020,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.01119012731836122,YCU -2020,NIC,2020,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF -2020,NIC,2020,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777484711797,BOP -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527160395198197,BOP -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777484711797,BOP -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527160395198197,BOP -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.967554969423595,BOP -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437375980433944,BOP -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909262557538,BOP -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29373948854293713,BOP -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970417989396935,CF -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970417989396935,CF -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.1337106481180328,CF -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.1337106481180328,CF -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.5933128558860402,CRU -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.5923289904108416,CRU -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.88767158333198,EOP -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.9654554759111158,EOP -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.71981967355651,EOP -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.9638544365065973,EOP -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.481278597221994,EV -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16090924598518777,EV -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.453303278926086,EV -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16064240608443553,EV -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489451119360447,IA -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.726288250786695E-05,IA -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489451119360447,IA -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.726288250786695E-05,IA -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.013723627798401118,IA -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0002461342988846482,IA -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.03421065335070039,IA -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.0006135656595298578,IA -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.06861813899200558,IFIE2 -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.5936362530674327,IFIE2 -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.018721402777999,ISE12 -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.2565476188917011,ISE12 -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755496942359,MC -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054320790396418,MC -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755496942359,MC -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054320790396418,MC -2020,NIC,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.950103263785998,OCI2 -2020,CDR,2020,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.8501838719591338,OCI2 -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.117955173561455,OCI2 -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.8485828325546154,OCI2 -2020,NIC,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11190127318363352,YCU -2020,CDR,2020,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8.349412781047394E-05,YCU -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711798,BOP -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.983777484711798,BOP -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.993510993884719,BOP -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.983818525115076,BOP -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.240639298610999,EOP -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.226651639463046,EOP -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.248127859722199,EV -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.2453303278926087,EV -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451119360446,IA -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451119360446,IA -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.002744725559680223,IA -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.006842130670140077,IA -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.00823417667904067,IFIE2 -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75137236277984,ISE12 -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.9967554969423595,MC -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.9967554969423595,MC -2020,,2020,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.7431381861008006,OCI2 -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.7571258452487513,OCI2 -2020,,2020,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.01119012731836122,YCU -0,PR,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,CF -0,NIC,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF -0,PR,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,ISE1 -0,NIC,2020,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 -0,PR,2020,USD,,AA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,CF -0,PR,2020,USD,,AA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,EOP -0,PR,2020,USD,,AA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,ISE1 -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.81696474942763,BOP -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777484711797,BOP -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527160395198197,BOP -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.81696474942763,BOP -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777484711797,BOP -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527160395198197,BOP -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.981696474942762,BOP -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.967554969423595,BOP -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437375980433944,BOP -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.954352475328808,BOP -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909262557538,BOP -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29373948854293713,BOP -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970417989396935,CF -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970417989396935,CF -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.1337106481180328,CF -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.1337106481180328,CF -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.5933128558860402,CRU -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.5923289904108416,CRU -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.38516743196308,EOP -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.88767158333198,EOP -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.9654554759111158,EOP -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.2135438700358,EOP -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.71981967355651,EOP -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.9638544365065973,EOP -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.4950072796505705,EV -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.481278597221994,EV -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16090924598518777,EV -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.487545385653731,EV -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.453303278926086,EV -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16064240608443553,EV -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.09149892794215597,IA -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489451119360447,IA -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.726288250786695E-05,IA -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.09149892794215597,IA -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489451119360447,IA -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.726288250786695E-05,IA -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.008318084358377817,IA -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.013723627798401118,IA -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0002461342988846482,IA -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.020738295978657114,IA -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.03421065335070039,IA -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0006135656595298578,IA -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.05192444400963031,IFIE1 -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.022796108639328655,IFIE1 -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.5929363248250689,IFIE1 -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,27.551496435382187,ISE10 -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.095159064922122,ISE10 -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.2556465077295465,ISE10 -0,PR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.981696474942737,MC -0,NIC,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755496942359,MC -0,CDR,2020,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054320790396418,MC -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.981696474942737,MC -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755496942359,MC -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054320790396418,MC -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,7.105427357601002E-15,OCI1 -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-5.551115123125783E-17,OCI1 -0,PR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.1641616679304434,YCU -0,NIC,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11190127318363352,YCU -0,CDR,2020,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8.349412781047394E-05,YCU -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,11.133355649364928,AM -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-24.22813469379126,BOP -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863442721,CL -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.5933128558860402,CRU -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-23.389442532110124,EOP -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.03854664570667637,IA -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.6318595015927165,IFIE1 -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,9.662803986091077,ISE10 -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.133355649364928,ISE7 -0,,2020,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-52.92295262051829,MC -0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-15.684995728561214,BOP -0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863442721,CL -0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,EOP -0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-27.56724877116518,EV -0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.007904134700818875,IA -0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.007904134700818875,IFIE1 -0,,2020,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.007904134700817522,ISE11 -0,PR,2020,USD,,OA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,CF -0,PR,2020,USD,,OA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,EOP -0,PR,2020,USD,,OA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,ISE1 -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.983777484711798,BOP -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.983777484711798,BOP -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.993510993884719,BOP -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.983818525115076,BOP -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.240639298610999,EOP -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.226651639463046,EOP -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.248127859722199,EV -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.2453303278926087,EV -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451119360446,IA -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451119360446,IA -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.002744725559680223,IA -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.006842130670140077,IA -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.001141454471139303,IFIE1 -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.7582672997198916,ISE10 -0,,2020,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.9967554969423595,MC -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.9967554969423595,MC -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.7763568394002505E-15,OCI1 -0,,2020,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.01119012731836122,YCU -2020,NIC,2020,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF -2020,NIC,2020,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777484711797,BOP -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527160395198197,BOP -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777484711797,BOP -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527160395198197,BOP -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.967554969423595,BOP -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437375980433944,BOP -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909262557538,BOP -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29373948854293713,BOP -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970417989396935,CF -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970417989396935,CF -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.1337106481180328,CF -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.1337106481180328,CF -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.5933128558860402,CRU -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.5923289904108416,CRU -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.88767158333198,EOP -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.9654554759111158,EOP -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.71981967355651,EOP -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.9638544365065973,EOP -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.481278597221994,EV -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16090924598518777,EV -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.453303278926086,EV -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16064240608443553,EV -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489451119360447,IA -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.726288250786695E-05,IA -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489451119360447,IA -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.726288250786695E-05,IA -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.013723627798401118,IA -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0002461342988846482,IA -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.03421065335070039,IA -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.0006135656595298578,IA -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.022796108639328655,IFIE2 -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.5929363248250689,IFIE2 -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.095159064922122,ISE12 -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.2556465077295465,ISE12 -2020,NIC,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755496942359,MC -2020,CDR,2020,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054320790396418,MC -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755496942359,MC -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054320790396418,MC -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,7.105427357601002E-15,OCI2 -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-5.551115123125783E-17,OCI2 -2020,NIC,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11190127318363352,YCU -2020,CDR,2020,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8.349412781047394E-05,YCU -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.983777484711798,BOP -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.983777484711798,BOP -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.993510993884719,BOP -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.983818525115076,BOP -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.240639298610999,EOP -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.226651639463046,EOP -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.248127859722199,EV -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.2453303278926087,EV -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451119360446,IA -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451119360446,IA -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.002744725559680223,IA -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.006842130670140077,IA -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.001141454471139303,IFIE2 -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.7582672997198916,ISE12 -2020,,2020,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.9967554969423595,MC -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.9967554969423595,MC -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.7763568394002505E-15,OCI2 -2020,,2020,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.01119012731836122,YCU \ No newline at end of file +@@ReportVariable,,,,,,,,,,,,,,,,,,,,,, +AccidentYear,AmountType,AnnualCohort,Currency,ContractualCurrency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType +0,PR,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF +0,ICO,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,USD,,AA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,AA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-1,EOP +0,PR,2020,USD,USD,,AA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,USD,,AA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,WO +0,PR,2020,USD,USD,,AAPA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,IR6 +0,PR,2020,USD,USD,,APA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-72,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.96339295,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94808795,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.90870495,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.8705482,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.7703349,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.7828317,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511439,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.4270877,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.458318,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.981321312,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.99001456,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719,EV +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.97509077,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.90660656,EV +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.016636169,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.021957804,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.041476592,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.054737045,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.199634025,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.131746827,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.005489451,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06322866,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446479,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.987021988,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.86359463,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89271797,OCI1 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511439,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684176,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.21723166,OCI1 +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.981321312,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.328323336,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.223802546,YCU +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,96,IR6 +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.773636698,AM +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.96811361,BOP +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135555,CL +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-43.6,EA +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,12.12950956,EOP +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.074374306,IA +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.074374306,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.773636698,IR3 +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,25.13934167,IR5 +0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.8920139,MC +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986,AM +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.156552131,BOP +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.65620815,EOP +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.500343986,ISE6 +0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.95873898,BOP +0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135555,CL +0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45631603,EV +0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.016300538,IA +0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016300538,IFIE1 +0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.016300538,ISE11 +0,PR,2020,USD,USD,,OA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,CF +0,PR,2020,USD,USD,,OA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1,EOP +0,PR,2020,USD,USD,,OA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,IR1 +0,PR,2020,USD,USD,,OA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2,WO +0,PR,2020,USD,USD,,OAPA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2.4,IR6 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.4812786,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.45330328,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719,EV +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660656,EV +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016468353,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.502744726,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425169,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.022380255,YCU +2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,CF +2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,ISE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.93510994,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.83818525,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.7753432,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.4396393,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719,EV +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.90660656,EV +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.027447256,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.068421307,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.137236278,IFIE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.03744281,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.90020653,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.23591035,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.223802546,YCU +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.4812786,EOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.45330328,EOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719,EV +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660656,EV +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016468353,IFIE2 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.502744726,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425169,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.022380255,YCU +0,PR,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF +0,ICO,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,USD,,AA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,AA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-1,EOP +0,PR,2020,USD,USD,,AA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,USD,,AA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,WO +0,PR,2020,USD,USD,,AAPA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5,IR6 +0,PR,2020,USD,USD,,APA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-90,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.96339295,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94808795,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.90870495,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.8705482,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.7703349,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.7828317,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511439,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.4270877,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.458318,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.981321312,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.99001456,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719,EV +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.97509077,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.90660656,EV +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.016636169,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.021957804,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.041476592,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.054737045,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.199634025,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.131746827,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.005489451,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06322866,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446479,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.987021988,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.86359463,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89271797,OCI1 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511439,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684176,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.21723166,OCI1 +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.981321312,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.328323336,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.223802546,YCU +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,120,IR6 +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-3.709682444,AM +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.96811361,BOP +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135555,CL +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-50,EA +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.79346381,EOP +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.074374306,IA +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.074374306,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3.709682444,IR3 +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,31.53934167,IR5 +0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.8920139,MC +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986,AM +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.156552131,BOP +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.65620815,EOP +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.500343986,ISE6 +0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.95873898,BOP +0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135555,CL +0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45631603,EV +0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.016300538,IA +0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016300538,IFIE1 +0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.016300538,ISE11 +0,PR,2020,USD,USD,,OA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,CF +0,PR,2020,USD,USD,,OA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1,EOP +0,PR,2020,USD,USD,,OA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,IR1 +0,PR,2020,USD,USD,,OA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2,WO +0,PR,2020,USD,USD,,OAPA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-3,IR6 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.4812786,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.45330328,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719,EV +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660656,EV +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016468353,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.502744726,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425169,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.022380255,YCU +0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF +0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF +0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,CF +0,ICO,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,CF +0,PR,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,90,CF +0,PR,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,USD,,AA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,AA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-1,EOP +0,PR,2020,USD,USD,,AA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,USD,,AA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,4,WO +0,PR,2020,USD,USD,,AAPA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,4,IR6 +0,PR,2020,USD,USD,,APA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-72,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.96339295,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,47.94808795,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,11.98702199,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.90870495,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,47.8705482,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,11.96763705,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.7703349,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,260.7828317,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,8.992511439,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.4270877,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,260.458318,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,8.981321312,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,14.99001456,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,44.96255719,EV +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,14.97509077,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,44.90660656,EV +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.016636169,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.021957804,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.005489451,IA +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.041476592,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.054737045,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.013684261,IA +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.103848888,IFIE1 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0.059276479,IFIE1 +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.013684261,IFIE1 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-55.10299287,IR5 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,39.15795518,IR5 +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-8.96763705,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.328323336,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.223802546,YCU +0,PR,2020,USD,USD,L,BEPA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,96,IR6 +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.773636698,AM +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,42.96811361,BOP +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135555,CL +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-43.6,EA +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,12.12950956,EOP +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.074374306,IA +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.074374306,IFIE1 +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,5.773636698,IR3 +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,25.13934167,IR5 +0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,105.8920139,MC +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,6.500343986,AM +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.156552131,BOP +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-13.65620815,EOP +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,6.500343986,IR4 +0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-6.500343986,ISE6 +0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,31.95873898,BOP +0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135555,CL +0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,55.45631603,EV +0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.016300538,IA +0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.016300538,IFIE1 +0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0.016300538,ISE11 +0,PR,2020,USD,USD,,OA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,3,CF +0,PR,2020,USD,USD,,OA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,1,EOP +0,PR,2020,USD,USD,,OA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,3,IR1 +0,PR,2020,USD,USD,,OA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-2,WO +0,PR,2020,USD,USD,,OAPA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-2.4,IR6 +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,11.98702199,BOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,11.96763705,BOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,22.4812786,EOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,22.45330328,EOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.496255719,EV +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.490660656,EV +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.005489451,IA +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.013684261,IA +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.002282909,IFIE1 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,7.516534599,IR5 +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,3.55E-15,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.022380255,YCU +2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,CF +2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,ISE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,299.6755497,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,299.6755497,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,59.93510994,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,59.83818525,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,269.7753432,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,269.4396393,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,44.96255719,EV +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,44.90660656,EV +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,0.109789022,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,0.109789022,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.027447256,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.068421307,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,0.045592217,IFIE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,30.19031813,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93510994,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93510994,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-1.42E-14,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.223802546,YCU +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,29.96755497,BOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,29.96755497,BOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,11.98702199,BOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,11.96763705,BOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,22.4812786,EOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,22.45330328,EOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.496255719,EV +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.490660656,EV +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,0.010978902,IA +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,0.010978902,IA +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.005489451,IA +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.013684261,IA +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.002282909,IFIE2 +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,7.516534599,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.993510994,MC +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.993510994,MC +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,3.55E-15,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.022380255,YCU +0,PR,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,CF +0,ICO,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,CF +0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,CF +0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF +0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2.5,EOP +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,4,WO +0,PR,2020,USD,USD,,AAPA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,4,IR6 +0,PR,2020,USD,USD,,APA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-72,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.96339295,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.94808795,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.98702199,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.90870495,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.8705482,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.96763705,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.7703349,CL +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.7828317,CL +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.992511439,CL +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.4270877,CL +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.458318,CL +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.981321312,CL +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.99001456,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.96255719,EV +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.97509077,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.90660656,EV +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.016636169,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.021957804,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.005489451,IA +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.041476592,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.054737045,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.013684261,IA +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.199634025,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.131746827,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.005489451,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.8335635,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.8072965,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.005489451,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.6339295,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.6755497,OCI1 +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339295,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755497,OCI1 +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.328323336,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.223802546,YCU +0,PR,2020,USD,USD,L,BEPA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,96,IR6 +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,67.83795828,BOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-139.9450686,CL +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-33.87170343,EA +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.086799913,IA +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.086799913,IFIE1 +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.9247582,IR5 +0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,105.8920139,MC +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655213,AM +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.156552131,BOP +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655213,IR4 +0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-20.15655213,ISE6 +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.728296571,AM +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,31.95873898,BOP +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-87.43135555,CL +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.728296571,EA +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,55.45631603,EV +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.016300538,IA +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.016300538,IFIE1 +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.711996033,ISE11 +0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.728296571,ISE9 +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,3,CF +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,2.5,EOP +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,3,IR1 +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2,WO +0,PR,2020,USD,USD,,OAPA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2.4,IR6 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.98702199,BOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.96763705,BOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.4812786,CL +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.45330328,CL +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.496255719,EV +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.490660656,EV +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.005489451,IA +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.013684261,IA +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.016468353,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.98402332,IR5 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.96755497,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755497,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.022380255,YCU +0,PR,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,CF +0,ICO,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,CF +0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,CF +0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF +0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,IR1 +0,ICO,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,IR2 +0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,ISE2 +0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 +0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 +0,ICO,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6,ISE5 +0,PR,2020,USD,USD,,AA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,AA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-1,EOP +0,PR,2020,USD,USD,,AA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,IR1 +0,PR,2020,USD,USD,,AA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,4,WO +0,PR,2020,USD,USD,,AAPA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,4,IR6 +0,PR,2020,USD,USD,,APA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-72,IR6 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.6339295,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.6755497,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.9267859,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.94808795,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.98702199,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.8174099,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.8705482,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.96763705,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.7144164,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.7828317,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.992511439,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.2875961,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.458318,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.981321312,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.97403785,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.96255719,EV +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.93523601,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.90660656,EV +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.182997856,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.109789022,IA +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.033272337,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.021957804,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.005489451,IA +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.082953184,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.054737045,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.013684261,IA +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,0.216270193,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.131746827,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.005489451,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.8642167,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.02446479,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.987021988,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.96339295,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93510994,MC +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.0804869,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-38.89271797,OCI1 +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.992511439,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.65366656,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.21723166,OCI1 +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.981321312,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.328323336,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.223802546,YCU +0,PR,2020,USD,USD,L,BEPA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,104,IR6 +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-33.48998868,AM +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,42.96811361,BOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,8.004653973,BOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-51.6,EA +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,70.35723911,EOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.492263621,EV +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.074374306,IA +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.000335631,IA +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.074709937,IFIE1 +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,33.48998868,IR3 +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-60.80440423,IR5 +0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,105.8920139,MC +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.500343986,AM +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.156552131,BOP +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-13.65620815,EOP +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.500343986,IR4 +0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6.500343986,ISE6 +0,PR,2020,USD,USD,,OA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,CF +0,PR,2020,USD,USD,,OA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1,EOP +0,PR,2020,USD,USD,,OA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,IR1 +0,PR,2020,USD,USD,,OA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-2,WO +0,PR,2020,USD,USD,,OAPA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-2.4,IR6 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.96755497,BOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.98702199,BOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.96763705,BOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.4812786,EOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.45330328,EOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.496255719,EV +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.490660656,EV +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.010978902,IA +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.005489451,IA +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.013684261,IA +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.016468353,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.502744726,IR5 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.993510994,MC +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-7.486276372,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.51425169,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.022380255,YCU +0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,ISE1 +0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 +0,PR,2020,USD,USD,,AA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,CF +0,PR,2020,USD,USD,,AA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,EOP +0,PR,2020,USD,USD,,AA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,ISE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.8169647,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.115271604,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.8169647,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.115271604,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.98169647,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.96755497,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437376,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.95435248,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909263,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.293739489,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970418,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970418,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.133710648,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.133710648,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.593312856,CRU +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59232899,CRU +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.3851674,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.8876716,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.965455476,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.2135439,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.7198197,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.963854437,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.49500728,EV +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.4812786,EV +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.160909246,EV +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.487545386,EV +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.45330328,EV +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.160642406,EV +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.091498928,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.054894511,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.73E-05,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.091498928,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.054894511,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.73E-05,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.008318084,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.013723628,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.000246134,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.020738296,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.034210653,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.000613566,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.099817012,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.068618139,IFIE1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.593636253,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.53161433,ISE10 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.0187214,ISE10 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.256547619,ISE10 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.98169647,MC +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755497,MC +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054321,MC +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.98169647,MC +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755497,MC +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054321,MC +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-27.43179732,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.95010326,OCI1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.850183872,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.60342088,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.11795517,OCI1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.848582833,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.164161668,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.111901273,YCU +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8.35E-05,YCU +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,11.13335565,AM +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-24.22813469,BOP +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863,CL +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.593312856,CRU +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-23.38944253,EOP +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.038546646,IA +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.631859502,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,9.662803986,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.13335565,ISE7 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-52.92295262,MC +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-15.68499573,BOP +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863,CL +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-27.56724877,EV +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.007904135,IA +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.007904135,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.007904135,ISE11 +0,PR,2020,USD,USD,,OA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,CF +0,PR,2020,USD,USD,,OA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,EOP +0,PR,2020,USD,USD,,OA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,ISE1 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.993510994,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.983818525,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.2406393,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.22665164,EOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24812786,EV +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.245330328,EV +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.002744726,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.006842131,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.008234177,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.751372363,ISE10 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.996755497,MC +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.996755497,MC +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.743138186,OCI1 +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.757125845,OCI1 +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.011190127,YCU +2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF +2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.115271604,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.115271604,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.96755497,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437376,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909263,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.293739489,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970418,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970418,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.133710648,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.133710648,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.593312856,CRU +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59232899,CRU +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.8876716,EOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.965455476,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.7198197,EOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.963854437,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.4812786,EV +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.160909246,EV +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.45330328,EV +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.160642406,EV +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.054894511,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.73E-05,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.054894511,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.73E-05,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.013723628,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.000246134,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.034210653,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.000613566,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.068618139,IFIE2 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.593636253,IFIE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.0187214,ISE12 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.256547619,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755497,MC +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054321,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755497,MC +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054321,MC +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.95010326,OCI2 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.850183872,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.11795517,OCI2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.848582833,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.111901273,YCU +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8.35E-05,YCU +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.993510994,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.983818525,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.2406393,EOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.22665164,EOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24812786,EV +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.245330328,EV +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451,IA +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451,IA +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.002744726,IA +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.006842131,IA +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.008234177,IFIE2 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.751372363,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.996755497,MC +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.996755497,MC +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.743138186,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.757125845,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.011190127,YCU +0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,CF +0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF +0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,ISE1 +0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 +0,PR,2020,USD,USD,,AA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,CF +0,PR,2020,USD,USD,,AA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,EOP +0,PR,2020,USD,USD,,AA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,ISE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.8169647,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.8377748,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.115271604,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.8169647,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.8377748,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.115271604,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.98169647,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.96755497,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437376,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.95435248,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909263,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.293739489,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970418,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970418,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.133710648,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.133710648,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.593312856,CRU +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.59232899,CRU +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.3851674,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.8876716,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.965455476,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.2135439,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.7198197,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.963854437,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.49500728,EV +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.4812786,EV +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.160909246,EV +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.487545386,EV +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.45330328,EV +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.160642406,EV +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.091498928,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.054894511,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.73E-05,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.091498928,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.054894511,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.73E-05,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.008318084,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.013723628,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.000246134,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.020738296,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.034210653,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.000613566,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.051924444,IFIE1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.022796109,IFIE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.592936325,IFIE1 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,27.55149644,ISE10 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.09515906,ISE10 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.255646508,ISE10 +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.98169647,MC +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755497,MC +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054321,MC +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.98169647,MC +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755497,MC +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054321,MC +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,7.11E-15,OCI1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-5.55E-17,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.164161668,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.111901273,YCU +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8.35E-05,YCU +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,11.13335565,AM +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-24.22813469,BOP +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863,CL +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.593312856,CRU +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-23.38944253,EOP +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.038546646,IA +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.631859502,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,9.662803986,ISE10 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.13335565,ISE7 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-52.92295262,MC +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-15.68499573,BOP +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863,CL +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-27.56724877,EV +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.007904135,IA +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.007904135,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.007904135,ISE11 +0,PR,2020,USD,USD,,OA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,CF +0,PR,2020,USD,USD,,OA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,EOP +0,PR,2020,USD,USD,,OA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,ISE1 +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98377748,BOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98377748,BOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.993510994,BOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.983818525,BOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.2406393,EOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.22665164,EOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.24812786,EV +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.245330328,EV +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451,IA +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451,IA +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.002744726,IA +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.006842131,IA +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.001141454,IFIE1 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.7582673,ISE10 +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.996755497,MC +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.996755497,MC +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.78E-15,OCI1 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.011190127,YCU +2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF +2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.8377748,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.115271604,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.8377748,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.115271604,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.96755497,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437376,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909263,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.293739489,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970418,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970418,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.133710648,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.133710648,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.593312856,CRU +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.59232899,CRU +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.8876716,EOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.965455476,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.7198197,EOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.963854437,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.4812786,EV +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.160909246,EV +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.45330328,EV +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.160642406,EV +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.054894511,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.73E-05,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.054894511,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.73E-05,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.013723628,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.000246134,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.034210653,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.000613566,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.022796109,IFIE2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.592936325,IFIE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.09515906,ISE12 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.255646508,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755497,MC +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054321,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755497,MC +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054321,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,7.11E-15,OCI2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-5.55E-17,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.111901273,YCU +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8.35E-05,YCU +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98377748,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98377748,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.993510994,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.983818525,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.2406393,EOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.22665164,EOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.24812786,EV +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.245330328,EV +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451,IA +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451,IA +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.002744726,IA +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.006842131,IA +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.001141454,IFIE2 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.7582673,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.996755497,MC +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.996755497,MC +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.78E-15,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.011190127,YCU diff --git a/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb index 7016fa12..60dc3809 100644 --- a/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb +++ b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb @@ -191,7 +191,7 @@ "Report.ForDataCube( Test.GetScopes(identities).Aggregate().FinancialPerformance.Filter((\"GroupOfContract\", dataNode)) )", "\n .WithQuerySource(DataSource)", "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", - "\n .SliceColumnsBy(CurrencyGrouper(currencyType), \"LiabilityType\",\"GroupOfContract\")", + "\n .SliceColumnsBy(\"Currency\", \"LiabilityType\",\"GroupOfContract\")", "\n .WithGridOptions( o => o.WithDefaultColumn( c => c.WithWidth(260) ) with {GroupDefaultExpanded = 3, Height = 900, OnGridReady = null} )", "\n .ToReport()" ] diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index 2c3fac39..cd9bb7a3 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -1529,17 +1529,21 @@ "\n [Dimension(typeof(Scenario))]", "\n [IdentityProperty]", "\n public string Scenario { get; init; }", + "\n", + "\n [NotVisible]", + "\n [Dimension(typeof(Currency))]", + "\n [IdentityProperty]", + "\n [AggregateBy]", + "\n public string Currency { get; init; }", "\n ", "\n [NotVisible]", "\n [Dimension(typeof(Currency), nameof(FunctionalCurrency))]", "\n [IdentityProperty]", - "\n //[AggregateBy]", "\n public string FunctionalCurrency { get; init; }", "\n ", "\n [NotVisible]", "\n [Dimension(typeof(Currency), nameof(ContractualCurrency))]", "\n [IdentityProperty]", - "\n //[AggregateBy]", "\n public string ContractualCurrency { get; init; }", "\n ", "\n [NotVisible]", @@ -1628,7 +1632,7 @@ "\n [NotVisible]", "\n [Dimension(typeof(EconomicBasis))]", "\n [IdentityProperty]", - "\n //[AggregateBy]", + "\n [AggregateBy]", "\n public string EconomicBasis { get; init; }", "\n ", "\n public double Value { get; init; }", @@ -1637,6 +1641,7 @@ "\n public ReportVariable(ReportVariable rv){", "\n ReportingNode = rv.ReportingNode;", "\n Scenario = rv.Scenario;", + "\n Currency = rv.Currency;", "\n FunctionalCurrency = rv.FunctionalCurrency;", "\n ContractualCurrency = rv.ContractualCurrency;", "\n GroupOfContract = rv.GroupOfContract;", diff --git a/ifrs17/Report/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb index e380125c..6b2cbab2 100644 --- a/ifrs17/Report/ReportConfigurationAndUtils.ipynb +++ b/ifrs17/Report/ReportConfigurationAndUtils.ipynb @@ -58,15 +58,6 @@ "# Currency methods" ] }, - { - "cell_type": "code", - "source": [ - "public static string CurrencyGrouper(CurrencyType currencyType) => currencyType switch {", - "\n CurrencyType.Contractual => \"ContractualCurrency\",", - "\n CurrencyType.Functional => \"FunctionalCurrency\",", - "\n _ => string.Empty };" - ] - }, { "cell_type": "code", "source": [ diff --git a/ifrs17/Report/ReportMutableScopes.ipynb b/ifrs17/Report/ReportMutableScopes.ipynb index 2cd03b41..68b45530 100644 --- a/ifrs17/Report/ReportMutableScopes.ipynb +++ b/ifrs17/Report/ReportMutableScopes.ipynb @@ -137,7 +137,7 @@ "\n", "\npublic interface PvReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] { \"Novelty\", \"VariableType\" };", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\", \"EconomicBasis\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"LiabilityType\", \"EconomicBasis\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? (GetScopes(GetIdentities()).Aggregate().LockedBestEstimate + GetScopes(GetIdentities()).Aggregate().CurrentBestEstimate)", "\n : (GetScopes(GetIdentities()).Aggregate().LockedBestEstimate + GetScopes(GetIdentities()).Aggregate().CurrentBestEstimate).Filter(dataFilter);", @@ -145,7 +145,7 @@ "\n", "\npublic interface RaReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] { \"Novelty\", \"VariableType\" };", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\", \"EconomicBasis\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"LiabilityType\", \"EconomicBasis\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().LockedRiskAdjustment + ", "\n GetScopes(GetIdentities()).Aggregate().CurrentRiskAdjustment", @@ -155,7 +155,7 @@ "\n", "\npublic interface WrittenReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"AmountType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"LiabilityType\"};", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().Written", "\n : GetScopes(GetIdentities()).Aggregate().Written.Filter(dataFilter);", @@ -163,7 +163,7 @@ "\n", "\npublic interface AccrualReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\"};", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().Advance + ", "\n GetScopes(GetIdentities()).Aggregate().Overdue", @@ -173,15 +173,15 @@ "\n", "\npublic interface DeferralReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"LiabilityType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().Deferrals", "\n : GetScopes(GetIdentities()).Aggregate().Deferrals.Filter(dataFilter);", "\n}", "\n", "\npublic interface FcfReport : IIfrs17Report {", - "\n string[] IIfrs17Report.defaultRowSlices => new string[] { \"Novelty\",\"VariableType\" };", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"LiabilityType\", \"EconomicBasis\" };", + "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\",\"VariableType\"};", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"LiabilityType\", \"EconomicBasis\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().Fcf", "\n : GetScopes(GetIdentities()).Aggregate().Fcf.Filter(dataFilter);", @@ -189,21 +189,21 @@ "\n", "\npublic interface ExpAdjReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"EstimateType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"AmountType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"AmountType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().ActuarialExperienceAdjustment", "\n : GetScopes(GetIdentities()).Aggregate().ActuarialExperienceAdjustment.Filter(dataFilter);", "\n}", "\npublic interface TmReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\", \"VariableType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType) };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().LrcTechnicalMargin", "\n : GetScopes(GetIdentities()).Aggregate().LrcTechnicalMargin.Filter(dataFilter);", "\n}", "\npublic interface CsmReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\", \"VariableType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().Csm + ", "\n GetScopes(GetIdentities()).Aggregate().Lc + ", @@ -214,35 +214,35 @@ "\n}", "\npublic interface ActLrcReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\",\"VariableType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().LrcActuarial", "\n : GetScopes(GetIdentities()).Aggregate().LrcActuarial.Filter(dataFilter);", "\n}", "\npublic interface LrcReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().Lrc", "\n : GetScopes(GetIdentities()).Aggregate().Lrc.Filter(dataFilter);", "\n}", "\npublic interface ActLicReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\",\"VariableType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().LicActuarial", "\n : GetScopes(GetIdentities()).Aggregate().LicActuarial.Filter(dataFilter);", "\n}", "\npublic interface LicReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType), \"EstimateType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().Lic", "\n : GetScopes(GetIdentities()).Aggregate().Lic.Filter(dataFilter);", "\n}", "\npublic interface FpReport : IIfrs17Report {", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\", \"EstimateType\"};", - "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { CurrencyGrouper(CurrencyType),\"LiabilityType\" };", + "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\",\"LiabilityType\" };", "\n int IIfrs17Report.headerColumnWidthValue => 500;", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", "\n ? GetScopes(GetIdentities()).Aggregate().FinancialPerformance", diff --git a/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb index b6fd584d..7a5efd50 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -148,7 +148,10 @@ "\n Identity.ReportIdentity.FunctionalCurrency, ", "\n GetStorage().GetFxPeriod(GetStorage().Args.Period, x.VariableType, x.Novelty),", "\n (Identity.ReportIdentity.Year, Identity.ReportIdentity.Month),", - "\n Identity.CurrencyType)).Fx, x ));", + "\n Identity.CurrencyType)).Fx, x ) with { Currency = Identity.CurrencyType switch {", + "\n CurrencyType.Contractual => x.ContractualCurrency,", + "\n CurrencyType.Functional => x.FunctionalCurrency,", + "\n _ => GroupCurrency }});", "\n ", "\n private IDataCube Eops => Data.Filter((\"VariableType\", AocTypes.EOP));", "\n private IDataCube NotEops => Data.Filter((\"VariableType\", \"!EOP\")); // TODO negation must be hardcoded (also to avoid string concatenation)", From 1bf5c0602d81e32e4aeda74120f4445f194e08ce Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Mon, 7 Nov 2022 09:34:46 +0100 Subject: [PATCH 22/43] Clean up doc (#71) * remove spec tests * read me and big picture * help review * code of conduct. Readme. Remove Spec tests * env for go live * rename of directories in file * overview template * improve template readme * calculation engine and reports in template * more on ifrs17ce * NB titles * clean up display order * improve validation * fix links * fix link * Close import template * additions to report guide * solve conflicts --- .../{Consts.ipynb => CalculationEngine.ipynb} | 6 +- full-ifrs17-template/Database/Configure.ipynb | 2 +- .../Database/PersonalConnectionExample.ipynb | 25 + full-ifrs17-template/Export/MapTemplate.ipynb | 63 +- .../DataNodeParameters_CH_2020_12.csv | 0 .../DataNodeStates_CH_2020_12.csv | 0 .../DataNodes_CH.csv | 0 .../CreditDefaultRate.csv | 0 .../ExchangeRate.csv | 0 .../PartnerRating.csv | 0 .../YieldCurve.csv | 0 .../ReportingNodes.csv | 0 .../Actuals_CH_2020_12.csv | 0 .../Actuals_CH_2021_3.csv | 0 .../NominalCashflows_CH_2020_12.csv | 0 .../NominalCashflows_CH_2021_3.csv | 0 .../Openings_CH_2020_12.csv | 0 .../SimpleValue_CH_2020_12.csv | 0 .../Images/SpecificationsCSM.PNG | Bin 40913 -> 0 bytes .../Images/SpecificationsImportActuals.PNG | Bin 12211 -> 0 bytes .../Images/SpecificationsImportCashflows.PNG | Bin 38471 -> 0 bytes .../Images/SpecificationsPL.PNG | Bin 79272 -> 0 bytes full-ifrs17-template/Images/video1.png | Bin 0 -> 283562 bytes .../Import/CloseImportTemplate.ipynb | 125 + .../InitSystemorphBaseToMemory.ipynb | 18 +- .../InitSystemorphToDatabase.ipynb | 26 +- .../InitSystemorphToMemory.ipynb | 12 +- .../InputFormatDescription.ipynb | 28 +- .../OverviewIFRS17Template.ipynb | 60 +- full-ifrs17-template/README.md | 38 +- full-ifrs17-template/Report/Reports.ipynb | 89 +- .../SpecificationsFinancialPerformance.ipynb | 1461 ------------ .../Test/SpecificationsImportActuals.ipynb | 507 ----- .../Test/SpecificationsImportCashflows.ipynb | 2005 ----------------- .../Test/SpecificationsSetup.ipynb | 125 - .../Test/SpecificationsTechnicalMargin.ipynb | 1768 --------------- full-ifrs17-template/Test/Tests.ipynb | 30 - ifrs17/Constants/Validations.ipynb | 2 +- ifrs17/DataModel/DataStructure.ipynb | 7 +- ifrs17/Export/ExportConfiguration.ipynb | 6 + ifrs17/Images/BigPicture.PNG | Bin 38530 -> 42091 bytes ifrs17/Import/ImportScopeCalculation.ipynb | 20 +- ifrs17/Import/Importers.ipynb | 60 +- ifrs17/OverviewCalculationEngine.ipynb | 43 +- ifrs17/README.md | 30 +- ifrs17/Report/ReportScopes.ipynb | 8 +- ifrs17/Utils/Extensions.ipynb | 6 + ifrs17/Utils/ImportCalculationMethods.ipynb | 6 + ifrs17/Utils/Queries.ipynb | 6 + ifrs17/Utils/TestHelper.ipynb | 6 + 50 files changed, 502 insertions(+), 6086 deletions(-) rename full-ifrs17-template/Constants/{Consts.ipynb => CalculationEngine.ipynb} (86%) create mode 100644 full-ifrs17-template/Database/PersonalConnectionExample.ipynb rename full-ifrs17-template/Files/{700.DataNodes => DataNodes}/DataNodeParameters_CH_2020_12.csv (100%) rename full-ifrs17-template/Files/{700.DataNodes => DataNodes}/DataNodeStates_CH_2020_12.csv (100%) rename full-ifrs17-template/Files/{700.DataNodes => DataNodes}/DataNodes_CH.csv (100%) rename full-ifrs17-template/Files/{800.Parameters => Parameters}/CreditDefaultRate.csv (100%) rename full-ifrs17-template/Files/{800.Parameters => Parameters}/ExchangeRate.csv (100%) rename full-ifrs17-template/Files/{800.Parameters => Parameters}/PartnerRating.csv (100%) rename full-ifrs17-template/Files/{800.Parameters => Parameters}/YieldCurve.csv (100%) rename full-ifrs17-template/Files/{300.ReportingNodes => ReportingNodes}/ReportingNodes.csv (100%) rename full-ifrs17-template/Files/{900.TransactionalData => TransactionalData}/Actuals_CH_2020_12.csv (100%) rename full-ifrs17-template/Files/{900.TransactionalData => TransactionalData}/Actuals_CH_2021_3.csv (100%) rename full-ifrs17-template/Files/{900.TransactionalData => TransactionalData}/NominalCashflows_CH_2020_12.csv (100%) rename full-ifrs17-template/Files/{900.TransactionalData => TransactionalData}/NominalCashflows_CH_2021_3.csv (100%) rename full-ifrs17-template/Files/{900.TransactionalData => TransactionalData}/Openings_CH_2020_12.csv (100%) rename full-ifrs17-template/Files/{900.TransactionalData => TransactionalData}/SimpleValue_CH_2020_12.csv (100%) delete mode 100644 full-ifrs17-template/Images/SpecificationsCSM.PNG delete mode 100644 full-ifrs17-template/Images/SpecificationsImportActuals.PNG delete mode 100644 full-ifrs17-template/Images/SpecificationsImportCashflows.PNG delete mode 100644 full-ifrs17-template/Images/SpecificationsPL.PNG create mode 100644 full-ifrs17-template/Images/video1.png create mode 100644 full-ifrs17-template/Import/CloseImportTemplate.ipynb delete mode 100644 full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb delete mode 100644 full-ifrs17-template/Test/SpecificationsImportActuals.ipynb delete mode 100644 full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb delete mode 100644 full-ifrs17-template/Test/SpecificationsSetup.ipynb delete mode 100644 full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb diff --git a/full-ifrs17-template/Constants/Consts.ipynb b/full-ifrs17-template/Constants/CalculationEngine.ipynb similarity index 86% rename from full-ifrs17-template/Constants/Consts.ipynb rename to full-ifrs17-template/Constants/CalculationEngine.ipynb index 1ef5ee81..cf36e68d 100644 --- a/full-ifrs17-template/Constants/Consts.ipynb +++ b/full-ifrs17-template/Constants/CalculationEngine.ipynb @@ -18,11 +18,11 @@ { "cell_type": "code", "source": [ - "var projectName = \"ifrs17ce\";", - "\nvar environmentName = \"dev\";", + "var projectName = \"ifrs17\";", + "\nvar environmentName = \"v1.0.0\";", "\nvar notebookName = \"CalculationEngine\";", "\nvar calculationEngine = $\"#!import \\\"//{projectName}/{environmentName}/{notebookName}\\\"\";" ] } ] -} +} \ No newline at end of file diff --git a/full-ifrs17-template/Database/Configure.ipynb b/full-ifrs17-template/Database/Configure.ipynb index cbe56388..44886de4 100644 --- a/full-ifrs17-template/Database/Configure.ipynb +++ b/full-ifrs17-template/Database/Configure.ipynb @@ -27,7 +27,7 @@ { "cell_type": "code", "source": [ - "#!import \"../Constants/Consts\"", + "#!import \"../Constants/CalculationEngine\"", "\n#!eval calculationEngine" ] }, diff --git a/full-ifrs17-template/Database/PersonalConnectionExample.ipynb b/full-ifrs17-template/Database/PersonalConnectionExample.ipynb new file mode 100644 index 00000000..0bcdbdd5 --- /dev/null +++ b/full-ifrs17-template/Database/PersonalConnectionExample.ipynb @@ -0,0 +1,25 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "var connectionStringMsSql = \"here enter your connection string\";" + ] + } + ] +} \ No newline at end of file diff --git a/full-ifrs17-template/Export/MapTemplate.ipynb b/full-ifrs17-template/Export/MapTemplate.ipynb index af901570..0b4a1094 100644 --- a/full-ifrs17-template/Export/MapTemplate.ipynb +++ b/full-ifrs17-template/Export/MapTemplate.ipynb @@ -26,13 +26,17 @@ { "cell_type": "markdown", "source": [ - "This Notebook exports the Data nodes, states, and parameters for the target partition to a spreadsheet file which can be read, modified, and is ready to be re-imported." + "This notebook exports the data nodes, data node states, and data node parameters belonging to a specific data partition into an excel file.", + "\n
This file contains reference data used to prepopulate dropdows and validations to facilitate editing.", + "\n
This can be modified and imported in the calculation engine to create and modify data." ] }, { "cell_type": "markdown", "source": [ - "After setting the desired target Partition, the Data present in the workspace is ready to be exported. " + "After setting the desired target Partition, the Data present in the workspace is ready to be exported. ", + "\n", + "\nThe default location of the exported files is the project file storage. A **download** link is generated and available for as long as the session is active. " ] }, { @@ -52,8 +56,8 @@ "source": [ "/* The DataSource is configured and connected to real database */", "\n//#!eval-notebook \"../Database/Configure\"", - "\n/* The Systemorph set of dimensions + mockdata are dispatched to the unconfigured in-memory DataSource */", - "\n#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + "\n/* The Systemorph set of dimensions + mockdata (+ those added in the CloseImportTemplate) are dispatched to the unconfigured in-memory DataSource */", + "\n#!eval-notebook \"../Import/CloseImportTemplate\"" ] }, { @@ -77,7 +81,9 @@ { "cell_type": "markdown", "source": [ - "# Map Template: Data Node" + "# Map Template: Data Node", + "\n", + "\n[DataNodes](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node) defines the properties of [Portfolios](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#group-of-contracts)." ] }, { @@ -89,13 +95,8 @@ { "cell_type": "code", "source": [ - "static var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };" - ] - }, - { - "cell_type": "code", - "source": [ - "await Workspace.Partition.SetAsync( partition );" + "static var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };", + "\nawait Workspace.Partition.SetAsync( partition );" ] }, { @@ -120,7 +121,9 @@ { "cell_type": "markdown", "source": [ - "# Map Template: Data Node State" + "# Map Template: Data Node State", + "\n", + "\n[Data Node State](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node-state) defines whether the instance is active (used in import/output) or inactive (present in the DataSource but not used in input/output operations)." ] }, { @@ -132,19 +135,20 @@ { "cell_type": "code", "source": [ - "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };" + "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", + "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" ] }, { - "cell_type": "code", + "cell_type": "markdown", "source": [ - "await Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" + "## Export" ] }, { "cell_type": "markdown", "source": [ - "## Export" + "The data is retrieved for the Workspace and prepared for export." ] }, { @@ -158,6 +162,12 @@ "\n .ToArray();" ] }, + { + "cell_type": "markdown", + "source": [ + "Export is performed." + ] + }, { "cell_type": "code", "source": [ @@ -172,7 +182,9 @@ { "cell_type": "markdown", "source": [ - "# Map Template: Data Node Parameter" + "# Map Template: Data Node Parameter", + "\n", + "\n[Data Node Parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node-parameters) are defined at the Group of Contract level and are used during the import calculation. " ] }, { @@ -184,19 +196,20 @@ { "cell_type": "code", "source": [ - "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };" + "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", + "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" ] }, { - "cell_type": "code", + "cell_type": "markdown", "source": [ - "await Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" + "## Export" ] }, { "cell_type": "markdown", "source": [ - "## Export" + "The data is retrieved for the Workspace and prepared for export." ] }, { @@ -212,6 +225,12 @@ "\n .ToArray() );" ] }, + { + "cell_type": "markdown", + "source": [ + "Export is performed." + ] + }, { "cell_type": "code", "source": [ diff --git a/full-ifrs17-template/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv b/full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv similarity index 100% rename from full-ifrs17-template/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv rename to full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv diff --git a/full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv b/full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv similarity index 100% rename from full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv rename to full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv diff --git a/full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv b/full-ifrs17-template/Files/DataNodes/DataNodes_CH.csv similarity index 100% rename from full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv rename to full-ifrs17-template/Files/DataNodes/DataNodes_CH.csv diff --git a/full-ifrs17-template/Files/800.Parameters/CreditDefaultRate.csv b/full-ifrs17-template/Files/Parameters/CreditDefaultRate.csv similarity index 100% rename from full-ifrs17-template/Files/800.Parameters/CreditDefaultRate.csv rename to full-ifrs17-template/Files/Parameters/CreditDefaultRate.csv diff --git a/full-ifrs17-template/Files/800.Parameters/ExchangeRate.csv b/full-ifrs17-template/Files/Parameters/ExchangeRate.csv similarity index 100% rename from full-ifrs17-template/Files/800.Parameters/ExchangeRate.csv rename to full-ifrs17-template/Files/Parameters/ExchangeRate.csv diff --git a/full-ifrs17-template/Files/800.Parameters/PartnerRating.csv b/full-ifrs17-template/Files/Parameters/PartnerRating.csv similarity index 100% rename from full-ifrs17-template/Files/800.Parameters/PartnerRating.csv rename to full-ifrs17-template/Files/Parameters/PartnerRating.csv diff --git a/full-ifrs17-template/Files/800.Parameters/YieldCurve.csv b/full-ifrs17-template/Files/Parameters/YieldCurve.csv similarity index 100% rename from full-ifrs17-template/Files/800.Parameters/YieldCurve.csv rename to full-ifrs17-template/Files/Parameters/YieldCurve.csv diff --git a/full-ifrs17-template/Files/300.ReportingNodes/ReportingNodes.csv b/full-ifrs17-template/Files/ReportingNodes/ReportingNodes.csv similarity index 100% rename from full-ifrs17-template/Files/300.ReportingNodes/ReportingNodes.csv rename to full-ifrs17-template/Files/ReportingNodes/ReportingNodes.csv diff --git a/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv similarity index 100% rename from full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv rename to full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv diff --git a/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv similarity index 100% rename from full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv rename to full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv diff --git a/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv similarity index 100% rename from full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv rename to full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv diff --git a/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv similarity index 100% rename from full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv rename to full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv diff --git a/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/Openings_CH_2020_12.csv similarity index 100% rename from full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv rename to full-ifrs17-template/Files/TransactionalData/Openings_CH_2020_12.csv diff --git a/full-ifrs17-template/Files/900.TransactionalData/SimpleValue_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/SimpleValue_CH_2020_12.csv similarity index 100% rename from full-ifrs17-template/Files/900.TransactionalData/SimpleValue_CH_2020_12.csv rename to full-ifrs17-template/Files/TransactionalData/SimpleValue_CH_2020_12.csv diff --git a/full-ifrs17-template/Images/SpecificationsCSM.PNG b/full-ifrs17-template/Images/SpecificationsCSM.PNG deleted file mode 100644 index a04d351d21e730028ab328c8311e70b0f77f19fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40913 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 diff --git a/full-ifrs17-template/Images/SpecificationsImportActuals.PNG b/full-ifrs17-template/Images/SpecificationsImportActuals.PNG deleted file mode 100644 index 7f3d5d05a460fba884f58baaeeb41c84a4617c0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12211 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 z zGk``Oerpa(iPi<=r!C%E(Bbz8?*40 zeoXb7UBBkFJOmZ7Sr7aXI8pmYHhAhV-?@TD7n_EOm#&vg17*k=pqc|P4L49fAuLnJ zj;Vh4IM%R8F8Dd=3akpkoM~0Fxa1r6R}r}6LY+dm!+e3Dr7%;A?Y4=)x3HVQrv`M4 zf%qeXzRp_J3YdH2el00r&Z&calkacOWznvJDX@m}FfEHSP8A4lC+nE z5dGFOdbH}wALTKgsp1+Cvg>Y(IS^OP2?BKgziM*W(*=$t?zGIcX+fRTY4Fmk3XXR&Xt!;o&W|MH&CB0u&P zXb7(@QTJ7`-FKL*FDE<+JrS;mEjYCM3a`|U8R-C>_~}ng#C0;#)epZjDcwE6fbE*# zAa+jVuLJiSrEskmTFO-?!Uq>27J(tl*yO!qbq$V80J7)MIY+}Y)Gd!rBkfA$EfLgDvDy*dt5{PSOeV~~r2T*aW%fiou`tzM>_ ox%0PE;r~}h%K!V16_2fjnV)nRz3RMsoja$#4qUrL^XL2j3jj;*0{{R3 diff --git a/full-ifrs17-template/Images/SpecificationsImportCashflows.PNG b/full-ifrs17-template/Images/SpecificationsImportCashflows.PNG deleted file mode 100644 index bcb093c83f1aeed76336d9853ce6074735e120e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38471 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

GkJ}&o=@#D>_ov@=)8CG67#8 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 literal 0 HcmV?d00001 diff --git a/full-ifrs17-template/Import/CloseImportTemplate.ipynb b/full-ifrs17-template/Import/CloseImportTemplate.ipynb new file mode 100644 index 00000000..eae574bf --- /dev/null +++ b/full-ifrs17-template/Import/CloseImportTemplate.ipynb @@ -0,0 +1,125 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Close Imports Template

" + ] + }, + { + "cell_type": "markdown", + "source": [ + "All imports are triggered via the Import command. Several options can be fluently appended to customize the import action:", + "\n- FromFile() : accepts a string as input (eg. \"../Files/TransactionalData/Openings_CH_2020_12.csv\"). It corresponds the file to be imported complete with the path", + "\n- WithFormat() : accepts a string as input (eg. \"Cashflow\" or \"Actual\"). It is used to trigger the desired import logic for the current file. Full list of avalaible ImportFormat can be found [here](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Constants/Consts#import-formats)", + "\n- WithFileStorage() : defined the drive from where the input files is retrieved. In this example we use the project file storage (new files have to be uploaded into the project), other options are SharePoint and OneDrive. ", + "\n- WithTarget() : target drive where the results are stored. In this example we use our in-memory set up", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Set up data and configuration", + "\n", + "\nThe data source is initialized and the whole IFRS 17 Calculation Engine code is compiled. " + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# DataNode and Parameters", + "\n", + "\nNew Data Nodes and Parameters are imported here.", + "\n
To easily generate these files, please refer to the **Map Template** files exported [here](../Export/MapTemplate). Edit them at your wish and import them back into the solution through the following cells. ", + "\n
For the **ImportFormat**, the following options are expected:", + "\n- ImportFormats.DataNode : [Portfolios](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#group-of-contracts)", + "\n- ImportFormats.DataNodeState : the [state of a data node](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node-state) can be either active or inactive.", + "\n- ImportFormats.DataNodeParameter : parameters are described [here](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node-parameters). For **Group of Insurance Contracts** a default [Premium Allocation factor](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Import/ImportScopeCalculation#experience-adjustment-on-premium) of 1 is applied if the parameter is not imported.", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "var pathToFile = \"../Files/DataNodes/DataNodes_CH.csv\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var format = ImportFormats.DataNode;" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(pathToFile).WithFormat(format).WithTarget(DataSource).ExecuteAsync()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Transactional Data", + "\n", + "\nTransactional data are imported here. ", + "\n
For the **ImportFormat**, the following options are expected:", + "\n- ImportFormats.Opening : for opening values in a Fair Value Approach", + "\n- ImportFormats.Cashflow : nominal cash flows", + "\n- ImportFormats.Actual : written actuals, payable and receivables. ", + "\n- ImportFormats.SimpleValue : direct import of pre-calculated Present Value and Actual values for all reports - no calculation is triggered -" + ] + }, + { + "cell_type": "code", + "source": [ + "var pathToFile = \"../Files/TransactionalData/Openings_CH_2020_12.csv\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var format = ImportFormats.Opening;" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(pathToFile).WithFormat(format).WithTarget(DataSource).ExecuteAsync()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Workspace reset" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + ] + } + ] +} \ No newline at end of file diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index e910c089..46ba277c 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb @@ -29,7 +29,7 @@ { "cell_type": "code", "source": [ - "#!import \"../Constants/Consts\"", + "#!import \"../Constants/CalculationEngine\"", "\n#!eval calculationEngine" ] }, @@ -106,7 +106,7 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/300.ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -128,25 +128,25 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/800.Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/800.Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/800.Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/800.Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -158,19 +158,19 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/700.DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" ] }, { diff --git a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb index cc45633d..104f646d 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb @@ -84,7 +84,7 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/300.ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -106,25 +106,25 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/800.Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/800.Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/800.Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/800.Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -136,19 +136,19 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/700.DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/700.DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -160,31 +160,31 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" ] }, { diff --git a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb index 057f5088..a96f6a66 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -52,37 +52,37 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" ] }, { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/900.TransactionalData/SimpleValue_CH_2020_12.csv\").WithFormat(ImportFormats.SimpleValue ).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/TransactionalData/SimpleValue_CH_2020_12.csv\").WithFormat(ImportFormats.SimpleValue ).WithTarget(DataSource).ExecuteAsync()" ] }, { diff --git a/full-ifrs17-template/InputFormatDescription.ipynb b/full-ifrs17-template/InputFormatDescription.ipynb index 9dd70de5..2b083f04 100644 --- a/full-ifrs17-template/InputFormatDescription.ipynb +++ b/full-ifrs17-template/InputFormatDescription.ipynb @@ -36,16 +36,16 @@ "source": [ "A cashflow file is named **NominalCashflows** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Cashflow**.", "\n", - "\nThe **Main** section contains information such as: Reporting Node, Year, Month and Scenario for which the data is being imported. This information is used to define the [partition](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#partitions) to which the data belongs.", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month and Scenario for which the data is being imported. This information is used to define the [partition](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#partitions) to which the data belongs.", "\n", "\nThe **Cashflow** section contains the cash flow data. Several pieces of information are required to characterize a cash flow correctly:", - "\n- [DataNode](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AmountType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- [AocType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [Novelty](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#novelty) : entered with its SystemName,", + "\n- [DataNode](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AmountType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [AocType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [Novelty](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#novelty) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims.", "\n", - "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", + "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", "\n
The cash flow is entered in the columns named ValuesN where N goes from 0 to the lenght of cash flow. The Value0 corresponds to January of the Year entered in the **Main** section for every combination of AocType and Novelty. " ] }, @@ -64,12 +64,12 @@ "source": [ "An Actuals file is named **Actuals** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Actual**.", "\n", - "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#partition) to which the data belong.", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#partition) to which the data belong.", "\n", "\nThe **Actual** section contains the actuals data. Several pieces of information are required to to characterize an Actuals amount correctly:", - "\n- [DataNode](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AocType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [ValueType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type) : corresponds to AmountType SystemName extended with the ExternalId,", + "\n- [DataNode](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AocType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [ValueType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#amount-type) : corresponds to AmountType SystemName extended with the ExternalId,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ] }, @@ -88,12 +88,12 @@ "source": [ "An Openings file is named **Openings** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Opening**. In an AoC for one period, we only need one file with the year/month combination of the beginning of the period. Some GICs do not need any entries in Openings.", "\n", - "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#partition) to which the data belong.", + "\nThe **Main** section contains information such as: Reporting Node, Year, Month for which the data is being imported. This information is used to define the [partition](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#partition) to which the data belong.", "\n", "\nThe **Opening** section contains values at opening of an analysis. Several pieces of information are required to to characterize an Opening amount correctly:", - "\n- [DataNode](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [EstimateType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#estimate-type) : entered with its SystemName,", - "\n- [AmountType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [DataNode](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [EstimateType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [AmountType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#amount-type) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ] } diff --git a/full-ifrs17-template/OverviewIFRS17Template.ipynb b/full-ifrs17-template/OverviewIFRS17Template.ipynb index 026e24e4..2475dbde 100644 --- a/full-ifrs17-template/OverviewIFRS17Template.ipynb +++ b/full-ifrs17-template/OverviewIFRS17Template.ipynb @@ -28,7 +28,7 @@ "source": [ "# Introduction", "\n", - "\nSystemorph's IFRS 17 Calculation Engine is a tool and a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts for **groups of insurance contracts** and other relevant parameters (Yield Curve, FX rates, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\nSystemorph's IFRS 17 Calculation Engine is a tool and a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts for **groups of insurance contracts** and other relevant parameters (Yield Curve, FX rates, etc...). The output is a set of calculated results (Contractual Service Margin, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", "\n", "\nSystemorph's Full IFRS 17 Template provides a complete example of input data and uses the Calculation Engine for the production of IFRS 17 results. Users can adapt this template to their own needs by changing the input data and calculating their own results.", "\n", @@ -43,7 +43,7 @@ "\n", "\nIFRS 17 is a new accounting standard for insurance contracts. The previous standard IFRS 4, which is based on nominal accounting, is replaced by the economic accounting standard IFRS 17.", "\n", - "\nExplanatory **videos** on **IFRS 17** and a **demo application** can be found on Systemorph's website. Some key points are repeated here briefly.", + "\nSome key points are repeated here briefly.", "\n", "\nIFRS 17 deals with insurance contracts which are on the liability side of the balance sheet. Other accounting standards deal with other parts of the business, primarily IFRS 9 for invested assets.", "\n", @@ -70,18 +70,22 @@ { "cell_type": "markdown", "source": [ - "# Data input" + "# Data input", + "\n", + "\n" ] }, { "cell_type": "markdown", "source": [ "", - "\n## Data input: Reporting nodes, dimensions and partitions", + "\n## Data input: Reporting nodes, dimensions", "\n", - "\nSee folders *Files* (DimensionsAndPartitions) and *Files/300.ReportingNodes* (ReportingNodes).", + "\nSee folders *Files* (Dimensions) and *Files/ReportingNodes* (ReportingNodes).", "\n- **ReportingNodes**: List of business units, often per country, with system name and display name, currency and \"G\" for the whole group", - "\n- **DimensionsAndPartitions**: The many dimensions (21) required to characterize all of the data and results, with system names and display names. This information is quite stable, but some information related to partitions refers to the reporting nodes " + "\n$$", + "\n$$", + "\n- **Dimensions**: The many dimensions required to characterize all of the data and results, with system names and display names. This information is quite stable." ] }, { @@ -90,9 +94,13 @@ "", "\n## Data input: Groups of insurance and reinsurance contracts", "\n", - "\nSee folder Files/700.DataNodes. The information is about data nodes, that is Groups of Insurance Contracts (GICs) and Groups of Reinsurance Contracts (GRICs) and portfolios of these.", + "\nSee folder Files/DataNodes. The information is about data nodes, that is Groups of Insurance Contracts (GICs) and Groups of Reinsurance Contracts (GRICs) and portfolios of these.", "\n- **DataNodes**: List of all GICs and GRICs, each with several attributes and the portfolios to which they belong; an additional attribute of GRICs being the reinsurance partner", + "\n$$", + "\n$$", "\n- **DataNodeParameters** *\\_* *\\_* *\\_*: List of those GICs and GRICs that are actually used for the given reporting node/year/month combination with few attributes; if needed, more such files may be added for other reporting node/year/month combinations", + "\n$$", + "\n$$", "\n- **DataNodeStates** *\\_* *\\_* *\\_*: Switching data nodes on and off, the normal state is (\"Active\") for all the GICs and GRICs of the reporting node/year/month combination; if needed, more such files may be added for other reporting node/year/month combinations" ] }, @@ -102,10 +110,16 @@ "", "\n## Data input: Parameters from financial markets", "\n", - "\nSee folder Files/800.Parameters.", + "\nSee folder Files/Parameters.", "\n- **YieldCurve**: List of all yield curves to be used, for different currencies and as-of dates (year/month), using a yearly grid of interest rate maturities extending as far as needed", + "\n$$", + "\n$$", "\n- **ExchangeRate**: List of exchange rates to be used, for different currencies and as-of dates (year/month), with a type (Spot/Average); defined as the value of 1 foreign unit expressed in the group currency of the insurance company ", + "\n$$", + "\n$$", "\n- **CreditDefaultRate**: For relevant year/month combinations, each with a full list of all credit ratings in S&P notation with their default rate (= probabilty of default within 1 year)", + "\n$$", + "\n$$", "\n- **PartnerRating**: For each reinsurance partner of a relevant GRIC, the rating in S&P notation with the as-of date (year/month)" ] }, @@ -115,9 +129,13 @@ "", "\n## Data input: Groups of insurance and reinsurance contracts", "\n", - "\nSee folder Files/900.TransactionalData.", + "\nSee folder Files/TransactionalData.", "\n- **Actuals** *\\_* *\\_* *\\_*: List of all actual amounts for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types and other attributes; we need at least two such files for the two dates of the Analysis of Change", + "\n$$", + "\n$$", "\n- **Openings** *\\_* *\\_* *\\_*: List of the opening amounts for some GICs that are used by the given reporting node. The year/month combination corresponds to the beginning of the planned Analysis of Change period, so only one such file is required. The entries are by EstimateType and AmountType.", + "\n$$", + "\n$$", "\n- **NominalCashflows** *\\_* *\\_* *\\_*: List of all projected cash flows for those GICs and GRICs that are used by the given reporting node/year/month combination, for different amount types, AoC types, novelty types and other attributes, where the cash flow amounts are given in a regular sequence extending as far as needed; we need at least two such files for the two dates of the Analysis of Change", "\n", "\nThe structure of the [Actuals](./InputFormatDescription#actual), [Openings](./InputFormatDescription#opening) and [NominalCashflows](./InputFormatDescription#cashflow) files is explained in a special [notebook](./InputFormatDescription).", @@ -128,10 +146,19 @@ { "cell_type": "markdown", "source": [ - "", - "\n# Reports", + "# Initialization", + "\n", + "\nWith **Initialization** we refer to an automatic import of data.", + "\nImport of dimensions is a necessary step which occurs only once in a production application. ", + "\nIn the context of the present **Full IFRS 17 Template** project other data, such as data nodes and transactional data, are imported through one of the following notebooks:", "\n", - "\nAll the reports are produced by running a notebook such as **[Reports](./Report/Reports#report-production)**. Some information on the reporting functionality can also be found there and in the final Reports section of [OverviewIFRS17](../IFRS17/OverviewIFRS17#reports)." + "\n- [InitSystemorphToDatabase](./Initialization/InitSystemorphToDatabase): where a physical database is used as target data store (database)", + "\n$$", + "\n$$", + "\n- [InitSystemorphToMemory](./Initialization/InitSystemorphToMemory): where memory of the server hosting the application is used as target data store (in-memory). Note that, this memory is lost when connection to the server is interrupted. ", + "\n", + "\nIn the **Full IFRS 17 Template** project we always rely on the in-memory set up in order to be independet from a physical database which might not be available to every user. ", + "\n" ] }, { @@ -139,6 +166,15 @@ "source": [ "" ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Reports", + "\n", + "\nAll the reports are produced by running a notebook such as **[Reports](./Report/Reports#report-production)**." + ] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/README.md b/full-ifrs17-template/README.md index 682bf0c1..3a4c25fc 100644 --- a/full-ifrs17-template/README.md +++ b/full-ifrs17-template/README.md @@ -1,36 +1,38 @@ -![Systemorph_logo.png](https://portal.systemorph.cloud/api/project/full-ifrs17-template1/env/dev/file/download?path=Images/Systemorph_logo.png) +

+Systemorph logo +

-**Full IFRS 17 Template** +

Full IFRS 17 Template

-Systemorph's IFRS 17 [Calculation Engine](https://portal.systemorph.cloud/api/project/ifrs17ce/env/dev/) is a tool to conduct all the essential IFRS 17 calculations given some key figures. +**Full IFRS 17 Template** uses our [**IFRS 17 Calculation Engine**](https://portal.systemorph.cloud/api/project/ifrs17/env/v1.0.0/) to import several use-cases and show the results. -Systemorph's *Full IFRS 17 Template* uses our IFRS 17 Calculation Engine to import several use-cases and show the results. +**IFRS 17 Calculation Engine** is a tool to conduct all the essential IFRS 17 calculations given some key figures. # Get Started -Interact with this *Full IFRS 17 Template* after having cloned the project +Clone this project to start interacting with it. # Supporting Material -Check out the [video]() (this is a youtube link or the video is embedded) +Check out our video series. You can get started here: +[](https://www.youtube.com/watch?v=M1B5AyYvXT8) -Check out our IFRS 17 initiative [here](landing page) +For more information on our IFRS 17 initiative check out our [IFRS 17 page](*landing page*). -# Report +For an overview of the **Full IFRS 17 Template** project refer to the [OverviewIFRS17Template](https://portal.systemorph.cloud/project/full-ifrs-17-template/env/v1.0.0/OverviewIFRS17Template) -Check out the IFRS 17 reports computed for our use-cases [here](./Report/Reports) +# Report -# Testing +Check out the IFRS 17 reports computed for our mock use-cases [here](https://portal.systemorph.cloud/project/full-ifrs-17-template/env/v1.0.0/Report/Reports). -If you want a step by step guide into the calculation logic, please go to the "Specification" notebook you are interested in: -- [Cashflow Calculation](./Test/SpecificationsImportCashflows) -- [Actuals Calculation](./Test/SpecificationsImportActuals) -- [Technical Margin Calculation](./Test/SpecificationsTechnicalMargin) -- [Financial Performance Calculation](./Test/SpecificationsFinancialPerformance) +Check out the our mock data set by exporting excel MapTemplates [here](https://portal.systemorph.cloud/project/full-ifrs-17-template/env/v1.0.0/Export/MapTemplate). # Got Questions -For support around the IFRS 17 CalculationEngine get in contact with our Community: +For support around the IFRS 17 CalculationEngine get in contact with our [Community](). (*TODO -link to the community page(IFRS17 landing page)*)- + +# Contributing + +All work on the **Full IFRS 17 Template** happens directly on [GitHub](https://github.com/Systemorph/IFRS17CalculationEngine). -- [Community]() -link to the community page- -- [Evangelists]() -link to Evangelists page- \ No newline at end of file +This project adheres to overall [General Terms & Conditions for Systemorph Cloud]() TODO link to terms and conditions file. \ No newline at end of file diff --git a/full-ifrs17-template/Report/Reports.ipynb b/full-ifrs17-template/Report/Reports.ipynb index 7528d59f..5d9ef4db 100644 --- a/full-ifrs17-template/Report/Reports.ipynb +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -20,9 +20,8 @@ { "cell_type": "markdown", "source": [ - "

Reports

", - "\n", - "\n" + "", + "\n

Reports

" ] }, { @@ -30,7 +29,7 @@ "source": [ "For demonstration purposes we import here data for 7 *Group of Insurance Contract* (GIC) and 4 *Group of Reinsurance Contract* (GRIC) - the import is triggered in the [Set up data and configuration](#set-up-data-and-configuration).", "\n
The imported data set consists of cashflows, actuals, and parameters for two consecutive periods (Year 2020-Quarter 4 and Year 2021-Quarter 1)", - "\n
Input files can be found in the **File** directory. You are invited to change them or upload your own. ", + "\n
Input files can be found in the **File** directory. You are invited to change them or upload your own or to add new data in the [CloseImportTemplate](../Import/CloseImportTemplate) notebook. ", "\n
For simplicity, we import the same transactional data for all GICs and GRICs. Each *Group of Contracts* produces different figures due to differences in parameters such as *Liability Type*, *Oci type* or *Premium allocation factor* to Contractual Service Margin.", "\n", "\nFollow the instructions below for a guided interaction with the reports." @@ -45,7 +44,7 @@ { "cell_type": "code", "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + "#!eval-notebook \"../Import/CloseImportTemplate\"" ] }, { @@ -60,7 +59,7 @@ "source": [ "# Best Estimate", "\n", - "\nPresent values of the [best-estimate](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#best-estimate) future cashflows are shown here in an Analysis of Change report.", + "\nPresent values of the [best-estimate](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#best-estimate) future cashflows are shown here in an Analysis of Change report.", "\n", "\nThe granularity of the reported figures can be modified by changing the Column Slices options.", "\nFor example one can add \"GroupOfContract\" to separate the contributions of the individual Group of Contracts.", @@ -85,16 +84,18 @@ "source": [ "# Risk Adjustment", "\n", - "\nPresent values of the [risk adjustment](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#risk-adjustment) future cashflows are shown here.", + "\nPresent values of the [risk adjustment](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#risk-adjustment) future cashflows are shown here.", "\n", - "\nFilters can be applied to report to isolate a sub-set of the data. They can be used in conjuction to the Slice options. For example, filtering **EconomicBasis** Locked-in together with a slice on the **GroupOfContract** allows to analyse the risk adjustment figures computed with the yield curve at inception for all Group of Contracts." + "\nThe additional ColumnSlices are added to the view as the inner column. This can dicrease the readability of the report. For example, adding the slice by \"GroupOfContract\" leaves the lock-in and current rate contributions far apart and difficult to compare. The re-order of default slices with custom slices is achieved by esplicitly add the default slice among the custom slices. In our case, you can try entering both \"GroupOfContract\" and \"EconomicBasis\" separated by a comma in the ColumnSlices." ] }, { "cell_type": "code", "source": [ "var raReport = ifrs17Report.RiskAdjustments;", - "\nraReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", + "\nraReport.ReportingNode = \"CH\";", + "\nraReport.ReportingPeriod = (2021, 3);", + "\nraReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"EconomicBasis\"", "\nraReport.DataFilter = null;//new [] {(\"GroupOfContract\", \"DT1.2\")};", "\n(await raReport.ToReportAsync) with {Height = 800}" ] @@ -104,15 +105,18 @@ "source": [ "# Written Actuals", "\n", - "\n[Written Actuals](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#written-accrual-deferral) are shown here. ", + "\n[Written Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#written-accrual-deferral) are shown here. ", "\n", - "\nIn this case, the analysis of change view is replaced with a default slice by the **AmountTypes**. Only the amount type with non zero value are displayed. " + "\nIn this case, the analysis of change view is replaced with a default slice by the **AmountTypes**. Only the amount type with non zero value are displayed. ", + "\nFilters can be applied to report to isolate a sub-set of the data, by selecting the dimension to filter and the system value desired. For example, to investigate the contribution of a single Group of Contract the following filter can be applied: new [] {(\"GroupOfContract\", \"DT1.1\")}." ] }, { "cell_type": "code", "source": [ "var writtenActualReport = ifrs17Report.WrittenActuals;", + "\nwrittenActualReport.ReportingNode = \"CH\";", + "\nwrittenActualReport.ReportingPeriod = (2021, 3);", "\nwrittenActualReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", "\nwrittenActualReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await writtenActualReport.ToReportAsync) with {Height = 400}" @@ -123,16 +127,20 @@ "source": [ "## Advance, Overdue Actuals", "\n", - "\nActuals payed in [Advance](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#written-accrual-deferral)", - "\nor [Overdue](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#written-accrual-deferral) are shown here together in a simplified Analysis of Change. " + "\nActuals payed in [Advance](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#written-accrual-deferral)", + "\nor [Overdue](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#written-accrual-deferral) are shown here together in a simplified Analysis of Change. ", + "\n", + "\nCombining Filters and ColumnSlices facilitate the report analysis. For example, you can select \"GroupOfContract\" as column slices with a Filter on EstimateType \"AA\" to analyse the Advance Actuals for all Group of Contract. " ] }, { "cell_type": "code", "source": [ "var accrualActualReport = ifrs17Report.AccrualActuals;", + "\naccrualActualReport.ReportingNode = \"CH\";", + "\naccrualActualReport.ReportingPeriod = (2021, 3);", "\naccrualActualReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", - "\naccrualActualReport.DataFilter = null;//new [] {(\"GroupOfContract\", \"DT2.1\")};", + "\naccrualActualReport.DataFilter = null; //new [] {(\"EstimateType\", \"AA\")};", "\n(await accrualActualReport.ToReportAsync) with {Height = 400}" ] }, @@ -141,13 +149,15 @@ "source": [ "## Deferrable Actuals", "\n", - "\n[Deferrable Actuals](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#written-accrual-deferral) are shown here. Amortization of the deferrable amount is computed using the Coverage Unit pattern. " + "\n[Deferrable Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#written-accrual-deferral) are shown here. Amortization of the deferrable amount is computed using the Coverage Unit pattern. " ] }, { "cell_type": "code", "source": [ "var deferrableActualReport = ifrs17Report.DeferralActuals;", + "\ndeferrableActualReport.ReportingNode = \"CH\";", + "\ndeferrableActualReport.ReportingPeriod = (2021, 3);", "\ndeferrableActualReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\ndeferrableActualReport.DataFilter = null;//new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await deferrableActualReport.ToReportAsync) with {Height = 400}" @@ -158,14 +168,19 @@ "source": [ "# Fulfilment Cashflow", "\n", - "\nPresent Value of the [Fulfilment Cashflow](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#fulfillment-cashflows) are shown here. ", - "\n
The individual contributions from Best Estimate and Risk Adjustment can be visualized slicing by **EstimateType**" + "\nPresent Value of the [Fulfilment Cashflow](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#fulfillment-cashflows) are shown here. ", + "\n
The individual contributions from Best Estimate and Risk Adjustment can be visualized slicing by **EstimateType**.", + "\n", + "\nFilters can be applied to report to isolate a sub-set of the data. For example you can Filter by a specific Group of Contract using its system name using : new [] {(\"GroupOfContract\", \"DT1.1\")}.", + "\n" ] }, { "cell_type": "code", "source": [ "var fulfillmentCashflowsReport = ifrs17Report.FulfillmentCashflows;", + "\nfulfillmentCashflowsReport.ReportingNode = \"CH\";", + "\nfulfillmentCashflowsReport.ReportingPeriod = (2021, 3);", "\nfulfillmentCashflowsReport.ColumnSlices = new string[]{};//\"EstimateType\"", "\nfulfillmentCashflowsReport.DataFilter = null;// new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await fulfillmentCashflowsReport.ToReportAsync) with {Height = 750}" @@ -176,13 +191,15 @@ "source": [ "# Actuarial Experience Adjustment", "\n", - "\nA comparison between [Written Actual](#written-actual) and the Releases of the [Best Estimate](#present-value) is reported in the [Actuarial Experience Adjustment](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#experience-adjustment)." + "\nA comparison between [Written Actual](#written-actual) and the Releases of the [Best Estimate](#present-value) is reported in the [Actuarial Experience Adjustment](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#experience-adjustment)." ] }, { "cell_type": "code", "source": [ "var experienceAdjustmentsReport = ifrs17Report.ExperienceAdjustments;", + "\nexperienceAdjustmentsReport.ReportingNode = \"CH\";", + "\nexperienceAdjustmentsReport.ReportingPeriod = (2021, 3);", "\nexperienceAdjustmentsReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\nexperienceAdjustmentsReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await experienceAdjustmentsReport.ToReportAsync) with {Height = 300}" @@ -193,7 +210,7 @@ "source": [ "# LRC Technical Margin", "\n", - "\nIn the [Technical Margin](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#technical-margin) report we present a unified view on the figures that are allocated to either Contractual Service Margin or to Loss Component. ", + "\nIn the [Technical Margin](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#technical-margin) report we present a unified view on the figures that are allocated to either Contractual Service Margin or to Loss Component. ", "\n
The Analysis of Change is expanded with few more steps such as **Experience Adjustment** and **Amortization**." ] }, @@ -201,6 +218,8 @@ "cell_type": "code", "source": [ "var technicalMarginsReport = ifrs17Report.TechnicalMargins;", + "\ntechnicalMarginsReport.ReportingNode = \"CH\";", + "\ntechnicalMarginsReport.ReportingPeriod = (2021, 3);", "\ntechnicalMarginsReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\ntechnicalMarginsReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await technicalMarginsReport.ToReportAsync) with {Height = 600}" @@ -211,7 +230,7 @@ "source": [ "# Contractual Service Margin / Loss Component / Loss Recovery Component", "\n", - "\nThe Contractual Service Margin (CSM) / Loss Component (LC) / Loss Recovery Component (LR) [report](https://portal.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#technical-margin) are here shown side by side as the allocation to profit or loss is done at each step of the Analysis of Change. ", + "\nThe Contractual Service Margin (CSM) / Loss Component (LC) / Loss Recovery Component (LR) [report](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#technical-margin) are here shown side by side as the allocation to profit or loss is done at each step of the Analysis of Change. ", "\n", "\nA default slice by EstimateType - which distinguish between CSM, LC and LR contributions - is automatically enforced. " ] @@ -220,6 +239,8 @@ "cell_type": "code", "source": [ "var allocatedTechnicalMarginsReport = ifrs17Report.AllocatedTechnicalMargins;", + "\nallocatedTechnicalMarginsReport.ReportingNode = \"CH\";", + "\nallocatedTechnicalMarginsReport.ReportingPeriod = (2021, 3);", "\nallocatedTechnicalMarginsReport.ColumnSlices = new string[]{\"GroupOfContract\", \"EstimateType\"};//\"GroupOfContract\", \"AmountType\"", "\nallocatedTechnicalMarginsReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await allocatedTechnicalMarginsReport.ToReportAsync) with {Height = 700}" @@ -228,13 +249,17 @@ { "cell_type": "markdown", "source": [ - "# LRC Actuarial" + "# LRC Actuarial", + "\n", + "\nThe [Actuarial Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#lrc-actuarial-actuarial-liability-for-remaining-coverage) report shows figures from Fulfilment Cashflow discounted with current yield curve, and the allocated techinical margin. " ] }, { "cell_type": "code", "source": [ "var actuarialLrcReport = ifrs17Report.ActuarialLrc;", + "\nactuarialLrcReport.ReportingNode = \"CH\";", + "\nactuarialLrcReport.ReportingPeriod = (2021, 3);", "\nactuarialLrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\nactuarialLrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await actuarialLrcReport.ToReportAsync) with {Height = 750}" @@ -243,13 +268,17 @@ { "cell_type": "markdown", "source": [ - "# LRC" + "# LRC", + "\n", + "\nThe [Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#lrc-liability-for-remaining-coverage) report adds to the [Actuarial Liability for Remaining Coverage](#lrc-actuarial) the contribution of and accrual actuals. A simplified Aoc Chain is used to allow comparison of the balance change between Actuals and Present Values. " ] }, { "cell_type": "code", "source": [ "var lrcReport = ifrs17Report.Lrc;", + "\nlrcReport.ReportingNode = \"CH\";", + "\nlrcReport.ReportingPeriod = (2021, 3);", "\nlrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\nlrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await lrcReport.ToReportAsync) with {Height = 250}" @@ -258,13 +287,17 @@ { "cell_type": "markdown", "source": [ - "# LIC Actuarial" + "# LIC Actuarial", + "\n", + "\nThe [Actuarial Liability of Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#lic-actuarial-actuarial-liability-for-incurred-claims) report shows figures from Fulfilment Cashflow discounted with current yield curve. " ] }, { "cell_type": "code", "source": [ "var actuarialLicReport = ifrs17Report.ActuarialLic;", + "\nactuarialLicReport.ReportingNode = \"CH\";", + "\nactuarialLicReport.ReportingPeriod = (2021, 3);", "\nactuarialLicReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\nactuarialLicReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await actuarialLicReport.ToReportAsync) with {Height = 750}" @@ -273,13 +306,17 @@ { "cell_type": "markdown", "source": [ - "# LIC" + "# LIC", + "\n", + "\nThe [Liability for Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#lic-liability-for-incurred-claims) adds to the [Actuarial Liability for Incurred Claims](#lic-actuarial) the contribution of and accrual actuals." ] }, { "cell_type": "code", "source": [ "var licReport = ifrs17Report.Lic;", + "\nlicReport.ReportingNode = \"CH\";", + "\nlicReport.ReportingPeriod = (2021, 3);", "\nlicReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\nlicReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await licReport.ToReportAsync) with {Height = 250}" @@ -290,6 +327,8 @@ "source": [ "# Financial Performance", "\n", + "\nThe [Financial Performance](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#ifrs-17-financial-performance) report discloses the Change in Estimate of the IFRS 17 balance sheet items ([LRC](#lrc) and [LIC](#lic)) and the relevant incurred cashflows (Premiums, Claims, Expenses, etc...) for the given period.", + "\n", "\nUse the expand and collapse buttons in the report rows to change the granularity of the figures displayed." ] }, @@ -297,6 +336,8 @@ "cell_type": "code", "source": [ "var financialPerformanceReport = ifrs17Report.FinancialPerformance;", + "\nfinancialPerformanceReport.ReportingNode = \"CH\";", + "\nfinancialPerformanceReport.ReportingPeriod = (2021, 3);", "\nfinancialPerformanceReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", "\nfinancialPerformanceReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await financialPerformanceReport.ToReportAsync) with { Height = 900, GroupDefaultExpanded = 3}" diff --git a/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb deleted file mode 100644 index 60dc3809..00000000 --- a/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb +++ /dev/null @@ -1,1461 +0,0 @@ -{ - "metadata": { - "authors": [], - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "

Financial Performance Specifications

" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The aim of this notebook is to document the Financial Performance reporting system. The process is pictorially explained in the following flowchart. ", - "\n", - "\n", - "\n
", - "\n", - "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." - ] - }, - { - "cell_type": "markdown", - "source": [ - "In the following the Dimensions, Parameters, Nominal Cashflows, and Actuals are imported from the corresponding csv files in Initialization/Systemorph/" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Process Data" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Current Period, Reporting Node and Currency Type" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" - ] - }, - { - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;" - ] - }, - { - "cell_type": "markdown", - "source": [ - "and the type of Currency among Contractual, Functional, and Group" - ] - }, - { - "cell_type": "code", - "source": [ - "var currencyType = CurrencyType.Functional ;" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Import the Report definitions, initialize the Workspace and the Test Suite:" - ] - }, - { - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ] - }, - { - "cell_type": "code", - "source": [ - "var period = (year, month) ;", - "\nvar reportStorage = new ReportStorage(Workspace, Report) ;", - "\nvar Test = Scopes.ForSingleton().WithStorage(reportStorage).ToScope();" - ] - }, - { - "cell_type": "code", - "source": [ - "await reportStorage.InitializeReportIndependentCacheAsync();", - "\nawait reportStorage.InitializeAsync(period, reportingNode, null, currencyType);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## View list of Identities" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Based on the Cashflows imported, the list of all possible identities, i.e. combinations of valid Contractual and Functional Currencies, Liability Types, (Re)Insurance and Oci, is contructed and reported here below:" - ] - }, - { - "cell_type": "code", - "source": [ - "var identities = reportStorage.GetIdentities(period, reportingNode, null, currencyType);", - "\nidentities" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Report" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Please select here below the target Data Node for executing the tests below:" - ] - }, - { - "cell_type": "code", - "source": [ - "var dataNode = \"DT1.1\";" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Group of Contract selected is:" - ] - }, - { - "cell_type": "code", - "source": [ - "var groupOfContract = (await Workspace.Query().Where(x => x.SystemName == dataNode).ToArrayAsync()).FirstOrDefault();", - "\ngroupOfContract" - ] - }, - { - "cell_type": "markdown", - "source": [ - "where ", - "\n- the **OciType** can be Default for contracts with non-zero OCI, and null otherwise, ", - "\n- the **Liability Type** can be LRC for Liability for Remaining Coverage, and LIC for Liability of Incurred Claims,", - "\n- the **Partner** can be null for Insurance contracts, or equal to the Partner System Name for Reinsurance contracts." - ] - }, - { - "cell_type": "markdown", - "source": [ - "The summary of the Financial Performance report is shown below" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForDataCube( Test.GetScopes(identities).Aggregate().FinancialPerformance.Filter((\"GroupOfContract\", dataNode)) )", - "\n .WithQuerySource(DataSource)", - "\n .SliceRowsBy(\"VariableType\", \"EstimateType\")", - "\n .SliceColumnsBy(\"Currency\", \"LiabilityType\",\"GroupOfContract\")", - "\n .WithGridOptions( o => o.WithDefaultColumn( c => c.WithWidth(260) ) with {GroupDefaultExpanded = 3, Height = 900, OnGridReady = null} )", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Inspection" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Fulfillment Cashflows" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Fulfillment Cashflow (FCF) corresponds to the sum of the Best Estimate [Present Value](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#current-and-locked) (PV) and the [Risk Adjustment](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#risk-adjustment) (RA), both summed over Amounty Types, and both discounted with the Locked-In curve in the BBA valuation approach:", - "\n", - "\n$$", - "\n\\text{FCF}(\\text{AoC}) = \\text{PV Locked}(\\text{AoC})", - "\n\\bigg|_{\\substack{\\text{Non Attributable} \\\\ \\text{Amount Types} \\\\ \\text{excluded}}} ", - "\n+ \\text{RA Locked}(\\text{AoC}) ~.", - "\n$$" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Non Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed value for the non financial contribution to the FCF is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaFCF_nonFinancial = Test.GetScopes(identities).Aggregate()", - "\n .FpNonFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaFCF_nonFinancial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the full list of FCFs" - ] - }, - { - "cell_type": "code", - "source": [ - "var FCFs = Test.GetScopes(identities).Aggregate().Fcf.Filter((\"GroupOfContract\", dataNode));" - ] - }, - { - "cell_type": "code", - "source": [ - "var deltaFCF = FCFs.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n FCFs.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ] - }, - { - "cell_type": "code", - "source": [ - "deltaFCF.Aggregate().Value" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaFCF_nonFinancial = deltaFCF.Filter((\"VariableType\", \"!IA\"), ", - "\n (\"VariableType\", \"!YCU\"), ", - "\n (\"VariableType\", \"!CRU\"), ", - "\n (\"VariableType\", \"!FX\") ).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaFCF_nonFinancial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "For consistency, this term is taken with the minus sign" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaFCF_nonFinancial.CheckEquality( -computedDeltaFCF_nonFinancial ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Conversely, the computed value for the financial contribution to the Fulfillment Cashflows (FCF) is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaFCF_Financial = Test.GetScopes(identities).Aggregate()", - "\n .FpFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaFCF_Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The independent recalculation of this value reads" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaFCF_Financial = (deltaFCF.Filter((\"VariableType\", \"IA\")) +", - "\n deltaFCF.Filter((\"VariableType\", \"YCU\")) +", - "\n deltaFCF.Filter((\"VariableType\", \"CRU\")) ).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaFCF_Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "taking the minus sign into account" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaFCF_Financial.CheckEquality( -computedDeltaFCF_Financial ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### FX" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed value for the FX contribution to the Fulfillment Cashflows (FCF) is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaFCF_Fx = Test.GetScopes(identities).Aggregate()", - "\n .FpFx.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaFCF_Fx" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The independent recalculation of this value reads" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaFCF_Fx = deltaFCF.Filter((\"VariableType\", \"FX\")).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaFCF_Fx" - ] - }, - { - "cell_type": "markdown", - "source": [ - "taking the minus sign into account" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaFCF_Fx.CheckEquality( -computedDeltaFCF_Fx ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n### Other Comprehensive Income" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Other Comprehensive Income (OCI) term is by definition the sum of the financial contributions not related to the insurance sector.", - "\n", - "\nThe Default method to compute the OCI term is by subtracting the FCF computed with the *Locked-In* rates and the FCF computed with the *Current* rates. In this way the non insurance financial volatiliy of the economic input is relegated to the OCI. " - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaFCF_OCI = Test.GetScopes(identities).Aggregate()", - "\n .OciFinancial.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaFCF_OCI" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The OCI contribution is zero when the OCI option is disabled for the [target Group of Contract](#report).", - "\n", - "\nHere below we follow the steps to calculate independently the OCI contribution " - ] - }, - { - "cell_type": "code", - "source": [ - "var DeltaFCF_Locked = deltaFCF.Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "var FCFs_current = Test.GetScopes(identities).Aggregate().CurrentFcf.Filter((\"GroupOfContract\", dataNode));" - ] - }, - { - "cell_type": "code", - "source": [ - "var DeltaFCF_Current = FCFs_current.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n FCFs_current.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaFCF_OCI = DeltaFCF_Locked - DeltaFCF_Current.Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "DeltaFCF_Locked" - ] - }, - { - "cell_type": "code", - "source": [ - "DeltaFCF_Current.Aggregate().Value" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaFCF_OCI" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaFCF_OCI.CheckEquality( computedDeltaFCF_OCI ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### FX Other Comprehensive Income" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The FX impact on the Other Comprehensive Income is calculated using the same formulas defined [above](#oci) but is presented separately in the Financial Performance.", - "\n", - "\nThe computed value for the FX contribution to the Other Comprehensive Income (OCI) is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedFxFCF_OCI = Test.GetScopes(identities).Aggregate()", - "\n .OciFx.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedFxFCF_OCI" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The OCI contribution is zero when the OCI option is disabled for the [target Group of Contract](#report).", - "\n", - "\nHere below we follow the steps to calculate independently the FX OCI contribution " - ] - }, - { - "cell_type": "code", - "source": [ - "var FxFCF_Locked = deltaFCF.Filter((\"VariableType\", AocTypes.FX)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "var FxFCF_Current = FCFs_current.Filter((\"VariableType\", AocTypes.FX)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedFxFCF_OCI = FxFCF_Locked - FxFCF_Current;" - ] - }, - { - "cell_type": "code", - "source": [ - "FxFCF_Locked" - ] - }, - { - "cell_type": "code", - "source": [ - "FxFCF_Current" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedFxFCF_OCI" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedFxFCF_OCI.CheckEquality( computedFxFCF_OCI ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Contractual Service Margin" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Non Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed value for the non financial change of the CSM is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaCSM_nonFinancial = Test.GetScopes(identities).Aggregate()", - "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaCSM_nonFinancial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the full CSM data from which the delta can be computed:" - ] - }, - { - "cell_type": "code", - "source": [ - "var CSM = Test.GetScopes(identities).Aggregate().Csm.Filter((\"GroupOfContract\", dataNode));" - ] - }, - { - "cell_type": "code", - "source": [ - "var deltaCSM = CSM.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n CSM.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ] - }, - { - "cell_type": "code", - "source": [ - "deltaCSM.Aggregate().Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaCSM_nonFinancial = deltaCSM.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\")).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaCSM_nonFinancial" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaCSM_nonFinancial.CheckEquality( -computedDeltaCSM_nonFinancial ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Conversely, the computed value for the financial change of the CSM is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaCSM_Financial = Test.GetScopes(identities).Aggregate()", - "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaCSM_Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only Interest Accretion, Yield Curve Update and Credit Risk Update terms" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaCSM_Financial = ( deltaCSM.Filter((\"VariableType\", \"IA\")) +", - "\n deltaCSM.Filter((\"VariableType\", \"YCU\")) +", - "\n deltaCSM.Filter((\"VariableType\", \"CRU\")) )", - "\n .Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaCSM_Financial" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaCSM_Financial.CheckEquality( -computedDeltaCSM_Financial ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### FX" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed value for the FX change of the CSM is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaCSM_Fx = Test.GetScopes(identities).Aggregate()", - "\n .Fx.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaCSM_Fx" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the $\\Delta\\text{CSM}$, and considering only the FX term" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaCSM_Fx = deltaCSM.Filter((\"VariableType\", AocTypes.FX)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaCSM_Fx" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaCSM_Fx.CheckEquality( -computedDeltaCSM_Fx ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Loss Component" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Non Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed value for the non financial change of the LC is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaLC_nonFinancial = Test.GetScopes(identities).Aggregate()", - "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaLC_nonFinancial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the full CSM data from which the delta can be computed:" - ] - }, - { - "cell_type": "code", - "source": [ - "var LC = Test.GetScopes(identities).Aggregate().Lc.Filter((\"GroupOfContract\", dataNode));" - ] - }, - { - "cell_type": "code", - "source": [ - "var deltaLC = LC.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n LC.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ] - }, - { - "cell_type": "code", - "source": [ - "deltaLC.Aggregate().Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The non Financial contribution is calculated subtracting the Amortization, Interest Accretion, Yield Curve Update, Credit Risk Update, Fx terms:" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaLC_nonFinancial = deltaLC.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\")).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLC_nonFinancial" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLC_nonFinancial.CheckEquality( -computedDeltaLC_nonFinancial ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Conversely, the computed value for the financial change of the LC is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaLC_Financial = Test.GetScopes(identities).Aggregate()", - "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaLC_Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the $\\Delta\\text{LC}$, and considering only the Interest Accretion, Yield Curve Update, Credit Risk Update terms" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaLC_Financial = ( deltaLC.Filter((\"VariableType\", \"IA\")) +", - "\n deltaLC.Filter((\"VariableType\", \"YCU\")) +", - "\n deltaLC.Filter((\"VariableType\", \"CRU\")) )", - "\n .Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLC_Financial" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLC_Financial.CheckEquality( -computedDeltaLC_Financial ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### FX" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed value for the FX change of the LC is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaLC_Fx = Test.GetScopes(identities).Aggregate()", - "\n .Fx.Filter((\"GroupOfContract\", dataNode)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaLC_Fx" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the $\\Delta\\text{LC}$, and considering only the FX term" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaLC_Fx = deltaLC.Filter((\"VariableType\", AocTypes.FX)).Aggregate().Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLC_Fx" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLC_Fx.CheckEquality( -computedDeltaLC_Fx ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Loss Recovery Component" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Non Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "If the [target Group of Contract](#report) is not of type Re-Insurance, the result of the following will return null.", - "\n", - "\nThe computed value for the non financial change of the LoReCo is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaLORECO_nonFinancial = Test.GetScopes(identities).Aggregate()", - "\n .NonFinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaLORECO_nonFinancial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the full LoReCo data from which the delta can be computed:" - ] - }, - { - "cell_type": "code", - "source": [ - "var LORECO = Test.GetScopes(identities).Aggregate().Loreco.Filter((\"GroupOfContract\", dataNode));" - ] - }, - { - "cell_type": "code", - "source": [ - "var deltaLORECO = LORECO.Filter((\"VariableType\", \"!BOP\"),(\"VariableType\", \"!EOP\")) +", - "\n LORECO.Filter((\"VariableType\", AocTypes.BOP),(\"Novelty\", Novelties.N));" - ] - }, - { - "cell_type": "code", - "source": [ - "deltaLORECO.Aggregate()?.Value?? 0" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The non Financial contribution is calculated subtracting the Amortization and the Interest Accretion terms:" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaLORECO_nonFinancial = deltaLORECO.Filter((\"VariableType\", \"!AM\"), (\"VariableType\", \"!IA\"), (\"VariableType\", \"!YCU\"), (\"VariableType\", \"!CRU\"), (\"VariableType\", \"!FX\")).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_nonFinancial" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_nonFinancial.CheckEquality( -computedDeltaLORECO_nonFinancial ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Conversely, the computed value for the financial change of the LoReCo is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaLORECO_Financial = Test.GetScopes(identities).Aggregate()", - "\n .FinancialChanges.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaLORECO_Financial" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the $\\Delta\\text{LoReCo}$, and considering only the Interest Accretion, Yield Curve Update, Credit Risk Update terms" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaLORECO_Financial = ( deltaLORECO.Filter((\"VariableType\", \"IA\")) +", - "\n deltaLORECO.Filter((\"VariableType\", \"YCU\")) +", - "\n deltaLORECO.Filter((\"VariableType\", \"CRU\")) )", - "\n .Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_Financial" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_Financial.CheckEquality( -computedDeltaLORECO_Financial ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### FX" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed value for the FX change of the LoReCo is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeltaLORECO_Fx = Test.GetScopes(identities).Aggregate()", - "\n .Fx.Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeltaLORECO_Fx" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This value can be independently computed starting from the $\\Delta\\text{LoReCo}$, and considering only the FX term" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaLORECO_Fx = deltaLORECO.Filter((\"VariableType\", AocTypes.FX)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_Fx" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDeltaLORECO_Fx.CheckEquality( -computedDeltaLORECO_Fx ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Reconciliation" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Based on the results calculated in Section 3, we check here the consistency of the [Financial Performance Report](#report). ", - "\n", - "\nFiner granular reconciliations can be performed by following the datails of how each report contributes to the Financial Performance Report. Please, refer to the [Report documentation](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Report/ReportScopes#financial-performance) for all the details. " - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Insurance Revenue" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Insurance Revenue (IR) contributions vary from Insurance to Re-Insurance and depend on the Liability Type of the [target Group of Contract](#report). This can be summarized by the formulas below", - "\n", - "\n$$", - "\n\\text{IR} = \\left\\{ ", - "\n\\begin{array}{ll}", - "\n\\Delta\\text{FCF Gross Non Financial} + \\Delta\\text{CSM Non Financial} + \\Delta\\text{CSM Release} \\\\", - "\n+ \\text{Incurred Incoming Cashflows} + \\text{Claims ICO} + \\text{Incurred Deferrals} \\\\", - "\n+ \\text{Exc. Experience Adjustment on Premiums} ~~,", - "\n& \\text{for LRC Insurance contracts} \\\\[0.2cm]", - "\n\\Delta\\text{CSM Non Financial} + \\Delta\\text{CSM Release} \\\\", - "\n+ \\text{Incurred Incoming Cashflows} + \\text{Claims ICO} + \\text{Incurred Deferrals} ~~,", - "\n& \\text{for LIC Insurance contracts} \\\\[0.2cm]", - "\n\\text{Claims ICO} + \\text{Incurred Deferrals} ~~,", - "\n& \\text{for Re-Insurance contracts}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nHere below we recompute the IR term:" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaCSM_release = deltaCSM.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedIncurredIncomingCashflows = Test.GetScopes(identities).Aggregate().Premiums", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedIncurredDeferralsIr = Test.GetScopes(identities).Aggregate().AmortizationToIr", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedClaimsICO = Test.GetScopes(identities).Aggregate().ClaimsIcoToIr", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedExcExperienceAdjPremiums = Test.GetScopes(identities).Aggregate().ExperienceAdjustmentOnPremium", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "double IR = 0;", - "\nif(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LRC\")", - "\n IR = - expectedDeltaFCF_nonFinancial ", - "\n - expectedDeltaCSM_nonFinancial ", - "\n - expectedDeltaCSM_release ", - "\n + expectedIncurredIncomingCashflows", - "\n + expectedClaimsICO", - "\n + expectedIncurredDeferralsIr", - "\n + expectedExcExperienceAdjPremiums;", - "\nelse if(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LIC\")", - "\n IR = - expectedDeltaCSM_nonFinancial", - "\n - expectedDeltaCSM_release", - "\n + expectedIncurredIncomingCashflows", - "\n + expectedClaimsICO", - "\n + expectedIncurredDeferralsIr ", - "\n + expectedExcExperienceAdjPremiums;", - "\nelse if(groupOfContract.Partner != null)", - "\n IR = + expectedClaimsICO", - "\n + expectedIncurredDeferralsIr", - "\n + expectedExcExperienceAdjPremiums;" - ] - }, - { - "cell_type": "code", - "source": [ - "IR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Insurance Service Expenses" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Analogously, the Insurance Service Expenses (ISE) read", - "\n", - "\n$$", - "\n\\text{ISE} = \\left\\{ ", - "\n\\begin{array}{ll}", - "\n\\Delta\\text{LC Non Financial}", - "\n+ \\Delta\\text{LC Release}", - "\n+ \\text{Incurred ClaimsNIC} \\\\", - "\n+ \\text{Incurred Expenses}", - "\n+ \\text{Incurred Commissions}", - "\n+ \\text{Incurred Deferrals}", - "\n& \\text{for LRC Insurance contracts} \\\\[0.2cm]", - "\n\\Delta\\text{FCF Reinsurance Non Financial}", - "\n+ \\Delta\\text{LC Non Financial}", - "\n+ \\Delta\\text{LC Release}", - "\n+ \\text{Incurred ClaimsNIC} \\\\", - "\n+ \\text{Incurred Expenses} ", - "\n+ \\text{Incurred Commissions}", - "\n+ \\text{Incurred Deferrals}", - "\n& \\text{for LIC Insurance contracts} \\\\[0.2cm]", - "\n\\Delta\\text{FCF Reinsurance Non Financial} ", - "\n+ \\Delta\\text{CSM Non Financial} ", - "\n+ \\Delta\\text{CSM Release} \\\\", - "\n+ \\Delta\\text{LC Non Financial} ", - "\n+ \\Delta\\text{LC Release} ", - "\n+ \\Delta\\text{LoReCo Non Financial} \\\\", - "\n+ \\text{Incurred Incoming Cashflows} ", - "\n+ \\text{Incurred ClaimsNIC} ", - "\n+ \\text{Incurred Expenses} \\\\", - "\n+ \\text{Incurred Commissions}", - "\n+ \\text{Incurred Deferrals}", - "\n& \\text{for Re-Insurance contracts}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nHere below we recompute the ISE term:" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaLC_release = deltaLC.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeltaLoReCo_release = deltaLORECO.Filter((\"VariableType\", \"AM\")).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedIncurredClaimsNIC = Test.GetScopes(identities).Aggregate().ClaimsNic", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedIncurredExpenses = Test.GetScopes(identities).Aggregate().Expenses", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedIncurredCommissions = Test.GetScopes(identities).Aggregate().Commissions", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedIncurredClaimsICO = Test.GetScopes(identities).Aggregate().ClaimsIcoToIse", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedIncurredDeferralsIse = Test.GetScopes(identities).Aggregate().AmortizationToIse", - "\n .Filter((\"GroupOfContract\", dataNode)).Aggregate()?.Value?? 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "double ISE = 0;", - "\nif(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LRC\")", - "\n ISE = - expectedDeltaLC_nonFinancial ", - "\n - expectedDeltaLC_release", - "\n + expectedIncurredClaimsNIC ", - "\n + expectedIncurredExpenses ", - "\n + expectedIncurredClaimsICO", - "\n + expectedIncurredCommissions", - "\n + expectedIncurredDeferralsIse;", - "\nelse if(groupOfContract.Partner == null && groupOfContract.LiabilityType == \"LIC\")", - "\n ISE = - expectedDeltaFCF_nonFinancial", - "\n - expectedDeltaLC_nonFinancial ", - "\n - expectedDeltaLC_release", - "\n + expectedIncurredClaimsNIC ", - "\n + expectedIncurredExpenses ", - "\n + expectedIncurredClaimsICO", - "\n + expectedIncurredCommissions", - "\n + expectedIncurredDeferralsIse;", - "\nelse if(groupOfContract.Partner != null)", - "\n ISE = - expectedDeltaFCF_nonFinancial", - "\n - expectedDeltaCSM_nonFinancial", - "\n - expectedDeltaCSM_release", - "\n - expectedDeltaLC_nonFinancial ", - "\n - expectedDeltaLC_release", - "\n - expectedDeltaLoReCo_release", - "\n + expectedIncurredIncomingCashflows", - "\n + expectedIncurredClaimsNIC ", - "\n + expectedIncurredExpenses ", - "\n + expectedIncurredClaimsICO", - "\n + expectedIncurredCommissions", - "\n + expectedIncurredDeferralsIse;" - ] - }, - { - "cell_type": "code", - "source": [ - "ISE" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Insurance Finance Income/Expenses" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Financial part associated to the Insurance business encompassing both the Income and Expenses is denoted IFIE from the initials marked in capital letters. The ", - "\n", - "\n$$", - "\n\\text{IFIE} = \\left\\{", - "\n\\begin{array}{ll}", - "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} + \\Delta\\text{FCF FX} + \\Delta\\text{CSM FX} + \\Delta\\text{LC FX} ~~,", - "\n& \\text{for Insurance contracts} \\\\[0.2cm]", - "\n\\Delta\\text{FCF Financial} + \\Delta\\text{CSM Financial} + \\Delta\\text{LC Financial} ", - "\n+ \\Delta\\text{LoReCo Financial} + \\Delta\\text{FCF FX} + \\Delta\\text{CSM FX} + \\Delta\\text{LC FX} ", - "\n+ \\Delta\\text{LoReCo FX} ~~, ", - "\n& \\text{for Re-Insurance contracts}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nHere below we recompute the IFIE term:" - ] - }, - { - "cell_type": "code", - "source": [ - "double IFIE = 0;", - "\nif(groupOfContract.Partner == null) ", - "\n IFIE = - expectedDeltaFCF_Financial ", - "\n - expectedDeltaCSM_Financial", - "\n - expectedDeltaLC_Financial", - "\n - expectedDeltaFCF_Fx ", - "\n - expectedDeltaCSM_Fx", - "\n - expectedDeltaLC_Fx;", - "\nelse", - "\n IFIE = - expectedDeltaFCF_Financial ", - "\n - expectedDeltaCSM_Financial", - "\n - expectedDeltaLC_Financial", - "\n - expectedDeltaLORECO_Financial", - "\n - expectedDeltaFCF_Fx ", - "\n - expectedDeltaCSM_Fx", - "\n - expectedDeltaLC_Fx", - "\n - expectedDeltaLORECO_Fx;" - ] - }, - { - "cell_type": "code", - "source": [ - "IFIE" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Other Comprehensive Income" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Other Comprehensive Income (OCI) can be non-zero only when the OCI is enabled for [target Group of Contract](#report), that is, Oci Type = Default.", - "\n", - "\n$$", - "\n\\text{OCI} = \\Delta\\text{FCF} \\big|_{\\text{Locked-in}} - \\Delta\\text{FCF} \\big|_{\\text{Current}} ~~.", - "\n$$", - "\n", - "\nHere below we recompute the OCI term:" - ] - }, - { - "cell_type": "code", - "source": [ - "var OCI = expectedDeltaFCF_OCI + expectedFxFCF_OCI;" - ] - }, - { - "cell_type": "code", - "source": [ - "OCI" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb b/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb deleted file mode 100644 index 8993aa5c..00000000 --- a/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb +++ /dev/null @@ -1,507 +0,0 @@ -{ - "metadata": { - "authors": [], - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "

Import Actuals Specifications

" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The aim of this notebook is to document the calculations taking place when importing the Actuals. For this documentation notebook the Data is imported from the corresponding csv files located in the following path Initialization/Systemorph/. The process is pictorially explained in the following flowchart. ", - "\n", - "\n", - "\n
", - "\n", - "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import Data" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Current Period" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Please select the target period (i.e. year and month), Reporting Node, Economic Basis, and Data Node based on the imported data:" - ] - }, - { - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;", - "\nvar economicBasis = \"L\" ;", - "\nvar dataNode = \"DT1.1\";" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Import the Dimensions, Yield Curves and Nominal Cashflows from the corresponding csv files in Initialization/Systemorph/" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, - { - "cell_type": "markdown", - "source": [ - "[Setup IFRS17 Calculation Engine](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation):" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"SpecificationsSetup\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Initialization of the Test Suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" - ] - }, - { - "cell_type": "code", - "source": [ - "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Actual);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## View imported Actuals" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Here the imported Actuals from csv are visualized " - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().GetIfrsVariables(dataNode)", - "\n .Where(x => new string[] {EstimateTypes.A, EstimateTypes.AA, EstimateTypes.OA}.Contains(x.EstimateType))", - "\n .Where(x => x.AocType != \"EOP\")" - ] - }, - { - "cell_type": "markdown", - "source": [ - "where the filter is selecting only those *estimate types* associated to the imported Actuals, hence excluding the IFRS variables calculated when [importing the cashflows](SpecificationsImportCashflows)." - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Base Actuals" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The following simplified AoC Chain applies for Advance and Overdue Actuals:", - "\n1. Beginning of Period (BOP)", - "\n2. Cash flow (CF)", - "\n3. Amortization (AM) ", - "\n4. End of Period (EOP) ", - "\n", - "\nWe consider 4 types of Actual values, which are distinguished through their [Estimate Type](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#estimate-type):", - "\n- Actuals (A)", - "\n- Advance Actuals (AA)", - "\n- Overdue Actuals (OA)", - "\n- Deferrable Actuals (DA)", - "\n", - "\nwith the Estimate Type's system name shown between parenthesis above.", - "\nThey are computed by the so-called Actual Base **Scope**", - "\n", - "\n$$", - "\n\\text{Actual Base} (\\text{AoC}) = \\left\\{", - "\n\\begin{array}{cl}", - "\n0 & \\text{if AoC step is AM,} \\\\", - "\n\\text{Actual Base}(\\rm{BOP}) + \\text{Actual Base}(\\rm{CF}) + \\text{Actual Base}(\\rm{WO}) & \\text{if AoC step is EOP and Estimate Type is not A,} \\\\", - "\n\\text{Imported Actual} & \\text{otherwise.}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nWe start by selecting one of the [imported Actual](#view-imported-actuals) and we pick up an available data node, novelty, and amount type. Then, we can retrieve the corresponding actual (if any) with AoC type BOP, R, and WO. ", - "\n", - "\nNote that the **Identity** for Actual Base contains information about the target data node, AoC type, novelty, amount type and estimate type." - ] - }, - { - "cell_type": "markdown", - "source": [ - "## End of Period" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The imported actuals for the AoC steps BOP, CF, and WO are:" - ] - }, - { - "cell_type": "code", - "source": [ - "var actualBaseBOP = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" }, \"PR\", \"AA\", (int?)null) ); ", - "\nactualBaseBOP" - ] - }, - { - "cell_type": "code", - "source": [ - "var actualBaseCF = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) );", - "\nactualBaseCF" - ] - }, - { - "cell_type": "code", - "source": [ - "var actualBaseWO = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"WO\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) ); ", - "\nactualBaseWO" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Based on the imported actuals and according to the [formula above](#base-actual), the computed actual for AoC step EOP reads" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedActualBaseEOP = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"EOP\", Novelty = \"C\" }, \"PR\", \"AA\", (int?)null) ); ", - "\ncomputedActualBaseEOP" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed value can be compared with the expected value" - ] - }, - { - "cell_type": "code", - "source": [ - "computedActualBaseEOP.Value == actualBaseBOP.Value + actualBaseCF.Value + actualBaseWO.Value" - ] - }, - { - "cell_type": "code", - "source": [ - "computedActualBaseEOP.Value.Should().Be( actualBaseBOP.Value + actualBaseCF.Value + actualBaseWO.Value );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Deferrable Actuals" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Deferrable Actuals (DA) are computed as follows", - "\n", - "\n$$", - "\n\\text{Deferrable Actual} (\\text{AoC}) = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{Actual Base}_{\\substack{\\text{Estimate Type}=\\text{A} \\\\ \\text{Amount Type}=\\text{ACA}}} (\\text{CF})", - "\n +\\text{Actual Base}_{\\substack{\\text{Estimate Type}=\\text{A} \\\\ \\text{Amount Type}=\\text{AEA}}} (\\text{CF}) & \\text{if AoC step is CF } \\\\", - "\n-\\text{AMF} \\cdot \\big( \\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) \\big) & \\text{if AoC step is AM } \\\\", - "\n\\text{Deferrable Actual}(\\rm{BOP}) + \\text{Deferrable Actual}(\\rm{CF}) + \\text{Deferrable Actual}(\\rm{AM}) & \\text{if AoC step is EOP } \\\\", - "\n\\text{Input Actual}_{\\text{Estimate Type}=\\text{DA}} (\\text{BOP}) & \\text{if AoC step is BOP } \\\\", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere ACA and AEA are *Aquisition* Amount Types from *Attributable Commission* and *Attributable Expenses*, respectively.", - "\n", - "\nNote that the **Identity** of Deferrable Actual is encompassing solely data node, Aoc type, and novelty." - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Beginning of Period" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeferrableActualBOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" } );", - "\ncomputedDeferrableActualBOP" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The deferrable Actual for the AoC step being BOP is simply the EOP Actual of the previous period. In fact, if the latter exists among the [imported Actuals](#view-imported-actuals), it is reported here below as the BOP of the current period:" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeferrableActualBOP = Test.GetStorage().GetValue(new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" }, (string)null, EstimateTypes.DA, (int?)null);", - "\nexpectedDeferrableActualBOP" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected value is compared with the computed result: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeferrableActualBOP.Value == expectedDeferrableActualBOP" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeferrableActualBOP.Value.Should().Be(expectedDeferrableActualBOP);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Cash flow" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeferrableActualCF = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" } );", - "\ncomputedDeferrableActualCF" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The deferrable Actual for the AoC step being CF is the sum of the base Actuals with Amount Type ACA and AEA:" - ] - }, - { - "cell_type": "code", - "source": [ - "var actualBaseAEA = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"AEA\", \"A\", (int?)null) );", - "\nactualBaseAEA" - ] - }, - { - "cell_type": "code", - "source": [ - "var actualBaseACA = Test.GetScope( (new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" }, \"ACA\", \"A\", (int?)null) );", - "\nactualBaseACA" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeferrableActualCF = actualBaseAEA.Value + actualBaseACA.Value;", - "\nexpectedDeferrableActualCF" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected value is compared with the computed result: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeferrableActualCF.Value == expectedDeferrableActualCF" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeferrableActualCF.Value.Should().Be(expectedDeferrableActualCF);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Amortization" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeferrableActualAM = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", - "\ncomputedDeferrableActualAM" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The deferrable Actual for the AoC step being AM is the sum of the deferrable Actuals for AoC step BOP and CF multiplied by the current period amortization factor:" - ] - }, - { - "cell_type": "code", - "source": [ - "var currentPeriodAmortizationFactor = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", - "\ncurrentPeriodAmortizationFactor" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().GetValue(new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" }, (string)null, \"F\", \"L\", (int?)null)" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeferrableActualAM = -currentPeriodAmortizationFactor.Value * (expectedDeferrableActualBOP + expectedDeferrableActualCF);", - "\nexpectedDeferrableActualAM" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected value is compared with the computed result: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeferrableActualAM.Value == expectedDeferrableActualAM" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeferrableActualAM.Value.Should().Be( expectedDeferrableActualAM );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## End of Period" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDeferrableActualEOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"EOP\", Novelty = \"C\" } );", - "\ncomputedDeferrableActualEOP" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The deferrable Actual for the AoC step being EOP is the sum of the deferrable Actuals for AoC step BOP, CF, and AM:" - ] - }, - { - "cell_type": "code", - "source": [ - "var deferrableActualBOP = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"BOP\", Novelty = \"I\" } );", - "\ndeferrableActualBOP" - ] - }, - { - "cell_type": "code", - "source": [ - "var deferrableActualCF = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"CF\", Novelty = \"C\" } );", - "\ndeferrableActualCF" - ] - }, - { - "cell_type": "code", - "source": [ - "var deferrableActualAM = Test.GetScope( new ImportIdentity {DataNode = \"DT1.1\", AocType = \"AM\", Novelty = \"C\" } );", - "\ndeferrableActualAM" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDeferrableActualEOP = deferrableActualBOP.Value + deferrableActualCF.Value + deferrableActualAM.Value;", - "\nexpectedDeferrableActualEOP" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected value is compared with the computed result: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeferrableActualEOP.Value == expectedDeferrableActualEOP" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDeferrableActualEOP.Value.Should().Be(expectedDeferrableActualEOP);" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb deleted file mode 100644 index 899f899d..00000000 --- a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb +++ /dev/null @@ -1,2005 +0,0 @@ -{ - "metadata": { - "authors": [], - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False", - "toc-showmarkdowntxt": "False", - "toc-showtags": "False" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "

Import Cashflows Specifications

" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The aim of this notebook is to document the calculation of the Present Values and Amortization Factors starting from the nominal Cashflows and the Yearly Yield Curve. These starting data is imported from the corresponding csv files located in the following path Initialization/Systemorph/. The process is pictorially explained in the following flowchart. ", - "\n", - "\n", - "\n
", - "\n", - "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import Data" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Current Period" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Please select the target period (i.e. year and month), Reporting Node, Economic Basis, and Data Node based on the imported data:" - ] - }, - { - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;", - "\nvar economicBasis = \"C\" ;" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Import the Dimensions, Yield Curves and Nominal Cashflows from the corresponding csv files in Initialization/Systemorph/" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ] - }, - { - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, - { - "cell_type": "markdown", - "source": [ - "[Setup IFRS17 Calculation Engine](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation):" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"SpecificationsSetup\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, - { - "cell_type": "markdown", - "source": [ - "At this point reference data are loaded. Import now a cashfow file with a 720 elements." - ] - }, - { - "cell_type": "code", - "source": [ - "var groupOfContract = \"GricComplex\";", - "\nawait Import.FromFile(\"Data/CashflowComplex.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Initialization of the Test suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" - ] - }, - { - "cell_type": "code", - "source": [ - "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## View loaded Data Nodes" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The imported active Data Nodes from Initialization/Systemorph/DataNodes.csv are " - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().DataNodeDataBySystemName" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## View loaded Yearly Yield Curve" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Here the correct Yield Curve is chosen among those imported from Initialization/Systemorph/Data.csv according to the [current period](#year-and-period) and the Aoc Step according the [Aoc Configuration](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-configuration). In the following we retrieve the desired identity." - ] - }, - { - "cell_type": "code", - "source": [ - "var aocType = \"CL\";", - "\nvar novelty = \"C\";" - ] - }, - { - "cell_type": "code", - "source": [ - "var id = Test.GetIdentity(groupOfContract, aocType, novelty);" - ] - }, - { - "cell_type": "code", - "source": [ - "var yearlyYieldCurve = Test.GetStorage().GetYearlyYieldCurve(id, economicBasis);" - ] - }, - { - "cell_type": "code", - "source": [ - "yearlyYieldCurve" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## View loaded Nominal Cashflows" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The nominal Cashflows for the current period are loaded together with last period Cashflows for Group of Contract that were already existent. ", - "\n", - "\nThe relative files are located in: Files/.", - "\n", - "\nThe result is showed in the following list to be compared with the entries of the csv files" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().GetRawVariables(groupOfContract)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Interest and Discount Rates" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Yield Curve ${\\text{YC}_i}$ associated to the the [selected period](#year-and-period) and target currency of the Group of Contract Reporting Node is [displayed above](#view-loaded-yearly-yield-curve) and used in this section to calculate the Interest and Discount factors", - "\n", - "\n$$", - "\n\\text{Interest}_i = \\big( 1 + \\text{YC}_i \\big) ^{\\frac{1}{12}} ~,", - "\n$$", - "\n", - "\nand", - "\n", - "\n$$", - "\n\\text{Discount}_i = \\big( 1 + \\text{YC}_i \\big) ^{-\\frac{1}{12}} ~.", - "\n$$" - ] - }, - { - "cell_type": "markdown", - "source": [ - "In the Scope named *MonthlyRate* the Interest and Discount factors are computed" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedMonthlyRates = Test.GetScope( id );" - ] - }, - { - "cell_type": "code", - "source": [ - "computedMonthlyRates" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Interest" - ] - }, - { - "cell_type": "markdown", - "source": [ - "In the following, the Interest factors computed by the application are recalculated independently according to the formula above in two different ways" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedInterest = yearlyYieldCurve.Select( yc => Math.Pow(1 + yc, 1.0 / 12.0) );", - "\nexpectedInterest" - ] - }, - { - "cell_type": "code", - "source": [ - "from yc in yearlyYieldCurve select Math.Pow(1 + yc, 1.0 / 12.0)" - ] - }, - { - "cell_type": "code", - "source": [ - "computedMonthlyRates.Interest.CheckEquality( expectedInterest ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Discount" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The following recalculates the Discount factors to be compared with the computed values" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDiscount = yearlyYieldCurve.Select( yc => Math.Pow(1 + yc, -1.0 / 12.0) );", - "\nexpectedDiscount" - ] - }, - { - "cell_type": "code", - "source": [ - "computedMonthlyRates.Discount.CheckEquality( expectedDiscount ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Test method: Get Valid Element" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Given the present Yield Curve array has finite *length*, the extrapolation implemented is taking the last element for all successive years. This behavior is given by the function *GetValidElement*. The test in this section assures that constant extrapolation is taken for *index* > *length*" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDiscount.GetValidElement( 120 )" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDiscount.GetValidElement( 120 ).Should().Be( expectedDiscount.Last() );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n# Cashflows" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This section deals with the calculation of the *Cumulated Discounted Cashflows* (CDC) starting from the nominal Cashflows. " - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Choose identity" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Each loaded nominal Cashflows is assigned to a so-called *Identity* which uniquely identifies it based on the *Data Node*, *Aoc Type*, and *Novelty*. In the following cells we retrieve the desired Identity:" - ] - }, - { - "cell_type": "code", - "source": [ - "var aocType = \"CL\";", - "\nvar novelty = \"C\";" - ] - }, - { - "cell_type": "code", - "source": [ - "var id = Test.GetIdentity(groupOfContract, aocType, novelty);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Nominal Cashflow" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Consider the two Amount Type *PR* and *NIC*, with Transaction Period being *Beginning of Period* (BOP) and *End of Period* (EOP), respectively. The corresponding nominal Cashflows are deposited in the Scopes named *NominalCashflow* with the Identity provided above, Calculation Type *BE*, and the aforementioned Amount Types. These nominal Cashflows correspond with those [loaded from the csv files](#view-loaded-nominal-cashflows). " - ] - }, - { - "cell_type": "code", - "source": [ - "var amountTypePR = \"PR\";", - "\nvar amountTypeNIC = \"NIC\";", - "\nvar estimateType = \"BE\";", - "\nvar accidentYear = (int?)null;" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalPR = Test.GetScope((id, amountTypePR, estimateType, accidentYear));" - ] - }, - { - "cell_type": "code", - "source": [ - "nominalPR" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalNIC = Test.GetScope((id, amountTypeNIC, estimateType, accidentYear));" - ] - }, - { - "cell_type": "code", - "source": [ - "nominalNIC" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Cumulated Discounted Cashflow" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The CDC is defined by the following recursive formulas", - "\n", - "\n$$", - "\n\\text{CDC}_t = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{Nominal}_t + \\text{CDC}_{t+1} \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} ~, & \\text{if Transaction Period is Beginning of Period} \\\\", - "\n\\big( \\text{Nominal}_t + \\text{CDC}_{t+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} ~, & \\text{if Transaction Period is End of Period}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere the Transaction Period depends on the given cashflow Amount Type. " - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Beginning of Period" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Amount Type **Premiums** (PR) has Transaction Period **Beginning of Period** (BOP). The corresponding CDC calculated by the application is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDiscountedPR = Test.GetScope((id, amountTypePR, estimateType, accidentYear));" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDiscountedPR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "In the following cell we independently evaluate the expected discounted cashflow according to the formula above:" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDiscountedPR = new double[nominalPR.Values.Length];", - "\n", - "\nEnumerable.Range(0, nominalPR.Values.Length).Reverse()", - "\n .ForEach( i => expectedDiscountedPR[i] = nominalPR.Values[i] + expectedDiscountedPR.GetValidElement(i+1) * expectedDiscount.GetValidElement(i/12) );", - "\n", - "\nexpectedDiscountedPR = Multiply(-1d, expectedDiscountedPR); // we need a reserve view for comparison" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDiscountedPR" - ] - }, - { - "cell_type": "code", - "source": [ - "(nominalPR.Values, nominalPR.Values.Length)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected cumulated discount is compared with the computed values" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDiscountedPR.Values.CheckEquality( expectedDiscountedPR )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDiscountedPR.Values.CheckEquality( expectedDiscountedPR ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### End Of Period" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Amount Type **Non Investment Component** (NIC) has Transaction Period **End of Period** (EOP). The corresponding CDC calculated by the application is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDiscountedNIC = Test.GetScope((id, amountTypeNIC, estimateType, accidentYear));" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDiscountedNIC" - ] - }, - { - "cell_type": "markdown", - "source": [ - "In the following cell we independently evaluate the expected discounted cashflow according to the formula above:" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDiscountedNIC = new double[nominalNIC.Values.Length];", - "\n", - "\nEnumerable.Range(0, nominalNIC.Values.Length).Reverse()", - "\n .ForEach( i => expectedDiscountedNIC[i] = ( nominalNIC.Values[i] + expectedDiscountedNIC.GetValidElement(i+1) ) * expectedDiscount.GetValidElement(i/12) );", - "\n", - "\nexpectedDiscountedNIC = Multiply(-1d, expectedDiscountedNIC); // we need a reserve view for comparison" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedDiscountedNIC" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected cumulated discount is compared with the computed values" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDiscountedNIC.Values.CheckEquality( expectedDiscountedNIC )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDiscountedNIC.Values.CheckEquality( expectedDiscountedNIC ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Non Performance Risk Adjustment" - ] - }, - { - "cell_type": "markdown", - "source": [ - "In this section we treat the determination of the non-performance risk adjustment, an element offsetting partially future", - "\nclaims according to the risk that the reinsurance company cannot fulfil the full extent of its obligations.", - "\n", - "\nFirstly, the discounting recursive relation can be written explicitly as", - "\n", - "\n$$", - "\n\\begin{array}{l}", - "\n\\text{CDC}_t = \\big( \\text{Nominal}_t + \\text{CDC}_{t+1} \\big) \\cdot {\\text{Valid Discount}_{\\frac{t}{12}}} \\\\", - "\n\\Rightarrow \\text{CDC}_t = \\sum_{\\tau=t} \\big( \\text{Valid Discount}_{\\frac{t}{12}} \\big)^{\\tau-t+1} \\cdot \\text{Nominal}_\\tau ", - "\n\\end{array}", - "\n$$", - "\n", - "\nFor nominal Cashflows with Amount Type being *Claims*, the risk-adjusted Cumulated Discounted Cashflow ", - "\nis assigned the Amount Type **Credit Default Risk** (CDR), ", - "\nand is obtained by multiplying the right hand side of the latter formula by the corresponding risk factor", - "\n", - "\n$$", - "\n\\text{CDC}_t^{\\text{Amount Type}=\\text{CDR}} = \\sum_{\\tau=t} \\big( \\text{Valid Discount}_{\\frac{t}{12}} \\big)^{\\tau-t+1} \\cdot \\text{Nominal}_\\tau^{\\text{Claim}} \\cdot \\big( e^{-\\gamma(\\tau-t)} -1 \\big)", - "\n$$", - "\n", - "\nwhere $\\gamma$ is the assumed non-performance probability of the reinsurer to be provided as an [input parameter](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#credit-default-rate).", - "\n", - "\nThis rate is constant for the whole projection period, that is, $\\gamma$ is not a function of $t$. ", - "\nIt effectively amounts to a constant increase in the continuous discount rate by $\\gamma$. " - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Explicit vs recursive formula" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The explicit formula is tested versus the expected result obtained with the recursive formula" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDiscountedNICbis = new double[nominalNIC.Values.Length];", - "\n", - "\n//for(int t = 0; t < 12; t++)", - "\n// for(int tau = t; tau < 12; tau++)", - "\n// expectedDiscountedNICbis[t] += nominalNIC.Values[tau] * Math.Pow(expectedDiscount.GetValidElement(t/12), tau-t+1);", - "\n", - "\nEnumerable.Range(0, nominalNIC.Values.Length)", - "\n .ForEach( i => expectedDiscountedNICbis[i] = ", - "\n Enumerable.Range(i, nominalNIC.Values.Length-i).Select( tau => nominalNIC.Values[tau] * Math.Pow(expectedDiscount.GetValidElement(i/12), tau-i+1) ).Sum() );", - "\n ", - "\nexpectedDiscountedNIC.CheckEquality( expectedDiscountedNICbis )" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Risk Adjusted Claims " - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed CDC with Amount Type being CDR reads" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedDiscountedCRD = Test.GetScope((id, \"CDR\", estimateType, accidentYear));" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDiscountedCRD" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The starting point for the non performance risk adjustment is the computation of the sum of nominal Cashflows with Amount Type **Claims** listed below" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().GetClaims()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "with the corresponding nominal Cashflows being" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalNIC = Test.GetScope((id, \"NIC\", estimateType, accidentYear));", - "\nnominalNIC" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalICO = Test.GetScope((id, \"ICO\", estimateType, accidentYear));", - "\nnominalICO" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalALE = Test.GetScope((id, \"ALE\", estimateType, accidentYear));", - "\nnominalNIC" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalULE = Test.GetScope((id, \"ULE\", estimateType, accidentYear));", - "\nnominalNIC" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalClaims = Sum( Sum(nominalICO.Values, nominalNIC.Values), Sum(nominalALE.Values, nominalULE.Values) );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Secondly, the correct credit risk rate (parameter $\\gamma$ in the [formula above](#non-performance-risk-adjustment)) is retrieved from the list of imported [Partner Rating](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure) and [Credit Default Rates](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure) relative to the target [Data Node](#year-and-period)'s Partner" - ] - }, - { - "cell_type": "code", - "source": [ - "groupOfContract" - ] - }, - { - "cell_type": "code", - "source": [ - "var creditDefaultRate = Test.GetStorage().GetNonPerformanceRiskRate( id );", - "\ncreditDefaultRate" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Lastly, using the [formula above](#non-performance-risk-adjustment), the expected CDR discounted Cashflow can be computed" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedDiscountedCDR = new double[nominalNIC.Values.Length];", - "\n", - "\nEnumerable.Range(0, nominalClaims.Length).ForEach( t => ", - "\n expectedDiscountedCDR[t] = Enumerable.Range(t, nominalClaims.Length-t).Select( tau => ", - "\n nominalClaims[tau] * Math.Pow(expectedDiscount.GetValidElement(t/12), tau-t+1) * (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", - "\n ).Sum() );", - "\n", - "\nexpectedDiscountedCDR = Multiply(-1d, expectedDiscountedCDR); // we need a reserve view for comparison", - "\nexpectedDiscountedCDR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Finally, the expected cumulated discount is compared with the computed values" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDiscountedCRD.Values.CheckEquality( expectedDiscountedCDR )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedDiscountedCRD.Values.CheckEquality( expectedDiscountedCDR ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Present Values" - ] - }, - { - "cell_type": "markdown", - "source": [ - "For an implementation of these formulas refer to the [ImportScopeCalculation notebook](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation). " - ] - }, - { - "cell_type": "markdown", - "source": [ - "The company portfolio value in one period is given by the following Analysis of Change AoC steps:", - "\n1. Beginning of Period (BoP): starting value of the portfolio as of December last year (in the Year to Date view), ", - "\n2. Model Corrections (MC): change of the portfolio value based on the model change,", - "\n3. Cash Flow (CF):", - "\n4. Interest Accretion (IA): ", - "\n5. Assumption Update (AU): ", - "\n6. Yield Curve Update (YCU): impact of yield curve update occured during the reporting period,", - "\n7. Credit Risk Update (CRU): impact of credit default rate update occured during the reporting period,", - "\n8. Experience Variance (EV): value adjustments following insurance related events which took place (e.g. mortality),", - "\n9. Combined Liabilities (CL):", - "\n10. End of Period (EOP): portfolio value at the end of the current period.", - "\n", - "\nNote: the AoC steps WO, EA and AM are not included in the Present Value calculation, hence their values if inquired is zero." - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Present Value Base (PVB) values are valid for all [Economic Basis](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#economic-basis) and depends on the corresponding [AoCType](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#aoc-type):", - "\n", - "\n$$", - "\n\\text{PVB}_t \\big(\\text{AoC}\\big) = ", - "\n\\left\\{", - "\n\\begin{array}{cl}", - "\n\\text{CDC}_t & \\text{if AoC is Beginning of Period (BOP) } \\\\", - "\n-\\text{Nominal}_t(\\text{Parent AoC}) & \\text{if AoC is Expected Cashflow (CF) } \\\\", - "\n\\text{InterestAccretion}_t & \\text{if AoC is Interest Accretion (IA) } \\\\", - "\n\\text{CDC}_t(\\text{Parent AoC}) & \\text{if AoC is End of Period (EOP) } \\\\", - "\n\\text{CDC}_{t}(\\text{current AoC}) - \\text{CDC}_{t}(\\text{parent AoC}) & \\text{otherwise}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nand the Projected Present Value (PPV) reads", - "\n", - "\n$$", - "\n\\text{PPV} \\big(\\text{AoC},\\text{TS},\\text{S}\\big) = \\left\\{", - "\n\\begin{array}{cll}", - "\n\\text{PVB}_{S} & \\text{if AoC Valuation Period is Beginning of Period } & \\text{ (e.g. BOP, MC) } \\\\", - "\n\\text{PVB}_{S+TS/2 -1} & \\text{if AoC Valuation Period is Mid of Period } & \\text{ (no examples in current data model) } \\\\", - "\n\\sum_{i=S}^{S + TS -1}\\text{PVB}_{i} & \\text{if AoC Valuation Period is Delta } & \\text{ (e.g. CF, IA) } \\\\", - "\n\\text{PVB}_{S + TS} & \\text{if AoC Valuation Period is End of Period } & \\text{ (e.g. YCU, CRU, EV, CL, EOP) } \\\\", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere the Shift (S) and Time Step (TS) are derived from the current [Year and Period](#year-and-period)" - ] - }, - { - "cell_type": "code", - "source": [ - "var projectionPeriod = 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().GetShift(projectionPeriod)" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().GetTimeStep(projectionPeriod)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Load Cashflow Data" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] - }, - { - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "At this point standard Cashflows are loaded." - ] - }, - { - "cell_type": "markdown", - "source": [ - "Initialization of the Test suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" - ] - }, - { - "cell_type": "code", - "source": [ - "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Select Group of Contract", - "\n", - "\nHere, it is possible to select the Group of Contract used to run the next section of this Notebook." - ] - }, - { - "cell_type": "code", - "source": [ - "groupOfContract = \"DTR1.1\" ;" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Beginning of Period" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Beginning of Period is:" - ] - }, - { - "cell_type": "code", - "source": [ - "var idBoP = Test.GetIdentity(groupOfContract, \"BOP\", \"I\");", - "\nidBoP" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueBoP_PR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, the expected BOP AoCType for PVB is defined to be equal to the discounted cashflows with the same Identity, Amount Type, and Calculation Type, whereas the PPV is the S-th element of the PVB." - ] - }, - { - "cell_type": "code", - "source": [ - "var discountedBoP_PR = Test.GetScope((idBoP, \"PR\", \"BE\", (int?)null));", - "\ndiscountedBoP_PR" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedPresentValueBoP_PR = discountedBoP_PR.Values;" - ] - }, - { - "cell_type": "markdown", - "source": [ - "In the following cell we check whether the expected values match the computed values" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueBoP_PR.Values.CheckEquality( expectedPresentValueBoP_PR )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueBoP_PR.Values.CheckEquality( expectedPresentValueBoP_PR ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Model Corrections" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Model Corrections is:" - ] - }, - { - "cell_type": "code", - "source": [ - "var idMC = Test.GetIdentity(groupOfContract, \"MC\", \"I\");", - "\nidMC" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueMC_PR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, for MC AoCType, the PVB is equal to the difference between the CDC of the current AoCType and the CDC of its parent. Additionally, the PPV is the S-th element of the PVB." - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetScope((idMC, \"PR\")).Values" - ] - }, - { - "cell_type": "code", - "source": [ - "var discountedMC_PR = Test.GetScope((idMC, \"PR\", \"BE\", (int?)null));", - "\ndiscountedMC_PR" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedPresentValueMC_PR = Subtract(discountedMC_PR.Values, discountedBoP_PR.Values);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueMC_PR.Values.CheckEquality( expectedPresentValueMC_PR )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueMC_PR.Value == expectedPresentValueMC_PR[0]" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueMC_PR.Values.CheckEquality( expectedPresentValueMC_PR ).Should().Be(true);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueMC_PR.Value.Should().Be( expectedPresentValueMC_PR[0] );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Cashflow" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Cashflow is:" - ] - }, - { - "cell_type": "code", - "source": [ - "var idCF = Test.GetIdentity(groupOfContract, \"CF\", \"I\");", - "\nidCF" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueCF_PR = Test.GetScope((idCF, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueCF_PR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, for CF AoCType, the PVB is equal to the nominal cashflow of its parent AoC step with opposite sign. The PPV is given by the sum of the first 3 elements." - ] - }, - { - "cell_type": "code", - "source": [ - "var cfReferenceAocStep = Test.GetScope(idCF).Value;", - "\ncfReferenceAocStep" - ] - }, - { - "cell_type": "code", - "source": [ - "var cfNominalReference_PR = Test.GetScope((idCF with {AocType = cfReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", - "\ncfNominalReference_PR" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedPresentValueCF_PR = Multiply(1.0, cfNominalReference_PR.Values);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCF_PR.Values.CheckEquality( expectedPresentValueCF_PR )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCF_PR.Values[0] + computedPresentValueCF_PR.Values[1] + computedPresentValueCF_PR.Values[2] == computedPresentValueCF_PR.Value" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCF_PR.Values.CheckEquality( expectedPresentValueCF_PR ).Should().Be(true);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCF_PR.Value.Should().Be( computedPresentValueCF_PR.Values[0] + computedPresentValueCF_PR.Values[1] + computedPresentValueCF_PR.Values[2] );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Interest Accretion" - ] - }, - { - "cell_type": "markdown", - "source": [ - "For IA AoCType, the PVB is given by the following relation ", - "\n", - "\n$$", - "\n\\text{InterestAccretion}_i = \\left\\{", - "\n\\begin{array}{cl}", - "\n\\big(\\text{CDC}_i(\\text{Parent AoC}) - \\text{Nominal}_i(\\text{parent AoC}) \\big) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, ", - "\n & \\text{if AmountType Transaction Period is Beginning of Period} \\\\", - "\n\\text{CDC}_i(\\text{parent AoC}) \\cdot \\big({\\text{Valid Interest}_{\\frac{i}{12}}} - 1 \\big)~, ", - "\n & \\text{otherwise}", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhile the PPV is given by the sum of the first S elements.", - "\n", - "\nWhen selecting the Identity, note that the Novelty *C* is not contemplated for Interest Accretion." - ] - }, - { - "cell_type": "code", - "source": [ - "var idIA = Test.GetIdentity(groupOfContract, \"IA\", \"I\");", - "\nidIA" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Amount Type BOP" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed Present Value for Amount Type **Premiums** (PR) with Transaction Period **Beginning of Period** (BOP) is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueIA_PR = Test.GetScope((idIA, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueIA_PR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the interest factors, the nominal and discounted Cashflow of the parent Aoc Step" - ] - }, - { - "cell_type": "code", - "source": [ - "var iaComputedMonthlyRates = Test.GetScope( idIA );", - "\niaComputedMonthlyRates" - ] - }, - { - "cell_type": "code", - "source": [ - "var iaReferenceAocStep = Test.GetScope(idIA).Value;", - "\niaReferenceAocStep" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalIaReference_PR = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", - "\nnominalIaReference_PR" - ] - }, - { - "cell_type": "code", - "source": [ - "var discountedIaReference_PR = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"PR\", \"BE\", (int?)null));", - "\ndiscountedIaReference_PR" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedPresentValueIA_PR = discountedIaReference_PR.Values.Select((val, index) => ( val - ( -1d * nominalIaReference_PR.Values[index]) ) * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueIA_PR.Values.CheckEquality( expectedPresentValueIA_PR )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueIA_PR.Values[0] + computedPresentValueIA_PR.Values[1] + computedPresentValueIA_PR.Values[2] == computedPresentValueIA_PR.Value" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueIA_PR.Values.CheckEquality( expectedPresentValueIA_PR ).Should().Be(true);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueIA_PR.Value.Should().Be( computedPresentValueIA_PR.Values[0] + computedPresentValueIA_PR.Values[1] + computedPresentValueIA_PR.Values[2] );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Amount Type EOP" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed Present Value for Amount Type **Non Investment Component** (NIC) with Transaction Period **End of Period** (EOP) is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueIA_NIC = Test.GetScope((idIA, \"NIC\", \"BE\", (int?)null));", - "\ncomputedPresentValueIA_NIC" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the interest monthly rates, the discounted Cashflow of the parent Aoc Step" - ] - }, - { - "cell_type": "code", - "source": [ - "var iaReferenceAocStep = Test.GetScope(idIA).Value;", - "\niaReferenceAocStep" - ] - }, - { - "cell_type": "code", - "source": [ - "var discountedIaReference_NIC = Test.GetScope((idIA with {AocType = iaReferenceAocStep.AocType}, \"NIC\", \"BE\", (int?)null));", - "\ndiscountedIaReference_NIC" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedPresentValueIA_NIC = discountedIaReference_NIC.Values.Select((val, index) => val * ( iaComputedMonthlyRates.Interest.GetValidElement(index/12) -1));" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueIA_NIC.Values.CheckEquality( expectedPresentValueIA_NIC )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueIA_NIC.Values[0] + computedPresentValueIA_NIC.Values[1] + computedPresentValueIA_NIC.Values[2] == computedPresentValueIA_NIC.Value" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueIA_NIC.Values.CheckEquality( expectedPresentValueIA_NIC ).Should().Be(true);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueIA_NIC.Value.Should().Be( computedPresentValueIA_NIC.Values[0] + computedPresentValueIA_NIC.Values[1] + computedPresentValueIA_NIC.Values[2] );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Yield Curve Update" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Yield Curve Update is:" - ] - }, - { - "cell_type": "code", - "source": [ - "var idYcu = Test.GetIdentity(groupOfContract, \"YCU\", \"I\");", - "\nidYcu" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueYCU_PR = Test.GetScope((idYcu, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueYCU_PR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Present Value can be recomputed independently following the aforementioned [equation](#interest-accretion) starting from the discount factors for beginning of period and for end of period applied to the reference Aoc step, followed by the difference between the CDC obtained with end of period discount factor and the CDC obtained with beginning of period discount factor. " - ] - }, - { - "cell_type": "code", - "source": [ - "var ycReferenceAocStep = Test.GetScope(idYcu).Value;", - "\nycReferenceAocStep" - ] - }, - { - "cell_type": "code", - "source": [ - "var ycParentAocStep = Test.GetScope((idYcu, \"PR\")).Values.Single();", - "\nycParentAocStep" - ] - }, - { - "cell_type": "code", - "source": [ - "var ycParentId = idYcu with {AocType = ycParentAocStep.AocType, Novelty = ycParentAocStep.Novelty};", - "\nycParentId" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Here is the parent AocStep discounted with the beginning of period discount factor." - ] - }, - { - "cell_type": "code", - "source": [ - "var discountedYcParent = Test.GetScope((ycParentId, \"PR\", \"BE\", (int?)null));", - "\ndiscountedYcParent" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Here we independently compute the CDC of the parent AocStep discounted with end of period discount factor." - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalYcParent = Test.GetScope((ycParentId, \"PR\", \"BE\", (int?)null));", - "\nnominalYcParent" - ] - }, - { - "cell_type": "code", - "source": [ - "var ycComputedMonthlyRates = Test.GetScope( idYcu );", - "\nycComputedMonthlyRates" - ] - }, - { - "cell_type": "code", - "source": [ - "var ycReferenceDiscountedEop = new double[nominalYcParent.Values.Length];", - "\n", - "\nEnumerable.Range(0, nominalYcParent.Values.Length).Reverse()", - "\n .ForEach( i => ycReferenceDiscountedEop[i] = nominalYcParent.Values[i] + ycReferenceDiscountedEop.GetValidElement(i+1) * ycComputedMonthlyRates.Discount.GetValidElement(i/12) );", - "\n", - "\nycReferenceDiscountedEop = Multiply(-1d, ycReferenceDiscountedEop); // we need a reserve view for comparison", - "\nycReferenceDiscountedEop" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedPresentValueYCU_PR = Subtract(ycReferenceDiscountedEop, discountedYcParent.Values);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueYCU_PR.Values.CheckEquality( expectedPresentValueYCU_PR )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueYCU_PR.Value == expectedPresentValueYCU_PR[3]" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueYCU_PR.Values.CheckEquality( expectedPresentValueYCU_PR ).Should().Be(true);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueYCU_PR.Value.Should().Be( expectedPresentValueYCU_PR[3] );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Credit Risk Update" - ] - }, - { - "cell_type": "markdown", - "source": [ - "This Aoc Step is relevant only in the case of a Group of Reinsurance Contract." - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Credit Risk Update is:" - ] - }, - { - "cell_type": "code", - "source": [ - "var idCru = Test.GetIdentity(groupOfContract, \"CRU\", \"I\");", - "\nidCru" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueCRU = Test.GetScope((idCru, \"CDR\", \"BE\", (int?)null));", - "\ncomputedPresentValueCRU" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Present Value can be recomputed independently starting as the difference between the CDC obtained with end of period credit default risk rate and the CDC obtained with beginning of period credit default risk rate, both computed using the Nominal cashflow of the reference Aoc Step and the End Of Period discounting factors. " - ] - }, - { - "cell_type": "code", - "source": [ - "var cruReferenceAocStep = Test.GetScope(idCru).Value;", - "\ncruReferenceAocStep" - ] - }, - { - "cell_type": "code", - "source": [ - "var cruReferenceId = idCru with {AocType = cruReferenceAocStep.AocType, Novelty = cruReferenceAocStep.Novelty};", - "\ncruReferenceId" - ] - }, - { - "cell_type": "code", - "source": [ - "var cruParentAocStep = Test.GetScope((idCru, \"CDR\")).Values.Single();", - "\ncruParentAocStep" - ] - }, - { - "cell_type": "code", - "source": [ - "var cruParentId = idCru with {AocType = cruParentAocStep.AocType, Novelty = cruParentAocStep.Novelty};", - "\ncruParentId" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Here is the parent AocStep discounted with beginning of period credit default risk rate." - ] - }, - { - "cell_type": "code", - "source": [ - "var discountedCruParent = Test.GetScope((cruParentId, \"CDR\", \"BE\", (int?)null));", - "\ndiscountedCruParent" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalCruReference = Test.GetScope((cruReferenceId, \"CDR\", \"BE\", (int?)null)).Values;", - "\nnominalCruReference" - ] - }, - { - "cell_type": "code", - "source": [ - "var creditDefaultRate = Test.GetStorage().GetNonPerformanceRiskRate( idCru );", - "\ncreditDefaultRate" - ] - }, - { - "cell_type": "code", - "source": [ - "var cruComputedMonthlyRates = Test.GetScope( idCru );", - "\ncruComputedMonthlyRates" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Lastly, using the [formula above](#non-performance-risk-adjustment), the expected CDR discounted Cashflow can be computed" - ] - }, - { - "cell_type": "code", - "source": [ - "var cruExpectedDiscountedCDR = new double[nominalCruReference.Length];", - "\n", - "\nEnumerable.Range(0, nominalCruReference.Length).ForEach( t => ", - "\n cruExpectedDiscountedCDR[t] = Enumerable.Range(t, nominalCruReference.Length-t).Select( tau => ", - "\n nominalCruReference[tau] * ", - "\n Math.Pow(cruComputedMonthlyRates.Discount.GetValidElement(t/12), tau-t+1) * ", - "\n (Math.Exp(-creditDefaultRate*(tau-t)) - 1)", - "\n ).Sum() );", - "\n", - "\ncruExpectedDiscountedCDR = Multiply(-1d, cruExpectedDiscountedCDR); // we need a reserve view for comparison", - "\n", - "\ncruExpectedDiscountedCDR" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedPresentValueCRU = Subtract(cruExpectedDiscountedCDR, discountedCruParent.Values);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCRU.Values.CheckEquality( expectedPresentValueCRU )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCRU.Value == expectedPresentValueCRU[3]" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCRU.Values.CheckEquality( expectedPresentValueCRU ).Should().Be(true);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCRU.Value.Should().Be( expectedPresentValueCRU[3] );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Combined Liabilities" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type Combined Liabilities and Amount Type PR is:" - ] - }, - { - "cell_type": "code", - "source": [ - "var idCL = Test.GetIdentity(groupOfContract, \"CL\", \"C\");", - "\nidCL" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueCL_PR = Test.GetScope((idCL, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueCL_PR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, for CL AoCType, the PVB is equal to the difference between the CDC of the current AoCType and the CDC of its parent(s). Additionally, the PPV is the $(\\text{S}+\\text{TS})$-th element of the PVB." - ] - }, - { - "cell_type": "code", - "source": [ - "var clParents = Test.GetScope((idCL,\"PR\")).Values;", - "\nclParents" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedPresentValueCL_PR = Subtract(Test.GetScope((idCL, \"PR\", \"BE\", (int?)null)).Values,", - "\n clParents.Select(aocStep => Test.GetScope((idCL with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}, \"PR\", \"BE\", (int?)null)).Values).Aggregate());" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCL_PR.Values.CheckEquality( expectedPresentValueCL_PR )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCL_PR.Value == expectedPresentValueCL_PR[3]" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCL_PR.Values.CheckEquality( expectedPresentValueCL_PR ).Should().Be(true);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueCL_PR.Value.Should().Be( expectedPresentValueCL_PR[3] );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## End of Period" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed Present Value for Aoc type End of Period is:" - ] - }, - { - "cell_type": "code", - "source": [ - "var idEOP = Test.GetIdentity(groupOfContract, \"EOP\", \"C\");", - "\nidEOP" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueEOP_NIC = Test.GetScope((idEOP, \"NIC\", \"BE\", (int?)null));", - "\ncomputedPresentValueEOP_NIC" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#present-values) above, for EOP AoCType, the PVB is equal to the CDC of the parent AoC step, while the PPV is the $(\\text{S}+\\text{TS})$-th element of the PVB." - ] - }, - { - "cell_type": "code", - "source": [ - "var eopReferenceAocStep = Test.GetScope(idEOP).Value;", - "\neopReferenceAocStep" - ] - }, - { - "cell_type": "code", - "source": [ - "var discountedCL_NIC = Test.GetScope((idEOP with {AocType = eopReferenceAocStep.AocType, Novelty = eopReferenceAocStep.Novelty}, \"NIC\", \"BE\", (int?)null));", - "\ndiscountedCL_NIC" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedPresentValueEOP_NIC = discountedCL_NIC.Values;" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The expected PVB and PPV are compared with the computed results in the following two cells: " - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueEOP_NIC.Values.CheckEquality( expectedPresentValueEOP_NIC )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueEOP_NIC.Value == expectedPresentValueEOP_NIC[3]" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueEOP_NIC.Values.CheckEquality( expectedPresentValueEOP_NIC ).Should().Be(true);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedPresentValueEOP_NIC.Value.Should().Be( expectedPresentValueEOP_NIC[3] );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Check for zero PVB values" - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Amortization" - ] - }, - { - "cell_type": "markdown", - "source": [ - "For AM AoCType, the PVB values are zero, i.e. Amortization is not part of the Present Value computation. In this subsection we check whether the corresponding values are zero accordingly. " - ] - }, - { - "cell_type": "code", - "source": [ - "var idAM = Test.GetIdentity(groupOfContract, \"AM\", \"C\");", - "\nidAM" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueAM_PR = Test.GetScope((idAM, \"PR\", \"BE\", (int?)null));", - "\ncomputedPresentValueAM_PR" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedPresentValueAM_PR = Test.GetScope((idAM, \"NIC\", \"BE\", (int?)null));", - "\ncomputedPresentValueAM_PR" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Amortization Factors" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The amortization factors (AMF) are calculated from the corresponding Nominal and Discounted Cashflows with Calculation Type being *Coverage Units* (CU). ", - "\nThe monthly AMF is", - "\n", - "\n$$", - "\n\\text{AMF}^{\\text{Monthly}}_t = 1 - \\frac{ \\text{Nominal}^{\\text{Coverage Units}}_t } { \\text{CDC}^{\\text{Coverage Units}}_t } ~,", - "\n$$", - "\n", - "\nwhile the AMF related to the current period is", - "\n", - "\n$$", - "\n\\text{AMF} = 1 - \\prod _{t = \\text{S}}^{\\text{S}+\\text{TS}-1} \\text{AMF}^{\\text{Monthly}}_t ~.", - "\n$$", - "\n", - "\nwhere the shift S and Time Step TS for the [current period](#year-and-period) are" - ] - }, - { - "cell_type": "code", - "source": [ - "var projectionPeriod = 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var shift = Test.GetStorage().GetShift(projectionPeriod);", - "\nshift" - ] - }, - { - "cell_type": "code", - "source": [ - "var timeStep = Test.GetStorage().GetTimeStep(projectionPeriod);", - "\ntimeStep" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Monthly Amortization" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed monthly and current period Amortization Factors derived from a non-zero [imported](#year-and-period) nominal cashflows and its corresponding discounted are shown in the following" - ] - }, - { - "cell_type": "code", - "source": [ - "var idAM = Test.GetIdentity(groupOfContract, \"CL\", \"C\");", - "\nidAM" - ] - }, - { - "cell_type": "code", - "source": [ - "var nominalCashflowAmortizationFactorTest = Test.GetScope( (idAM, default(string), \"CU\", (int?)null) );", - "\nnominalCashflowAmortizationFactorTest" - ] - }, - { - "cell_type": "code", - "source": [ - "var discountedCashflowAmortizationFactorTest = Test.GetScope(idAM);", - "\ndiscountedCashflowAmortizationFactorTest" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedMonthlyAmortizationFactor = Test.GetScope(idAM with {AocType = \"AM\"});", - "\ncomputedMonthlyAmortizationFactor" - ] - }, - { - "cell_type": "markdown", - "source": [ - "In the following cell we independently evaluate the expected monthly amortization factor according to the [formula above](#amortization-factor) and we check whether expected vs computed match" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedMonthlyAmortizationFactor = nominalCashflowAmortizationFactorTest.Values.Zip(discountedCashflowAmortizationFactorTest.Values, ", - "\n (nominal, discountedCumulated) => 1 - (-nominal) / discountedCumulated ).ToArray();" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedMonthlyAmortizationFactor.RepeatOnce()" - ] - }, - { - "cell_type": "code", - "source": [ - "computedMonthlyAmortizationFactor.MonthlyAmortizationFactors.CheckEquality( expectedMonthlyAmortizationFactor )" - ] - }, - { - "cell_type": "code", - "source": [ - "computedMonthlyAmortizationFactor.MonthlyAmortizationFactors.CheckEquality( expectedMonthlyAmortizationFactor ).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Current Period" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The computed current period amortization factor is" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedCurrentPeriodAmortizationFactor = Test.GetScope(idAM with {AocType = \"AM\"});", - "\ncomputedCurrentPeriodAmortizationFactor" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Conversely, the current period Amortization factor can be independently computed using the [formula above](#amortization-factor) as" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedCurrentPeriodAmortizationFactor = 1d - expectedMonthlyAmortizationFactor.Skip(shift).Take(timeStep).Aggregate(1d, (x, y) => x * y);" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedCurrentPeriodAmortizationFactor" - ] - }, - { - "cell_type": "code", - "source": [ - "computedCurrentPeriodAmortizationFactor.Value == expectedCurrentPeriodAmortizationFactor" - ] - }, - { - "cell_type": "code", - "source": [ - "computedCurrentPeriodAmortizationFactor.Value.Should().Be( expectedCurrentPeriodAmortizationFactor );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Results persisted" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The last step during the Cashflow import is to save, namely *persist* the Present Values computed with *locked* (L) and *current* (C) economic basis, and calculation type being *Best Estimate* (BE). ", - "\n", - "\nThese data is the starting point of the [Contractual Service Margin calculation](\"SpecificationsCSM\")." - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Test/SpecificationsSetup.ipynb b/full-ifrs17-template/Test/SpecificationsSetup.ipynb deleted file mode 100644 index b9f1e2f4..00000000 --- a/full-ifrs17-template/Test/SpecificationsSetup.ipynb +++ /dev/null @@ -1,125 +0,0 @@ -{ - "metadata": { - "authors": [], - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "

Specifications Setup

" - ] - }, - { - "cell_type": "code", - "source": [ - "public interface Universe : IMutableScopeWithStorage{}", - "\n", - "\npublic async Task StartCalculatorAsync(string reportingNode, int year, int month, string economicBasis, Periodicity period, string format) ", - "\n{", - "\n ", - "\n var importArgs = new ImportArgs(reportingNode, year, month, period, null, format);", - "\n Workspace.Reset();", - "\n Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization());", - "\n", - "\n var partition = (await DataSource.Query().Where(p => p.ReportingNode == importArgs.ReportingNode &&", - "\n p.Year == importArgs.Year &&", - "\n p.Month == importArgs.Month &&", - "\n p.Scenario == importArgs.Scenario", - "\n ).ToArrayAsync()).Single().Id;", - "\n await DataSource.Partition.SetAsync(partition);", - "\n", - "\n //Set Workspace as when the parsing is completed.", - "\n if(importArgs.ImportFormat == ImportFormats.Actual)", - "\n { ", - "\n await Workspace.UpdateAsync(await DataSource.Query()", - "\n .Where(x => x.Partition == partition && ", - "\n new string[]{EstimateTypes.A, EstimateTypes.AA, EstimateTypes.OA}.Contains(x.EstimateType) && ", - "\n new string[]{AocTypes.CF, AocTypes.WO}.Contains(x.AocType))", - "\n .ToArrayAsync());", - "\n }", - "\n else if(importArgs.ImportFormat == ImportFormats.Opening)", - "\n { ", - "\n await Workspace.UpdateAsync(await DataSource.Query()", - "\n .Where(x => x.Partition == partition && ", - "\n new string[]{ EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, EstimateTypes.AA, EstimateTypes.OA, EstimateTypes.DA}.Contains(x.EstimateType) && ", - "\n x.AocType == AocTypes.BOP && x.Novelty == Novelties.I)", - "\n .ToArrayAsync());", - "\n }", - "\n else", - "\n {", - "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => x.Partition == partition).ToArrayAsync());", - "\n }", - "\n var storage = new ImportStorage(importArgs, DataSource, Workspace);", - "\n await storage.InitializeAsync();", - "\n return Scopes.ForStorage(storage).WithContext(economicBasis).ToScope();", - "\n}", - "\n", - "\npublic static ImportIdentity GetIdentity (this Universe universe, string dataNode, string aocType, string novelty) ", - "\n => universe.GetScope(dataNode).Identities.Single( x => x.AocType == aocType && x.Novelty == novelty );", - "\n", - "\nstatic T GetValidElement(this IList array, int index) => GetElementOrDefault(array, index);", - "\n", - "\nstatic T GetValidElement(this IEnumerable array, int index) => GetElementOrDefault(array.ToArray(), index);", - "\n", - "\nstatic void ForEach(this IEnumerable self, Action action) => self.ToList().ForEach(action);", - "\n", - "\npublic static IfrsVariable FromPvToIfrsVariable(this PresentValue scope)", - "\n => new IfrsVariable{ EconomicBasis = scope.EconomicBasis, ", - "\n EstimateType = scope.Identity.EstimateType, ", - "\n DataNode = scope.Identity.Id.DataNode, ", - "\n AocType = scope.Identity.Id.AocType, ", - "\n Novelty = scope.Identity.Id.Novelty, ", - "\n AccidentYear = scope.Identity.AccidentYear,", - "\n AmountType = scope.Identity.AmountType,", - "\n Value = scope.Value,", - "\n Partition = scope.GetStorage().TargetPartition };", - "\n", - "\npublic static IfrsVariable FromCsmToIfrsVariable(this ContractualServiceMargin scope)", - "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", - "\n DataNode = scope.Identity.DataNode, ", - "\n AocType = scope.Identity.AocType, ", - "\n Novelty = scope.Identity.Novelty, ", - "\n Value = scope.Value,", - "\n Partition = scope.GetStorage().TargetPartition };", - "\n", - "\npublic static IfrsVariable FromLcToIfrsVariable(this LossComponent scope)", - "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", - "\n DataNode = scope.Identity.DataNode, ", - "\n AocType = scope.Identity.AocType, ", - "\n Novelty = scope.Identity.Novelty, ", - "\n Value = scope.Value,", - "\n Partition = scope.GetStorage().TargetPartition };", - "\n", - "\npublic static IfrsVariable FromLoReCoToIfrsVariable(this LossRecoveryComponent scope)", - "\n => new IfrsVariable{ EstimateType = scope.EstimateType, ", - "\n DataNode = scope.Identity.DataNode, ", - "\n AocType = scope.Identity.AocType, ", - "\n Novelty = scope.Identity.Novelty, ", - "\n Value = scope.Value,", - "\n Partition = scope.GetStorage().TargetPartition };" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb b/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb deleted file mode 100644 index f8cc0f73..00000000 --- a/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb +++ /dev/null @@ -1,1768 +0,0 @@ -{ - "metadata": { - "authors": [], - "kernelspec": { - "display_name": "Formula Framework", - "language": "C#", - "name": "C#" - }, - "language_info": { - "file_extension": ".cs", - "mimetype": "text/plain", - "name": "C#" - }, - "toc-autonumbering": "True", - "toc-showcode": "False" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "

Technical Margin Specifications

" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The aim of this notebook is to document the Technical Margin (TM) and its allocation to the Contractual Service Margin (CSM), Loss Component (LC), or Loss Recovery Component (LoReCo). The process is pictorially explained in the following flowchart. ", - "\n", - "\n", - "\n
", - "\n", - "\nThroughout this notebook we adopt the following variable notation: we use the words *computed* vs. *expected* to differentiate the results provided by the application vs. this test notebook, respectively." - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import Data" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Current Period" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Please select the target period (i.e. year and month) and Reporting Node based on the imported data:" - ] - }, - { - "cell_type": "code", - "source": [ - "var year = 2021 ;", - "\nvar month = 3 ;", - "\nvar reportingNode = \"CH\" ;", - "\nvar economicBasis = \"L\" ;" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Import the Dimensions, Parameters, Nominal Cashflows, and Actuals from the corresponding csv files in Initialization/Systemorph/" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, - { - "cell_type": "markdown", - "source": [ - "[Setup IFRS17 Calculation Engine](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation):" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"SpecificationsSetup\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Initialization of the Test Suite: the data loaded from csv files are ready to be used by the Scopes for the calculations" - ] - }, - { - "cell_type": "code", - "source": [ - "var Test = await StartCalculatorAsync(reportingNode, year, month, economicBasis, Periodicity.Quarterly, ImportFormats.Cashflow);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## View loaded Data Nodes" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The imported active Data Nodes from Initialization/Systemorph/DataNodes.csv are " - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().DataNodeDataBySystemName" - ] - }, - { - "cell_type": "markdown", - "source": [ - "whereas the Data Nodes of your imported Cashflows are" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().DataNodesByImportScope[ImportScope.Primary]" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Please select here below the target Data Node for executing the tests below:" - ] - }, - { - "cell_type": "code", - "source": [ - "var dataNode = \"DT1.1\";" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## View list of Identities" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Based on the Cashflows imported, the list of all possible identities, i.e. combinations of valid Data Nodes, Aoc steps, and Novelties, is contructed and reported here below:" - ] - }, - { - "cell_type": "code", - "source": [ - "var allIdentities = Test.GetScopes(Test.GetStorage().DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities).ToArray();" - ] - }, - { - "cell_type": "code", - "source": [ - "allIdentities" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Present Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Projected Present Values (PPVs) are calculated for each Amount Type (AT) either with the *locked-in* (L) and with the *current* (C) Yield Curves. While the former is the latest available as per end of the DataNode's inception year, the latter is the latest available as per the current period. ", - "\nPPVs for both Economic Basis L and C have been defined [here](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", - "\n", - "\nAccording to the BBA methodology, the CSM calculation uses the PV with locked-in Yield Curve simply defined as", - "\n", - "\n$$", - "\n\\text{PV Locked}(\\text{AoC}, \\text{AT}) = \\text{PPV}(\\text{AoC}, \\text{AT}) \\big|_{\\substack{ \\text{Calculation Type = BE} \\\\ \\text{Economic Base = L} } }", - "\n$$" - ] - }, - { - "cell_type": "code", - "source": [ - "var pvsLocked = allIdentities.SelectMany(id => Test.GetScope(id).PresentValues", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromPvToIfrsVariable())).ToArray();" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Below a view of the computed locked-in PV " - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForObjects(pvsLocked)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.EconomicBasis)", - "\n .GroupColumnsBy(x => x.AmountType)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Aggregated values are also available as the sum over all [Amount Types](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type):", - "\n", - "\n$$", - "\n\\text{PV Locked Value}(\\text{AoC}) = \\sum_{\\text{AT}} \\text{PV Locked}(\\text{AoC}, \\text{AT})", - "\n$$" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Here below an example" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_BoP_I" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetScope( id_BoP_I ).Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Risk Adjustment" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The CSM calculation also uses locked-in Risk Adjustment (RA Locked) which is retrieved from the corresponding Present Value with [Calculation Type](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#calculation-type) being RA defined [here](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#present-value) and tested [here](SpecificationsImportCashflows#present-values). ", - "\n", - "\nRisk Adjustment values can be written as", - "\n", - "\n$$", - "\n\\text{RA Locked Value}(\\text{AoC}) = \\text{PV}(\\text{AoC})|_{\\substack{ \\text{Calculation Type = RA} \\\\ \\text{Economic Base = L} }}", - "\n$$", - "\n", - "\nwhere the imported Cashflows for the RA Calculation Type are already aggregated over all [Amount Types](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/DataModel/DataStructure#amount-type)." - ] - }, - { - "cell_type": "markdown", - "source": [ - "Here below an example" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_BoP_I" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetScope( id_BoP_I ).Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The RA Locked per Data Node imported are" - ] - }, - { - "cell_type": "code", - "source": [ - "var rasLocked = allIdentities.SelectMany(id => Test.GetScope(id).PresentValues", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromPvToIfrsVariable())).ToArray();" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForObjects(rasLocked)", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.EconomicBasis)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Technical Margin" - ] - }, - { - "cell_type": "markdown", - "source": [ - "For the computation of the CSM or LC components for each AoC step, it is convenient to introduce the notion of technical margin (TM).", - "\n", - "\nFirstly, it is useful to define the so-called Aggregated Technical Margin (ATM)", - "\n", - "\n$$", - "\n\\text{ATM} (\\text{AoC}) = \\sum_{s\\in\\text{previous AoC steps}} \\text{TM}(s) ~,", - "\n$$", - "\n", - "\nand the Interest Accretion Factor (IAF) ", - "\n", - "\n$$", - "\n\\text{IAF} = \\prod_{i=1}^{\\text{TS}} (1 + \\text{YC}_i) - 1 ~.", - "\n$$", - "\n", - "\nThe TM is defined as", - "\n", - "\n$$", - "\n\\text{TM}(\\text{AoC}) = \\left\\{", - "\n\\begin{array}{rl}", - "\n\\text{TM}(\\rm{EOP}) \\text{ of the previous period} ~ & \\text{if }s = \\text{BOP and Novelty is In-Force}. \\\\", - "\n0 ~ & \\text{if }s = \\text{CF}. \\\\", - "\n\\text{IAF} \\cdot ~ \\text{ATM}(\\text{AoC}) ~ & \\text{if }s = \\text{IA}. \\\\", - "\n\\rm{Premiums} + \\text{Attributable Expense and Commissions} + \\text{Investment Claims} ~ & \\text{if }s = \\text{EA}. \\\\", - "\n-\\text{AMF} \\cdot ~ \\text{ATM}(\\text{AoC}) ~ & \\text{if }s = \\text{AM}. \\\\", - "\n\\text{PV Locked Value}(\\text{AoC}) ", - "\n\\bigg|_{\\substack{\\text{Non Attributable} \\\\ ", - "\n \\text{Amount Types} \\\\ ", - "\n \\text{excluded}}} ", - "\n+ \\text{RA Locked Value}(\\text{AoC}) ~ & \\text{otherwise} ", - "\n\\end{array}", - "\n\\right.", - "\n$$", - "\n", - "\nwhere AMF is the Amortization Factor that is defined [here](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#amortization-factor) and tested [here](SpecificationsImportCashflows#amortization-factor), with YC being the [Yield Curve](#yield-curves) and TS is the Time-Step, ", - "\nand the Premiums, Attributable Expense and Commissions and Investment Claims terms are given by:", - "\n", - "\n$$", - "\n\\begin{array}{lcl}", - "\n\\rm{Premiums} &=& \\text{Premium Allocation Factor} \\cdot \\sum_{\\text{Amount Type}\\in\\{\\text{PR and its children}\\}}", - "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - ", - "\n \\big(\\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}} + \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~, \\\\", - "\n\\text{Attributable Expense and Commissions} &=& \\sum_{\\text{Amount Type}\\in\\{\\rm{ACA}, \\rm{AEA}\\}}", - "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - \\text{Actual}_{\\text{Novelty=C}} ~, \\\\", - "\n\\text{Investment Claims } &=& \\sum_{\\text{Amount Type}\\in\\{\\text{ICO and its children}\\}}", - "\n \\big(\\text{PV}_{\\text{Novelty = I}} + \\text{PV}_{\\text{Novelty = N}} \\big) - ", - "\n \\big( \\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}} + \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~.", - "\n\\end{array}", - "\n$$", - "\n", - "\nThe AoC Type **CF** is implicit for all formulas, PV is the [present value](#present-value) with Calculation Type **BE**, and Actuals have Estimate Types **A**, **OA** and **AA** (see details [here](https://portal.stage.systemorph.cloud/project/ifrs17ce/env/dev/Import/ImportScopeCalculation#actual-base))." - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Beginning of Period" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_BoP_I" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedTM_BoP_I = Test.GetScope(id_BoP_I);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_BoP_I.Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The TM for BOP is equal to the TM for EOP of the previous period, that is, the sum of Csm, Loss Component and LoReCo as of at the end of last period (see the corresponding [formula](#technical-margins)). ", - "\n", - "\nThe corresponding **IFRS Variables** can be loaded directly from the *Storage*" - ] - }, - { - "cell_type": "code", - "source": [ - "var valueCsm = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.C, null);", - "\nvalueCsm" - ] - }, - { - "cell_type": "code", - "source": [ - "var valueLc = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.L, null);", - "\nvalueLc" - ] - }, - { - "cell_type": "code", - "source": [ - "var valueLr = Test.GetStorage().GetValue(id_BoP_I, null, EstimateTypes.LR, null);", - "\nvalueLr" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedTM_BoP_I = -valueCsm + valueLc + valueLr;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedTM_BoP_I" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_BoP_I.Value.Should().BeApproximately( expectedTM_BoP_I, Precision );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Model Corrections" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_MC_I = Test.GetIdentity(dataNode, \"MC\", \"I\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_MC_I" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedTM_MC_I = Test.GetScope(id_MC_I);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_MC_I.Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The TM for MC is given by the default [formula](#technical-margins), i.e. it is equal to the sum of PV and RA Locked, where the former does not encompass the *NonAttributable* Amount Types" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedTM_MC_I = Test.GetScope(id_MC_I).Value + Test.GetScope( id_MC_I ).Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedTM_MC_I" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_MC_I.Value.Should().BeApproximately( expectedTM_MC_I, Precision );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Cash Flow" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_CF_I = Test.GetIdentity(dataNode, \"CF\", \"I\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_CF_I" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedTM_CF_I = Test.GetScope(id_CF_I);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_CF_I.Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#technical-margins) above, the tecnical margin is 0 for the Cash Flow AoC step " - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_CF_I.Value.Should().BeApproximately( 0, Precision );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Interest Accretion" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_IA_I = Test.GetIdentity(dataNode, \"IA\", \"I\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_IA_I" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedTM_IA_I = Test.GetScope(id_IA_I);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_IA_I.Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#technical-margins) above, for the AoC step IA, the TM is equal to sum of the TMs of its previous AoC step multiplied by the IAF. " - ] - }, - { - "cell_type": "markdown", - "source": [ - "The IAF associated to the current period (i.e. shift and time step) can be calculated from the shift, the time Step, and the Interest Rates" - ] - }, - { - "cell_type": "code", - "source": [ - "var projectionPeriod = 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "var shift = Test.GetStorage().GetShift(projectionPeriod);" - ] - }, - { - "cell_type": "code", - "source": [ - "var timeStep = Test.GetStorage().GetTimeStep(projectionPeriod);" - ] - }, - { - "cell_type": "code", - "source": [ - "(shift, timeStep)" - ] - }, - { - "cell_type": "code", - "source": [ - "var monthlyRates = Test.GetScope(id_IA_I);" - ] - }, - { - "cell_type": "code", - "source": [ - "monthlyRates" - ] - }, - { - "cell_type": "code", - "source": [ - "var IAF = Enumerable.Range(shift,timeStep).Select(i => monthlyRates.Interest.GetValidElement(i/12)).Aggregate(1.0d, (x, y) => x * y ) - 1.0d;" - ] - }, - { - "cell_type": "code", - "source": [ - "IAF" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Since the previous AoC steps are" - ] - }, - { - "cell_type": "code", - "source": [ - "var previousAocStep = Test.GetScope((id_IA_I, InputSource.Cashflow)).Values;", - "\npreviousAocStep" - ] - }, - { - "cell_type": "markdown", - "source": [ - "the expected TM for the Amortization step reads" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedTM_IA_I = IAF * previousAocStep.Sum(aoc => Test.GetScope(id_IA_I with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedTM_IA_I" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_IA_I.Value.Should().BeApproximately( expectedTM_IA_I, Precision );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Combined Liabilities" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_CL_C = Test.GetIdentity(dataNode, \"CL\", \"C\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_CL_C" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedTM_CL_C = Test.GetScope(id_CL_C);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_CL_C.Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the default TM [formula](#technical-margins), for the CL step the TM is equal to the sum of PV and RA Locked, where the former does not encompass the *NonAttributable* Amount Types" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedTM_CL_C = Test.GetScope(id_CL_C).Value + Test.GetScope( id_CL_C ).Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedTM_CL_C" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_CL_C.Value.Should().BeApproximately( expectedTM_CL_C, Precision );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Experience Adjustment" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_EA_C = Test.GetIdentity(dataNode, \"EA\", \"C\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_EA_C" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedTM_EA_C = Test.GetScope(id_EA_C);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_EA_C.Value" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#technical-margins) above, for the AoC step EA, the TM is equal to sum of the Premiums, Attributable Expense and Commissions, and Investment Claims. Here below we calculate these terms individually." - ] - }, - { - "cell_type": "markdown", - "source": [ - "The Premiums, Attributable Expense and Commissions and Investment Claims Present Values and Actuals are calculated using the CF AoC step. Therefore, as first step we define the relevant AoC step and Novelties:" - ] - }, - { - "cell_type": "code", - "source": [ - "var referenceAoCType = Test.GetScope(id_EA_C).Value.AocType;", - "\nvar referenceAoC = Test.GetStorage().GetNovelties().Select(n => new AocStep(referenceAoCType, n));" - ] - }, - { - "cell_type": "code", - "source": [ - "referenceAoC" - ] - }, - { - "cell_type": "markdown", - "source": [ - "**Premiums**" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The list of Premiums Amount Type defined in the imported dimensions and the Premium Allocation Factor can be retrieved" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetStorage().GetPremiums()" - ] - }, - { - "cell_type": "code", - "source": [ - "var premiumAllocationFactor = Test.GetStorage().GetPremiumAllocationFactor(id_EA_C);" - ] - }, - { - "cell_type": "code", - "source": [ - "premiumAllocationFactor" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Lastly, the Premiums term is" - ] - }, - { - "cell_type": "code", - "source": [ - "var premiums = premiumAllocationFactor * Test.GetStorage().GetPremiums()", - "\n .Sum(p => referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", - "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.A, (int?)null)).Value)", - "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.AA, (int?)null)).Value)", - "\n -referenceAoC.Sum(aoc => Test.GetScope((Test.GetIdentity(dataNode, aoc.AocType, aoc.Novelty), p, EstimateTypes.OA, (int?)null)).Value)", - "\n );" - ] - }, - { - "cell_type": "code", - "source": [ - "premiums" - ] - }, - { - "cell_type": "markdown", - "source": [ - "**Attributable Expense and Commissions**" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Analogously, the Attributable Expense and Commissions term can be computed" - ] - }, - { - "cell_type": "code", - "source": [ - "var attributableExpenseAndCommissions = new string[] {AmountTypes.ACA, AmountTypes.AEA}", - "\n .Sum(d => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, EstimateTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", - "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), d, EstimateTypes.A, (int?)null)).Value));" - ] - }, - { - "cell_type": "code", - "source": [ - "attributableExpenseAndCommissions" - ] - }, - { - "cell_type": "markdown", - "source": [ - "**Investment Claims**" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Finally the Investment Claims term reads" - ] - }, - { - "cell_type": "code", - "source": [ - "var investmentClaims = Test.GetStorage().GetInvestmentClaims()", - "\n .Sum(ic => referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.BE, (int?)null), o => o.WithContext(economicBasis)).Value)", - "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.A, (int?)null)).Value)", - "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.AA, (int?)null)).Value)", - "\n -referenceAoC.Sum(s => Test.GetScope((Test.GetIdentity(dataNode, s.AocType, s.Novelty), ic, EstimateTypes.OA, (int?)null)).Value)", - "\n );" - ] - }, - { - "cell_type": "code", - "source": [ - "investmentClaims" - ] - }, - { - "cell_type": "markdown", - "source": [ - "**Expected TM**" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedTM_EA_C = premiums + attributableExpenseAndCommissions + investmentClaims;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedTM_EA_C" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_EA_C.Value.Should().BeApproximately( expectedTM_EA_C, Precision );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Amortization" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_AM_C = Test.GetIdentity(dataNode, \"AM\", \"C\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_AM_C" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedTM_AM_C = Test.GetScope(id_AM_C);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_AM_C.Value" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_AM_C" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#technical-margins) above, for the AoC step AM, the TM is equal to sum of the TMs of its previous AoC step multiplied by the amortization factor with opposite sign. ", - "\n", - "\nThe AoC step previous to Amortization are" - ] - }, - { - "cell_type": "code", - "source": [ - "var previousAocStep = Test.GetScope((id_AM_C, InputSource.Cashflow)).Values;", - "\npreviousAocStep" - ] - }, - { - "cell_type": "markdown", - "source": [ - "while the Amortization Factor can be retrieved in the following" - ] - }, - { - "cell_type": "code", - "source": [ - "Test.GetScope(id_AM_C)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Therefore, the expected TM for the Amortization step reads" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedTM_AM_C = -Test.GetScope(id_AM_C).Value * ", - "\n previousAocStep.Sum(aoc => Test.GetScope(id_AM_C with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedTM_AM_C" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_AM_C.Value.Should().BeApproximately( expectedTM_AM_C, Precision );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## End of Period" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_EoP_C = Test.GetIdentity(dataNode, \"EOP\", \"C\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_EoP_C" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedTM_EoP_C = Test.GetScope(id_EoP_C);" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_EoP_C.Value" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedTM_EoP_C = Test.GetScope( id_EoP_C ).Value + Test.GetScope( id_EoP_C ).Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedTM_EoP_C" - ] - }, - { - "cell_type": "code", - "source": [ - "computedTM_EoP_C.Value.Should().BeApproximately( expectedTM_EoP_C, Precision );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Switch Logic " - ] - }, - { - "cell_type": "markdown", - "source": [ - "The CSM and LC figures are allocated for each AoC step based on the sign of the ATM. Specifically, for positive (negative) ATM, the TM of the current step is allocated to the LC (CSM), unless the TM flips the sign of the ATM. This special circumstance is named **switch**. It can happen at any AoC step with the only exception of Amortization where there is no switch from the previous step.", - "\nWhen a switch occurs the total contribution to the CSM (LC) prior the switching step is brought to 0 and the remaing amount is allocated to LC (CSM).", - "\n", - "\nIn the following the AoC chain is investigated." - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Beginning of Period", - "\n", - "\nFor the BOP, the last period is considered, which dictates that the corresponding EOP figures considered have necessarily Novelty of type *In-Force*.", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{BOP}) &=& \\text{CSM}(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force} \\\\", - "\n\\text{LC}(\\text{BOP}) &=& \\text{LC}(\\text{EOP}) \\text{ of the previous period, for Novelty In-Force}", - "\n\\end{array}", - "\n$$" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_BoP_I = Test.GetIdentity(dataNode, \"BOP\", \"I\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_BoP_I" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedCSM_BoP_I = Test.GetScope(id_BoP_I).Value;", - "\nvar computedLC_BoP_I = Test.GetScope(id_BoP_I).Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "(computedCSM_BoP_I, computedLC_BoP_I)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "To understand where the BOP is allocated, we retrieve the corresponding TM and, based on its sign, we expect the CSM or the LC to be non-zero according to the [formula](#switch-logic) above" - ] - }, - { - "cell_type": "code", - "source": [ - "var TM_BOP_I = Test.GetScope(id_BoP_I).Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "TM_BOP_I" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedCSM_BoP_I = TM_BOP_I < 0 ? -TM_BOP_I : 0;", - "\nvar expectedLC_BoP_I = TM_BOP_I > 0 ? +TM_BOP_I : 0;" - ] - }, - { - "cell_type": "code", - "source": [ - "(expectedCSM_BoP_I, expectedLC_BoP_I)" - ] - }, - { - "cell_type": "code", - "source": [ - "computedCSM_BoP_I.CheckEquality(computedCSM_BoP_I).Should().Be(true);", - "\nexpectedLC_BoP_I.CheckEquality(computedLC_BoP_I).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Following AoC steps" - ] - }, - { - "cell_type": "markdown", - "source": [ - "From the BOP up to the CL step, the switch logic is applied separately to the In-Force and New Business novelties." - ] - }, - { - "cell_type": "code", - "source": [ - "var id_MC_I = Test.GetIdentity(dataNode, \"MC\", \"I\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_MC_I" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedCSM_MC_I = Test.GetScope(id_MC_I).Value;", - "\nvar computedLC_MC_I = Test.GetScope(id_MC_I).Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "(computedCSM_MC_I, computedLC_MC_I)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formula](#switch-logic) above this AoC step is allocated either to CSM or to LC based on the sign of ATM + TM. Both these two terms can be retrieved from the **TechnicalMargin** Scope." - ] - }, - { - "cell_type": "code", - "source": [ - "var TM_MC_I = Test.GetScope(id_MC_I);" - ] - }, - { - "cell_type": "code", - "source": [ - "TM_MC_I" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The correctness of the ATM can be checked by firstly withdrawing the previous AoC steps" - ] - }, - { - "cell_type": "code", - "source": [ - "var previousAocStep = Test.GetScope((id_MC_I, InputSource.Cashflow)).Values;" - ] - }, - { - "cell_type": "code", - "source": [ - "previousAocStep" - ] - }, - { - "cell_type": "markdown", - "source": [ - "and then evaluating the sum of the corresponding TMs" - ] - }, - { - "cell_type": "code", - "source": [ - "var expectedATM = previousAocStep.Sum(aoc => Test.GetScope(id_MC_I with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedATM" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Therefore, the following condition for ATM calculated by the **TechnicalMargin** Scope needs to be fullfilled" - ] - }, - { - "cell_type": "code", - "source": [ - "TM_MC_I.AggregatedValue.Should().BeApproximately( expectedATM, Precision );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The CSM and LC can be allocated according to the [Switch Logic](#switch-logic)." - ] - }, - { - "cell_type": "code", - "source": [ - "double expectedCSM_MC_I; ", - "\ndouble expectedLC_MC_I; " - ] - }, - { - "cell_type": "code", - "source": [ - "var aggregated = TM_MC_I.Value + TM_MC_I.AggregatedValue;" - ] - }, - { - "cell_type": "markdown", - "source": [ - "If there is no switch from LC, i.e. $\\text{ATM} (\\text{AoC}) > 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\ge 0 $, then:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& 0 ~, \\\\", - "\n\\text{LC}(\\text{AoC}) &=& \\text{TM}(\\text{AoC}) ~.", - "\n\\end{array}", - "\n$$" - ] - }, - { - "cell_type": "code", - "source": [ - "if(TM_MC_I.AggregatedValue > 0 && aggregated >= 0) {", - "\n expectedCSM_MC_I = 0 ;", - "\n expectedLC_MC_I = TM_MC_I.Value ;", - "\n} " - ] - }, - { - "cell_type": "markdown", - "source": [ - "If there is no switch from CSM, i.e. $\\text{ATM} (\\text{AoC}) \\le 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\le 0 $, then:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) ~, \\\\", - "\n\\text{LC}(\\text{AoC}) &=& 0 ~.", - "\n\\end{array}", - "\n$$" - ] - }, - { - "cell_type": "code", - "source": [ - "if(TM_MC_I.AggregatedValue < 0 && aggregated <= 0) {", - "\n expectedCSM_MC_I = -TM_MC_I.Value ;", - "\n expectedLC_MC_I = 0 ;", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "If $\\text{ATM} (\\text{AoC}) > 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) \\le 0$, then there is a switch to CSM:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) -\\text{ATM} (\\text{AoC}) ~, \\\\", - "\n\\text{LC}(\\text{AoC}) &=& -\\text{ATM} (\\text{AoC}) ~.", - "\n\\end{array}", - "\n$$" - ] - }, - { - "cell_type": "code", - "source": [ - "if(TM_MC_I.AggregatedValue > 0 && aggregated <= 0) {", - "\n expectedCSM_MC_I = -aggregated;", - "\n expectedLC_MC_I = -TM_MC_I.AggregatedValue ;", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "On the other hand, if $\\text{ATM} (\\text{AoC}) \\le 0$ and $\\text{ATM} (\\text{AoC}) + \\text{TM}(\\text{AoC}) > 0$, ", - "\nthen the switch is to LC:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& \\text{ATM} (\\text{AoC}) ~, \\\\", - "\n\\text{LC}(\\text{AoC}) &=& \\text{TM}(\\text{AoC}) + \\text{ATM} (\\text{AoC}) ~.", - "\n\\end{array}", - "\n$$" - ] - }, - { - "cell_type": "code", - "source": [ - "if(TM_MC_I.AggregatedValue <= 0 && aggregated > 0) {", - "\n expectedCSM_MC_I = TM_MC_I.AggregatedValue ;", - "\n expectedLC_MC_I = aggregated ;", - "\n}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Therefore, the expected CSM and LC for this step are" - ] - }, - { - "cell_type": "code", - "source": [ - "(expectedCSM_MC_I, expectedLC_MC_I)" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedCSM_MC_I.CheckEquality(computedCSM_MC_I).Should().Be(true);", - "\nexpectedLC_MC_I.CheckEquality(computedLC_MC_I).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Combined Liabilities" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The CL Aoc Step brings both contributions to CSM and LC together as the novelities are summed.", - "\n", - "\nFor the CL step, the logic is similar to the one above, except that a switch from LC to CSM can happen **because of New Business and despite of In-Force**, in which case we have:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& -\\text{TM}(\\text{AoC}) - \\text{ATM}(\\text{Last In-Force AoC step}) - \\text{TM}(\\text{Last In-Force AoC step}) \\\\", - "\n\\text{LC}(\\text{AoC}) &=& -\\text{ATM}(\\text{Last In-Force AoC step}) - \\text{TM}(\\text{Last In-Force AoC step})", - "\n\\end{array}", - "\n$$", - "\n", - "\nIf, on the other hand, the switch from LC to CSM happens **because of In-Force and despite of New Business**, then we have:", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{AoC}) &=& - \\text{TM}(\\text{AoC}) - \\text{ATM}(\\text{Last NB AoC step}) - \\text{TM}(\\text{Last NB AoC step}) \\\\", - "\n\\text{LC}(\\text{AoC}) &=& - \\text{ATM}(\\text{Last NB AoC step}) - \\text{TM}(\\text{Last NB AoC step})", - "\n\\end{array}", - "\n$$", - "\n", - "\nFor the switch in the other direction, i.e. from CSM to LC the formulas are similar except that LC and CSM are swapped." - ] - }, - { - "cell_type": "code", - "source": [ - "var id_CL_C = Test.GetIdentity(dataNode, \"CL\", \"C\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_CL_C" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedCSM_CL_C = Test.GetScope(id_CL_C).Value;", - "\nvar computedLC_CL_C = Test.GetScope(id_CL_C).Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "(computedCSM_CL_C, computedLC_CL_C)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The CL step considers the last step of both the New Business and the In Force Novelties to decide what to allocate to CSM or LC. " - ] - }, - { - "cell_type": "code", - "source": [ - "var lastAocSteps = Test.GetScope((id_CL_C, InputSource.Cashflow)).Values.GroupBy(x => x.Novelty).Select(g => g.Last());" - ] - }, - { - "cell_type": "code", - "source": [ - "lastAocSteps" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Selecting the corresponding AocTypes:" - ] - }, - { - "cell_type": "code", - "source": [ - "var lastAocTypeNb = lastAocSteps.Single(x => x.Novelty == Novelties.N).AocType;", - "\nvar lastAocTypeI = lastAocSteps.Single(x => x.Novelty == Novelties.I).AocType;", - "\n(lastAocTypeI, lastAocTypeNb)" - ] - }, - { - "cell_type": "code", - "source": [ - "var lastTM_NewBusiness = Test.GetScope(id_CL_C with {AocType = lastAocTypeNb, Novelty = Novelties.N});" - ] - }, - { - "cell_type": "code", - "source": [ - "lastTM_NewBusiness" - ] - }, - { - "cell_type": "code", - "source": [ - "var lastTM_InForce = Test.GetScope(id_CL_C with {AocType = lastAocTypeI, Novelty = Novelties.I});" - ] - }, - { - "cell_type": "code", - "source": [ - "lastTM_InForce" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Conversely the TM and ATM for the CL step is" - ] - }, - { - "cell_type": "code", - "source": [ - "var TM_Combined = Test.GetScope(id_CL_C);" - ] - }, - { - "cell_type": "code", - "source": [ - "TM_Combined" - ] - }, - { - "cell_type": "markdown", - "source": [ - "where the ATM of CL is given by the sum of the ATMs of the New Business and In Force Novelties" - ] - }, - { - "cell_type": "code", - "source": [ - "var aggregatedNewBusiness = lastTM_NewBusiness.Value + lastTM_NewBusiness.AggregatedValue;", - "\nvar aggregatedInForce = lastTM_InForce.Value + lastTM_InForce.AggregatedValue;", - "\nvar sum = aggregatedNewBusiness + aggregatedInForce;", - "\nsum" - ] - }, - { - "cell_type": "code", - "source": [ - "( (sum - TM_Combined.AggregatedValue)/sum < 1.0e-12).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "In order to decide where the TM of the CL step is allocated, one has to check the sign of the ATM + TM for both the New Business and the In Force" - ] - }, - { - "cell_type": "code", - "source": [ - "var aggregatedCombined = TM_Combined.Value + TM_Combined.AggregatedValue;", - "\naggregatedCombined" - ] - }, - { - "cell_type": "markdown", - "source": [ - "According to the [formulas above](#combined-liabilities), for a positive (negative) aggregated CL value, the CL TM has to be allocated to LC (CSM). ", - "\n
In case the one of last Aoc step of the novelties (I, NB) has the sign of the CL ATM opposite to the CL ATM, the CL AocStep is used to introduce a balancing item to bring the ATM of the novelty with opposite sign to 0. ", - "\n
This is equivalent to execute the switch logic with a balancing item = ATM of the last AocStep having opposite sign to CL ATM. ", - "\n
Note that if CL TM is zero this results in allocating the same amount with opposite sign to CSM(note that the sign of the CSM componet is flipped) and LC." - ] - }, - { - "cell_type": "code", - "source": [ - "double expectedCSM_CL_C; ", - "\ndouble expectedLC_CL_C; " - ] - }, - { - "cell_type": "code", - "source": [ - "var balancingItem = aggregatedCombined < 0 ? aggregatedNewBusiness : aggregatedInForce;", - "\nbalancingItem" - ] - }, - { - "cell_type": "code", - "source": [ - "", - "\nif(aggregatedCombined > 0) {", - "\n expectedCSM_CL_C = balancingItem ;", - "\n expectedLC_CL_C = TM_Combined.Value + balancingItem;", - "\n} else {", - "\n expectedLC_CL_C = - balancingItem ;", - "\n expectedCSM_CL_C = TM_Combined.Value - balancingItem ;", - "\n}" - ] - }, - { - "cell_type": "code", - "source": [ - "(expectedCSM_CL_C, expectedLC_CL_C)" - ] - }, - { - "cell_type": "code", - "source": [ - "expectedCSM_CL_C.CheckEquality(computedCSM_CL_C).Should().Be(true);", - "\nexpectedLC_CL_C.CheckEquality(computedLC_CL_C).Should().Be(true);" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## End Of Period", - "\n", - "\nFor the last AoC step, the EOP is the sum of all previous steps", - "\n", - "\n$$", - "\n\\begin{array}{rcl}", - "\n\\text{CSM}(\\text{EOP}) &=& \\sum_{s~\\in~\\text{previous AoC steps}} \\text{CSM}(s) ~, \\\\", - "\n\\text{LC}(\\text{EOP}) &=& \\sum_{s~\\in~\\text{previous AoC steps}} \\text{LC}(s) ~.", - "\n\\end{array}", - "\n$$" - ] - }, - { - "cell_type": "code", - "source": [ - "var id_EoP_C = Test.GetIdentity(dataNode, \"EOP\", \"C\");" - ] - }, - { - "cell_type": "code", - "source": [ - "id_EoP_C" - ] - }, - { - "cell_type": "code", - "source": [ - "var computedCSM_EoP_C = Test.GetScope(id_EoP_C).Value;", - "\nvar computedLC_EoP_C = Test.GetScope(id_EoP_C).Value;" - ] - }, - { - "cell_type": "code", - "source": [ - "(computedCSM_EoP_C, computedLC_EoP_C)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n
", - "\nFor the reinsurance case, the switch logic is identical to the one described above, except that it uses the corresponding gross case TM to allocate the figure either to CSM or to LoReCo. The reinsurance gross TM multiplied by the weights coming from the Reinsurance Coverage Parameter (Data Node Parameters). In case a GRIC has multiple GICs, then these weighted TMs are aggregated.", - "\n
" - ] - }, - { - "cell_type": "markdown", - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

", - "\n", - "\n# Contractual Service Margin and Loss Component" - ] - }, - { - "cell_type": "markdown", - "source": [ - "Here below a view of the CSM and Loss Component results are shown. ", - "\n", - "\nNote: the Data Nodes with LiabilityType being *LIC* are excluded." - ] - }, - { - "cell_type": "code", - "source": [ - "var allIdentitiesWoLic = allIdentities.Where(id => Test.GetStorage().DataNodeDataBySystemName[id.DataNode].LiabilityType != \"LIC\").ToArray();" - ] - }, - { - "cell_type": "code", - "source": [ - "var csm = allIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromCsmToIfrsVariable())).ToArray();" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Gross case" - ] - }, - { - "cell_type": "code", - "source": [ - "var allInsuranceIdentitiesWoLic = allIdentitiesWoLic.Where(id => !id.IsReinsurance).ToArray();" - ] - }, - { - "cell_type": "code", - "source": [ - "var lc = allInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromLcToIfrsVariable())).ToArray();" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Re-Insurance case (LoReCo)" - ] - }, - { - "cell_type": "code", - "source": [ - "var allReInsuranceIdentitiesWoLic = allIdentitiesWoLic.Where(id => id.IsReinsurance).ToArray();" - ] - }, - { - "cell_type": "code", - "source": [ - "var loreco = allReInsuranceIdentitiesWoLic.SelectMany(id => Test.GetScope(id).RepeatOnce()", - "\n .Where(x => Math.Abs(x.Value) >= Precision)", - "\n .Select(x => x.FromLoReCoToIfrsVariable())).ToArray();" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Summary" - ] - }, - { - "cell_type": "code", - "source": [ - "Report.ForObjects( csm.Concat(lc).Concat(loreco) )", - "\n .WithQuerySource(Workspace)", - "\n .GroupColumnsBy(x => x.DataNode)", - "\n .GroupColumnsBy(x => x.EstimateType)", - "\n .GroupRowsBy(x => x.Novelty)", - "\n .GroupRowsBy(x => x.AocType)", - "\n .WithGridOptionsForIfrsVariable()", - "\n .ToReport()" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Test/Tests.ipynb b/full-ifrs17-template/Test/Tests.ipynb index 47f5ea85..06b5b7d7 100644 --- a/full-ifrs17-template/Test/Tests.ipynb +++ b/full-ifrs17-template/Test/Tests.ipynb @@ -59,36 +59,6 @@ "---" ] }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"SpecificationsImportCashflows\"" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"SpecificationsImportActuals\"" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"SpecificationsTechnicalMargin\"" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"SpecificationsFinancialPerformance\"" - ] - }, - { - "cell_type": "markdown", - "source": [ - "---" - ] - }, { "cell_type": "code", "source": [ diff --git a/ifrs17/Constants/Validations.ipynb b/ifrs17/Constants/Validations.ipynb index afd2e82e..3ee38f17 100644 --- a/ifrs17/Constants/Validations.ipynb +++ b/ifrs17/Constants/Validations.ipynb @@ -156,7 +156,7 @@ "source": [ "public static string Get (Warning w, params string[] s) => (w, s.Length) switch {", "\n // Import", - "\n (Warning.ActiveDataNodeWithCashflowBOPI , _) => $\"Cashflows for active DataNode has been parsed with AocType {AocTypes.BOP} and Novelty {Novelties.I} \",", + "\n (Warning.ActiveDataNodeWithCashflowBOPI , 1) => $\"Cash flow with AocType: {AocTypes.BOP} and Novelty: {Novelties.I} for Group of Contract {s[0]} is not allowed because previous period data are available.\",", "\n // Default", "\n (Warning.Generic , _) => $\"{s[0]}\",", "\n (_ , _) => $\"Warning not found.\"", diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index cd9bb7a3..636e87a9 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -149,13 +149,10 @@ "source": [ "public interface IHierarchy", "\n{", - "\n [Display(Order = 10)]", "\n public string Name { get; init; }", "\n ", - "\n [Display(Order = 20)]", "\n public string Parent { get; init; }", "\n ", - "\n [Display(Order = 30)]", "\n public string Child { get; init; }", "\n}" ] @@ -1067,13 +1064,11 @@ "\n ", "\n [NotVisible] ", "\n [Dimension(typeof(Currency))]", - "\n //[Required] // TODO: check", - "\n //[Immutable] // TODO: Not available yet", + "\n //[Immutable]", "\n public string ContractualCurrency { get; init; }", "\n ", "\n [NotVisible] ", "\n [Dimension(typeof(Currency))]", - "\n //[Required] // TODO: check", "\n //[Immutable]", "\n public string FunctionalCurrency { get; init; }", "\n ", diff --git a/ifrs17/Export/ExportConfiguration.ipynb b/ifrs17/Export/ExportConfiguration.ipynb index e3fa8ad4..6ce27a87 100644 --- a/ifrs17/Export/ExportConfiguration.ipynb +++ b/ifrs17/Export/ExportConfiguration.ipynb @@ -17,6 +17,12 @@ "nbformat": 4, "nbformat_minor": 5, "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Export Configuration

" + ] + }, { "cell_type": "code", "source": [ diff --git a/ifrs17/Images/BigPicture.PNG b/ifrs17/Images/BigPicture.PNG index 9e7bfe681aa1819381f918930245e7053bb9f9e7..d4a6699180f8c29f87014e1eafa71e6a001fa215 100644 GIT binary patch literal 42091 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 SK+msRX97EO`l-Q%oBs Math.Abs(ValueCsm) > Precision && Math.Abs(ValueLc) > Precision ", - "\n ? (double)ApplicationMessage.Log(Error.MultipleEoP)", - "\n : default;", - "\n */", + "\n ", "\n IEnumerable CalculatedIfrsVariables => GetStorage().ImportFormat switch {", "\n ImportFormats.Actual => Actual.Concat(AdvanceActual).Concat(OverdueActual).Concat(ActEAForPremium)", "\n .Concat(DeferrableActual).Concat(Csms).Concat(Loss),", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index 7aeb86d5..c8659d4f 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -35,7 +35,10 @@ { "cell_type": "markdown", "source": [ - "# Parsing Storage" + "# Parsing Storage", + "\n", + "\nThe Parsing storage collects data required for the import of a file. ", + "\nSuch storage is then passed to parsing format definitions to map the content of the file into variables." ] }, { @@ -210,7 +213,9 @@ { "cell_type": "markdown", "source": [ - "# Basics" + "# Basics", + "\n", + "\nBasic methods to delete variable and update variables to the data source are defined." ] }, { @@ -308,15 +313,16 @@ { "cell_type": "markdown", "source": [ - "The Analysis of Change configuration is parsed from the input file and complemented with defaults to allow for an easy insertion of new AOC steps. ", + "The [Analysis of Change configuration](../DataModel/DataStructure#aoc-step-configuration) is parsed from the input file and complemented with defaults to allow for an easy insertion of new Aoc steps. ", "\n", - "\nAfter having checked that the AocTypes loaded in the target DataSource are including all the compulsory ones, default configurations are generated on the basis of the AocTypes ordering. ", + "\nAfter having checked that the [AocTypes](../DataModel/DataStructure#aoc-variable-type) loaded in the target DataSource are including all the compulsory ones, default configurations are generated on the basis of the AocTypes ordering. ", "\n", - "\nThe following categories have been identified based on the *Order* of the novel AOC step:", + "\nThe following categories have been identified based on the *Order* of the novel Aoc step:", "\n", - "\n| Category | Default added with same configuration of |", - "\n| --------------------- | ----------------------------------------------------- |", - "\n| Order < RCU | MC with Novelty I |", + "\n**Category** $$\\hspace{2.8cm}$$ **Default added with same configuration of**", + "\n| | |", + "\n|-----------------------|-------------------------------------------------------|", + "\n| Order < RCU $$\\phantom{.......................}$$ | MC with Novelty I |", "\n| RCU < Order < CF | RCU with Novelty I |", "\n| IA < Order < YCU | AU with both Novelty I and N |", "\n| CRU < Order < WO | EV with Novelty I and N |", @@ -325,6 +331,18 @@ "\nThe new Aoc Configurations are created with the same order of the Aoc Types. " ] }, + { + "cell_type": "code", + "source": [ + "" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + }, { "cell_type": "code", "source": [ @@ -405,7 +423,9 @@ { "cell_type": "markdown", "source": [ - "## Parse Main Tab and return Args" + "## Parse Main Tab and return Args", + "\n", + "\nThe main table of our custom import formats contains the information which are required to identify the data partition. These information are temporarily stored in [Args](../DataModel/DataStructure#args) and used in the next methods. " ] }, { @@ -450,7 +470,9 @@ { "cell_type": "markdown", "source": [ - "## Parse and Upload: Data Nodes" + "## Parse and Upload: Data Nodes", + "\n", + "\n[Portfolios](../DataModel/DataStructure#portfolios) and [Group of Contracts](../DataModel/DataStructure#group-of-contracts) are imported in the same file. " ] }, { @@ -760,7 +782,14 @@ { "cell_type": "markdown", "source": [ - "## Parse and Upload: Variables" + "## Parse and Upload: Variables", + "\n", + "\nVariables are created upon import of Cash flow and Actual file.", + "\n
Cash flows are firstly mapped into [RawVariables](../DataModel/DataStructure#raw-variables-cashflows). These are then used as input for the [calculation](ImportScopeCalculation) of the IFRS 17 business logic which computes [IfrsVariables](../DataModel/DataStructure#ifrs-variable).", + "\n
Actuals are directly mapped into [IfrsVariables](../DataModel/DataStructure#ifrs-variable). ", + "\n", + "\nSome computed variables depend on both cash flow and actual input, requiring recalculation at each new import. ", + "\n
In order to improve performance and maximize computational efficiency, we only (re)compute the set of variables that are expected to change given the underlying business logic. " ] }, { @@ -820,7 +849,7 @@ "\n ", "\n // Filter out cashflows for DataNode that were created in the past and are still active and come with AocType = BOPI", "\n if(dataNodeData.Year < args.Year && aocType == AocTypes.BOP && novelty == Novelties.I) {", - "\n ApplicationMessage.Log(Warning.ActiveDataNodeWithCashflowBOPI);", + "\n ApplicationMessage.Log(Warning.ActiveDataNodeWithCashflowBOPI, dataNode);", "\n return null;", "\n }", "\n ", @@ -990,7 +1019,12 @@ { "cell_type": "markdown", "source": [ - "# Simple Value Import" + "# Simple Value Import", + "\n", + "\nSimple Value import is a special import that imports [IfrsVariables](../DataModel/DataStructure#ifrs-variable).", + "\n
It can be used in two very different scenarios: ", + "\n- Simple Value : to import final figures as computed by an independent tool. In this case our IFRS 17 calculation is not applied and variable are stored in the Database for being consumed in reports with our powerful reporting tooling. ", + "\n- Opening value : in the **fair value approach** this importer allows the import of in force opening values (Aoc step BOP and novelty I) for EstimateTypes C, L, LR, AA, OA, DA." ] }, { diff --git a/ifrs17/OverviewCalculationEngine.ipynb b/ifrs17/OverviewCalculationEngine.ipynb index 866c5502..651ab74b 100644 --- a/ifrs17/OverviewCalculationEngine.ipynb +++ b/ifrs17/OverviewCalculationEngine.ipynb @@ -28,11 +28,11 @@ "source": [ "# Introduction", "\n", - "\nSystemorph's IFRS 17 Calculation Engine is a tool and a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts for **groups of insurance contracts** and other relevant parameters (Yield Curve, FX rates, etc...). The output is a set of calculated results (CSM, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\nSystemorph's IFRS 17 Calculation Engine is a tool and a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts for **groups of insurance contracts** and other relevant parameters (Yield Curve, FX rates, etc...). The output is a set of calculated results (Contractual Service Margin, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", "\n", "\nThis notebook provides an **overview** of Systemorph's IFRS 17 Calculation Engine with brief introductions to all the main steps.", "\n", - "\nThere are numerous **links** to several notebooks of the Calculation Engine. These notebooks contain specifications, code and also some detailed explanations with formulas in markdown blocks. The most important ones in this respect are [DataModel/DataStructure](./DataModel/DataStructure#data-structure), [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) and [ReportScopes](./Report/ReportScopes#report-scopes)." + "\nThere are numerous **links** to several notebooks of the Calculation Engine. These notebooks contain specifications, code and also some detailed explanations with formulas in markdown blocks. The most important ones in this respect are [DataStructure](./DataModel/DataStructure#data-structure), [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) and [ReportScopes](./Report/ReportScopes#report-scopes)." ] }, { @@ -43,7 +43,7 @@ "\n", "\nIFRS 17 is a new accounting standard for insurance contracts. The previous standard IFRS 4, which is based on nominal accounting, is replaced by the economic accounting standard IFRS 17.", "\n", - "\nExplanatory **videos** on **IFRS 17** and a **demo application** can be found on Systemorph's website. Some key points are repeated here briefly.", + "\nSome key points are repeated here briefly.", "\n", "\nIFRS 17 deals with insurance contracts which are on the liability side of the balance sheet. Other accounting standards deal with other parts of the business, primarily IFRS 9 for invested assets.", "\n", @@ -74,7 +74,7 @@ "", "\n# Data Model, Data Import", "\n", - "\nThe IFRS 17 calculations are based on a well-defined **data model**. The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model.", + "\nThe IFRS 17 calculations are based on a well-defined [DataModel](./DataModel/DataStructure#data-structure). The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model.", "\n", "\nThe IFRS 17 calculations start by importing data input files, and the more complex IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." ] @@ -87,9 +87,9 @@ "\n", "\nThe data model includes the definition of reporting nodes and dimensions to be used, including identities, amount types, group of insurance contracts and many more.", "\n", - "\nThe notebook [DataModel/DataStructure](./DataModel/DataStructure#data-structure) defines the data records, dimensions and interfaces of the data model. There is a long section on the many [dimensions](./DataModel/DataStructure#dimensions) used to characterize the business and its IFRS 17 model.", + "\nThe notebook [DataStructure](./DataModel/DataStructure#data-structure) defines the data records, dimensions and interfaces of the data model. There is a long section on the many [dimensions](./DataModel/DataStructure#dimensions) used to characterize the business and its IFRS 17 model.", "\n", - "\nThe [input files](#data-input-dim-nodes) ReportingNodes and especially DimensionsAndPartitions provide an overview of data structures actually used. Some dimensions are hierarchical, so some entries have parent entries.", + "\nThe [input files](#data-input-dim-nodes) for ReportingNodes and especially Dimensions provide an overview of data structures actually used. Some dimensions are hierarchical, so some entries have parent entries.", "\n", "\nMany abbreviations and acronyms used later in the documentation and the code are the **system names**, where the corresponding display names can be found in the corresponding input files together with the attributes." ] @@ -100,13 +100,11 @@ "", "\n## Data import and related calculations", "\n", - "\nSeveral notebooks organize the data import. Methods for importing and accessing data are in the class [ImportStorage](./Import/ImportStorage#import-storage). Methods for further calculations to be done upon import are in [ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation).", + "\nSeveral notebooks organize the data import. Methods for importing and accessing data are in the [Importers](./Import/Importers) notebook. The [ImportStorage](./Import/ImportStorage#import-storage) prepare the data to perfom the calculation required. Finally, methods for the calculations are in [ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation).", "\n", - "\nHowever, the import as such is conducted by other notebooks which use the methods of ImportStorage and ImportScopeCalculation in a chain of notebook imports:", + "\nHowever, the import as such is conducted by other notebooks which use the methods of Importers, ImportStorage and ImportScopeCalculation in a chain of notebook imports:", "\n", - "\nImportStorage --> ImportScopeCalculation --> [Importers](./Import/Importers#importers) --> [InitSystemorphBaseToMemory](./Initialization/InitSystemorphBaseToMemory#init-base-to-memory) --> [InitSystemorphToMemory](./Initialization/InitSystemorphToMemory#init-base-to-memory).", - "\n", - "\nThe latter two notebooks initialize and store the imported and derived data in memory for further usage. To store the data in a physical database, [InitSystemorphToDatabase](./Initialization/InitSystemorphToDatabase#init-to-database) can be employed.", + "\nImportStorage --> ImportScopeCalculation --> Importers", "\n", "\nThe calculations of ImportScopeCalculation cover a large part of the IFRS 17 methodology and are explained in the section below." ] @@ -121,20 +119,33 @@ "\n", "\nThe main concepts and parts of ImportScopeCalculation are listed here, with links.", "\n- Structure and sequence of the **[Analysis of Change (AoC)](./Import/ImportScopeCalculation#aoc-step-structure)** steps for the given period", + "\n$$", + "\n$$", "\n- **[Discounting](./Import/ImportScopeCalculation#discounting-calculation)** projected cash flows using [yield curves](#data-input-parameters) (current or locked in)", + "\n$$", + "\n$$", "\n- **[Nominal](./Import/ImportScopeCalculation#nominal-values)** cash flow amounts per AoC step", + "\n$$", + "\n$$", "\n- **[Present Values (PV)](./Import/ImportScopeCalculation#present-values)** of cash flow amounts for all AoC steps:", "\n - [Cumulated discounted](./Import/ImportScopeCalculation#cumulated-discounted-cashflows) cash flow amounts for all AoC steps", "\n - [Telescoping difference](./Import/ImportScopeCalculation#telescopic-difference) calculation of cumulated discounted cashflows per AoC step, where the total PV change over the period is the telescoping sum of all these differences", - "\n - [Present Value calculation](./Import/ImportScopeCalculation#present-value) at the beginning and end of the period, with its underlying [PV base](./Import/ImportScopeCalculation#present-value-base) calculations for different AoC types and for [current and locked-in](./Import/ImportScopeCalculation#current-and-locked) yield curves", + "\n - [Present Value calculation](./Import/ImportScopeCalculation#present-value) at the beginning and end of the period, with its underlying [Present value base](./Import/ImportScopeCalculation#present-value-base) calculations for different AoC types and for [current and locked-in](./Import/ImportScopeCalculation#current-and-locked) yield curves", "\n - [Interest accretion](./Import/ImportScopeCalculation#interest-accretion) cash flow calculation (one of the AoC steps)", "\n- **[Risk Adjustment (RA)](./Import/ImportScopeCalculation#risk-adjustment)** calculation, a requirement of the IFRS 17 standard", + "\n$$", + "\n$$", "\n- **[Amortization](./Import/ImportScopeCalculation#amortization)**, the AoC step dealing with the reduction of the remaining exposure over the period:", "\n - [Coverage Unit (CU)](./Import/ImportScopeCalculation#coverage-units), the quantity of services provided by a given GIC, considering one period (reflecting the run-off pattern of the GIC)", "\n - [Amortization factor](./Import/ImportScopeCalculation#amortization-factor), the relative size of the amortization of a GIC, monthly and for a longer time interval", + "\n$$", + "\n$$", "\n- **[Actuals](./Import/ImportScopeCalculation#actual-values)**, treatment of actual values per GIC or GRIC, distinguished according to by their Estimate Type: Ordinary Actuals, Advance Actuals, Overdue Actuals and Deferrable Actuals", "\n - Calculation of [Actuals Base](./Import/ImportScopeCalculation#actual-base) values for a given GIC and per Estimate Type and Amount Type", "\n - Different Estimate Types of Actuals and their calculations: Ordinary [Actuals](./Import/ImportScopeCalculation#actuals), [Advance Actuals](./Import/ImportScopeCalculation#advance-actuals) paid before the due date which is inside the AoC period, [Overdue Actuals](./Import/ImportScopeCalculation#overdue-actuals) paid after the AoC period, [Deferrable Actuals](./Import/ImportScopeCalculation#overdue-actuals) whose recognition is deferred (typically used for expenses of different kinds)", + "\n", + "\n$$", + "\n$$", "\n- **[Contractual Service Margin (CSM), Loss Component LC) and Loss Recovery Component (LRC)](./Import/ImportScopeCalculation#csm)**, modeling the treatment of unearned profits (CSM) and losses (LC, LRC) as required by the IFRS 17 standard, per GIC or GRIC:", "\n - [Fulfillment Cashflow (FCF)](./Import/ImportScopeCalculation#fulfillment-cashflow), same as the aforementioned cumulated discounted cashflow, now adding the risk adjustment component as a basis for CSM and LC calculations", "\n - [Technical Margin](./Import/ImportScopeCalculation#technical-margin), which is the FCF with special rules for different AoC steps including the Amortization step, also using and calculating the Interest Accretion Factor, Premiums, Deferrals and Investment Claims", @@ -153,13 +164,7 @@ "\n", "\nSome reports of ReportScopes just present existing data from the database, namely the imported data and the results already calculated using the methods of [ImportScopes](#model-calc).", "\n", - "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#financial-performance)." - ] - }, - { - "cell_type": "code", - "source": [ - "" + "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#ifrs-17-financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#ifrs-17-financial-performance)." ] } ] diff --git a/ifrs17/README.md b/ifrs17/README.md index 9891b004..10015d5e 100644 --- a/ifrs17/README.md +++ b/ifrs17/README.md @@ -1,7 +1,8 @@ -![Systemorph_logo.png](https://portal.systemorph.cloud/api/project/ifrs17ce/env/dev/file/download?path=Images/Systemorph_logo.png) +

+Systemorph logo +

- -**IFRS17 Calculation Engine** +

IFRS 17 Calculation Engine

Systemorph's IFRS 17 Calculation Engine is a tool to conduct all the essential IFRS 17 calculations given some key figures, future cashflows and actual amounts, for groups of insurance contracts and other basic information. The result is a set of reports needed for IFRS 17 accounting and management information. @@ -9,21 +10,24 @@ Systemorph's IFRS 17 Calculation Engine is a tool to conduct all the essential I Systemorph portal allows Users to create their own projects powered by the Vertex 10 technology. -## Overview +# Overview -![BigPicture.png](https://portal.systemorph.cloud/api/project/ifrs17ce/env/dev/file/download?path=Images/BigPicture.png) +

+IFRS 17 Solution Overview +

-If you want to know more about the Calculation Engine than just its standard technical use, you are recommended to look at [OverviewCalculationEngine](OverviewCalculationEngine). +If you want to know more about the Calculation Engine than just its standard technical use, you are recommended to look at [OverviewCalculationEngine](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/OverviewCalculationEngine). You will be introduced to -- [DataModel](./DataModel/DataStructure) with links to detailed description of individual data types, dimensions and partitions employed -- [Calculation](./Import/ImportScopeCalculation) with in detail description using mathematical formulas and links to supporting material -- [Reports](./Report/ReportScopes) for data analysis and drill down to the lowest data granularity. With links to discover the calculation of the [Financial Performance](./Report/ReportScopes#ifrs-17-financial-performance) +- [DataModel](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure) with links to detailed description of individual data types, dimensions and partitions employed +- [Calculation](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Import/ImportScopeCalculation) with in detail description using mathematical formulas and links to supporting material + +# Got Questions +For support around the IFRS 17 CalculationEngine get in contact with our [Community](). -TODO link to the community page(IFRS17 landing page)- -## Got Questions +# Contributing -For support around the IFRS 17 CalculationEngine get in contact with our Community: +All work on the **Full IFRS 17 Template** happens directly on [GitHub](https://github.com/Systemorph/IFRS17CalculationEngine). -- [Community]() -link to the community page- -- [Evangelists]() -link to Evangelists page- \ No newline at end of file +This project adheres to overall [General Terms & Conditions for Systemorph Cloud]() TODO link to terms and conditions file. \ No newline at end of file diff --git a/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb index 7a5efd50..f4f56181 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -180,7 +180,7 @@ "", "\n### Best Estimate", "\n", - "\nBest Estimate of Present Value (PV) report includes contributions from the [Present Value](../Import/ImportScopeCalculation#current-and-locked) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." + "\nBest Estimate of Present Value (PV) report includes contributions from the [Present Value](../Import/ImportScopeCalculation#present-values) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." ] }, { @@ -368,7 +368,7 @@ "", "\n## LIC Actuarial (Actuarial Liability for Incurred Claims)", "\n", - "\nLiability of Incurred Claims (LIC Actuarial) report includes the contributions from [Fulfillment cashflow](#fulfillment-cashflows)." + "\nActuarial Liability of Incurred Claims (LIC Actuarial) report includes the contributions from [Fulfillment cashflow](#fulfillment-cashflows)." ] }, { @@ -413,7 +413,7 @@ "", "\n## LRC Actuarial (Actuarial Liability for Remaining Coverage)", "\n", - "\nLiability for Remaining Coverage (LRC) report includes all the contributions from [Fulfillment cashflow](#fulfillment-cashflows), [Contructual Sevice Margin](#technical-margin), [Loss Component](#technical-margin), and [Loss Recovery Component](#technical-margin)." + "\nActuarial Liability for Remaining Coverage (LRC) report includes all the contributions from [Fulfillment cashflow](#fulfillment-cashflows), [Contructual Sevice Margin](#technical-margin), [Loss Component](#technical-margin), and [Loss Recovery Component](#technical-margin)." ] }, { @@ -459,7 +459,7 @@ { "cell_type": "markdown", "source": [ - "", + "", "\n# IFRS 17 Financial Performance" ] }, diff --git a/ifrs17/Utils/Extensions.ipynb b/ifrs17/Utils/Extensions.ipynb index 0eb9c443..e006c87e 100644 --- a/ifrs17/Utils/Extensions.ipynb +++ b/ifrs17/Utils/Extensions.ipynb @@ -17,6 +17,12 @@ "nbformat": 4, "nbformat_minor": 5, "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Extention Methods Import Calculation Methods Queries Test Helper Methods Date: Mon, 7 Nov 2022 09:35:59 +0100 Subject: [PATCH 23/43] Update issue templates (#69) --- .github/ISSUE_TEMPLATE/bug_report.md | 27 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..5cf41052 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: triage +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..082ddcf5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: triage +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From a9a30ce7710f3681d6b150462dcea7f16366fef4 Mon Sep 17 00:00:00 2001 From: amuolo Date: Mon, 7 Nov 2022 11:36:33 +0100 Subject: [PATCH 24/43] Merge pull request #72 from Systemorph/NoMorePartitions Partitions are handled automatically --- ...nsionsAndPartitions.csv => Dimensions.csv} | 9 --- .../InitSystemorphBaseToMemory.ipynb | 14 +--- .../InitSystemorphToDatabase.ipynb | 12 +--- .../Test/AocStructureTest.ipynb | 25 +++++-- .../Test/ImportStorageTest.ipynb | 30 +++++--- .../Test/MapTemplateAndImportTest.ipynb | 19 +----- ifrs17/Constants/Validations.ipynb | 4 ++ ifrs17/Import/Importers.ipynb | 68 ++++++++++++------- 8 files changed, 92 insertions(+), 89 deletions(-) rename full-ifrs17-template/Files/{DimensionsAndPartitions.csv => Dimensions.csv} (96%) diff --git a/full-ifrs17-template/Files/DimensionsAndPartitions.csv b/full-ifrs17-template/Files/Dimensions.csv similarity index 96% rename from full-ifrs17-template/Files/DimensionsAndPartitions.csv rename to full-ifrs17-template/Files/Dimensions.csv index 4f648680..c6729913 100644 --- a/full-ifrs17-template/Files/DimensionsAndPartitions.csv +++ b/full-ifrs17-template/Files/Dimensions.csv @@ -220,15 +220,6 @@ BE,Best Estimate,,,,,,,,,, SystemName,DisplayName,,,,,,,,,, BBA,Building Block Approach,,,,,,,,,, ,,,,,,,,,,, -@@PartitionByReportingNode,,,,,,,,,,, -ReportingNode,Id,,,,,,,,,, -CH,00000000-0000-0000-0000-000000000001,,,,,,,,,, -,,,,,,,,,,, -@@PartitionByReportingNodeAndPeriod,,,,,,,,,,, -ReportingNode,Year,Month,Id,,,,,,,, -CH,2020,12,10000000-0000-0000-0000-000000000000,,,,,,,, -CH,2021,3,20000000-0000-0000-0000-000000000000,,,,,,,, -,,,,,,,,,,, @@ProjectionConfiguration,,,,,,,,,,, SystemName,DisplayName,Shift,TimeStep,,,,,,,, P0,End of January,0,1,,,,,,,, diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index 46ba277c..dfe320cb 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb @@ -73,7 +73,7 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "await Import.FromFile(\"../Files/Dimensions.csv\")", "\n .WithType()", "\n .WithType()", "\n .WithType()", @@ -100,7 +100,7 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\").WithFormat(ImportFormats.AocConfiguration).WithTarget(DataSource).ExecuteAsync()" + "await Import.FromFile(\"../Files/Dimensions.csv\").WithFormat(ImportFormats.AocConfiguration).WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -109,16 +109,6 @@ "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" ] }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", - "\n .WithType()", - "\n .WithType()", - "\n .WithTarget(DataSource)", - "\n .ExecuteAsync()" - ] - }, { "cell_type": "markdown", "source": [ diff --git a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb index 104f646d..04d2caa5 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb @@ -56,7 +56,7 @@ { "cell_type": "code", "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", + "await Import.FromFile(\"../Files/Dimensions.csv\")", "\n .WithType()", "\n .WithType()", "\n .WithType()", @@ -87,16 +87,6 @@ "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" ] }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\")", - "\n .WithType()", - "\n .WithType()", - "\n .WithTarget(DataSource)", - "\n .ExecuteAsync()" - ] - }, { "cell_type": "markdown", "source": [ diff --git a/full-ifrs17-template/Test/AocStructureTest.ipynb b/full-ifrs17-template/Test/AocStructureTest.ipynb index f279ad6f..7a350bb4 100644 --- a/full-ifrs17-template/Test/AocStructureTest.ipynb +++ b/full-ifrs17-template/Test/AocStructureTest.ipynb @@ -38,7 +38,9 @@ { "cell_type": "code", "source": [ - "Workspace.InitializeFrom(DataSource);" + "Workspace.Initialize(x => x.FromSource(DataSource)", + "\n .DisableInitialization()", + "\n .DisableInitialization());" ] }, { @@ -50,10 +52,22 @@ { "cell_type": "code", "source": [ - "var args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Cashflow);", - "\nvar partition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", - "\n x.Month == args.Month && x.Scenario == args.Scenario);", - "\nif(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + "var reportingNode = \"CH\";", + "\nvar scenario = (string)null;" + ] + }, + { + "cell_type": "code", + "source": [ + "//Define partition", + "\nvar args = new ImportArgs(reportingNode, 2021, 3, Periodicity.Quarterly, scenario, ImportFormats.Actual);", + "\nvar partition = new PartitionByReportingNodeAndPeriod { Id = (Guid)(await DataSource.Partition.GetKeyForInstanceAsync(args)),", + "\n ReportingNode = reportingNode, ", + "\n Scenario = scenario, ", + "\n Year = args.Year,", + "\n Month = args.Month };", + "\nawait DataSource.UpdateAsync(new[]{partition});", + "\nawait DataSource.CommitAsync();" ] }, { @@ -296,7 +310,6 @@ "\n new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"), new AocStep(\"CL\",\"C\"),", "\n }},", "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", - "\n ", "\n };" ] }, diff --git a/full-ifrs17-template/Test/ImportStorageTest.ipynb b/full-ifrs17-template/Test/ImportStorageTest.ipynb index effe2de0..bb0d0a2e 100644 --- a/full-ifrs17-template/Test/ImportStorageTest.ipynb +++ b/full-ifrs17-template/Test/ImportStorageTest.ipynb @@ -39,8 +39,8 @@ "cell_type": "code", "source": [ "Workspace.Initialize(x => x.FromSource(DataSource)", - "\n .DisableInitialization()", - "\n .DisableInitialization());" + "\n .DisableInitialization()", + "\n .DisableInitialization());" ] }, { @@ -53,21 +53,29 @@ "cell_type": "code", "source": [ "var gic = \"DT1.1\";", - "\nvar gric = \"DTR1.1\";" + "\nvar gric = \"DTR1.1\";", + "\nvar reportingNode = \"CH\";", + "\nvar scenario = (string)null;" ] }, { "cell_type": "code", "source": [ "//Define partition", - "\nvar args = new ImportArgs(\"CH\", 2021, 3, Periodicity.Quarterly, null, ImportFormats.Actual);", - "\nvar partition = DataSource.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", - "\n x.Month == args.Month && x.Scenario == args.Scenario);", - "\nif(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);", - "\n", - "\nvar previousPeriodPartition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year - 1 && ", - "\n x.Month == MonthInAYear && x.Scenario == args.Scenario);", - "\nif(previousPeriodPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);" + "\nvar args = new ImportArgs(reportingNode, 2021, 3, Periodicity.Quarterly, scenario, ImportFormats.Actual);", + "\nvar previousArgs = new ImportArgs(reportingNode, 2020, 12, Periodicity.Quarterly, scenario, ImportFormats.Actual);", + "\nvar partition = new PartitionByReportingNodeAndPeriod { Id = (Guid)(await DataSource.Partition.GetKeyForInstanceAsync(args)),", + "\n ReportingNode = reportingNode, ", + "\n Scenario = scenario, ", + "\n Year = args.Year,", + "\n Month = args.Month };", + "\nvar previousPeriodPartition = new PartitionByReportingNodeAndPeriod { Id = (Guid)(await DataSource.Partition.GetKeyForInstanceAsync(previousArgs)),", + "\n ReportingNode = reportingNode, ", + "\n Scenario = scenario, ", + "\n Year = args.Year,", + "\n Month = args.Month };", + "\nawait DataSource.UpdateAsync(new[]{partition, previousPeriodPartition});", + "\nawait DataSource.CommitAsync();" ] }, { diff --git a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb index 69f8137a..92b8091b 100644 --- a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb +++ b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb @@ -166,11 +166,7 @@ "\ngricCols.Intersect(tables.Tables[nameof(GroupOfReinsuranceContract)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(gricCols.Length); ", "\n", "\n// check that imported data matches the exported data", - "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", - "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", - "\nawait storage.InitializeAsync();", - "\n", - "\nawait UploadDataNodesToWorkspaceAsync(filename+\".xlsx\");", + "\nawait Import.FromFile(filename+\".xlsx\").WithFormat(ImportFormats.DataNode).WithTarget(Workspace).ExecuteAsync();", "\nUtils.EqualityComparer(ips, Workspace.Query().ToArray());", "\nUtils.EqualityComparer(rps, Workspace.Query().ToArray());", "\nUtils.EqualityComparer(gics, Workspace.Query().ToArray());", @@ -245,12 +241,7 @@ "\ndataNodeStateCols.Intersect(tables.Tables[\"DataNodeState\"].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(dataNodeStateCols.Length);", "\n", "\n// check that imported data matches the exported data ", - "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", - "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", - "\nawait storage.InitializeAsync();", - "\n", - "\nawait UploadDataNodeStateToWorkspaceAsync(filename+\".xlsx\");", - "\n", + "\nawait Import.FromFile(filename+\".xlsx\").WithFormat(ImportFormats.DataNodeState).WithTarget(Workspace).ExecuteAsync();", "\n// Workspace is empty because ValidateDataNodeStatesAsync removes the entry, since this is already present in the DataSource.", "\nWorkspace.Query().ToArray().Should().BeEmpty();", "\n*/" @@ -330,11 +321,7 @@ "\nsingleDataNodeParamCols.Intersect(tables.Tables[nameof(SingleDataNodeParameter)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(singleDataNodeParamCols.Length);", "\ninterDataNodeParamCols.Intersect(tables.Tables[nameof(InterDataNodeParameter)].Columns.Select(x => x.ColumnName).ToArray()).Count().Should().Be(interDataNodeParamCols.Length);", "\n// check that imported data matches the exported data ", - "\nvar args = await GetArgsFromMainAsync(filename+\".xlsx\");", - "\nvar storage = new ParsingStorage(args, DataSource, Workspace);", - "\nvar targetPartitionByReportingNodeId = new Guid();", - "\nawait storage.InitializeAsync();", - "\nawait UploadDataNodeParameterToWorkspaceAsync(filename+\".xlsx\", targetPartitionByReportingNodeId);", + "\nawait Import.FromFile(filename+\".xlsx\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(Workspace).ExecuteAsync();", "\nvar expectedSingleDataNodeParamBm = Workspace.Query().Where(x => x.Year == partition.Year && x.Month == partition.Month).ToArray();", "\nvar expectedInterDataNodeParamBm = Workspace.Query().ToArray();", "\nUtils.EqualityComparer(singleDataNodeParamBm, expectedSingleDataNodeParamBm);", diff --git a/ifrs17/Constants/Validations.ipynb b/ifrs17/Constants/Validations.ipynb index 3ee38f17..18c2edbe 100644 --- a/ifrs17/Constants/Validations.ipynb +++ b/ifrs17/Constants/Validations.ipynb @@ -54,6 +54,7 @@ "public enum Error { ", "\n // Import", "\n NoMainTab, IncompleteMainTab, ParsingScientificNotation, ValueTypeNotFound, ValueTypeNotValid, ", + "\n ReportingNodeInMainNotFound, YearInMainNotFound, MonthInMainNotFound,", "\n AocTypeNotValid, AocTypeCompulsoryNotFound, AocTypePositionNotSupported, AocConfigurationOrderNotUnique,", "\n // Partition", "\n PartitionNotFound, ParsedPartitionNotFound, PartititionNameNotFound, PartitionTypeNotFound,", @@ -95,6 +96,9 @@ "\n (Error.ParsingScientificNotation , 1) => $\"While parsing found real number in scientific notation: {s[0]}.\",", "\n (Error.ValueTypeNotFound , _) => $\"Value Type not found.\",", "\n (Error.ValueTypeNotValid , 1) => $\"The Value Type {s[0]} is invalid.\",", + "\n (Error.ReportingNodeInMainNotFound , _) => $\"Reporting Node missing from the Main tab.\",", + "\n (Error.YearInMainNotFound , _) => $\"Year missing from the Main tab.\",", + "\n (Error.MonthInMainNotFound , _) => $\"Month missing from the Main tab.\",", "\n (Error.AocTypeNotValid , 1) => $\"The parsed AocType {s[0]} is invalid.\",", "\n (Error.AocTypeCompulsoryNotFound , _) => $\"Not all compulsory AocTypes have been imported.\",", "\n (Error.AocTypePositionNotSupported , 1) => $\"The position of the AocType {s[0]} is not supported.\",", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index c8659d4f..d8c0a918 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -434,36 +434,56 @@ "public async Task GetArgsFromMainAsync(IDataSet dataSet)", "\n{", "\n var mainTab = dataSet.Tables[Main];", - "\n ", "\n if(mainTab == null) ApplicationMessage.Log(Error.NoMainTab);", "\n if(mainTab.Rows.Count() == 0) ApplicationMessage.Log(Error.IncompleteMainTab);", + "\n if(mainTab.Columns.FirstOrDefault(x => x.ColumnName == nameof(ReportingNode)) == null) ApplicationMessage.Log(Error.ReportingNodeInMainNotFound);", "\n if(ApplicationMessage.HasErrors()) return null;", "\n ", "\n var main = mainTab.Rows.First();", - "\n var scenario = mainTab.Columns.Where(x => x.ColumnName == nameof(PartitionByReportingNode.Scenario)).Count() > 0? ", - "\n (string)main[nameof(PartitionByReportingNode.Scenario)] : default(string);", - "\n ", - "\n var partitionName = typeof(IPartition).Name switch ", - "\n {", - "\n nameof(PartitionByReportingNode) => new ImportArgs( (string)main[nameof(PartitionByReportingNode.ReportingNode)],", - "\n default(int),", - "\n default(int),", - "\n default(Periodicity),", - "\n scenario,", - "\n default(string)),", - "\n ", - "\n nameof(PartitionByReportingNodeAndPeriod) => new ImportArgs( (string)main[nameof(PartitionByReportingNodeAndPeriod.ReportingNode)], ", - "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Year)], typeof(int)),", - "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Month)], typeof(int)),", - "\n default(Periodicity),", - "\n scenario,", - "\n default(string)),", - "\n ", - "\n _ => null", - "\n };", + "\n var reportingNode = (string)main[nameof(ReportingNode)];", + "\n var scenario = mainTab.Columns.Where(x => x.ColumnName == nameof(Scenario)).Count()>0? (string)main[nameof(Scenario)] : default(string);", + "\n", + "\n ImportArgs args;", + "\n switch(typeof(IPartition).Name) {", + "\n case nameof(PartitionByReportingNode) : {", + "\n args = new ImportArgs( reportingNode,", + "\n default(int),", + "\n default(int),", + "\n default(Periodicity),", + "\n scenario,", + "\n default(string));", + "\n await DataSource.UpdateAsync( new[] { new PartitionByReportingNode { ", + "\n Id = (Guid)(await DataSource.Partition.GetKeyForInstanceAsync(args)),", + "\n ReportingNode = reportingNode, ", + "\n Scenario = scenario } } );", + "\n break;", + "\n }", + "\n case nameof(PartitionByReportingNodeAndPeriod) : {", + "\n if(mainTab.Columns.Where(x => x.ColumnName == nameof(PartitionByReportingNodeAndPeriod.Year)).Count()!=1) ApplicationMessage.Log(Error.YearInMainNotFound);", + "\n if(mainTab.Columns.Where(x => x.ColumnName == nameof(PartitionByReportingNodeAndPeriod.Month)).Count()!=1) ApplicationMessage.Log(Error.MonthInMainNotFound);", + "\n if(ApplicationMessage.HasErrors()) return null;", + "\n args = new ImportArgs( reportingNode, ", + "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Year)], typeof(int)),", + "\n (int)Convert.ChangeType(main[nameof(PartitionByReportingNodeAndPeriod.Month)], typeof(int)),", + "\n default(Periodicity),", + "\n scenario,", + "\n default(string) );", + "\n await DataSource.UpdateAsync( new[]{ new PartitionByReportingNodeAndPeriod { ", + "\n Id = (Guid)(await DataSource.Partition.GetKeyForInstanceAsync(args)),", + "\n Year = args.Year,", + "\n Month = args.Month,", + "\n ReportingNode = reportingNode, ", + "\n Scenario = scenario } } );", + "\n break;", + "\n }", + "\n default : {", + "\n ApplicationMessage.Log(Error.PartitionTypeNotFound, typeof(IPartition).Name); ", + "\n return null;", + "\n }", + "\n }", "\n ", - "\n if (partitionName == null) ApplicationMessage.Log(Error.PartitionTypeNotFound, typeof(IPartition).Name); ", - "\n return partitionName;", + "\n await DataSource.CommitAsync();", + "\n return args;", "\n}" ] }, From a96e79e3b1a91d8ecb32f608fb2f5edd377b54c0 Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Wed, 9 Nov 2022 14:46:00 +0100 Subject: [PATCH 25/43] Doc cleanup2 (#76) * forbiddenSlices and chose init or db connection * clean ups * small letters to capital * complete sentence about filters --- full-ifrs17-template/Export/MapTemplate.ipynb | 11 +++++----- .../Import/CloseImportTemplate.ipynb | 18 ++++++++++++++- full-ifrs17-template/README.md | 8 +++++-- full-ifrs17-template/Report/Reports.ipynb | 22 ++++++++++++------- ifrs17/DataModel/DataStructure.ipynb | 1 - ifrs17/Import/Importers.ipynb | 12 ---------- ifrs17/Report/ReportMutableScopes.ipynb | 15 +++++++++++-- ifrs17/Report/ReportScopes.ipynb | 2 +- 8 files changed, 57 insertions(+), 32 deletions(-) diff --git a/full-ifrs17-template/Export/MapTemplate.ipynb b/full-ifrs17-template/Export/MapTemplate.ipynb index 0b4a1094..f9062ea3 100644 --- a/full-ifrs17-template/Export/MapTemplate.ipynb +++ b/full-ifrs17-template/Export/MapTemplate.ipynb @@ -48,16 +48,17 @@ { "cell_type": "markdown", "source": [ - "Choose to run the Map Template either with the set of Systemorph data in memory or with the data present in the Database. Uncomment the desired option." + "Choose to run the Map Template either with the set of Systemorph data in memory or with the data present in the Database: ", + "\n- #!eval-notebook \"../Database/Configure\" : connects to a physical Database", + "\n- #!eval-notebook \"../Import/CloseImportTemplate\" : uses the in-memory set up", + "\n", + "\nWe use here the in-memory set up." ] }, { "cell_type": "code", "source": [ - "/* The DataSource is configured and connected to real database */", - "\n//#!eval-notebook \"../Database/Configure\"", - "\n/* The Systemorph set of dimensions + mockdata (+ those added in the CloseImportTemplate) are dispatched to the unconfigured in-memory DataSource */", - "\n#!eval-notebook \"../Import/CloseImportTemplate\"" + "#!eval-notebook \"../Import/CloseImportTemplate\"" ] }, { diff --git a/full-ifrs17-template/Import/CloseImportTemplate.ipynb b/full-ifrs17-template/Import/CloseImportTemplate.ipynb index eae574bf..7bb5d82e 100644 --- a/full-ifrs17-template/Import/CloseImportTemplate.ipynb +++ b/full-ifrs17-template/Import/CloseImportTemplate.ipynb @@ -18,7 +18,13 @@ { "cell_type": "markdown", "source": [ - "

Close Imports Template

" + "*Note: before configuring your data please refer to [Map Template](../Export/MapTemplate) Notebook.*" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

Close Import Template

" ] }, { @@ -40,6 +46,16 @@ "\nThe data source is initialized and the whole IFRS 17 Calculation Engine code is compiled. " ] }, + { + "cell_type": "markdown", + "source": [ + "Choose to run the Close Import Template notebook either on top of the set of Systemorph data in memory or on top to the data present in the Database: ", + "\n- #!eval-notebook \"../Database/Configure\" : connects to a physical Database", + "\n- #!eval-notebook \"../Initialization/InitSystemorphToMemory\" : uses the in-memory set up", + "\n", + "\nWe use here the in-memory set up." + ] + }, { "cell_type": "code", "source": [ diff --git a/full-ifrs17-template/README.md b/full-ifrs17-template/README.md index 3a4c25fc..d1d48400 100644 --- a/full-ifrs17-template/README.md +++ b/full-ifrs17-template/README.md @@ -21,11 +21,15 @@ For more information on our IFRS 17 initiative check out our [IFRS 17 page](*lan For an overview of the **Full IFRS 17 Template** project refer to the [OverviewIFRS17Template](https://portal.systemorph.cloud/project/full-ifrs-17-template/env/v1.0.0/OverviewIFRS17Template) -# Report +# Report Check out the IFRS 17 reports computed for our mock use-cases [here](https://portal.systemorph.cloud/project/full-ifrs-17-template/env/v1.0.0/Report/Reports). -Check out the our mock data set by exporting excel MapTemplates [here](https://portal.systemorph.cloud/project/full-ifrs-17-template/env/v1.0.0/Export/MapTemplate). +# Export - Import + +Check out our mock data set by exporting excel MapTemplates [here](https://portal.systemorph.cloud/project/full-ifrs-17-template/env/v1.0.0/Export/MapTemplate). + +Import your custom files using our [CloseImportTemplate](https://portal.systemorph.cloud/project/full-ifrs-17-template/env/v1.0.0/Import/CloseImportTemplate) Notebook. # Got Questions diff --git a/full-ifrs17-template/Report/Reports.ipynb b/full-ifrs17-template/Report/Reports.ipynb index 5d9ef4db..b31f2e68 100644 --- a/full-ifrs17-template/Report/Reports.ipynb +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -27,10 +27,10 @@ { "cell_type": "markdown", "source": [ - "For demonstration purposes we import here data for 7 *Group of Insurance Contract* (GIC) and 4 *Group of Reinsurance Contract* (GRIC) - the import is triggered in the [Set up data and configuration](#set-up-data-and-configuration).", - "\n
The imported data set consists of cashflows, actuals, and parameters for two consecutive periods (Year 2020-Quarter 4 and Year 2021-Quarter 1)", - "\n
Input files can be found in the **File** directory. You are invited to change them or upload your own or to add new data in the [CloseImportTemplate](../Import/CloseImportTemplate) notebook. ", - "\n
For simplicity, we import the same transactional data for all GICs and GRICs. Each *Group of Contracts* produces different figures due to differences in parameters such as *Liability Type*, *Oci type* or *Premium allocation factor* to Contractual Service Margin.", + "For demonstration purposes we import here data for some *Group of Insurance Contract* (GIC) and *Group of Reinsurance Contract* (GRIC) - the import is triggered in the [Set up data and configuration](#set-up-data-and-configuration).", + "\n
The imported data set consists of cashflows, actuals, and parameters.", + "\n
Input files can be found in the **File** directory. You are invited to change them or upload your own or add new data in the [CloseImportTemplate](../Import/CloseImportTemplate) notebook. ", + "\n
For simplicity, we import similar transactional data for all GICs and GRICs. Each *Group of Contracts* produces different figures due to differences in parameters such as *Liability Type*, *Oci type* or *Premium allocation factor* to Contractual Service Margin.", "\n", "\nFollow the instructions below for a guided interaction with the reports." ] @@ -38,7 +38,13 @@ { "cell_type": "markdown", "source": [ - "# Set up data and configuration" + "# Set up data and configuration", + "\n", + "\nChoose to run the Reports notebook either with the set of Systemorph data in memory or with the data present in the Database: ", + "\n- #!eval-notebook \"../Database/Configure\" : connects to a physical Database", + "\n- #!eval-notebook \"../Import/CloseImportTemplate\" : uses the in-memory set up", + "\n", + "\nWe use here the in-memory set up." ] }, { @@ -108,7 +114,7 @@ "\n[Written Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#written-accrual-deferral) are shown here. ", "\n", "\nIn this case, the analysis of change view is replaced with a default slice by the **AmountTypes**. Only the amount type with non zero value are displayed. ", - "\nFilters can be applied to report to isolate a sub-set of the data, by selecting the dimension to filter and the system value desired. For example, to investigate the contribution of a single Group of Contract the following filter can be applied: new [] {(\"GroupOfContract\", \"DT1.1\")}." + "\n
Filters can be applied to reports in order to isolate a sub-set of the data. They are specified by the name of the dimension to filter and the system name of the desired value. For example, to investigate the contribution of a single Group of Contract the following filter can be applied: new [] {(\"GroupOfContract\", \"DT1.1\")}." ] }, { @@ -260,7 +266,7 @@ "var actuarialLrcReport = ifrs17Report.ActuarialLrc;", "\nactuarialLrcReport.ReportingNode = \"CH\";", "\nactuarialLrcReport.ReportingPeriod = (2021, 3);", - "\nactuarialLrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\nactuarialLrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", "\nactuarialLrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await actuarialLrcReport.ToReportAsync) with {Height = 750}" ] @@ -279,7 +285,7 @@ "var lrcReport = ifrs17Report.Lrc;", "\nlrcReport.ReportingNode = \"CH\";", "\nlrcReport.ReportingPeriod = (2021, 3);", - "\nlrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\nlrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\",", "\nlrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await lrcReport.ToReportAsync) with {Height = 250}" ] diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index 636e87a9..36026b3c 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -1627,7 +1627,6 @@ "\n [NotVisible]", "\n [Dimension(typeof(EconomicBasis))]", "\n [IdentityProperty]", - "\n [AggregateBy]", "\n public string EconomicBasis { get; init; }", "\n ", "\n public double Value { get; init; }", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index d8c0a918..66c34b78 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -331,18 +331,6 @@ "\nThe new Aoc Configurations are created with the same order of the Aoc Types. " ] }, - { - "cell_type": "code", - "source": [ - "" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - }, { "cell_type": "code", "source": [ diff --git a/ifrs17/Report/ReportMutableScopes.ipynb b/ifrs17/Report/ReportMutableScopes.ipynb index 68b45530..b34cea87 100644 --- a/ifrs17/Report/ReportMutableScopes.ipynb +++ b/ifrs17/Report/ReportMutableScopes.ipynb @@ -96,13 +96,15 @@ "\n ((int Year, int Month) ReportingPeriod, string ReportingNode, string Scenario, CurrencyType) ShowSettings => (ReportingPeriod, ReportingNode, Scenario, CurrencyType);", "\n ", "\n // Slice and Dice", + "\n protected string[] forbiddenSlices => new string[] { };", + "\n", "\n IEnumerable RowSlices { get; set; }", "\n protected string[] defaultRowSlices => new string[] { };", - "\n protected string[] rowSlices => RowSlices is null ? defaultRowSlices : defaultRowSlices.Concat(RowSlices).ToArray();", + "\n protected string[] rowSlices => RowSlices is null ? defaultRowSlices : defaultRowSlices.Concat(RowSlices).Where(x => !forbiddenSlices.Contains(x)).ToArray();", "\n", "\n IEnumerable ColumnSlices { get; set; }", "\n protected string[] defaultColumnSlices => new string[] { };", - "\n protected string[] columnSlices => ColumnSlices is null ? defaultColumnSlices : defaultColumnSlices.Where(cs => !ColumnSlices.Contains(cs)).Concat(ColumnSlices).ToArray(); //I can't put a slice before defaultSlices !!!", + "\n protected string[] columnSlices => ColumnSlices is null ? defaultColumnSlices : defaultColumnSlices.Where(cs => !ColumnSlices.Contains(cs)).Concat(ColumnSlices).Where(x => !forbiddenSlices.Contains(x)).ToArray();", "\n protected HashSet<(ReportIdentity, CurrencyType)> GetIdentities() => GetStorage().GetIdentities(ReportingPeriod, ReportingNode, Scenario, CurrencyType);", "\n ", "\n // Filter", @@ -144,6 +146,7 @@ "\n}", "\n", "\npublic interface RaReport : IIfrs17Report {", + "\n string[] IIfrs17Report.forbiddenSlices => new string[] {\"AmountType\"};", "\n string[] IIfrs17Report.defaultRowSlices => new string[] { \"Novelty\", \"VariableType\" };", "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"LiabilityType\", \"EconomicBasis\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", @@ -154,6 +157,7 @@ "\n}", "\n", "\npublic interface WrittenReport : IIfrs17Report {", + "\n string[] IIfrs17Report.forbiddenSlices => new string[] {nameof(EconomicBasis)};", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"AmountType\"};", "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"LiabilityType\"};", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", @@ -195,6 +199,7 @@ "\n : GetScopes(GetIdentities()).Aggregate().ActuarialExperienceAdjustment.Filter(dataFilter);", "\n}", "\npublic interface TmReport : IIfrs17Report {", + "\n string[] IIfrs17Report.forbiddenSlices => new string[] {\"AmountType\", nameof(EconomicBasis)};", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\", \"VariableType\"};", "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", @@ -202,6 +207,7 @@ "\n : GetScopes(GetIdentities()).Aggregate().LrcTechnicalMargin.Filter(dataFilter);", "\n}", "\npublic interface CsmReport : IIfrs17Report {", + "\n string[] IIfrs17Report.forbiddenSlices => new string[] {\"AmountType\", nameof(EconomicBasis)};", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\", \"VariableType\"};", "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", @@ -213,6 +219,7 @@ "\n GetScopes(GetIdentities()).Aggregate().Loreco.Filter(dataFilter);", "\n}", "\npublic interface ActLrcReport : IIfrs17Report {", + "\n string[] IIfrs17Report.forbiddenSlices => new string[] {\"AmountType\"};", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\",\"VariableType\"};", "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", @@ -220,6 +227,7 @@ "\n : GetScopes(GetIdentities()).Aggregate().LrcActuarial.Filter(dataFilter);", "\n}", "\npublic interface LrcReport : IIfrs17Report {", + "\n string[] IIfrs17Report.forbiddenSlices => new string[] {\"AmountType\"};", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", @@ -227,6 +235,7 @@ "\n : GetScopes(GetIdentities()).Aggregate().Lrc.Filter(dataFilter);", "\n}", "\npublic interface ActLicReport : IIfrs17Report {", + "\n string[] IIfrs17Report.forbiddenSlices => new string[] {\"AmountType\"};", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"Novelty\",\"VariableType\"};", "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", @@ -234,6 +243,7 @@ "\n : GetScopes(GetIdentities()).Aggregate().LicActuarial.Filter(dataFilter);", "\n}", "\npublic interface LicReport : IIfrs17Report {", + "\n string[] IIfrs17Report.forbiddenSlices => new string[] {\"AmountType\"};", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\"};", "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\", \"EstimateType\" };", "\n IDataCube IIfrs17Report.GetDataCube() => DataFilter == null ", @@ -241,6 +251,7 @@ "\n : GetScopes(GetIdentities()).Aggregate().Lic.Filter(dataFilter);", "\n}", "\npublic interface FpReport : IIfrs17Report {", + "\n string[] IIfrs17Report.forbiddenSlices => new string[] {\"AmountType\", nameof(EconomicBasis)};", "\n string[] IIfrs17Report.defaultRowSlices => new string[] {\"VariableType\", \"EstimateType\"};", "\n string[] IIfrs17Report.defaultColumnSlices => new string[] { \"Currency\",\"LiabilityType\" };", "\n int IIfrs17Report.headerColumnWidthValue => 500;", diff --git a/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb index f4f56181..b8a73b15 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -385,7 +385,7 @@ "", "\n## LIC (Liability for Incurred Claims)", "\n", - "\nLiability of Incurred Claims (LIC) report includes the contributions from [Lic Actuarial](#lic-actuarial) (Fullfilment Cashflow), [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." + "\nLiability of Incurred Claims (LIC) report includes the contributions from [LIC Actuarial](#lic-actuarial) (Fullfilment Cashflow), [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." ] }, { From 5ec6d03fb6e2e6eba0190ebc6ad99eaf8559d75f Mon Sep 17 00:00:00 2001 From: amuolo Date: Wed, 9 Nov 2022 22:21:48 +0100 Subject: [PATCH 26/43] Merge pull request #45 from Systemorph/Multiple_Scenario_Implementation Multiple scenario implementation --- full-ifrs17-template/Files/Dimensions.csv | 17 +- .../Actuals_CH_2020_12_MTUP10pct.csv | 12 ++ .../NominalCashflows_CH_2020_12_MTUP10pct.csv | 13 ++ .../Import/CloseImportTemplate.ipynb | 4 +- .../InitSystemorphToMemory.ipynb | 12 ++ .../BM_CH_2020_12_MTUP10pct_A.csv | 14 ++ .../BM_CH_2020_12_MTUP10pct_BE.csv | 69 +++++++ .../BM_CH_2020_12_MTUP10pct_BEPA.csv | 6 + .../BM_CH_2020_12_MTUP10pct_C.csv | 22 ++ .../BM_CH_2020_12_MTUP10pct_F.csv | 9 + .../BM_CH_2020_12_MTUP10pct_L.csv | 14 ++ .../BM_CH_2020_12_MTUP10pct_RA.csv | 37 ++++ .../Test/ExportIfrsVariable.ipynb | 42 ++-- .../Test/IfrsVariablesTest.ipynb | 27 ++- full-ifrs17-template/Test/ScenarioTest.ipynb | 195 ++++++++++++++++++ .../Test/SequenceImportTest.ipynb | 121 +++++++++++ full-ifrs17-template/Test/Tests.ipynb | 12 ++ ifrs17/CalculationEngine.ipynb | 3 +- ifrs17/Constants/Consts.ipynb | 47 +++-- ifrs17/Constants/Validations.ipynb | 4 +- ifrs17/DataModel/DataStructure.ipynb | 66 +++++- ifrs17/Import/ImportStorage.ipynb | 40 +++- ifrs17/Import/Importers.ipynb | 2 +- .../Report/ReportConfigurationAndUtils.ipynb | 26 ++- ifrs17/Report/ReportStorage.ipynb | 4 +- ifrs17/Test/QueriesTest.ipynb | 130 ++++++++---- ifrs17/Utils/ApplicationMessage.ipynb | 11 +- ifrs17/Utils/EqualityComparers.ipynb | 139 +++++++++++++ ifrs17/Utils/Queries.ipynb | 36 ++-- 29 files changed, 998 insertions(+), 136 deletions(-) create mode 100644 full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv create mode 100644 full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_A.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BEPA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.csv create mode 100644 full-ifrs17-template/Test/ScenarioTest.ipynb create mode 100644 full-ifrs17-template/Test/SequenceImportTest.ipynb create mode 100644 ifrs17/Utils/EqualityComparers.ipynb diff --git a/full-ifrs17-template/Files/Dimensions.csv b/full-ifrs17-template/Files/Dimensions.csv index c6729913..d0a29c98 100644 --- a/full-ifrs17-template/Files/Dimensions.csv +++ b/full-ifrs17-template/Files/Dimensions.csv @@ -214,7 +214,22 @@ Default,Default,,,,,,,,,, ,,,,,,,,,,, @@Scenario,,,,,,,,,,, SystemName,DisplayName,,,,,,,,,, -BE,Best Estimate,,,,,,,,,, +YCUP1.0pct,Yield Curve Up 1.0pct,,,,,,,,,, +YCDW1.0pct,Yield Curve Down 1.0pct,,,,,,,,,, +SRUP1.0pct,Spread Rate Up 1.0pct,,,,,,,,,, +SRDW1.0pct,Spread Rate Down 1.0pct,,,,,,,,,, +EUP1.0pct,Equity Up 1.0pct,,,,,,,,,, +EDW1.0pct,Equity Down 1.0pct,,,,,,,,,, +FXUP1.0pct,Exchange Rate Up 1.0pct,,,,,,,,,, +FXDW1.0pct,Exchange Rate Down 1.0pct,,,,,,,,,, +MTUP10pct,Mortality Up 10pct,,,,,,,,,, +MTDW10pct,Mortality Down 10pct,,,,,,,,,, +LUP10pct,Longevity Up 10pct,,,,,,,,,, +LDW10pct,Longevity Down 10pct,,,,,,,,,, +DUP10pct,Disability Up 10pct,,,,,,,,,, +DDW10pct,Disability Down 10pct,,,,,,,,,, +LICUP10pct,Lic Up 10pct,,,,,,,,,, +LICDW10pct,Lic Down 10pct,,,,,,,,,, ,,,,,,,,,,, @@ValuationApproach,,,,,,,,,,, SystemName,DisplayName,,,,,,,,,, diff --git a/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv new file mode 100644 index 00000000..eb8fb4c5 --- /dev/null +++ b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv @@ -0,0 +1,12 @@ +@@Main,,,, +ReportingNode,Year,Month,Scenario, +CH,2020,12,MTUP10pct, +@@Actual,,,, +DataNode,AocType,ValueType,AccidentYear,Value +DT1.1,CF,NIC,,-310 +DT1.2,CF,NIC,2020,-310 +DT2.1,CF,NIC,,-310 +DT1.3,CF,NIC,,-310 +DT2.2,CF,NIC,2020,-310 +DTR1.1,CF,NIC,,170 +DTR1.2,CF,NIC,2020,170 diff --git a/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv new file mode 100644 index 00000000..3e08a787 --- /dev/null +++ b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv @@ -0,0 +1,13 @@ +@@Main,,,,,,,,,,,,,,,,,,,,,,,,,,,, +ReportingNode,Year,Month,Scenario,,,,,,,,,,,,,,,,,,,,,,,,, +CH,2020,12,MTUP10pct,,,,,,,,,,,,,,,,,,,,,,,,, +@@Cashflow,,,,,,,,,,,,,,,,,,,,,,,,,,,, +DataNode,AmountType,AocType,Novelty,AccidentYear,Values0,Values1,Values2,Values3,Values4,Values5,Values6,Values7,Values8,Values9,Values10,Values11,Values12,Values13,Values14,Values15,Values16,Values17,Values18,Values19,Values20,Values21,Values22,Values23 +DT1.1,NIC,BOP,N,,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5 +DT1.1,NIC,CL,C,,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5 +DT1.2,NIC,BOP,N,2020,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5 +DT1.2,NIC,CL,C,2020,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5 +DTR1.1,NIC,BOP,N,,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75 +DTR1.1,NIC,CL,C,,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75 +DTR1.2,NIC,BOP,N,2020,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75 +DTR1.2,NIC,CL,C,2020,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75,13.75 diff --git a/full-ifrs17-template/Import/CloseImportTemplate.ipynb b/full-ifrs17-template/Import/CloseImportTemplate.ipynb index 7bb5d82e..3ba75fe8 100644 --- a/full-ifrs17-template/Import/CloseImportTemplate.ipynb +++ b/full-ifrs17-template/Import/CloseImportTemplate.ipynb @@ -134,7 +134,9 @@ { "cell_type": "code", "source": [ - "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" + "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\nawait DataSource.Partition.SetAsync(null);", + "\nawait DataSource.Partition.SetAsync(null);" ] } ] diff --git a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb index a96f6a66..37489f3f 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -85,6 +85,18 @@ "await Import.FromFile(\"../Files/TransactionalData/SimpleValue_CH_2020_12.csv\").WithFormat(ImportFormats.SimpleValue ).WithTarget(DataSource).ExecuteAsync()" ] }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" + ] + }, { "cell_type": "markdown", "source": [ diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_A.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_A.csv new file mode 100644 index 00000000..6a49b39f --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_A.csv @@ -0,0 +1,14 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,MTUP10pct,2020 +@@A +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,NIC,CF,DT2.1,,A,C,-310 +2020,NIC,CF,DT1.2,,A,C,-310 +,NIC,CF,DT1.1,,A,C,-310 +,NIC,CF,DT1.3,,A,C,-310 +2020,NIC,CF,DT2.2,,A,C,-310 +,NIC,CF,DTR1.1,,A,C,170 +2020,NIC,CF,DTR1.2,,A,C,170 +,PR,CF,DTR2.1,,A,C,-200 +,NIC,CF,DTR2.1,,A,C,140 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv new file mode 100644 index 00000000..9d548fcb --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv @@ -0,0 +1,69 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,MTUP10pct,2020 +@@BE +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,NIC,BOP,DT1.1,L,BE,N,658.6282390585294 +,PR,BOP,DT1.1,L,BE,N,-798.536731161375 +,NIC,BOP,DT1.1,C,BE,N,658.6282390585294 +,PR,BOP,DT1.1,C,BE,N,-798.536731161375 +,NIC,EOP,DT1.1,L,BE,C,329.6431046636596 +,PR,EOP,DT1.1,L,BE,C,-399.63392949885525 +,NIC,EOP,DT1.1,C,BE,C,329.6431046636596 +,PR,EOP,DT1.1,C,BE,C,-399.63392949885525 +,NIC,IA,DT1.1,L,BE,N,1.0148656051304286 +,PR,IA,DT1.1,L,BE,N,-1.0971983374806105 +,NIC,IA,DT1.1,C,BE,N,1.0148656051304286 +,PR,IA,DT1.1,C,BE,N,-1.0971983374806105 +,NIC,CF,DT1.1,L,BE,N,-330 +,PR,CF,DT1.1,L,BE,N,400 +,NIC,CF,DT1.1,C,BE,N,-330 +,PR,CF,DT1.1,C,BE,N,400 +2020,NIC,BOP,DT1.2,L,BE,N,658.6282390585294 +2020,NIC,BOP,DT1.2,C,BE,N,658.6282390585294 +2020,NIC,EOP,DT1.2,L,BE,C,329.6431046636596 +2020,NIC,EOP,DT1.2,C,BE,C,329.6431046636596 +2020,NIC,IA,DT1.2,L,BE,N,1.0148656051304286 +2020,NIC,IA,DT1.2,C,BE,N,1.0148656051304286 +2020,NIC,CF,DT1.2,L,BE,N,-330 +2020,NIC,CF,DT1.2,C,BE,N,-330 +,NIC,BOP,DTR1.1,L,BE,N,-329.3141195292647 +,PR,BOP,DTR1.1,L,BE,N,399.2683655806875 +,CDR,BOP,DTR1.1,L,BE,N,0.5292475300191577 +,NIC,BOP,DTR1.1,C,BE,N,-329.3141195292647 +,PR,BOP,DTR1.1,C,BE,N,399.2683655806875 +,CDR,BOP,DTR1.1,C,BE,N,0.5292475300191577 +,NIC,EOP,DTR1.1,L,BE,C,-164.8215523318298 +,PR,EOP,DTR1.1,L,BE,C,199.81696474942763 +,CDR,EOP,DTR1.1,L,BE,C,0.12679876434718015 +,NIC,EOP,DTR1.1,C,BE,C,-164.8215523318298 +,PR,EOP,DTR1.1,C,BE,C,199.81696474942763 +,CDR,EOP,DTR1.1,C,BE,C,0.12679876434718015 +,NIC,IA,DTR1.1,L,BE,N,-0.5074328025652143 +,PR,IA,DTR1.1,L,BE,N,0.5485991687403052 +,CDR,IA,DTR1.1,L,BE,N,0.001287210150087148 +,NIC,IA,DTR1.1,C,BE,N,-0.5074328025652143 +,PR,IA,DTR1.1,C,BE,N,0.5485991687403052 +,CDR,IA,DTR1.1,C,BE,N,0.001287210150087148 +,NIC,CF,DTR1.1,L,BE,N,165 +,PR,CF,DTR1.1,L,BE,N,-200 +,CDR,CF,DTR1.1,L,BE,N,-0.40373597582193455 +,NIC,CF,DTR1.1,C,BE,N,165 +,PR,CF,DTR1.1,C,BE,N,-200 +,CDR,CF,DTR1.1,C,BE,N,-0.40373597582193455 +2020,NIC,BOP,DTR1.2,L,BE,N,-329.3141195292647 +2020,CDR,BOP,DTR1.2,L,BE,N,0.5292475300191577 +2020,NIC,BOP,DTR1.2,C,BE,N,-329.3141195292647 +2020,CDR,BOP,DTR1.2,C,BE,N,0.5292475300191577 +2020,NIC,EOP,DTR1.2,L,BE,C,-164.8215523318298 +2020,CDR,EOP,DTR1.2,L,BE,C,0.12679876434718015 +2020,NIC,EOP,DTR1.2,C,BE,C,-164.8215523318298 +2020,CDR,EOP,DTR1.2,C,BE,C,0.12679876434718015 +2020,NIC,IA,DTR1.2,L,BE,N,-0.5074328025652143 +2020,CDR,IA,DTR1.2,L,BE,N,0.001287210150087148 +2020,NIC,IA,DTR1.2,C,BE,N,-0.5074328025652143 +2020,CDR,IA,DTR1.2,C,BE,N,0.001287210150087148 +2020,NIC,CF,DTR1.2,L,BE,N,165 +2020,CDR,CF,DTR1.2,L,BE,N,-0.40373597582193455 +2020,NIC,CF,DTR1.2,C,BE,N,165 +2020,CDR,CF,DTR1.2,C,BE,N,-0.40373597582193455 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BEPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BEPA.csv new file mode 100644 index 00000000..4674e6db --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BEPA.csv @@ -0,0 +1,6 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,MTUP10pct,2020 +@@BEPA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,CF,DT1.1,L,BEPA,N,320 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv new file mode 100644 index 00000000..5b4b8afc --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv @@ -0,0 +1,22 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,MTUP10pct,2020 +@@C +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,EA,DT2.1,,C,C,-139.99082483519595 +,,EA,DT1.1,,C,C,-80.02326986577215 +,,BOP,DT1.1,,C,N,80.03319764297927 +,,IA,DT1.1,,C,N,-0.009927777207129784 +,,BOP,DT2.1,,C,N,139.90849210284577 +,,IA,DT2.1,,C,N,0.08233273235018213 +,,EA,DT1.3,,C,C,-139.99082483519595 +,,BOP,DT1.3,,C,N,139.90849210284577 +,,IA,DT1.3,,C,N,0.08233273235018213 +,,AM,DTR1.1,,C,C,26.60498224366728 +,,EOP,DTR1.1,,C,C,-13.93718742938804 +,,BOP,DTR1.1,,C,N,-40.5458463515088 +,,IA,DTR1.1,,C,N,0.003676678453477744 +,,AM,DTR2.1,,C,C,46.24958203305145 +,,EOP,DTR2.1,,C,C,-24.22813469379126 +,,BOP,DTR2.1,,C,N,-70.43538016962212 +,,IA,DTR2.1,,C,N,-0.04233655722058882 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv new file mode 100644 index 00000000..a3a224c1 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv @@ -0,0 +1,9 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,MTUP10pct,2020 +@@F +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,AM,DT1.1,L,F,C,0.6562298579039588 +,,AM,DT1.2,L,F,C,1 +,,AM,DTR1.1,L,F,C,0.6562298579039588 +,,AM,DTR1.2,L,F,C,1 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv new file mode 100644 index 00000000..4f72f891 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv @@ -0,0 +1,14 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,MTUP10pct,2020 +@@L +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,AM,DT2.1,,L,C,-118.1273954398082 +,,EA,DT2.1,,L,C,180.00917516480405 +,,EA,DT1.1,,L,C,239.97673013422786 +,,AM,DT1.1,,L,C,-157.47989551624102 +,,EOP,DT1.1,,L,C,82.49683461798685 +,,EOP,DT2.1,,L,C,61.88177972499585 +,,EA,DT1.3,,L,C,260.00917516480405 +,,AM,DT1.3,,L,C,-170.6257840721249 +,,EOP,DT1.3,,L,C,89.38339109267915 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.csv new file mode 100644 index 00000000..fdff21b6 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.csv @@ -0,0 +1,37 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,MTUP10pct,2020 +@@RA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,BOP,DT1.1,C,RA,N,59.8752944598663 +,,BOP,DT1.1,L,RA,N,59.8752944598663 +,,EOP,DT1.1,C,RA,C,29.967554969423595 +,,EOP,DT1.1,L,RA,C,29.967554969423595 +,,IA,DT1.1,C,RA,N,0.09226050955731169 +,,IA,DT1.1,L,RA,N,0.09226050955731169 +,,CF,DT1.1,C,RA,N,-30 +,,CF,DT1.1,L,RA,N,-30 +2020,,BOP,DT1.2,C,RA,N,59.8752944598663 +2020,,BOP,DT1.2,L,RA,N,59.8752944598663 +2020,,EOP,DT1.2,C,RA,C,29.967554969423595 +2020,,EOP,DT1.2,L,RA,C,29.967554969423595 +2020,,IA,DT1.2,C,RA,N,0.09226050955731169 +2020,,IA,DT1.2,L,RA,N,0.09226050955731169 +2020,,CF,DT1.2,C,RA,N,-30 +2020,,CF,DT1.2,L,RA,N,-30 +,,BOP,DTR1.1,C,RA,N,-29.93764722993315 +,,BOP,DTR1.1,L,RA,N,-29.93764722993315 +,,EOP,DTR1.1,C,RA,C,-14.983777484711798 +,,EOP,DTR1.1,L,RA,C,-14.983777484711798 +,,IA,DTR1.1,C,RA,N,-0.046130254778655844 +,,IA,DTR1.1,L,RA,N,-0.046130254778655844 +,,CF,DTR1.1,C,RA,N,15 +,,CF,DTR1.1,L,RA,N,15 +2020,,BOP,DTR1.2,C,RA,N,-29.93764722993315 +2020,,BOP,DTR1.2,L,RA,N,-29.93764722993315 +2020,,EOP,DTR1.2,C,RA,C,-14.983777484711798 +2020,,EOP,DTR1.2,L,RA,C,-14.983777484711798 +2020,,IA,DTR1.2,C,RA,N,-0.046130254778655844 +2020,,IA,DTR1.2,L,RA,N,-0.046130254778655844 +2020,,CF,DTR1.2,C,RA,N,15 +2020,,CF,DTR1.2,L,RA,N,15 \ No newline at end of file diff --git a/full-ifrs17-template/Test/ExportIfrsVariable.ipynb b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb index 9d21556c..f844924b 100644 --- a/full-ifrs17-template/Test/ExportIfrsVariable.ipynb +++ b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb @@ -53,14 +53,28 @@ { "cell_type": "code", "source": [ - "public async Task ExportBenchmarks(ImportArgs args)", - "\n{", - "\n await DataSource.Partition.SetAsync(new {ReportingNode = args.ReportingNode, Year= args.Year, Month = args.Month, Scenario = args.Scenario});", - "\n var computedVariables = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());", - "\n", - "\n foreach (var estimateType in computedVariables.Keys)", - "\n {", - "\n await Export.ToCsv(pathToBm+\"BM_\"+args.ReportingNode+\"_\"+args.Year.ToString()+\"_\"+args.Month.ToString()+\"_\"+estimateType)", + "var scenario = \"MTUP10pct\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new ImportArgs (\"CH\", 2020, 12, Periodicity.Quarterly, scenario, null);", + "\nawait DataSource.Partition.SetAsync(new {ReportingNode = args.ReportingNode, Year= args.Year, Month = args.Month, Scenario = args.Scenario});", + "\nvar computedVariables = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());" + ] + }, + { + "cell_type": "code", + "source": [ + "(0, computedVariables.Keys)" + ] + }, + { + "cell_type": "code", + "source": [ + "var estimateType = \"BEPA\";", + "\nawait Export.ToCsv(\"BM_\"+args.ReportingNode+\"_\"+args.Year.ToString()+\"_\"+args.Month.ToString()+\"_\"+scenario+\"_\"+estimateType)", "\n .WithTable(tableConfig => tableConfig", "\n .AtBeginning()", "\n .WithName(Main)", @@ -74,16 +88,8 @@ "\n .WithColumn(x => x.Partition, x => x.Delete())", "\n .WithColumn(x => x.Id, x => x.Delete())", "\n )", - "\n .ExecuteAsync();", - "\n }", - "\n}" - ] - }, - { - "cell_type": "code", - "source": [ - "foreach (var args in argsArray)", - "\n await ExportBenchmarks(args);" + "\n .WithSource(DataSource)", + "\n .ExecuteAsync()" ] }, { diff --git a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb index 6e90aee1..78347e9c 100644 --- a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb +++ b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb @@ -44,14 +44,14 @@ { "cell_type": "code", "source": [ - "public record BenchmarkMetadata(string FileName, string ReportingNode, int Year, int Month){} " + "public record BenchmarkMetadata(string FileName, string ReportingNode, int Year, int Month, string Scenario = null){} " ] }, { "cell_type": "code", "source": [ "var bmFiles = new BenchmarkMetadata[]{", - "\n //2020 Q4", + "\n // 2020 Q4", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_A.csv\" , \"CH\", 2020, 12),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_AA.csv\" , \"CH\", 2020, 12),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_APA.csv\" , \"CH\", 2020, 12),", @@ -62,7 +62,7 @@ "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_F.csv\" , \"CH\", 2020, 12),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_OA.csv\" , \"CH\", 2020, 12),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_RA.csv\" , \"CH\", 2020, 12),", - "\n //2021 Q1", + "\n // 2021 Q1", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_A.csv\" , \"CH\", 2021, 3),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AA.csv\" , \"CH\", 2021, 3),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AAPA.csv\" , \"CH\", 2021, 3),", @@ -77,6 +77,14 @@ "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OA.csv\" , \"CH\", 2021, 3),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OAPA.csv\" , \"CH\", 2021, 3),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_RA.csv\" , \"CH\", 2021, 3),", + "\n // 2020 Q4", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_BE.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_BEPA.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_A.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_C.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_F.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_L.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_RA.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", "\n};" ] }, @@ -208,16 +216,16 @@ "cell_type": "code", "source": [ "var errorList = new List();", - "\nforeach (var g in bmFiles.GroupBy(x => (ReportingNode: x.ReportingNode, Year: x.Year, Month: x.Month)))", + "\nforeach (var g in bmFiles.GroupBy(x => (ReportingNode: x.ReportingNode, Year: x.Year, Month: x.Month, Scenario : x.Scenario)))", "\n{", "\n var reportingNode = g.Key.ReportingNode;", "\n var year = g.Key.Year;", "\n var month = g.Key.Month;", - "\n string scenario = null;", + "\n string scenario = g.Key.Scenario;", "\n ", "\n //Set up Args and storage", "\n await DataSource.Partition.SetAsync(new {ReportingNode = reportingNode, ", - "\n Year= year, ", + "\n Year = year, ", "\n Month = month, ", "\n Scenario = scenario});", "\n var partition = (await DataSource.Query().ToArrayAsync())", @@ -245,14 +253,13 @@ "\n //Get the computed Data", "\n var computedVariables = computedVariablesByEstimateType.TryGetValue(bmTableName, out var ret) ? ret : Enumerable.Empty();", "\n", - "\n if(!computedVariables.Any()) ", + "\n if(!computedVariables.Any())", "\n errorList.Add(new BenchmarkTestResult(\"No variables are computed for EstimateType: \" + bmTableName, 0, 0));", "\n //CompareAgainstBm", "\n if (bmVariables.Any() && computedVariables.Any()) //TODO we are adding duplicates here", - "\n errorList = errorList.Concat(CompareAgainstBm(errorList, bmVariables, computedVariables)).ToList();", + "\n errorList = errorList.Concat(CompareAgainstBm(errorList, bmVariables, computedVariables)).Distinct().ToList();", "\n }", - "\n}", - "\nerrorList = errorList.Distinct().ToList();" + "\n}" ] }, { diff --git a/full-ifrs17-template/Test/ScenarioTest.ipynb b/full-ifrs17-template/Test/ScenarioTest.ipynb new file mode 100644 index 00000000..c86a432b --- /dev/null +++ b/full-ifrs17-template/Test/ScenarioTest.ipynb @@ -0,0 +1,195 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Context" + ] + }, + { + "cell_type": "code", + "source": [ + "var log = await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync();", + "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\nWorkspace.Initialize(x => x.FromSource(DataSource));", + "\nlog" + ] + }, + { + "cell_type": "code", + "source": [ + "var log = await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync();", + "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\nWorkspace.Initialize(x => x.FromSource(DataSource));", + "\nlog" + ] + }, + { + "cell_type": "code", + "source": [ + "var defaultVarsBE = Workspace.Query().ToArray();" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Scenario Cashflows" + ] + }, + { + "cell_type": "code", + "source": [ + "var cashflows_scenarioTest = @\"", + "\n@@Main", + "\nReportingNode,Year,Month,Scenario", + "\nCH,2020,12,Test", + "\n@@Cashflow", + "\nDataNode,AmountType,AocType,Novelty,AccidentYear,Values0,Values1,Values2,Values3,Values4,Values5,Values6,Values7,Values8,Values9,Values10,Values11,Values12,Values13,Values14,Values15,Values16,Values17,Values18,Values19,Values20,Values21,Values22,Values23", + "\nDT1.1,PR,CL,C,,110,0,0,110,0,0,110,0,0,110,0,0,0,110,0,0,110,0,0,110,0,0,110,0", + "\nDT1.1,NIC,CL,C,,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5", + "\nDT1.1,CU,CL,C,,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-3.3", + "\nDT1.1,RA,CL,C,,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var cashflows_scenarioTest_equalTo_BestEstimate = @\"", + "\n@@Main", + "\nReportingNode,Year,Month,Scenario", + "\nCH,2020,12,Test", + "\n@@Cashflow", + "\nDataNode,AmountType,AocType,Novelty,AccidentYear,Values0,Values1,Values2,Values3,Values4,Values5,Values6,Values7,Values8,Values9,Values10,Values11,Values12,Values13,Values14,Values15,Values16,Values17,Values18,Values19,Values20,Values21,Values22,Values23", + "\nDT1.1,PR,CL,C,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0", + "\nDT1.1,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25", + "\nDT1.1,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3", + "\nDT1.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var log = await Import.FromString(cashflows_scenarioTest).WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync();", + "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\nWorkspace.Initialize(x => x.FromSource(DataSource));", + "\nlog" + ] + }, + { + "cell_type": "code", + "source": [ + "await Workspace.Partition.SetAsync(new{ReportingNode = \"CH\", Scenario = \"Test\", Year = 2020, Month = 12});", + "\nawait DataSource.Partition.SetAsync(new{ReportingNode = \"CH\", Scenario = \"Test\", Year = 2020, Month = 12});", + "\nvar diffs = Workspace.Query().Except(defaultVarsBE, IfrsVariableComparer.Instance());", + "\ndiffs.Where(x => (new[]{\"A\",\"AA\",\"OA\",\"DA\"}).Contains(x.EstimateType)).ToArray().Length.Should().Be(0);", + "\ndiffs.Where(x => !(new[]{\"A\",\"AA\",\"OA\",\"DA\"}).Contains(x.EstimateType)).ToArray().Length.Should().NotBe(0);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Scenario Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "var actuals_scenarioTest = @\"", + "\n@@Main", + "\nReportingNode,Year,Month,Scenario", + "\nCH,2020,12,Test", + "\n@@Actual", + "\nDataNode,AocType,ValueType,AccidentYear,Value", + "\nDT1.1,CF,NIC,,-308\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var actuals_scenarioTest_equalTo_BestEstimate = @\"", + "\n@@Main", + "\nReportingNode,Year,Month,Scenario", + "\nCH,2020,12,Test", + "\n@@Actual", + "\nDataNode,AocType,ValueType,AccidentYear,Value", + "\nDT1.1,CF,NIC,,-280\";" + ] + }, + { + "cell_type": "code", + "source": [ + "var log = await Import.FromString(actuals_scenarioTest).WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync();", + "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\nWorkspace.Initialize(x => x.FromSource(DataSource));", + "\nlog" + ] + }, + { + "cell_type": "code", + "source": [ + "await Workspace.Partition.SetAsync(new{ReportingNode = \"CH\", Scenario = \"Test\", Year = 2020, Month = 12});", + "\nawait DataSource.Partition.SetAsync(new{ReportingNode = \"CH\", Scenario = \"Test\", Year = 2020, Month = 12});", + "\nvar diffs = Workspace.Query().Except(defaultVarsBE, IfrsVariableComparer.Instance());", + "\ndiffs.Where(x => (new[]{\"A\",\"AA\",\"OA\",\"DA\"}).Contains(x.EstimateType)).ToArray().Length.Should().NotBe(0);", + "\ndiffs.Where(x => x.EstimateType == \"CU\").ToArray().Length.Should().Be(0);" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Robustness: back to Best Estimate" + ] + }, + { + "cell_type": "code", + "source": [ + "var log = await Import.FromString(actuals_scenarioTest_equalTo_BestEstimate).WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync();", + "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\nWorkspace.Initialize(x => x.FromSource(DataSource));", + "\nlog" + ] + }, + { + "cell_type": "code", + "source": [ + "var log = await Import.FromString(cashflows_scenarioTest_equalTo_BestEstimate).WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync();", + "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\nWorkspace.Initialize(x => x.FromSource(DataSource));", + "\nlog" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Query().Except(defaultVarsBE, IfrsVariableComparer.Instance()).ToArray().Length.Should().Be(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/full-ifrs17-template/Test/SequenceImportTest.ipynb b/full-ifrs17-template/Test/SequenceImportTest.ipynb new file mode 100644 index 00000000..cfbc24c3 --- /dev/null +++ b/full-ifrs17-template/Test/SequenceImportTest.ipynb @@ -0,0 +1,121 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Cashflow -> Actuals" + ] + }, + { + "cell_type": "code", + "source": [ + "var ws1 = Workspace.CreateNew();", + "\nws1.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(ws1).ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(ws1).ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "ws1.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\nws1.Initialize(x => x.FromSource(DataSource));" + ] + }, + { + "cell_type": "code", + "source": [ + "var ifrsVars1 = await ws1.Query().ToArrayAsync();", + "\nifrsVars1.Count()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Actuals -> Cashflow" + ] + }, + { + "cell_type": "code", + "source": [ + "var ws2 = Workspace.CreateNew();", + "\nws2.InitializeFrom(DataSource);" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(ws2).ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(ws2).ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "ws2.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", + "\nws2.Initialize(x => x.FromSource(DataSource));" + ] + }, + { + "cell_type": "code", + "source": [ + "var ifrsVars2 = await ws2.Query().ToArrayAsync();", + "\nifrsVars2.Count()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Test" + ] + }, + { + "cell_type": "code", + "source": [ + "ifrsVars1.Except(ifrsVars2, IfrsVariableComparer.Instance()).Count().Should().Be(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/full-ifrs17-template/Test/Tests.ipynb b/full-ifrs17-template/Test/Tests.ipynb index 06b5b7d7..2b7fefcb 100644 --- a/full-ifrs17-template/Test/Tests.ipynb +++ b/full-ifrs17-template/Test/Tests.ipynb @@ -53,6 +53,18 @@ "#!eval-notebook \"TechnicalMarginTest\"" ] }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"SequenceImportTest\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"ScenarioTest\"" + ] + }, { "cell_type": "markdown", "source": [ diff --git a/ifrs17/CalculationEngine.ipynb b/ifrs17/CalculationEngine.ipynb index 0936fa66..13b87df7 100644 --- a/ifrs17/CalculationEngine.ipynb +++ b/ifrs17/CalculationEngine.ipynb @@ -22,8 +22,7 @@ "\n#!import \"Report/ReportMutableScopes\"", "\n#!import \"Import/Importers\"", "\n#!import \"Export/ExportConfiguration\"", - "\n#!import \"Utils/TestHelper\"", - "\n#!import \"Utils/ImportCalculationMethods\"" + "\n#!import \"Utils/TestHelper\"" ] }, { diff --git a/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb index 06a89425..9d54b276 100644 --- a/ifrs17/Constants/Consts.ipynb +++ b/ifrs17/Constants/Consts.ipynb @@ -245,18 +245,41 @@ "cell_type": "code", "source": [ "public static class AmountTypes{", - "\n public const string ACA = nameof(ACA); //Attributable Commissions Acquisition", - "\n public const string AEA = nameof(AEA); //Attributable Expenses Acquisition", - "\n public const string CDR = nameof(CDR); //Credit Default Risk", - "\n public const string CL = nameof(CL); //Claims", - "\n public const string PR = nameof(PR); //Premiums", - "\n public const string NIC = nameof(NIC); //Claims Non-Investment component", - "\n public const string ICO = nameof(ICO); //Claims Investment component", - "\n public const string NE = nameof(NE); //Non Attributable Expenses", - "\n public const string ACM = nameof(ACM); //Attributable Commissions Maintenance", - "\n public const string AEM = nameof(AEM); //Attributable Expenses Maintenance", - "\n public const string AC = nameof(AC); //Attributable Commissions", - "\n public const string AE = nameof(AE); //Attributable Expenses", + "\n public const string ACA = nameof(ACA); // Attributable Commissions Acquisition", + "\n public const string AEA = nameof(AEA); // Attributable Expenses Acquisition", + "\n public const string CDR = nameof(CDR); // Credit Default Risk", + "\n public const string CL = nameof(CL); // Claims", + "\n public const string PR = nameof(PR); // Premiums", + "\n public const string NIC = nameof(NIC); // Claims Non-Investment component", + "\n public const string ICO = nameof(ICO); // Claims Investment component", + "\n public const string NE = nameof(NE); // Non Attributable Expenses", + "\n public const string ACM = nameof(ACM); // Attributable Commissions Maintenance", + "\n public const string AEM = nameof(AEM); // Attributable Expenses Maintenance", + "\n public const string AC = nameof(AC); // Attributable Commissions", + "\n public const string AE = nameof(AE); // Attributable Expenses", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static class Scenarios{", + "\n public const string YCUP1pct = nameof(YCUP1pct); // Yield Curve Up 1.0pct", + "\n public const string YCDW1pct = nameof(YCDW1pct); // Yield Curve Down 1.0pct", + "\n public const string SRUP1pct = nameof(SRUP1pct); // Spread Rate Up 1.0pct", + "\n public const string SRDW1pct = nameof(SRDW1pct); // Spread Rate Down 1.0pct", + "\n public const string EUP1pct = nameof(EUP1pct); // Equity Up 1.0pct", + "\n public const string EDW1pct = nameof(EDW1pct); // Equity Down 1.0pct", + "\n public const string FXUP1pct = nameof(FXUP1pct); // Exchange Rate Up 1.0pct", + "\n public const string FXDW1pct = nameof(FXDW1pct); // Exchange Rate Down 1.0pct", + "\n public const string MTUP10pct = nameof(MTUP10pct); // Mortality Up 10pct", + "\n public const string MTDW10pct = nameof(MTDW10pct); // Mortality Down 10pct", + "\n public const string LUP10pct = nameof(LUP10pct); // Longevity Up 10pct", + "\n public const string LDW10pct = nameof(LDW10pct); // Longevity Down 10pct", + "\n public const string DUP10pct = nameof(DUP10pct); // Disability Up 10pct", + "\n public const string DDW10pct = nameof(DDW10pct); // Disability Down 10pct", + "\n public const string LICUP10pct = nameof(LICUP10pct); // Lic Up 10pct", + "\n public const string LICDW10pct = nameof(LICDW10pct); // Lic Down 10pct", "\n}" ] }, diff --git a/ifrs17/Constants/Validations.ipynb b/ifrs17/Constants/Validations.ipynb index 18c2edbe..61e79c34 100644 --- a/ifrs17/Constants/Validations.ipynb +++ b/ifrs17/Constants/Validations.ipynb @@ -42,7 +42,7 @@ "source": [ "public enum Warning {", "\n // Import", - "\n ActiveDataNodeWithCashflowBOPI,", + "\n ActiveDataNodeWithCashflowBOPI, VariablesAlreadyImported, VariablesAlreadyCalculated,", "\n // Default", "\n Generic", "\n}; " @@ -174,4 +174,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index 36026b3c..ecd6fbe3 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -43,8 +43,12 @@ { "cell_type": "code", "source": [ - "#r \"nuget:Systemorph.Arithmetics,1.5.5\"", + "#r \"nuget:Systemorph.Activities,1.5.5\"", + "\n#r \"nuget:Systemorph.Arithmetics,1.5.5\"", "\n#r \"nuget:Systemorph.Workspace,1.5.3\"", + "\n#r \"nuget:Systemorph.InteractiveObjects,1.5.5\"", + "\n#r \"nuget:Systemorph.SharePoint,1.5.6\"", + "\n#r \"nuget:Systemorph.OneDrive,1.5.6\"", "\n#r \"nuget:Systemorph.Scopes,1.5.5\"", "\n#r \"nuget:Systemorph.Import,1.5.1\"", "\n#r \"nuget:Systemorph.Test,1.5.5\"", @@ -52,9 +56,7 @@ "\n#r \"nuget:Systemorph.DataSetReader,1.5.1\"", "\n#r \"nuget:Systemorph.DataSource,1.5.3\"", "\n#r \"nuget:Systemorph.DataSource.Conversions,1.5.3\"", - "\n#r \"nuget:Systemorph.Reporting,1.5.5\"", - "\n#r \"nuget:Systemorph.DomainDesigner,1.5.1\"", - "\n#r \"nuget:Systemorph.SharePoint,1.5.6\"" + "\n#r \"nuget:Systemorph.Reporting,1.5.5\"" ] }, { @@ -174,6 +176,22 @@ "\n}" ] }, + { + "cell_type": "markdown", + "source": [ + "The interface IWithYearMonthAndScenario allows to identify the year, month and scenario associated to the data:", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "public interface IWithYearMonthAndScenario : IWithYearAndMonth", + "\n{", + "\n public string Scenario { get; init; }", + "\n}" + ] + }, { "cell_type": "markdown", "source": [ @@ -795,7 +813,7 @@ { "cell_type": "code", "source": [ - "public record ExchangeRate : KeyedRecord", + "public record ExchangeRate : KeyedRecord, IWithYearMonthAndScenario", "\n{ ", "\n [Required]", "\n [IdentityProperty]", @@ -826,6 +844,11 @@ "\n", "\n [Display(Order = 50)]", "\n public double FxToGroupCurrency { get; init; }", + "\n", + "\n [IdentityProperty]", + "\n [Display(Order = 60)]", + "\n [Dimension(typeof(Scenario))]", + "\n public string Scenario { get; init; }", "\n}" ] }, @@ -844,7 +867,7 @@ { "cell_type": "code", "source": [ - "public record CreditDefaultRate : KeyedRecord, IWithYearAndMonth", + "public record CreditDefaultRate : KeyedRecord, IWithYearMonthAndScenario", "\n{ ", "\n [Required]", "\n [IdentityProperty]", @@ -871,6 +894,11 @@ "\n [Conversion(typeof(PrimitiveArrayConverter))]", "\n [Display(Order = 40)]", "\n public double[] Values { get; init; }", + "\n", + "\n [IdentityProperty]", + "\n [Display(Order = 50)]", + "\n [Dimension(typeof(Scenario))]", + "\n public string Scenario { get; init; }", "\n}" ] }, @@ -890,7 +918,7 @@ { "cell_type": "code", "source": [ - "public record YieldCurve : KeyedRecord, IWithYearAndMonth", + "public record YieldCurve : KeyedRecord, IWithYearMonthAndScenario", "\n{ ", "\n [Required]", "\n [IdentityProperty]", @@ -916,6 +944,7 @@ "\n", "\n [IdentityProperty]", "\n [Display(Order = 35)]", + "\n [Dimension(typeof(Scenario))]", "\n public string Scenario { get; init; }", "\n", "\n [Conversion(typeof(PrimitiveArrayConverter))]", @@ -935,7 +964,7 @@ { "cell_type": "code", "source": [ - "public record PartnerRating : KeyedRecord, IWithYearAndMonth", + "public record PartnerRating : KeyedRecord, IWithYearMonthAndScenario", "\n{ ", "\n [Required]", "\n [IdentityProperty]", @@ -963,6 +992,11 @@ "\n [Range(1, 12, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", "\n [Display(Order = 40)]", "\n public int Month { get; init; }", + "\n", + "\n [IdentityProperty]", + "\n [Display(Order = 50)]", + "\n [Dimension(typeof(Scenario))]", + "\n public string Scenario { get; init; }", "\n}" ] }, @@ -1202,7 +1236,7 @@ { "cell_type": "code", "source": [ - "public record DataNodeState : KeyedRecord, IPartitioned, IWithYearAndMonth", + "public record DataNodeState : KeyedRecord, IPartitioned, IWithYearMonthAndScenario", "\n{", "\n [NotVisible]", "\n [PartitionKey(typeof(PartitionByReportingNode))]", @@ -1235,6 +1269,11 @@ "\n [Display(Order = 40)]", "\n [DefaultValue(State.Active)]", "\n public State State { get; init; } = State.Active;", + "\n", + "\n [IdentityProperty]", + "\n [Display(Order = 50)]", + "\n [Dimension(typeof(Scenario))]", + "\n public string Scenario { get; init; }", "\n}" ] }, @@ -1254,7 +1293,7 @@ { "cell_type": "code", "source": [ - "public record DataNodeParameter : KeyedRecord, IPartitioned, IWithYearAndMonth", + "public record DataNodeParameter : KeyedRecord, IPartitioned, IWithYearMonthAndScenario", "\n{", "\n [NotVisible]", "\n [PartitionKey(typeof(PartitionByReportingNode))]", @@ -1282,6 +1321,11 @@ "\n [Display(Order = 10)]", "\n [Dimension(typeof(GroupOfContract))]", "\n public string DataNode { get; init; }", + "\n", + "\n [IdentityProperty]", + "\n [Display(Order = 40)]", + "\n [Dimension(typeof(Scenario))]", + "\n public string Scenario { get; init; }", "\n}" ] }, @@ -1340,7 +1384,7 @@ "\n public State PreviousState { get; init; }", "\n ", "\n public bool IsReinsurance { get; init; }", - "\n ", + "\n public string Scenario { get; init; }", "\n public DataNodeData(){}", "\n}" ] diff --git a/ifrs17/Import/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb index 8dc36adc..00ccbba0 100644 --- a/ifrs17/Import/ImportStorage.ipynb +++ b/ifrs17/Import/ImportStorage.ipynb @@ -44,7 +44,8 @@ { "cell_type": "code", "source": [ - "#!import \"../Utils/ImportCalculationMethods\"", + "#!import \"../Utils/EqualityComparers\"", + "\n#!import \"../Utils/ImportCalculationMethods\"", "\n#!import \"../Utils/Queries\"" ] }, @@ -250,18 +251,34 @@ "\n //Variables", "\n var rawVariables = parsedRawVariables.Concat(openingRawVariables)", "\n .Concat(await querySource.Query()", - "\n .Where(rv => rv.Partition == TargetPartition)", - "\n .Where(rv => primaryScopeFromLinkedReinsurance.Contains(rv.DataNode))", - "\n .ToArrayAsync());", - "\n RawVariablesByImportIdentity = (IDictionary>)rawVariables.ToDictionaryGrouped(v => v.DataNode, v => (ICollection)v.ToArray());", + "\n .Where(rv => rv.Partition == TargetPartition)", + "\n .Where(rv => primaryScopeFromLinkedReinsurance.Contains(rv.DataNode)).ToArrayAsync()); ", "\n ", "\n var ifrsVariables = parsedIfrsVariables.Concat(openingIfrsVariables)", - "\n .Concat(await querySource.Query()", - "\n .Where(iv => iv.Partition == TargetPartition && !(iv.AocType == AocTypes.BOP && iv.Novelty == Novelties.I))", - "\n .Where(iv => primaryScopeFromParsedVariables.Contains(iv.DataNode) && !EstimateTypesByImportFormat[ImportFormat].Contains(iv.EstimateType) ", - "\n || primaryScopeFromLinkedReinsurance.Contains(iv.DataNode) ", - "\n || secondaryScope.Contains(iv.DataNode))", - "\n .ToArrayAsync());", + "\n .Concat(await querySource.Query()", + "\n .Where(iv => iv.Partition == TargetPartition && !(iv.AocType == AocTypes.BOP && iv.Novelty == Novelties.I))", + "\n .Where(iv => primaryScopeFromParsedVariables.Contains(iv.DataNode) ", + "\n && !EstimateTypesByImportFormat[ImportFormat].Contains(iv.EstimateType) ", + "\n || primaryScopeFromLinkedReinsurance.Contains(iv.DataNode) ", + "\n || secondaryScope.Contains(iv.DataNode)).ToArrayAsync());", + "\n", + "\n if(DefaultPartition != TargetPartition) {", + "\n await querySource.Partition.SetAsync(DefaultPartition);", + "\n var defaultRawVariables = await querySource.Query()", + "\n .Where(rv => rv.Partition == DefaultPartition)", + "\n .Where(rv => primaryScope.Contains(rv.DataNode)).ToArrayAsync();", + "\n var defaultIfrsVariables = await querySource.Query()", + "\n .Where(iv => iv.Partition == DefaultPartition)", + "\n .Where(iv => primaryScopeFromParsedVariables.Contains(iv.DataNode)", + "\n && !EstimateTypesByImportFormat[ImportFormat].Contains(iv.EstimateType) ", + "\n || primaryScopeFromLinkedReinsurance.Contains(iv.DataNode) ", + "\n || secondaryScope.Contains(iv.DataNode)).ToArrayAsync();", + "\n rawVariables = rawVariables.Union(defaultRawVariables, EqualityComparer.Instance);", + "\n ifrsVariables = ifrsVariables.Union(defaultIfrsVariables, EqualityComparer.Instance);", + "\n await querySource.Partition.SetAsync(TargetPartition);", + "\n }", + "\n", + "\n RawVariablesByImportIdentity = (IDictionary>)rawVariables.ToDictionaryGrouped(v => v.DataNode, v => (ICollection)v.ToArray());", "\n IfrsVariablesByImportIdentity = (IDictionary>)ifrsVariables.ToDictionaryGrouped(v => v.DataNode, v => (ICollection)v.ToArray());", "\n }", "\n ", @@ -301,6 +318,7 @@ "\n ? ct.PeriodType : PeriodType.EndOfPeriod;", "\n", "\n //Variables and Cashflows", + "\n ", "\n public IEnumerable GetRawVariables(string dataNode) => RawVariablesByImportIdentity.TryGetValue(dataNode, out var variableCollection) ? variableCollection : Enumerable.Empty();", "\n public IEnumerable GetIfrsVariables(string dataNode) => IfrsVariablesByImportIdentity.TryGetValue(dataNode, out var variableCollection) ? variableCollection : Enumerable.Empty();", "\n ", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index 66c34b78..d115059d 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -902,7 +902,7 @@ "\n ", "\n var parsingLog = await ParseCashflowsToWorkspaceAsync(dataSet, args);", "\n if(parsingLog.Errors.Any()) return Activity.Finish().Merge(parsingLog);", - "\n ", + "\n ", "\n var storage = new ImportStorage(args, DataSource, Workspace);", "\n await storage.InitializeAsync();", "\n if(Activity.HasErrors()) return Activity.Finish().Merge(parsingLog);", diff --git a/ifrs17/Report/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb index 6b2cbab2..28b0acd6 100644 --- a/ifrs17/Report/ReportConfigurationAndUtils.ipynb +++ b/ifrs17/Report/ReportConfigurationAndUtils.ipynb @@ -26,7 +26,8 @@ { "cell_type": "code", "source": [ - "#!import \"../Utils/Queries\"" + "#!import \"../Utils/EqualityComparers\"", + "\n#!import \"../Utils/Queries\"" ] }, { @@ -91,11 +92,12 @@ { "cell_type": "code", "source": [ - "public static async Task> QueryReportVariablesAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", - "\n ", + "public static async Task QueryReportVariablesSingleScenarioAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", + "\n", + "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = (string)null}); // TODO: Scenario from args + relaxed query ", "\n await workspace.Partition.SetAsync(new { ReportingNode = args.ReportingNode, Scenario = args.Scenario, Year = args.Year, Month = args.Month });", "\n ", - "\n return await workspace.Query()", + "\n var reportVariables = await workspace.Query()", "\n .Join(workspace.Query(),", "\n dn => dn.SystemName,", "\n iv => iv.DataNode,", @@ -134,6 +136,22 @@ "\n ", "\n Value = iv.Value })", "\n .ToArrayAsync();", + "\n", + "\n await workspace.Partition.SetAsync(null);", + "\n await workspace.Partition.SetAsync(null);", + "\n return reportVariables;", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "public static async Task> QueryReportVariablesAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", + "\n ReportVariable[] reportVariables = new ReportVariable[0];", + "\n if(args.Scenario != null) ", + "\n reportVariables = (await workspace.QueryReportVariablesSingleScenarioAsync((args.Year, args.Month, args.ReportingNode, null)));", + "\n return (await workspace.QueryReportVariablesSingleScenarioAsync((args.Year, args.Month, args.ReportingNode, args.Scenario)))", + "\n .Union(reportVariables.Select(x => x with {Scenario = args.Scenario}), EqualityComparer.Instance).ToArray();", "\n}" ] }, diff --git a/ifrs17/Report/ReportStorage.ipynb b/ifrs17/Report/ReportStorage.ipynb index 0c61fe1a..13525d14 100644 --- a/ifrs17/Report/ReportStorage.ipynb +++ b/ifrs17/Report/ReportStorage.ipynb @@ -141,7 +141,7 @@ "\n }", "\n ", "\n // Variables", - "\n foreach(var rn in GetLeaves(reportingNode)) { ", + "\n foreach(var rn in GetLeaves(reportingNode)) {", "\n if(!variablesDictionary.TryGetValue((period, rn, scenario), out var variablesByIdentity)) {", "\n variablesByIdentity = (await workspace.QueryReportVariablesAsync((period.year, period.month, rn, scenario)))", "\n .ToDictionaryGrouped(x => new ReportIdentity {", @@ -159,7 +159,7 @@ "\n x => x.ToDictionaryGrouped(y => y.EstimateType,", "\n y => y.ToArray().ToDataCube()));", "\n ", - "\n variablesDictionary.Add((period, rn, scenario), variablesByIdentity);", + "\n variablesDictionary.Add((period, rn, scenario), variablesByIdentity);", "\n }", "\n }", "\n }", diff --git a/ifrs17/Test/QueriesTest.ipynb b/ifrs17/Test/QueriesTest.ipynb index 07990aa7..6b91461e 100644 --- a/ifrs17/Test/QueriesTest.ipynb +++ b/ifrs17/Test/QueriesTest.ipynb @@ -26,7 +26,8 @@ { "cell_type": "code", "source": [ - "var gic = \"DT1.1\";" + "var gic = \"DT1.1\";", + "\nvar scenario = \"MTUP\";" ] }, { @@ -45,8 +46,8 @@ "cell_type": "code", "source": [ "public async Task CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(Args args, IEnumerable testData, ", - "\n (int Year, int Month) expectedCurrentPeriod, ", - "\n (int Year, int Month) expectedPreviousPeriod)", + "\n (int Year, int Month, string Scenario) expectedCurrentPeriod, ", + "\n (int Year, int Month, string Scenario) expectedPreviousPeriod)", "\n{", "\n await Workspace.UpdateAsync(testData);", "\n var eurCurrentAndPreviousYieldCurve = (await Workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Currency))[\"EUR\"];", @@ -54,10 +55,12 @@ "\n //Check Current Period", "\n eurCurrentAndPreviousYieldCurve[CurrentPeriod].Year.Should().Be(expectedCurrentPeriod.Year);", "\n eurCurrentAndPreviousYieldCurve[CurrentPeriod].Month.Should().Be(expectedCurrentPeriod.Month);", + "\n eurCurrentAndPreviousYieldCurve[CurrentPeriod].Scenario.Should().Be(expectedCurrentPeriod.Scenario);", "\n ", "\n //Check Previous Period", "\n eurCurrentAndPreviousYieldCurve[PreviousPeriod].Year.Should().Be(expectedPreviousPeriod.Year);", "\n eurCurrentAndPreviousYieldCurve[PreviousPeriod].Month.Should().Be(expectedPreviousPeriod.Month);", + "\n eurCurrentAndPreviousYieldCurve[PreviousPeriod].Scenario.Should().Be(expectedPreviousPeriod.Scenario);", "\n ", "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", "\n}" @@ -68,93 +71,150 @@ "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2020, 9),(2020, 9));" + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2020, 9, null),(2020, 9, null));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", + "\nvar testData = new[] { new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9, Scenario = scenario }, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9 } };", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, scenario),(2020, 9, null));" ] }, { "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2019, 12), (2019, 12));" + "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2019, 12, null), (2019, 12, null));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9, Scenario = scenario},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, scenario), (2019, 12, null));" ] }, { "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2020, 6));" + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2020, 6, null));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2020, 6, null));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 3, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2019, 3, null));" ] }, { "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9), (2020, 9));" + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, null), (2020, 9, null));" ] }, { "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9), (2019, 9));" + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, null), (2019, 9, null));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"EUR\",2020,9,Periodicity.Monthly,scenario);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9, Scenario = scenario},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = scenario},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, scenario), (2019, 12, null));" ] }, { "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12), (2019, 12));" + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12, null), (2019, 12, null));" ] }, { "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2018, Month = 9}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12), (2019, 12));" + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2018, Month = 9, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12, null), (2019, 12, null));" ] }, { "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 6}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 9},", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 6}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 6), (2019, 6));" + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 6, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 9, Scenario = null},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 6, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 6, null), (2019, 6, null));" + ] + }, + { + "cell_type": "code", + "source": [ + "var args = new Args(\"CH\",2020,9,Periodicity.Monthly, scenario);", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 6, Scenario = scenario},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 6, Scenario = null},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 9, Scenario = null},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 6, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 6, null), (2019, 6, null));" ] }, { "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2015, Month = 9},", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3}};", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2016, 3));" + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2015, Month = 9, Scenario = null},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3, Scenario = null}};", + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2016, 3, null));" ] }, { "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", - "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3}, ", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2021, Month = 9},", - "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3}};", + "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3, Scenario = null}, ", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2021, Month = 9, Scenario = null},", + "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3, Scenario = null}};", "\n", - "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6), (2016, 3));" + "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2016, 3, null));" ] }, { diff --git a/ifrs17/Utils/ApplicationMessage.ipynb b/ifrs17/Utils/ApplicationMessage.ipynb index e55e688c..b826668d 100644 --- a/ifrs17/Utils/ApplicationMessage.ipynb +++ b/ifrs17/Utils/ApplicationMessage.ipynb @@ -27,13 +27,8 @@ { "cell_type": "code", "source": [ - "#r \"nuget:Systemorph.Activities,1.5.5\"" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"../Constants/Validations\"" + "#!import \"../Constants/Validations\"", + "\n#!import \"../DataModel/DataStructure\"" ] }, { @@ -115,4 +110,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/ifrs17/Utils/EqualityComparers.ipynb b/ifrs17/Utils/EqualityComparers.ipynb new file mode 100644 index 00000000..bd3021eb --- /dev/null +++ b/ifrs17/Utils/EqualityComparers.ipynb @@ -0,0 +1,139 @@ +{ + "metadata": { + "authors": [], + "kernelspec": { + "display_name": "Formula Framework", + "language": "C#", + "name": "C#" + }, + "language_info": { + "file_extension": ".cs", + "mimetype": "text/plain", + "name": "C#" + } + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Equality Comparers

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../DataModel/DataStructure\"" + ] + }, + { + "cell_type": "code", + "source": [ + "class RawVariableComparer: IEqualityComparer", + "\n{", + "\n private bool IgnoreValues;", + "\n private RawVariableComparer(bool ignoreValues)", + "\n {", + "\n IgnoreValues = ignoreValues;", + "\n }", + "\n", + "\n public bool Equals(RawVariable x, RawVariable y) =>", + "\n x.AccidentYear == y.AccidentYear && x.AmountType == y.AmountType && x.DataNode == y.DataNode && x.AocType == y.AocType && ", + "\n x.Novelty == y.Novelty && x.EstimateType == y.EstimateType && (IgnoreValues ? true : x.Values.SequenceEqual(y.Values)); // TODO: enable Precision", + "\n", + "\n public int GetHashCode(RawVariable v) => IgnoreValues ", + "\n ? HashCode.Combine(v.AccidentYear, v.AmountType, v.DataNode, v.AocType, v.Novelty) ", + "\n : HashCode.Combine(v.AccidentYear, v.AmountType, v.DataNode, v.AocType, v.Novelty, v.Values);", + "\n", + "\n public static RawVariableComparer Instance(bool ignoreValues = false)", + "\n { ", + "\n return new RawVariableComparer(ignoreValues);", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "class IfrsVariableComparer: IEqualityComparer", + "\n{", + "\n private bool IgnoreValue;", + "\n private IfrsVariableComparer(bool ignoreValue)", + "\n {", + "\n IgnoreValue = ignoreValue;", + "\n }", + "\n", + "\n public bool Equals(IfrsVariable x, IfrsVariable y) =>", + "\n x.AccidentYear == y.AccidentYear && x.AmountType == y.AmountType && x.DataNode == y.DataNode && x.AocType == y.AocType && ", + "\n x.Novelty == y.Novelty && x.EstimateType == y.EstimateType && (IgnoreValue ? true : Math.Abs(x.Value - y.Value) < Precision); ", + "\n", + "\n public int GetHashCode(IfrsVariable v) => IgnoreValue ", + "\n ? HashCode.Combine(v.AccidentYear, v.AmountType, v.DataNode, v.AocType, v.Novelty) ", + "\n : HashCode.Combine(v.AccidentYear, v.AmountType, v.DataNode, v.AocType, v.Novelty, v.Value.ToString(\"F5\"));", + "\n", + "\n public static IfrsVariableComparer Instance(bool ignoreValue = false)", + "\n { ", + "\n return new IfrsVariableComparer(ignoreValue);", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "using System;", + "\nusing System.Collections.Generic;", + "\nusing System.Diagnostics; ", + "\nusing System.Linq;", + "\nusing System.Linq.Expressions;", + "\nusing System.Reflection;", + "\nusing System.Threading;", + "\n//using Systemorph.Domain;", + "\n//using Systemorph.Utils.Reflection;", + "\nusing static Systemorph.Vertex.Equality.IdentityPropertyExtensions;" + ] + }, + { + "cell_type": "code", + "source": [ + "class EqualityComparer : IEqualityComparer", + "\n{", + "\n private static readonly System.Reflection.PropertyInfo[] IdentityProperties = typeof(T).GetIdentityProperties().ToArray();", + "\n private static Func compiledEqualityFunction;", + "\n", + "\n private EqualityComparer() {", + "\n compiledEqualityFunction = GetEqualityFunction();", + "\n }", + "\n", + "\n public static readonly EqualityComparer Instance = new EqualityComparer();", + "\n", + "\n public bool Equals(T x, T y) => compiledEqualityFunction(x, y);", + "\n public int GetHashCode(T obj) => 0;", + "\n", + "\n private static Func GetEqualityFunction()", + "\n {", + "\n var prm1 = Expression.Parameter(typeof(T));", + "\n var prm2 = Expression.Parameter(typeof(T));", + "\n", + "\n // r1 == null && r2 == null", + "\n var nullConditionExpression = Expression.AndAlso(Expression.Equal(prm1, Expression.Constant(null, typeof(T))), Expression.Equal(prm2, Expression.Constant(null, typeof(T))));", + "\n // r1 != null && r2 != null", + "\n var nonNullConditionExpression = Expression.AndAlso(Expression.NotEqual(prm1, Expression.Constant(null, typeof(T))), Expression.NotEqual(prm2, Expression.Constant(null, typeof(T))));", + "\n // r1.prop1 == r2.prop1 && r1.prop2 == r2.prop2...... ", + "\n var allPropertiesEqualExpression = IdentityProperties.Select(propertyInfo => Expression.Equal(Expression.Property(prm1, propertyInfo), Expression.Property(prm2, propertyInfo))).Aggregate(Expression.AndAlso);", + "\n", + "\n var equalityExpr = Expression.OrElse(nullConditionExpression, Expression.AndAlso(nonNullConditionExpression, allPropertiesEqualExpression));", + "\n return Expression.Lambda>(equalityExpr, prm1, prm2).Compile();", + "\n }", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/ifrs17/Utils/Queries.ipynb b/ifrs17/Utils/Queries.ipynb index 88b5c1c3..83b6c1ef 100644 --- a/ifrs17/Utils/Queries.ipynb +++ b/ifrs17/Utils/Queries.ipynb @@ -90,14 +90,16 @@ "\n Args args,", "\n Func identityExpression,", "\n Expression> filterExpression = null ) ", - "\n where T : IWithYearAndMonth", + "\n where T : IWithYearMonthAndScenario", "\n{", "\n return (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression))", - "\n .GroupBy(identityExpression)", - "\n .Select(y => y.OrderByDescending(x => x.Year)", - "\n .ThenByDescending(x => x.Month)", - "\n .FirstOrDefault())", - "\n .ToDictionary(identityExpression);", + "\n .Where(x => x.Scenario == args.Scenario || x.Scenario == null)", + "\n .GroupBy(x => identityExpression)", + "\n .Select(x => x.OrderByDescending(y => y.Year)", + "\n .ThenByDescending(y => y.Month)", + "\n .ThenByDescending(y => y.Scenario)", + "\n .FirstOrDefault())", + "\n .ToDictionary(identityExpression);", "\n}" ] }, @@ -109,20 +111,24 @@ "\n Args args,", "\n Func identityExpression,", "\n Expression> filterExpression = null ) ", - "\n where T : IWithYearAndMonth", + "\n where T : IWithYearMonthAndScenario", "\n{", - "\n var parameters = (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression)).GroupBy(identityExpression);", + "\n var parameters = (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression))", + "\n .Where(yc => yc.Scenario == args.Scenario || yc.Scenario == null)", + "\n .GroupBy(identityExpression);", "\n ", "\n var ret = new Dictionary>();", "\n foreach(var p in parameters)", "\n {", "\n var inner = ret.GetOrAdd(p.Key, _ => new Dictionary());", "\n", - "\n var currentCandidate = p.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).FirstOrDefault();", - "\n var previousCandidate = p.Where(x => x.Year < args.Year).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", + "\n var currentCandidate = p.Where(x => x.Year == args.Year).OrderByDescending(x => x.Month).ThenByDescending(x => x.Scenario).FirstOrDefault();", + "\n var previousCandidate = p.Where(x => x.Year < args.Year && x.Scenario == null).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", + "\n var currentCandidateBE = p.Where(x => x.Year <= args.Year && x.Scenario == null).OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).FirstOrDefault();", "\n ", "\n inner.Add(CurrentPeriod, currentCandidate != null ? currentCandidate : previousCandidate);", - "\n inner.Add(PreviousPeriod, previousCandidate != null ? previousCandidate : currentCandidate);", + "\n inner.Add(PreviousPeriod, previousCandidate != null ? previousCandidate : (currentCandidateBE != null ? currentCandidateBE : currentCandidate));", + "\n // TODO: log error if currentCandidate is null", "\n }", "\n return ret;", "\n}" @@ -150,7 +156,7 @@ "\n var lockedInYieldCurveByGoc = new Dictionary();", "\n foreach (var dn in dataNodes.Where(x => x.ValuationApproach == ValuationApproaches.BBA))", "\n {", - "\n var argsNew = args with {Year = dn.Year, Month = dn.Month};", + "\n var argsNew = args with {Year = dn.Year, Month = dn.Month, Scenario = dn.Scenario};", "\n var loadedYc = (await querySource.LoadCurrentParameterAsync(argsNew, x => x.Currency, x => x.Currency == dn.ContractualCurrency));", "\n ", "\n if(!loadedYc.TryGetValue(dn.ContractualCurrency, out var lockedYc))", @@ -315,12 +321,6 @@ "\n => (await querySource.LoadAocStepConfigurationAsync(year, month))", "\n .ToDictionary(x => new AocStep(x.AocType, x.Novelty)); " ] - }, - { - "cell_type": "code", - "source": [ - "" - ] } ] } \ No newline at end of file From e91515209a40b54c946cdd72c0323801ae81c5a5 Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Mon, 14 Nov 2022 11:20:44 +0100 Subject: [PATCH 27/43] packages + withGridOption + await HierarchyCache init (#83) --- ifrs17/DataModel/DataStructure.ipynb | 31 ++++++++++--------- ifrs17/Export/ExportConfiguration.ipynb | 7 +++++ ifrs17/Import/ImportStorage.ipynb | 2 +- ifrs17/Import/Importers.ipynb | 2 +- .../Report/ReportConfigurationAndUtils.ipynb | 4 +-- ifrs17/Report/ReportStorage.ipynb | 8 ++--- ifrs17/Utils/TestHelper.ipynb | 2 +- 7 files changed, 33 insertions(+), 23 deletions(-) diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index ecd6fbe3..2f63475c 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -43,20 +43,20 @@ { "cell_type": "code", "source": [ - "#r \"nuget:Systemorph.Activities,1.5.5\"", - "\n#r \"nuget:Systemorph.Arithmetics,1.5.5\"", - "\n#r \"nuget:Systemorph.Workspace,1.5.3\"", - "\n#r \"nuget:Systemorph.InteractiveObjects,1.5.5\"", - "\n#r \"nuget:Systemorph.SharePoint,1.5.6\"", - "\n#r \"nuget:Systemorph.OneDrive,1.5.6\"", - "\n#r \"nuget:Systemorph.Scopes,1.5.5\"", - "\n#r \"nuget:Systemorph.Import,1.5.1\"", - "\n#r \"nuget:Systemorph.Test,1.5.5\"", - "\n#r \"nuget:Systemorph.Export,1.5.1\"", - "\n#r \"nuget:Systemorph.DataSetReader,1.5.1\"", - "\n#r \"nuget:Systemorph.DataSource,1.5.3\"", - "\n#r \"nuget:Systemorph.DataSource.Conversions,1.5.3\"", - "\n#r \"nuget:Systemorph.Reporting,1.5.5\"" + "#r \"nuget:Systemorph.Activities,1.5.7\"", + "\n#r \"nuget:Systemorph.Arithmetics,1.5.7\"", + "\n#r \"nuget:Systemorph.Workspace,1.5.4\"", + "\n#r \"nuget:Systemorph.InteractiveObjects,1.5.7\"", + "\n#r \"nuget:Systemorph.SharePoint,1.5.7\"", + "\n#r \"nuget:Systemorph.OneDrive,1.5.7\"", + "\n#r \"nuget:Systemorph.Scopes,1.5.7\"", + "\n#r \"nuget:Systemorph.Import,1.5.2\"", + "\n#r \"nuget:Systemorph.Test,1.5.7\"", + "\n#r \"nuget:Systemorph.Export,1.5.2\"", + "\n#r \"nuget:Systemorph.DataSetReader,1.5.2\"", + "\n#r \"nuget:Systemorph.DataSource,1.5.4\"", + "\n#r \"nuget:Systemorph.DataSource.Conversions,1.5.4\"", + "\n#r \"nuget:Systemorph.Reporting,1.5.7\"" ] }, { @@ -71,6 +71,9 @@ "using System.ComponentModel.DataAnnotations;", "\nusing System.ComponentModel.DataAnnotations.Schema;", "\nusing Systemorph.Vertex.Grid.Model;", + "\nusing Systemorph.Vertex.Workspace;", + "\nusing Systemorph.Vertex.Activities;", + "\nusing Systemorph.Vertex.Import;", "\nusing static Systemorph.Vertex.Arithmetics.ArithmeticOperations;" ] }, diff --git a/ifrs17/Export/ExportConfiguration.ipynb b/ifrs17/Export/ExportConfiguration.ipynb index 6ce27a87..622371c3 100644 --- a/ifrs17/Export/ExportConfiguration.ipynb +++ b/ifrs17/Export/ExportConfiguration.ipynb @@ -29,6 +29,13 @@ "#!import \"../DataModel/DataStructure\"" ] }, + { + "cell_type": "code", + "source": [ + "using Systemorph.Vertex.Export.Builders.Interfaces;", + "\nusing Systemorph.Vertex.Export.Excel.Builders.Interfaces;" + ] + }, { "cell_type": "markdown", "source": [ diff --git a/ifrs17/Import/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb index 00ccbba0..41731861 100644 --- a/ifrs17/Import/ImportStorage.ipynb +++ b/ifrs17/Import/ImportStorage.ipynb @@ -132,7 +132,7 @@ "\n ExperienceAdjustEstimateTypeMapping = new Dictionary{{EstimateTypes.A, EstimateTypes.APA}, {EstimateTypes.AA, EstimateTypes.AAPA}, {EstimateTypes.OA, EstimateTypes.OAPA}}; //TODO move this logic", "\n ", "\n //Hierarchy Cache", - "\n hierarchyCache.Initialize();", + "\n await hierarchyCache.InitializeAsync();", "\n ", "\n //EstimateType to load and to update", "\n EstimateTypesByImportFormat = new InputSource[] { InputSource.Opening, InputSource.Actual, InputSource.Cashflow,}", diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index d115059d..d3f3eacf 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -152,7 +152,7 @@ "\n ", "\n //Hierarchy Cache", "\n HierarchyCache = workspace.ToHierarchicalDimensionCache();", - "\n HierarchyCache.Initialize();", + "\n await HierarchyCache.InitializeAsync();", "\n }", "\n ", "\n public async Task> GetDimensionWithExternalIdDictionaryAsync () where T : KeyedOrderedDimension", diff --git a/ifrs17/Report/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb index 28b0acd6..43ecc78c 100644 --- a/ifrs17/Report/ReportConfigurationAndUtils.ipynb +++ b/ifrs17/Report/ReportConfigurationAndUtils.ipynb @@ -38,12 +38,12 @@ "\nusing System.Collections.Immutable;", "\n", "\npublic static DataCubeReportBuilder, TVariable, TVariable ,TVariable> ReportGridOptions(", - "\n this DataCubePivotBuilder, TVariable, TVariable, TVariable> reportBuilder,", + "\n this DataCubePivotBuilder, TVariable, TVariable, TVariable> pivotBuilder,", "\n int reportHeight = 700,", "\n int valueColumnWidth = 250,", "\n int headerColumnWidth = 250,", "\n int groupDefaultExpanded = 2)", - "\n => reportBuilder.WithGridOptions(go => go", + "\n => pivotBuilder.ToTable().WithOptions(go => go", "\n .WithColumns(cols => cols.Modify(\"Value\",c => c.WithWidth(valueColumnWidth).WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", "\n .WithRows(rows => rows", "\n .Where(r => !(r.RowGroup.Coordinates.Last() == \"NullGroup\"))", diff --git a/ifrs17/Report/ReportStorage.ipynb b/ifrs17/Report/ReportStorage.ipynb index 13525d14..f71ce9e8 100644 --- a/ifrs17/Report/ReportStorage.ipynb +++ b/ifrs17/Report/ReportStorage.ipynb @@ -118,10 +118,10 @@ "\n // Initializers", "\n public async Task InitializeReportIndependentCacheAsync() {", "\n // Hierarchical Dimensions", - "\n hierarchicalDimensionCache.Initialize();", - "\n hierarchicalDimensionCache.Initialize(); ", - "\n hierarchicalDimensionCache.Initialize();", - "\n hierarchicalDimensionCache.Initialize();", + "\n await hierarchicalDimensionCache.InitializeAsync();", + "\n await hierarchicalDimensionCache.InitializeAsync(); ", + "\n await hierarchicalDimensionCache.InitializeAsync();", + "\n await hierarchicalDimensionCache.InitializeAsync();", "\n }", "\n ", "\n public async Task InitializeAsync((int year, int month) period, string reportingNode, string scenario, CurrencyType currencyType) {", diff --git a/ifrs17/Utils/TestHelper.ipynb b/ifrs17/Utils/TestHelper.ipynb index 5946b2d9..741b3e11 100644 --- a/ifrs17/Utils/TestHelper.ipynb +++ b/ifrs17/Utils/TestHelper.ipynb @@ -107,7 +107,7 @@ "public static Systemorph.Vertex.Pivot.Reporting.Builder.ReportBuilder WithGridOptionsForIfrsVariable", "\n(this Systemorph.Vertex.Pivot.Builder.PivotBuilder reportBuilder, int reportHeight = 650)", "\n{", - "\n return reportBuilder.WithGridOptions(go => ", + "\n return reportBuilder.ToTable().WithOptions(go => ", "\n go.WithColumns(cols => cols.Modify(\"Value\", c => c.WithWidth(300)", "\n .WithFormat(\"new Intl.NumberFormat('en',{ minimumFractionDigits:2, maximumFractionDigits:2 }).format(value)\")))", "\n .WithRows(rows => rows.Where(r => !r.RowGroup.SystemName.EndsWith(\"NullGroup\")).ToList())", From 2af3dd3da76c97a76af7fb7ce55680ab14f17b1f Mon Sep 17 00:00:00 2001 From: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Mon, 14 Nov 2022 15:11:02 +0100 Subject: [PATCH 28/43] Change in ReportMutableScopes NB (#85) --- ifrs17/Report/ReportMutableScopes.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ifrs17/Report/ReportMutableScopes.ipynb b/ifrs17/Report/ReportMutableScopes.ipynb index b34cea87..ffc3f5df 100644 --- a/ifrs17/Report/ReportMutableScopes.ipynb +++ b/ifrs17/Report/ReportMutableScopes.ipynb @@ -126,12 +126,12 @@ "\n private async Task GetReportTaskAsync() {", "\n await GetStorage().InitializeAsync(ReportingPeriod, ReportingNode, Scenario, CurrencyType);", "\n ", - "\n return report.ForDataCube(GetDataCube())", + "\n return await report.ForDataCube(GetDataCube())", "\n .WithQuerySource(workspace)", "\n .SliceRowsBy(rowSlices)", "\n .SliceColumnsBy(columnSlices)", "\n .ReportGridOptions(headerColumnWidth: headerColumnWidthValue)", - "\n .ToReport();", + "\n .ExecuteAsync();", "\n }", "\n", "\n Task ToReportAsync => GetReportTaskAsync();", From 6f61f26f9976c7fc1400fc1c31b6467ff60591e2 Mon Sep 17 00:00:00 2001 From: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Tue, 15 Nov 2022 09:46:25 +0100 Subject: [PATCH 29/43] New metadata (#87) --- .../Constants/CalculationEngine.ipynb | 6 +- full-ifrs17-template/Database/Configure.ipynb | 66 +- .../Database/PersonalConnectionExample.ipynb | 6 +- .../Database/Schema Delete.ipynb | 36 +- full-ifrs17-template/Export/MapTemplate.ipynb | 186 ++++- .../Import/CloseImportTemplate.ipynb | 96 ++- .../InitSystemorphBaseToMemory.ipynb | 138 +++- .../InitSystemorphToDatabase.ipynb | 156 +++- .../InitSystemorphToMemory.ipynb | 96 ++- .../InputFormatDescription.ipynb | 36 +- .../OverviewIFRS17Template.ipynb | 66 +- full-ifrs17-template/Report/Reports.ipynb | 204 ++++- .../Test/AocStructureTest.ipynb | 234 +++++- .../Test/ExportIfrsVariable.ipynb | 60 +- .../Test/ExportReportVariables.ipynb | 114 ++- .../Test/IfrsVariablesTest.ipynb | 108 ++- .../Test/ImportStorageTest.ipynb | 192 ++++- .../Test/MapTemplateAndImportTest.ipynb | 246 +++++- .../Test/ReportStorageTest.ipynb | 42 +- .../Test/ReportVariablesTest.ipynb | 120 ++- .../Test/ReportVariablesTestBase.ipynb | 66 +- full-ifrs17-template/Test/ScenarioTest.ipynb | 120 ++- .../Test/SequenceImportTest.ipynb | 96 ++- .../Test/TechnicalMarginTest.ipynb | 78 +- full-ifrs17-template/Test/Tests.ipynb | 78 +- ifrs17/CalculationEngine.ipynb | 12 +- ifrs17/Constants/Consts.ipynb | 186 ++++- ifrs17/Constants/Enums.ipynb | 156 +++- ifrs17/Constants/Validations.ipynb | 56 +- ifrs17/DataModel/DataStructure.ipynb | 774 +++++++++++++++--- ifrs17/Export/ExportConfiguration.ipynb | 108 ++- ifrs17/Import/ImportScopeCalculation.ipynb | 468 +++++++++-- ifrs17/Import/ImportStorage.ipynb | 30 +- ifrs17/Import/Importers.ipynb | 276 +++++-- ifrs17/OverviewCalculationEngine.ipynb | 48 +- .../Report/ReportConfigurationAndUtils.ipynb | 60 +- ifrs17/Report/ReportMutableScopes.ipynb | 72 +- ifrs17/Report/ReportScopes.ipynb | 390 +++++++-- ifrs17/Report/ReportStorage.ipynb | 42 +- ifrs17/Test/AocConfigurationTest.ipynb | 210 ++++- ifrs17/Test/QueriesTest.ipynb | 216 ++++- ifrs17/Test/Tests.ipynb | 18 +- ifrs17/Utils/ApplicationMessage.ipynb | 50 +- ifrs17/Utils/EqualityComparers.ipynb | 42 +- ifrs17/Utils/Extensions.ipynb | 96 ++- ifrs17/Utils/ImportCalculationMethods.ipynb | 114 ++- ifrs17/Utils/Queries.ipynb | 156 +++- ifrs17/Utils/TestHelper.ipynb | 42 +- 48 files changed, 5222 insertions(+), 1046 deletions(-) diff --git a/full-ifrs17-template/Constants/CalculationEngine.ipynb b/full-ifrs17-template/Constants/CalculationEngine.ipynb index cf36e68d..e30509df 100644 --- a/full-ifrs17-template/Constants/CalculationEngine.ipynb +++ b/full-ifrs17-template/Constants/CalculationEngine.ipynb @@ -16,13 +16,17 @@ "nbformat_minor": 5, "cells": [ { + "id": "0lsQIC1gDEODx-OkvAl3pQ", "cell_type": "code", "source": [ "var projectName = \"ifrs17\";", "\nvar environmentName = \"v1.0.0\";", "\nvar notebookName = \"CalculationEngine\";", "\nvar calculationEngine = $\"#!import \\\"//{projectName}/{environmentName}/{notebookName}\\\"\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Database/Configure.ipynb b/full-ifrs17-template/Database/Configure.ipynb index 44886de4..84f668d3 100644 --- a/full-ifrs17-template/Database/Configure.ipynb +++ b/full-ifrs17-template/Database/Configure.ipynb @@ -19,37 +19,58 @@ "nbformat_minor": 5, "cells": [ { + "id": "4pCtjml9b0qsW_qdBuJO6w", "cell_type": "markdown", "source": [ "

DataSource Configuration

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Vfn_7rax10adJW_1ZtDM8A", "cell_type": "code", "source": [ "#!import \"../Constants/CalculationEngine\"", "\n#!eval calculationEngine" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KhBa0fF-l0a93pgXYgVuFw", "cell_type": "code", "source": [ "#!import \"PersonalConnection\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Vh7nAxVvy0iUuSAGzjmDaw", "cell_type": "code", "source": [ "using System.Reflection;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZMZQjqRWTUGnPoJJpxkdLw", "cell_type": "markdown", "source": [ "# Database Configure" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "M452PsrooEqiMehPCaxUyQ", "cell_type": "code", "source": [ "var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())", @@ -57,38 +78,61 @@ "\n && !t.IsInterface", "\n && !t.IsAbstract", "\n ).ToArray();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0N7ABGO-n06LsiMOOHcdJw", "cell_type": "code", "source": [ "await DataSource.Configure().UseMsSql(opt => opt.WithConnectionString(connectionStringMsSql)", "\n .WithTypes(allTypes)) .ConnectAsync();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "RmBLxQdX_kOIeA0ktt94xQ", "cell_type": "code", "source": [ "await DataSource.CommitAsync();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "BA0VOza8rEajIHBmKBrSXA", "cell_type": "markdown", "source": [ "# Reset Workspace" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9InVK4PX5EGrE4_tARwXLw", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oYFbN_9RAU6NiE_F3qNY1A", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Database/PersonalConnectionExample.ipynb b/full-ifrs17-template/Database/PersonalConnectionExample.ipynb index 0bcdbdd5..a7877df3 100644 --- a/full-ifrs17-template/Database/PersonalConnectionExample.ipynb +++ b/full-ifrs17-template/Database/PersonalConnectionExample.ipynb @@ -16,10 +16,14 @@ "nbformat_minor": 5, "cells": [ { + "id": "PacHtppMCEiAbT28F8yC9Q", "cell_type": "code", "source": [ "var connectionStringMsSql = \"here enter your connection string\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Database/Schema Delete.ipynb b/full-ifrs17-template/Database/Schema Delete.ipynb index f1f25629..0894d1dd 100644 --- a/full-ifrs17-template/Database/Schema Delete.ipynb +++ b/full-ifrs17-template/Database/Schema Delete.ipynb @@ -17,18 +17,27 @@ "nbformat_minor": 5, "cells": [ { + "id": "kZ8F8V4tB0Wn8FeC8OhusQ", "cell_type": "code", "source": [ "#!import \"PersonalConnection\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ns9rbHPX0kSH-ZK7AejMeA", "cell_type": "code", "source": [ "#r \"nuget:SqlConnection,1.0.4\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4PUwLlVsK0uhCCfeGwRHFg", "cell_type": "code", "source": [ "string[] split = connectionStringMsSql.Split(new char[] { '=', ':', ',', ';' });", @@ -37,27 +46,42 @@ "\nstring database = split[5];", "\nstring userID = split[9];", "\nstring password = split[11];" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_tMxxfxtoU-Ji32JWMtCRw", "cell_type": "code", "source": [ "using SQLConnection;", "\nusing System;", "\nusing System.Data.SqlClient;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4vlEnuUvfkqV87nAO3Zbsg", "cell_type": "code", "source": [ "string query = \"DECLARE @sql NVARCHAR(max)='' SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; 'FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' Exec Sp_executesql @sql\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wseyK5F-cE-ZP_jy2OkS8Q", "cell_type": "code", "source": [ "int rowAffect = SqlServer.AzureSqlConnection(serverName, database, userID, password, query);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Export/MapTemplate.ipynb b/full-ifrs17-template/Export/MapTemplate.ipynb index f9062ea3..8d0c70b3 100644 --- a/full-ifrs17-template/Export/MapTemplate.ipynb +++ b/full-ifrs17-template/Export/MapTemplate.ipynb @@ -18,34 +18,51 @@ "nbformat_minor": 5, "cells": [ { + "id": "fjKBauyn0Uyuk0uljGsArg", "cell_type": "markdown", "source": [ "

Map Template

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "A4j8UHGNc0697n1iNB4Z7g", "cell_type": "markdown", "source": [ "This notebook exports the data nodes, data node states, and data node parameters belonging to a specific data partition into an excel file.", "\n
This file contains reference data used to prepopulate dropdows and validations to facilitate editing.", "\n
This can be modified and imported in the calculation engine to create and modify data." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WuQQ_5xug0mco92fji7LKw", "cell_type": "markdown", "source": [ "After setting the desired target Partition, the Data present in the workspace is ready to be exported. ", "\n", "\nThe default location of the exported files is the project file storage. A **download** link is generated and available for as long as the session is active. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "91ew-zbV-kyChbcoiWA4Pg", "cell_type": "markdown", "source": [ "# Select Initialization" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Qv_pfuGhMk6HAPOyqqo4RA", "cell_type": "markdown", "source": [ "Choose to run the Map Template either with the set of Systemorph data in memory or with the data present in the Database: ", @@ -53,60 +70,96 @@ "\n- #!eval-notebook \"../Import/CloseImportTemplate\" : uses the in-memory set up", "\n", "\nWe use here the in-memory set up." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jYRWlCvih0ih3Qb-VCnJxw", "cell_type": "code", "source": [ "#!eval-notebook \"../Import/CloseImportTemplate\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "f0i5Zqm2k0CiHXxvSxfEMw", "cell_type": "markdown", "source": [ "# Workspace Initialization " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "eyUx5D6bFkeK-e_YOjcKcw", "cell_type": "markdown", "source": [ "Firstly, the Workspace is initialized with basic dimensions and with Data Nodes. For a list of the dimensions please refer to the DataModel/DataStructure notebook." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XLZRzQo0h0KkxPio3o_pQA", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yaG0mhZJ4USG66zLvyOp8A", "cell_type": "markdown", "source": [ "# Map Template: Data Node", "\n", "\n[DataNodes](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node) defines the properties of [Portfolios](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#group-of-contracts)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZwUv99iEz0-BpQlAkBB0MQ", "cell_type": "markdown", "source": [ "## Set Partition" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KZS8p8Zgm0aL-Acn-8hUUQ", "cell_type": "code", "source": [ "static var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };", "\nawait Workspace.Partition.SetAsync( partition );" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "L64PC131ukOuV4NLTc8U8g", "cell_type": "markdown", "source": [ "## Export" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "36zerkOEh0ChbLDtD5sf9Q", "cell_type": "code", "source": [ "await Export.ToExcel(\"DataNodes\")", @@ -117,42 +170,66 @@ "\n .GroupofContractConfiguration(typeof(InsurancePortfolio))", "\n .MainTabConfigurationWoScenario(partition)", "\n.ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "LHS727tkQ06vfv6NhHl_sg", "cell_type": "markdown", "source": [ "# Map Template: Data Node State", "\n", "\n[Data Node State](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node-state) defines whether the instance is active (used in import/output) or inactive (present in the DataSource but not used in input/output operations)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5jGzLrGmT0Gj9wlvkzSy9Q", "cell_type": "markdown", "source": [ "## Set Partition" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "vV883PT1KUOnvMOnG7uAoA", "cell_type": "code", "source": [ "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "cGT1t9x9WkiwDWDsmfpnCw", "cell_type": "markdown", "source": [ "## Export" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3xILTNiIAk2QthF03nLqeQ", "cell_type": "markdown", "source": [ "The data is retrieved for the Workspace and prepared for export." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1WrPhQtQwkic6piAumGUmw", "cell_type": "code", "source": [ "var dataNodeStates = (await Workspace.Query()", @@ -161,15 +238,23 @@ "\n .Select(x => x.OrderByDescending(y => y.Year).ThenByDescending(y => y.Month))", "\n .Select(x => x.Last())", "\n .ToArray();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oJW1Sg5FsUyI5evdcvmJ_A", "cell_type": "markdown", "source": [ "Export is performed." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "p2h3e_gKYkSWAenN52sRYQ", "cell_type": "code", "source": [ "await Export.ToExcel(\"DataNodeState\")", @@ -178,42 +263,66 @@ "\n .DataNodeStateConfiguration(dataNodeStates)", "\n .MainTabConfigurationWoScenario(partition)", "\n.ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "B9bFvDffqES-eH1DaAJaEw", "cell_type": "markdown", "source": [ "# Map Template: Data Node Parameter", "\n", "\n[Data Node Parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node-parameters) are defined at the Group of Contract level and are used during the import calculation. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZvrsiiVNcU6R9eFqGvFb8A", "cell_type": "markdown", "source": [ "## Set Partition" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YFFB0fSxIEKDyRQ75hVt2g", "cell_type": "code", "source": [ "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Iy02_lvUWkqaWMeXB2KfpQ", "cell_type": "markdown", "source": [ "## Export" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "l2jxOmpye0iihraZH8DCdg", "cell_type": "markdown", "source": [ "The data is retrieved for the Workspace and prepared for export." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "LYzzjVLUkk-ts_ulw22Z4A", "cell_type": "code", "source": [ "var dataNodeParameters = (await Workspace.Query()", @@ -224,15 +333,23 @@ "\n .Select(y => y.OrderByDescending(z => z.Year).ThenByDescending(z => z.Month))", "\n .Select(y => y.Last())", "\n .ToArray() );" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DVUmvzU18kiplnYxpVJ6Aw", "cell_type": "markdown", "source": [ "Export is performed." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CAMD-p4UT0CPgGf2pt0gDQ", "cell_type": "code", "source": [ "await Export.ToExcel(\"DataNodeParameter\")", @@ -240,13 +357,20 @@ "\n .DataNodeParameterConfiguration(dataNodeParameters)", "\n .MainTabConfiguration(partition)", "\n.ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "TMlydk8uOUKGO2LOiMpREw", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Import/CloseImportTemplate.ipynb b/full-ifrs17-template/Import/CloseImportTemplate.ipynb index 3ba75fe8..50d70692 100644 --- a/full-ifrs17-template/Import/CloseImportTemplate.ipynb +++ b/full-ifrs17-template/Import/CloseImportTemplate.ipynb @@ -16,18 +16,27 @@ "nbformat_minor": 5, "cells": [ { + "id": "FEKLEJqGf0Oz-qMZllkbng", "cell_type": "markdown", "source": [ "*Note: before configuring your data please refer to [Map Template](../Export/MapTemplate) Notebook.*" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "hMb1v4Hbz0uLUbhvmm6Y1A", "cell_type": "markdown", "source": [ "

Close Import Template

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ArK9WxF3XUGSRdpNv0aa0A", "cell_type": "markdown", "source": [ "All imports are triggered via the Import command. Several options can be fluently appended to customize the import action:", @@ -36,17 +45,25 @@ "\n- WithFileStorage() : defined the drive from where the input files is retrieved. In this example we use the project file storage (new files have to be uploaded into the project), other options are SharePoint and OneDrive. ", "\n- WithTarget() : target drive where the results are stored. In this example we use our in-memory set up", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "D5wNqWFLo0-UlPV4sPO33A", "cell_type": "markdown", "source": [ "# Set up data and configuration", "\n", "\nThe data source is initialized and the whole IFRS 17 Calculation Engine code is compiled. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "c7It4DDk0UaGqiW6TZG_iA", "cell_type": "markdown", "source": [ "Choose to run the Close Import Template notebook either on top of the set of Systemorph data in memory or on top to the data present in the Database: ", @@ -54,15 +71,23 @@ "\n- #!eval-notebook \"../Initialization/InitSystemorphToMemory\" : uses the in-memory set up", "\n", "\nWe use here the in-memory set up." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "USHMPCizs0G_kBACuX-dDA", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "U3F6pMBgdUyHgBU8qjiYJQ", "cell_type": "markdown", "source": [ "# DataNode and Parameters", @@ -74,27 +99,43 @@ "\n- ImportFormats.DataNodeState : the [state of a data node](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node-state) can be either active or inactive.", "\n- ImportFormats.DataNodeParameter : parameters are described [here](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#data-node-parameters). For **Group of Insurance Contracts** a default [Premium Allocation factor](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Import/ImportScopeCalculation#experience-adjustment-on-premium) of 1 is applied if the parameter is not imported.", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "AaFS-0j0sEWW5SxoRYq4Vw", "cell_type": "code", "source": [ "var pathToFile = \"../Files/DataNodes/DataNodes_CH.csv\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ubGP1EsDNUC7xBL5VK7W7Q", "cell_type": "code", "source": [ "var format = ImportFormats.DataNode;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-tgk2OJzaUWeC73huuAIAg", "cell_type": "code", "source": [ "await Import.FromFile(pathToFile).WithFormat(format).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HHeBgnlDRkui1KTpqRPtaA", "cell_type": "markdown", "source": [ "# Transactional Data", @@ -105,39 +146,62 @@ "\n- ImportFormats.Cashflow : nominal cash flows", "\n- ImportFormats.Actual : written actuals, payable and receivables. ", "\n- ImportFormats.SimpleValue : direct import of pre-calculated Present Value and Actual values for all reports - no calculation is triggered -" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "FQeU-8odV0ql_WZJ1jHEWQ", "cell_type": "code", "source": [ "var pathToFile = \"../Files/TransactionalData/Openings_CH_2020_12.csv\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "iNUyEWfT3EamYL5mRG4amg", "cell_type": "code", "source": [ "var format = ImportFormats.Opening;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "98WY7o4cn06YizVrcR94xA", "cell_type": "code", "source": [ "await Import.FromFile(pathToFile).WithFormat(format).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "19kLJ4wFEkqfyJbhSgoIcg", "cell_type": "markdown", "source": [ "# Workspace reset" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zd61cWGdzkGJptkix9ISbA", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\nawait DataSource.Partition.SetAsync(null);", "\nawait DataSource.Partition.SetAsync(null);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index dfe320cb..c66f0472 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb @@ -18,59 +18,92 @@ "nbformat_minor": 5, "cells": [ { + "id": "Jw20XG4x1EilMCJAihQP9g", "cell_type": "markdown", "source": [ "

In Memory Initialization of unconfigured DataSource

", "\n

Reference Data and DataNode

", "\n", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CJ391fe1PkqmNCzrbe2e9A", "cell_type": "code", "source": [ "#!import \"../Constants/CalculationEngine\"", "\n#!eval calculationEngine" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6_xa9moxtkyL3ihz07u5jw", "cell_type": "markdown", "source": [ "# Set default DataSource" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bxuByZKrEEGaJlJhmI9osQ", "cell_type": "code", "source": [ "await DataSource.SetAsync();", "\nDataSource.Reset(x => x.ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "s0AlrC6liUWQOtiQVIhETw", "cell_type": "markdown", "source": [ "# Initialize Workspace" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "z4343SXng06FxPSXN2Aeow", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WL51QeoKJUmjFus2UMroPw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "2-aLOC4J4kGoki0zyUlMYA", "cell_type": "markdown", "source": [ "# Import Dimensions, Partitions" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "K0kR1Ex6GUuSxR9UWW6lAw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Dimensions.csv\")", @@ -95,91 +128,150 @@ "\n .WithType()", "\n .WithTarget(DataSource)", "\n .ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "gQrym4Or-UK0l0KA6Oo1Ag", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Dimensions.csv\").WithFormat(ImportFormats.AocConfiguration).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pVnKfqXxqkOFmEN6oMqzXA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CeFL2feAYEm4_iQf1FF-kw", "cell_type": "markdown", "source": [ "# Import Parameters" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jh9UF6J2W0yN7wPYYlWH3A", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-yXSxX1SlkCP7ItYBNxBzQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "g62eclyU5keZInFB-XjOuA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DBD01bxBz0ybP_0ZJWx6pQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "mzOil6-bnEOxaKRmzJkALA", "cell_type": "markdown", "source": [ "# Import DataNodes and DataNodeParameters" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7-ashq1f2UamoHI5eVd6TQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "vfjAuDCj4E6udIDEPDpi5g", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "gyPlZm5h-kyEEdSBKnxjQw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "j9T1pkXp8Ui_6fUppmZStQ", "cell_type": "markdown", "source": [ "# Reset Workspace" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oIEu2CZCckC-kJlVOOIFUA", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jPzyibohbkO7BcQpOMcOfg", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb index 04d2caa5..9bb486c7 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb @@ -18,42 +18,67 @@ "nbformat_minor": 5, "cells": [ { + "id": "dXiMOEAkhUS3szd2gfF6AA", "cell_type": "markdown", "source": [ "

Physical Database Initialization

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_W0Ol9Yp9UeBergpPJwHJQ", "cell_type": "code", "source": [ "#!import \"../Database/Configure\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "65YliV-tKkmoSPy38bJF1Q", "cell_type": "markdown", "source": [ "# Initialize Workspace" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "a-PRJMIuu0-d1Wc9Vdzexw", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "MiNtGH15D0yiZ7EBxZapSw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ly36ekMIOEmIr3ecEcrcLw", "cell_type": "markdown", "source": [ "# Import Dimensions, Partitions" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "x-MizAOJUE2I94Jd_HMpBA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Dimensions.csv\")", @@ -79,121 +104,200 @@ "\n .WithType()", "\n .WithTarget(DataSource)", "\n .ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dH5kihXlfU-Ipg3yKL6HZQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ptLGGIqwaU-rOpJwqkDPMQ", "cell_type": "markdown", "source": [ "# Import Parameters" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nyVjHWMCwkq5BzpPbVxpSg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "EnJEQa5B1kSZWSMWzVP6iQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nlxEPvEV8ke7pYuCdyx_Kw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "MKh8LPhn8EWNCzMIjw0FPg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6Lg4ijhfp02NEI7_K7WLeg", "cell_type": "markdown", "source": [ "# Import DataNodes and DataNodeParameters" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wybN1I0PzE60Q8fsBQncNA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "lDVi2RgwC0KBfSTM0haXLA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "RZGXHFwlhUa4QElkgnabrA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZRzbVWjGt0CQWMBmcdV6xA", "cell_type": "markdown", "source": [ "# Import Cashflow and Actuals" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "AQ2a6_t30kK9G1SpuPzbXA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "czdzFh4XYE6tgQIH0X5PeQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4oyINCcm00aOGDsmy3uYCg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4QCb8Aedd0SGt_lDSgoLZg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "PpdBhbl5XUOHeuneQTuqHg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "cuqbrXADgESQzMGmdJNbKA", "cell_type": "markdown", "source": [ "# Reset Workspace" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yH5itqeYMkKbcSt0cjJdBw", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "hQT5R1kCBUSQ-acs3AO6yg", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb index 37489f3f..c3796999 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -18,102 +18,166 @@ "nbformat_minor": 5, "cells": [ { + "id": "cbbGg6wjDk-TVYeStR4qBQ", "cell_type": "markdown", "source": [ "

In Memory Initialization of unconfigured DataSource

", "\n", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "IpRteNYsKEaP0_-LNWk1cw", "cell_type": "code", "source": [ "#!eval-notebook \"InitSystemorphBaseToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "SoE3gUys8EKp3ltftwtJ6A", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "a7zceRktk0Oj53N2bl_YgQ", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "VNVvjMUDfUyw_34VpV0mKw", "cell_type": "markdown", "source": [ "# Import of Transactional Data" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fUkB1KS4Uk-UGYu3OGnZVQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4eI7O5E33kO7J2A17OzgkQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yZwiP28TokCPvTjooQvb3w", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-pwL5OY8Zk-MVsjCcc0GBw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_BBWqUgvVEGssR-nINMZzw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fZkRZKEuA0yPF2yeLMm9Nw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/SimpleValue_CH_2020_12.csv\").WithFormat(ImportFormats.SimpleValue ).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "n9gNpRaqN0OZp7FW0xzn8Q", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nT-Kxk8_wEmlJuFiTIyo4g", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "RxVrDBGSckmToNXY8u0qNA", "cell_type": "markdown", "source": [ "# Reset Workspace" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zJuYHgo2HkKTEErlOcc0tg", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1OoKa9wkCkSVyawbxgUPJA", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/InputFormatDescription.ipynb b/full-ifrs17-template/InputFormatDescription.ipynb index 2b083f04..02a51dce 100644 --- a/full-ifrs17-template/InputFormatDescription.ipynb +++ b/full-ifrs17-template/InputFormatDescription.ipynb @@ -18,6 +18,7 @@ "nbformat_minor": 5, "cells": [ { + "id": "KxjjzFMIGE2XG47MupU_Rw", "cell_type": "markdown", "source": [ "

Structure of the Cashflows, Actuals and Openings Files

", @@ -29,9 +30,13 @@ "\n", "\n", "\n
" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "b_ujMXfzKkK739lQz4lDLA", "cell_type": "markdown", "source": [ "A cashflow file is named **NominalCashflows** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Cashflow**.", @@ -47,9 +52,13 @@ "\n", "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", "\n
The cash flow is entered in the columns named ValuesN where N goes from 0 to the lenght of cash flow. The Value0 corresponds to January of the Year entered in the **Main** section for every combination of AocType and Novelty. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3ZvTFE0td0OhuzUYPSQNYg", "cell_type": "markdown", "source": [ "", @@ -57,9 +66,13 @@ "\n", "\n", "\n
" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "TmexPVnf9UOLk5M-rBIOFQ", "cell_type": "markdown", "source": [ "An Actuals file is named **Actuals** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Actual**.", @@ -71,9 +84,13 @@ "\n- [AocType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#aoc-type) : entered with its SystemName,", "\n- [ValueType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#amount-type) : corresponds to AmountType SystemName extended with the ExternalId,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8q7t_L66eUCR0RPDomX5vw", "cell_type": "markdown", "source": [ "", @@ -81,9 +98,13 @@ "\n", "\n", "\n
" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KeCG80BBU0mkKTrFyzYswg", "cell_type": "markdown", "source": [ "An Openings file is named **Openings** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Opening**. In an AoC for one period, we only need one file with the year/month combination of the beginning of the period. Some GICs do not need any entries in Openings.", @@ -95,7 +116,10 @@ "\n- [EstimateType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#estimate-type) : entered with its SystemName,", "\n- [AmountType](https://portal.stage.systemorph.cloud/project/ifrs17/env/v1.0.0/DataModel/DataStructure#amount-type) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/OverviewIFRS17Template.ipynb b/full-ifrs17-template/OverviewIFRS17Template.ipynb index 2475dbde..46b1daf1 100644 --- a/full-ifrs17-template/OverviewIFRS17Template.ipynb +++ b/full-ifrs17-template/OverviewIFRS17Template.ipynb @@ -18,12 +18,17 @@ "nbformat_minor": 5, "cells": [ { + "id": "XqP6oT3oEUG8gfJACppeEA", "cell_type": "markdown", "source": [ "

IFRS17 Template - an Overview

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fLQXzK7btES7Yy94RU7hPg", "cell_type": "markdown", "source": [ "# Introduction", @@ -33,9 +38,13 @@ "\nSystemorph's Full IFRS 17 Template provides a complete example of input data and uses the Calculation Engine for the production of IFRS 17 results. Users can adapt this template to their own needs by changing the input data and calculating their own results.", "\n", "\nThis notebook provides an **overview** of Systemorph's Full IFRS 17 Template with brief introductions to all the main steps." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "mgx2RMH1lU2loBaAni5g_A", "cell_type": "markdown", "source": [ "", @@ -65,17 +74,25 @@ "\n - Liability for Remaining Coverage (LRC)", "\n - Liability for Incurred Claims (LIC)", "\n - Financial Performance" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "MzVwAqqUUU2txhGSipf7JQ", "cell_type": "markdown", "source": [ "# Data input", "\n", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nWSvAb7SxEKuYE10AgcJ3g", "cell_type": "markdown", "source": [ "", @@ -86,9 +103,13 @@ "\n$$", "\n$$", "\n- **Dimensions**: The many dimensions required to characterize all of the data and results, with system names and display names. This information is quite stable." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Y-wDmfD8GUCqW-pX9i8oLA", "cell_type": "markdown", "source": [ "", @@ -102,9 +123,13 @@ "\n$$", "\n$$", "\n- **DataNodeStates** *\\_* *\\_* *\\_*: Switching data nodes on and off, the normal state is (\"Active\") for all the GICs and GRICs of the reporting node/year/month combination; if needed, more such files may be added for other reporting node/year/month combinations" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "EeU9UVGsoEuSU1mmM-28cQ", "cell_type": "markdown", "source": [ "", @@ -121,9 +146,13 @@ "\n$$", "\n$$", "\n- **PartnerRating**: For each reinsurance partner of a relevant GRIC, the rating in S&P notation with the as-of date (year/month)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sLBXsjIWDUuSBmO6_bb3aQ", "cell_type": "markdown", "source": [ "", @@ -141,9 +170,13 @@ "\nThe structure of the [Actuals](./InputFormatDescription#actual), [Openings](./InputFormatDescription#opening) and [NominalCashflows](./InputFormatDescription#cashflow) files is explained in a special [notebook](./InputFormatDescription).", "\n", "\nThe less usual option of having discounted instead of nominal cash flows in the input is supported, but not a subject of this notebook in its current state." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "EKBiTpxkLkKpIEhzVuZ-kw", "cell_type": "markdown", "source": [ "# Initialization", @@ -159,22 +192,33 @@ "\n", "\nIn the **Full IFRS 17 Template** project we always rely on the in-memory set up in order to be independet from a physical database which might not be available to every user. ", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ovtyPj3BG0OpMirbW0a-vg", "cell_type": "markdown", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "A_hBKHHrgEWrhwl60wgegQ", "cell_type": "markdown", "source": [ "", "\n# Reports", "\n", "\nAll the reports are produced by running a notebook such as **[Reports](./Report/Reports#report-production)**." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Report/Reports.ipynb b/full-ifrs17-template/Report/Reports.ipynb index b31f2e68..771699ba 100644 --- a/full-ifrs17-template/Report/Reports.ipynb +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -18,13 +18,18 @@ "nbformat_minor": 5, "cells": [ { + "id": "u7uIwzix5EikOZED39lDSQ", "cell_type": "markdown", "source": [ "", "\n

Reports

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4igmSVIW0E6Kv5_vkT9DLg", "cell_type": "markdown", "source": [ "For demonstration purposes we import here data for some *Group of Insurance Contract* (GIC) and *Group of Reinsurance Contract* (GRIC) - the import is triggered in the [Set up data and configuration](#set-up-data-and-configuration).", @@ -33,9 +38,13 @@ "\n
For simplicity, we import similar transactional data for all GICs and GRICs. Each *Group of Contracts* produces different figures due to differences in parameters such as *Liability Type*, *Oci type* or *Premium allocation factor* to Contractual Service Margin.", "\n", "\nFollow the instructions below for a guided interaction with the reports." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "hLLR1wkcZkyJXyEFLqPMMA", "cell_type": "markdown", "source": [ "# Set up data and configuration", @@ -45,22 +54,34 @@ "\n- #!eval-notebook \"../Import/CloseImportTemplate\" : uses the in-memory set up", "\n", "\nWe use here the in-memory set up." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "eKD8BZm_xUOZQuA6m8UmTg", "cell_type": "code", "source": [ "#!eval-notebook \"../Import/CloseImportTemplate\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "U7KdEKhA_EOYfJ4pQQNz5A", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", "\nifrs17Report.Reset(Workspace)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "poAVlQqeLkiV37sb_NpveQ", "cell_type": "markdown", "source": [ "# Best Estimate", @@ -71,9 +92,13 @@ "\nFor example one can add \"GroupOfContract\" to separate the contributions of the individual Group of Contracts.", "\n", "\nAggregated values are displayed when the data has a finer granularity than the one selected by the report slice options." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "vtm0lBQIJEGfynjBvvZOrA", "cell_type": "code", "source": [ "var pvReport = ifrs17Report.PresentValues;", @@ -83,9 +108,13 @@ "\npvReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\npvReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.2\"),(\"LiabilityType\", \"LIC\") }", "\n(await pvReport.ToReportAsync) with {Height = 720}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ldw5kzK-mUSWoT7wyZhjcw", "cell_type": "markdown", "source": [ "# Risk Adjustment", @@ -93,9 +122,13 @@ "\nPresent values of the [risk adjustment](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#risk-adjustment) future cashflows are shown here.", "\n", "\nThe additional ColumnSlices are added to the view as the inner column. This can dicrease the readability of the report. For example, adding the slice by \"GroupOfContract\" leaves the lock-in and current rate contributions far apart and difficult to compare. The re-order of default slices with custom slices is achieved by esplicitly add the default slice among the custom slices. In our case, you can try entering both \"GroupOfContract\" and \"EconomicBasis\" separated by a comma in the ColumnSlices." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6qXICBD8FUOKmE7kKFNOdw", "cell_type": "code", "source": [ "var raReport = ifrs17Report.RiskAdjustments;", @@ -104,9 +137,13 @@ "\nraReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"EconomicBasis\"", "\nraReport.DataFilter = null;//new [] {(\"GroupOfContract\", \"DT1.2\")};", "\n(await raReport.ToReportAsync) with {Height = 800}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "v073-6zoBUOkEN0NkPMINA", "cell_type": "markdown", "source": [ "# Written Actuals", @@ -115,9 +152,13 @@ "\n", "\nIn this case, the analysis of change view is replaced with a default slice by the **AmountTypes**. Only the amount type with non zero value are displayed. ", "\n
Filters can be applied to reports in order to isolate a sub-set of the data. They are specified by the name of the dimension to filter and the system name of the desired value. For example, to investigate the contribution of a single Group of Contract the following filter can be applied: new [] {(\"GroupOfContract\", \"DT1.1\")}." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Bqo2fJLwn02ro4jOw7UcAQ", "cell_type": "code", "source": [ "var writtenActualReport = ifrs17Report.WrittenActuals;", @@ -126,9 +167,13 @@ "\nwrittenActualReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", "\nwrittenActualReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await writtenActualReport.ToReportAsync) with {Height = 400}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "h3gavlvtO0u2bh1A333Oew", "cell_type": "markdown", "source": [ "## Advance, Overdue Actuals", @@ -137,9 +182,13 @@ "\nor [Overdue](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#written-accrual-deferral) are shown here together in a simplified Analysis of Change. ", "\n", "\nCombining Filters and ColumnSlices facilitate the report analysis. For example, you can select \"GroupOfContract\" as column slices with a Filter on EstimateType \"AA\" to analyse the Advance Actuals for all Group of Contract. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "g5vadolJpEykmOcUutrCRg", "cell_type": "code", "source": [ "var accrualActualReport = ifrs17Report.AccrualActuals;", @@ -148,17 +197,25 @@ "\naccrualActualReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\naccrualActualReport.DataFilter = null; //new [] {(\"EstimateType\", \"AA\")};", "\n(await accrualActualReport.ToReportAsync) with {Height = 400}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yxg6Q5NzBE2TOmApSlpCKw", "cell_type": "markdown", "source": [ "## Deferrable Actuals", "\n", "\n[Deferrable Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#written-accrual-deferral) are shown here. Amortization of the deferrable amount is computed using the Coverage Unit pattern. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1I7E2WC9I0SuubPYwDRh0w", "cell_type": "code", "source": [ "var deferrableActualReport = ifrs17Report.DeferralActuals;", @@ -167,9 +224,13 @@ "\ndeferrableActualReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\ndeferrableActualReport.DataFilter = null;//new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await deferrableActualReport.ToReportAsync) with {Height = 400}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "b21x1Qg4zka-PSLZ2_VVtw", "cell_type": "markdown", "source": [ "# Fulfilment Cashflow", @@ -179,9 +240,13 @@ "\n", "\nFilters can be applied to report to isolate a sub-set of the data. For example you can Filter by a specific Group of Contract using its system name using : new [] {(\"GroupOfContract\", \"DT1.1\")}.", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fQuP9scuY0GkBt5BDKH4rQ", "cell_type": "code", "source": [ "var fulfillmentCashflowsReport = ifrs17Report.FulfillmentCashflows;", @@ -190,17 +255,25 @@ "\nfulfillmentCashflowsReport.ColumnSlices = new string[]{};//\"EstimateType\"", "\nfulfillmentCashflowsReport.DataFilter = null;// new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await fulfillmentCashflowsReport.ToReportAsync) with {Height = 750}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-Klq4DH4K0qG8aZqN3oSew", "cell_type": "markdown", "source": [ "# Actuarial Experience Adjustment", "\n", "\nA comparison between [Written Actual](#written-actual) and the Releases of the [Best Estimate](#present-value) is reported in the [Actuarial Experience Adjustment](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#experience-adjustment)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ed6yzeiYa0-3UyyBO7W0Rg", "cell_type": "code", "source": [ "var experienceAdjustmentsReport = ifrs17Report.ExperienceAdjustments;", @@ -209,18 +282,26 @@ "\nexperienceAdjustmentsReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\nexperienceAdjustmentsReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await experienceAdjustmentsReport.ToReportAsync) with {Height = 300}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5cscmHZq0U2qZkBjPplHRA", "cell_type": "markdown", "source": [ "# LRC Technical Margin", "\n", "\nIn the [Technical Margin](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#technical-margin) report we present a unified view on the figures that are allocated to either Contractual Service Margin or to Loss Component. ", "\n
The Analysis of Change is expanded with few more steps such as **Experience Adjustment** and **Amortization**." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "a3POL_T-EUqCOxc6-th4Ew", "cell_type": "code", "source": [ "var technicalMarginsReport = ifrs17Report.TechnicalMargins;", @@ -229,9 +310,13 @@ "\ntechnicalMarginsReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\ntechnicalMarginsReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await technicalMarginsReport.ToReportAsync) with {Height = 600}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "gPdzoyThOU--U7xX2ECoQQ", "cell_type": "markdown", "source": [ "# Contractual Service Margin / Loss Component / Loss Recovery Component", @@ -239,9 +324,13 @@ "\nThe Contractual Service Margin (CSM) / Loss Component (LC) / Loss Recovery Component (LR) [report](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#technical-margin) are here shown side by side as the allocation to profit or loss is done at each step of the Analysis of Change. ", "\n", "\nA default slice by EstimateType - which distinguish between CSM, LC and LR contributions - is automatically enforced. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "FmXWfR1g2EmvLBkN1e-E9w", "cell_type": "code", "source": [ "var allocatedTechnicalMarginsReport = ifrs17Report.AllocatedTechnicalMargins;", @@ -250,17 +339,25 @@ "\nallocatedTechnicalMarginsReport.ColumnSlices = new string[]{\"GroupOfContract\", \"EstimateType\"};//\"GroupOfContract\", \"AmountType\"", "\nallocatedTechnicalMarginsReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await allocatedTechnicalMarginsReport.ToReportAsync) with {Height = 700}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wy3GYkeG5UKsa50J8R17YQ", "cell_type": "markdown", "source": [ "# LRC Actuarial", "\n", "\nThe [Actuarial Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#lrc-actuarial-actuarial-liability-for-remaining-coverage) report shows figures from Fulfilment Cashflow discounted with current yield curve, and the allocated techinical margin. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Xpp0x9HDlkihJkci0h4Fmw", "cell_type": "code", "source": [ "var actuarialLrcReport = ifrs17Report.ActuarialLrc;", @@ -269,17 +366,25 @@ "\nactuarialLrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", "\nactuarialLrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await actuarialLrcReport.ToReportAsync) with {Height = 750}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "k6LnLkmNYkytkmkTkJLNJg", "cell_type": "markdown", "source": [ "# LRC", "\n", "\nThe [Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#lrc-liability-for-remaining-coverage) report adds to the [Actuarial Liability for Remaining Coverage](#lrc-actuarial) the contribution of and accrual actuals. A simplified Aoc Chain is used to allow comparison of the balance change between Actuals and Present Values. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pnSRXZw4G0mlrw6Balh3Eg", "cell_type": "code", "source": [ "var lrcReport = ifrs17Report.Lrc;", @@ -288,17 +393,25 @@ "\nlrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\",", "\nlrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await lrcReport.ToReportAsync) with {Height = 250}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "IEpuI6z2ZkSjC4N-wWpnXw", "cell_type": "markdown", "source": [ "# LIC Actuarial", "\n", "\nThe [Actuarial Liability of Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#lic-actuarial-actuarial-liability-for-incurred-claims) report shows figures from Fulfilment Cashflow discounted with current yield curve. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yS3hZ7c9YEWHWZPTNX-rhw", "cell_type": "code", "source": [ "var actuarialLicReport = ifrs17Report.ActuarialLic;", @@ -307,17 +420,25 @@ "\nactuarialLicReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\nactuarialLicReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await actuarialLicReport.ToReportAsync) with {Height = 750}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bo9xgnvtk0CRHOeS9vTULg", "cell_type": "markdown", "source": [ "# LIC", "\n", "\nThe [Liability for Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#lic-liability-for-incurred-claims) adds to the [Actuarial Liability for Incurred Claims](#lic-actuarial) the contribution of and accrual actuals." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "88vqIH2CvUaR5ukjOZzJwQ", "cell_type": "code", "source": [ "var licReport = ifrs17Report.Lic;", @@ -326,9 +447,13 @@ "\nlicReport.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", "\nlicReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await licReport.ToReportAsync) with {Height = 250}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "euXCVCpFJ0-az91gK8ZAjg", "cell_type": "markdown", "source": [ "# Financial Performance", @@ -336,9 +461,13 @@ "\nThe [Financial Performance](https://portal.systemorph.cloud/project/ifrs17/env/v1.0.0/Report/ReportScopes#ifrs-17-financial-performance) report discloses the Change in Estimate of the IFRS 17 balance sheet items ([LRC](#lrc) and [LIC](#lic)) and the relevant incurred cashflows (Premiums, Claims, Expenses, etc...) for the given period.", "\n", "\nUse the expand and collapse buttons in the report rows to change the granularity of the figures displayed." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "s-A7Z24en0CV_hj-p9F5rQ", "cell_type": "code", "source": [ "var financialPerformanceReport = ifrs17Report.FinancialPerformance;", @@ -347,13 +476,20 @@ "\nfinancialPerformanceReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", "\nfinancialPerformanceReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await financialPerformanceReport.ToReportAsync) with { Height = 900, GroupDefaultExpanded = 3}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "K9KFyJWxWEeHa2Pc1M54LQ", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/AocStructureTest.ipynb b/full-ifrs17-template/Test/AocStructureTest.ipynb index 7a350bb4..b84e90da 100644 --- a/full-ifrs17-template/Test/AocStructureTest.ipynb +++ b/full-ifrs17-template/Test/AocStructureTest.ipynb @@ -18,45 +18,70 @@ "nbformat_minor": 5, "cells": [ { + "id": "2SRO3ShzLkaZ7qWN8RvZ7Q", "cell_type": "markdown", "source": [ "

Test Aoc Management

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "M1VllEPGS0OhlSQ3uJd1eQ", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "hNl7XCToMUKSzhT3hzDPeQ", "cell_type": "markdown", "source": [ "# Workspace Initialization " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bQMzNpxXeUuoDw7sLQ_FJA", "cell_type": "code", "source": [ "Workspace.Initialize(x => x.FromSource(DataSource)", "\n .DisableInitialization()", "\n .DisableInitialization());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_wLRhB1_zkK24aHF4LmP7Q", "cell_type": "markdown", "source": [ "# Test" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "vNuhxD_Qo0GuHabTN1NA5g", "cell_type": "code", "source": [ "var reportingNode = \"CH\";", "\nvar scenario = (string)null;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9v46vtb-bUqHEbNG5SyPhw", "cell_type": "code", "source": [ "//Define partition", @@ -68,9 +93,13 @@ "\n Month = args.Month };", "\nawait DataSource.UpdateAsync(new[]{partition});", "\nawait DataSource.CommitAsync();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Btn83FlNYE6_Ql5XGVzmIg", "cell_type": "code", "source": [ "public async Task CheckAocStepStructureAsync(IEnumerable inputVariables, ", @@ -213,27 +242,43 @@ "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", "\n}", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "aFfmV7Ms80WfX9f9H0_wXQ", "cell_type": "markdown", "source": [ "# Use Cases" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "mzSm3LewcEmN0pzLELyAoQ", "cell_type": "markdown", "source": [ "## Gross Cashflow: InForce, NewBusiness, and Combined" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_4kokfPYeUyHMwvE0QmYfA", "cell_type": "code", "source": [ "var groupOfContract = \"DT1.1\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0e0Hl6UeEkeKZFmm1F23BA", "cell_type": "code", "source": [ "var inputRawVariables = new RawVariable[]{", @@ -243,9 +288,13 @@ "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", "\n};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Dz725xYrTU2lcT7unwrpWg", "cell_type": "code", "source": [ "var parentBm = new Dictionary>()", @@ -255,9 +304,13 @@ "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "gJi4A4oY9kSR1jm_-0Ottw", "cell_type": "code", "source": [ "var referenceBm = new Dictionary()", @@ -277,9 +330,13 @@ "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "o71ZpBEymEioQHtRrczoDw", "cell_type": "code", "source": [ "var fullAocBm = new Dictionary>()", @@ -311,27 +368,43 @@ "\n }},", "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "c2lCvWF2M0KxFyXg23xR5Q", "cell_type": "code", "source": [ "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fQPs1GfVgUGI3A2oi6ES_Q", "cell_type": "markdown", "source": [ "## Reinsurance Cashflow: InForce, NewBusiness, and Combined" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Y5UQw3aQ00Kwj2FwQlwFqA", "cell_type": "code", "source": [ "groupOfContract = \"DTR1.1\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "gmZ98jyVhE-gKbFFWdRM_A", "cell_type": "code", "source": [ "inputRawVariables = new RawVariable[]{", @@ -341,9 +414,13 @@ "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"EV\", Novelty = \"N\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", "\n};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CASGAQ4Tfk-r5qegnk_VTg", "cell_type": "code", "source": [ "parentBm = new Dictionary>()", @@ -354,9 +431,13 @@ "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CLL4jQwmfEe6fmoqWNjZGw", "cell_type": "code", "source": [ "var parentBm_CDR = new Dictionary>()", @@ -367,9 +448,13 @@ "\n {new AocStep(\"EV\",\"N\"), new AocStep[]{new AocStep(\"BOP\",\"N\")}},", "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"CRU\",\"I\"), new AocStep(\"EV\",\"N\"),}},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6WWtvNB4FUO7jnbMl-3d6Q", "cell_type": "code", "source": [ "referenceBm = new Dictionary()", @@ -391,9 +476,13 @@ "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "I_If6UTWpUCQqU0iKSjSng", "cell_type": "code", "source": [ "fullAocBm = new Dictionary>()", @@ -428,27 +517,43 @@ "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", "\n ", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HtMAFjHCU0qgleOtt6J70A", "cell_type": "code", "source": [ "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm, parentBm_CDR)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "C7fWPcfSOU2tKgZUhmqOQA", "cell_type": "markdown", "source": [ "## Cashflow: InForce, and Combined" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zKke0guumkSXcJBCS71Uew", "cell_type": "code", "source": [ "var groupOfContract = \"DT1.1\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_18dqpvWvUqCFX2z2M5WfA", "cell_type": "code", "source": [ "inputRawVariables = new RawVariable[]{", @@ -456,9 +561,13 @@ "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"MC\", Novelty = \"I\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", "\n new RawVariable{Partition = partition.Id, Values = new []{1.0}, DataNode = groupOfContract, AocType = \"CL\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\"},", "\n};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9J919h-K1kqu1tAGwVWYdw", "cell_type": "code", "source": [ "parentBm = new Dictionary>()", @@ -467,9 +576,13 @@ "\n {new AocStep(\"YCU\",\"I\"), new AocStep[]{new AocStep(\"MC\",\"I\")}}, ", "\n {new AocStep(\"CL\",\"C\"), new AocStep[]{new AocStep(\"YCU\",\"I\")}},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZE7AsxQoG02Qol7pRFbtXA", "cell_type": "code", "source": [ "referenceBm = new Dictionary()", @@ -485,9 +598,13 @@ "\n {new AocStep(\"EOP\",\"C\"), new AocStep(\"CL\",\"C\")},", "\n {new AocStep(\"CF\",\"C\"), new AocStep(\"CF\",\"C\")},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ay6veykrjkKNWneUWBpL7Q", "cell_type": "code", "source": [ "fullAocBm = new Dictionary>()", @@ -509,27 +626,43 @@ "\n new AocStep(\"CL\",\"C\"), new AocStep(\"EA\",\"C\"), new AocStep(\"AM\",\"C\"),}},", "\n //{new AocStep(\"CF\",\"C\"), Enumerable.Empty()},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "eHYrP4DJXUy7BsFDUCcJwg", "cell_type": "code", "source": [ "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "m7BQFO0kqUiHx6TEe7OuIw", "cell_type": "markdown", "source": [ "## Actual" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_ic5CYtWrE24qDPr1qGI1Q", "cell_type": "code", "source": [ "var groupOfContract = \"DT1.1\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "uANg5ulWwkiuBtfSR0K1eg", "cell_type": "code", "source": [ "var inputIfrsVariables = new IfrsVariable[]{", @@ -538,21 +671,33 @@ "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"CF\", Novelty = \"C\", AccidentYear = null, AmountType = \"ACA\", EstimateType = \"A\"},", "\n new IfrsVariable{Partition = partition.Id, Value = 1.0, DataNode = groupOfContract, AocType = \"WO\", Novelty = \"C\", AccidentYear = null, AmountType = \"PR\", EstimateType = \"OA\"},", "\n};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "l0y2QdR_O0mtdza797CLAw", "cell_type": "code", "source": [ "parentBm = null;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "SnSLmJ6Ph0SdiyWLD5gXAg", "cell_type": "code", "source": [ "referenceBm = null;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pFoRvT0Vj0qccKEeuynz9w", "cell_type": "code", "source": [ "fullAocBm = new Dictionary>()", @@ -563,19 +708,30 @@ "\n {new AocStep(\"AM\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"), new AocStep(\"WO\",\"C\"),}},", "\n {new AocStep(\"EOP\",\"C\"), new AocStep[]{new AocStep(\"BOP\",\"I\"), new AocStep(\"CF\",\"C\"), new AocStep(\"WO\",\"C\"), new AocStep(\"AM\",\"C\"),}},", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fCPrGixu902KzS2gDA_COA", "cell_type": "code", "source": [ "await CheckAocStepStructureAsync(inputIfrsVariables, parentBm, referenceBm, fullAocBm)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "UKC3B3KBzEu2chdA44RYWQ", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/ExportIfrsVariable.ipynb b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb index f844924b..268dbcda 100644 --- a/full-ifrs17-template/Test/ExportIfrsVariable.ipynb +++ b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb @@ -18,59 +18,92 @@ "nbformat_minor": 5, "cells": [ { + "id": "gyniYqnKikqyyeZwKE3w_A", "cell_type": "markdown", "source": [ "

Test Reports

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "b-vYp0gzsEG2ZbVtT_7kZA", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "AnHy7aq_1UCdpDokxEg1ug", "cell_type": "markdown", "source": [ "# BenchMarks" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jYkLXYmEE0SzZNcORVzVyg", "cell_type": "code", "source": [ "var pathToBm = \"./Data/ReportBenchmarks/\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ntINVSp7zUe_bdSYQISwRQ", "cell_type": "code", "source": [ "var argsArray = new ImportArgs[]{", "\n new ImportArgs (\"CH\", 2020, 12, Periodicity.Quarterly, null, null),", "\n new ImportArgs (\"CH\", 2021, 3, Periodicity.Quarterly, null, null)", "\n };" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XQD2qkj4kEmun05vfKjBXg", "cell_type": "code", "source": [ "var scenario = \"MTUP10pct\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "K0v3eoXQ-0GR5wQUavZZdA", "cell_type": "code", "source": [ "var args = new ImportArgs (\"CH\", 2020, 12, Periodicity.Quarterly, scenario, null);", "\nawait DataSource.Partition.SetAsync(new {ReportingNode = args.ReportingNode, Year= args.Year, Month = args.Month, Scenario = args.Scenario});", "\nvar computedVariables = (await DataSource.Query().ToArrayAsync()).ToDictionaryGrouped(x => x.EstimateType, x => x.ToArray());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "RLE-nEp_AEC80dTOOpOuEw", "cell_type": "code", "source": [ "(0, computedVariables.Keys)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "JLu16Jzr1E2J_BrBOUhoAQ", "cell_type": "code", "source": [ "var estimateType = \"BEPA\";", @@ -90,13 +123,20 @@ "\n )", "\n .WithSource(DataSource)", "\n .ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "VMRDuKeShkua9CR3XEa9Uw", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/ExportReportVariables.ipynb b/full-ifrs17-template/Test/ExportReportVariables.ipynb index 65d0e2cb..d9e1a630 100644 --- a/full-ifrs17-template/Test/ExportReportVariables.ipynb +++ b/full-ifrs17-template/Test/ExportReportVariables.ipynb @@ -18,85 +18,138 @@ "nbformat_minor": 5, "cells": [ { + "id": "w3hTos8PYE2anJHmCX5-og", "cell_type": "markdown", "source": [ "

Report Variable Exporter

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HpEqqWuC7kuRLHoeY6YLaA", "cell_type": "markdown", "source": [ "# Infrastructure and Configuration" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3Gteb02znkyyorr1rK8qrg", "cell_type": "markdown", "source": [ "## Initialize Workspace" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CHzk0G-F6EqVRewucQ24Tw", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "BYSXWDg9fkKVxwArMwDo2w", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "EhBxY5wLOkSrpUozXxisOA", "cell_type": "markdown", "source": [ "## Imports and Configurations" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "S02JZwmkG0epPmZbsUR7dg", "cell_type": "code", "source": [ "#!import \"ReportVariablesTestBase\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oJbkEK0FXkirjq30Wu873w", "cell_type": "markdown", "source": [ "## Storage" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "r-VrgwtMV0WNk2B4EJSZ7w", "cell_type": "code", "source": [ "var reportStorage = new ReportStorage(Workspace, Report);", "\nawait reportStorage.InitializeReportIndependentCacheAsync();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "D2-Sfwcbk0S_kDpIUPw9qw", "cell_type": "markdown", "source": [ "## Configurations" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fST1ooZG606uxzvrn9n86w", "cell_type": "code", "source": [ "//var path = \"./Data/ReportVariableBenchmarks/\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YG-CpjjbQk6oQcpgxXt23w", "cell_type": "markdown", "source": [ "# Defining Scope for the Reports and Tests" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_0V0ZWihnk-d3zNj56ZvcQ", "cell_type": "markdown", "source": [ "### Defining the Period and Reporting Node (...) for the Reports" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "QPJPvzqJqU20dfRXkgSKCA", "cell_type": "code", "source": [ "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType)[] exportScope = {", @@ -108,15 +161,23 @@ "\n// ((2021, 3), \"CH\", null, CurrencyType.Functional),", "\n// ((2021, 3), \"CH\", null, CurrencyType.Group),", "\n};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "doLfGk3ZY0O0B-1OJ93Eww", "cell_type": "markdown", "source": [ "# Export" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "J-gceJlUTEWA3b-_lA8jqQ", "cell_type": "code", "source": [ "// foreach(var args in exportScope){", @@ -124,29 +185,44 @@ "\n// var bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";", "\n// await Export.ToCsv(path + bmFileName).WithTable(tableConfig => tableConfig.WithSource(source => scopesData.AsQueryable())).ExecuteAsync(); ", "\n// }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wimBAI-AxUamvGEoBsgvLQ", "cell_type": "code", "source": [ "var args = exportScope.First();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "g7w8cfsKC0uqqa8Hk-tvig", "cell_type": "code", "source": [ "var scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", "\nvar bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "qIKmkC8tI0afnRzqSzu3Bg", "cell_type": "code", "source": [ "await Export.ToCsv(bmFileName)", "\n .WithTable(tableConfig => tableConfig.WithSource(source => scopesData.AsQueryable()))", "\n .WithSource(Workspace)", "\n .ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb index 78347e9c..95525812 100644 --- a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb +++ b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb @@ -18,36 +18,57 @@ "nbformat_minor": 5, "cells": [ { + "id": "6scxNAfeaEKQpsdiYwPBiQ", "cell_type": "markdown", "source": [ "

Ifrs Variable

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "M5pmNZSIl0-IBqNKyS2OJw", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "eEnHiGXZuk-HmFq5k-uskQ", "cell_type": "markdown", "source": [ "# BenchMarks" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "c8Ih_f5ou0GfWn7tGD0NjA", "cell_type": "code", "source": [ "var pathToBm = \"./Data/IfrsVariableBenchmarks/\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ady4_q_75kOPCb0L_OoTuA", "cell_type": "code", "source": [ "public record BenchmarkMetadata(string FileName, string ReportingNode, int Year, int Month, string Scenario = null){} " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "FxYB_odz5kauR7Tzov4FBA", "cell_type": "code", "source": [ "var bmFiles = new BenchmarkMetadata[]{", @@ -86,27 +107,43 @@ "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_L.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_RA.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", "\n};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Jpf73ojEzEuugf6Eb4VxLg", "cell_type": "code", "source": [ "var excludedDataNodes = new[] {\"DT5.1\"}; // DT5.1 is simple importer and tested at report variable level" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Obh-9GjSVk-Kzliv3vZWlA", "cell_type": "markdown", "source": [ "# Functions" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_CiTAc6k0UGmQqN2FL2rpQ", "cell_type": "code", "source": [ "public static NumberStyles AllowedNumberStyles = NumberStyles.Float | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowLeadingSign | NumberStyles.AllowTrailingSign | NumberStyles.AllowDecimalPoint;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8qbu0w9W6kOkf3L8Z9xYmQ", "cell_type": "code", "source": [ "public IfrsVariable CreateVariable (IDataRow row, Guid partition)", @@ -125,9 +162,13 @@ "\n Value = (-1.0) * doubleValue,", "\n };", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZSYfIGNm802cO89G2pEZJg", "cell_type": "code", "source": [ "public class BenchmarkTestResult", @@ -146,9 +187,13 @@ "\n ComputedValue = compValue; ", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WJCUw1Sgj0CdzcF6Odsd5w", "cell_type": "code", "source": [ "public List CompareAgainstBm (List errors, IEnumerable expected, IEnumerable computed)", @@ -189,15 +234,23 @@ "\n }", "\n return errors;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DdmDeyIpBUmkeNdMAzoCzw", "cell_type": "markdown", "source": [ "# Test Runner" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Z0IH9izEb0ShMy_VUmBNnA", "cell_type": "code", "source": [ "public bool ValidateMainTab(IDataRow mainRow, string reportingNode, int year, int month)", @@ -210,9 +263,13 @@ "\n ", "\n return reportingNode == mainReportingNode && year == mainYear && month == mainMonth;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Dsc_qCZWK0K7nrTWLfr_8A", "cell_type": "code", "source": [ "var errorList = new List();", @@ -260,25 +317,40 @@ "\n errorList = errorList.Concat(CompareAgainstBm(errorList, bmVariables, computedVariables)).Distinct().ToList();", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "uhA9D1gG6UC-WWEIVAGg6g", "cell_type": "code", "source": [ "errorList.Count().Should().Be(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yZXBFdNw30mnd_LjNJ-WeQ", "cell_type": "code", "source": [ "errorList" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "q7f3jcfZBUC5JR4OObHU8Q", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/ImportStorageTest.ipynb b/full-ifrs17-template/Test/ImportStorageTest.ipynb index bb0d0a2e..0fa50ad3 100644 --- a/full-ifrs17-template/Test/ImportStorageTest.ipynb +++ b/full-ifrs17-template/Test/ImportStorageTest.ipynb @@ -18,47 +18,72 @@ "nbformat_minor": 5, "cells": [ { + "id": "4V1Y85K3S0mh2c_A3peNmQ", "cell_type": "markdown", "source": [ "

Import Storage Test

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "PWZUG1NwMkCYuH0xNoicJQ", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oYCixA-P702eBHkRn7BP-A", "cell_type": "markdown", "source": [ "# Workspace Initialization " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "klkTq3g0X0ShwTF3rFiJug", "cell_type": "code", "source": [ "Workspace.Initialize(x => x.FromSource(DataSource)", "\n .DisableInitialization()", "\n .DisableInitialization());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5LVp8kBA5kq29eX43K0yDA", "cell_type": "markdown", "source": [ "# Test IfrsVariables Query" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Cz4yiK0cikSAdKQTs5lIiw", "cell_type": "code", "source": [ "var gic = \"DT1.1\";", "\nvar gric = \"DTR1.1\";", "\nvar reportingNode = \"CH\";", "\nvar scenario = (string)null;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ek6ue64fhU2TykP20XAnng", "cell_type": "code", "source": [ "//Define partition", @@ -76,9 +101,13 @@ "\n Month = args.Month };", "\nawait DataSource.UpdateAsync(new[]{partition, previousPeriodPartition});", "\nawait DataSource.CommitAsync();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sbwZeNrQ8EOHB4SUYpHtSg", "cell_type": "code", "source": [ "public async Task CheckIfrsVariablesFromImportStorageAsync(string importFormat, IEnumerable inputDataSetForWorkspace, IEnumerable inputDataSetForDataSource, IEnumerable ivsBenchmark)", @@ -112,9 +141,13 @@ "\n ", "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Anr6vl-t3UC5nTGfEVzRxA", "cell_type": "code", "source": [ "//There is a previous year, and it's the first time Actuals are imported for the current year", @@ -137,9 +170,13 @@ "\n };", "\n", "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "tE0Ru932CUGtOoYd5VsKgw", "cell_type": "code", "source": [ "//There is a previous year, and it's the second time Actuals are imported for the current year (reimport)", @@ -167,9 +204,13 @@ "\n };", "\n", "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fWKZntzNbUSeFnicGWY8qg", "cell_type": "code", "source": [ "//There is a previous year, Cashflows were already imported and Actuals are imported for the first time", @@ -199,9 +240,13 @@ "\n };", "\n", "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "AVGmHZJBB0eWrY6cU1ZGHw", "cell_type": "code", "source": [ "//There is a previous year, Cashflows and Actuals were already imported and Actuals are imported again", @@ -239,9 +284,13 @@ "\n };", "\n", "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WZ5UNLEbQEaqkkw1Eal-Sg", "cell_type": "code", "source": [ "//There is a previous year for Primary Scope (GRIC10) ", @@ -289,21 +338,33 @@ "\n };", "\n", "\nawait CheckIfrsVariablesFromImportStorageAsync(ImportFormats.Actual, inputDataSetForWorkspace, inputDataSetForDataSource, ivsBenchmark);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "U-aIdwuQhEO1mNg6s_O8RQ", "cell_type": "markdown", "source": [ "# Data Node Parameter related logic" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CgIPciXcd0yoh5eSyjtWLQ", "cell_type": "markdown", "source": [ "## Data Preparation" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8sToc40RHEyX6mnl6-2JeQ", "cell_type": "code", "source": [ "//Define partition", @@ -321,9 +382,13 @@ "\nvar previousPeriodPartition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year - 1 && ", "\n x.Month == MonthInAYear && x.Scenario == args.Scenario);", "\nif(previousPeriodPartition == null) ApplicationMessage.Log(Error.PartitionNotFound);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dj0d1i45IUCPGcUYSFqF1g", "cell_type": "code", "source": [ "var sampleGic = new GroupOfInsuranceContract(){Portfolio = \"P1\"};", @@ -360,9 +425,13 @@ "\n };", "\n", "\nvar sampleRawVar = new RawVariable{AmountType = AmountTypes.PR, AocType = AocTypes.CL, Novelty = Novelties.C, Partition = currentPartition.Id};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5tLIwPwQlE6Q-Mmjt5qABw", "cell_type": "code", "source": [ "public async Task PrepareWorkspaceDataNodes()", @@ -372,9 +441,13 @@ "\n await Workspace.UpdateAsync(inputDataState);", "\n await Workspace.UpdateAsync(inputDataParameter);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "lvmU4I0au0KQSSOu4P0Oaw", "cell_type": "code", "source": [ "public async Task CleanWorkspaceDataNodes()", @@ -384,15 +457,23 @@ "\n await Workspace.DeleteAsync(inputDataState);", "\n await Workspace.DeleteAsync(inputDataParameter);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8RVSgsGTckq6uDozpgV2Xg", "cell_type": "markdown", "source": [ "## Get Underlying Gic" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "g7MyEgjcT0mIl4njOQldiA", "cell_type": "code", "source": [ "public async Task CheckGetUnderlyingGicsAsync(RawVariable[] inputDataVariable, Dictionary> underlyingGicBm)", @@ -417,9 +498,13 @@ "\n await CleanWorkspaceDataNodes();", "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_LC1ibvA6k-LB8A_F-ZPJA", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -431,9 +516,13 @@ "\n};", "\n", "\nawait CheckGetUnderlyingGicsAsync(inputDataVariable, underlyingGicBm);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wt4c0eVk5EiGCnz9mj-E6g", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins2\"},", @@ -443,15 +532,23 @@ "\n};", "\n", "\nawait CheckGetUnderlyingGicsAsync(inputDataVariable, underlyingGicBm);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rHRLxr4v60KlzL_XBkR4dg", "cell_type": "markdown", "source": [ "## Get Reinsurance Coverage" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "y3-b6njLFkOwrNvRICbFTw", "cell_type": "code", "source": [ "public async Task CheckGetReinsuranceCoverageAsync(RawVariable[] inputDataVariable, ", @@ -495,9 +592,13 @@ "\n await CleanWorkspaceDataNodes();", "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3DoFFjphUk23ycw7uCoS-Q", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -516,15 +617,23 @@ "\n};", "\n", "\nawait CheckGetReinsuranceCoverageAsync(inputDataVariable, reinsCovBoPBm, reinsCovEoPBm);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9SN-SI-1Z0yDm8u66Z2x9Q", "cell_type": "markdown", "source": [ "## Primary and Secondary Scope" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0rLWKbTR00WV1wWkicVaaQ", "cell_type": "code", "source": [ "public async Task CheckSecondaryScopeAsync(RawVariable[] inputDataVariable, string[] primaryScopeBm, string[] secondaryScopeBm)", @@ -559,9 +668,13 @@ "\n await CleanWorkspaceDataNodes();", "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YdutG30Sxkit5d7-NlYKpg", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -570,9 +683,13 @@ "\nvar primaryScopeBm = new string[]{\"Reins1\", \"Reins2\"};", "\nvar secondaryScopeBm = new string[]{\"Gross1\", \"Gross2\"};", "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ktz7zDRMKUayJsk8d4qJDg", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -580,9 +697,13 @@ "\nvar primaryScopeBm = new string[]{\"Reins1\"};", "\nvar secondaryScopeBm = new string[]{\"Gross1\"};", "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "roTIyck4jUGmeXE_NdMzFA", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -591,13 +712,20 @@ "\nvar primaryScopeBm = new string[]{\"Reins1\",\"Gross1\",\"Reins2\"};", "\nvar secondaryScopeBm = new string[]{\"Gross2\"};", "\nawait CheckSecondaryScopeAsync(inputDataVariable, primaryScopeBm, secondaryScopeBm);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ia3QbwB_qE-OLOF3bFIIow", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb index 92b8091b..313984c2 100644 --- a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb +++ b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb @@ -18,90 +18,147 @@ "nbformat_minor": 5, "cells": [ { + "id": "5pJ9_h3JCkqu1VYGsHT6Ig", "cell_type": "markdown", "source": [ "

Test Map Template Export and Import

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wKj_RnoNyEmjYuzGN_J2ug", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "etRLzU1SR0KckKJ-yD-P8Q", "cell_type": "markdown", "source": [ "# Test Empty Database" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yKo9EdsuY0SaaQ7gp23QdQ", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "g50tzVTlvEqwzOtT6Vpj7A", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DU0jOj1B-0-pm6boDCGI4A", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4IuR29t8mkK5gCycGzQoeA", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "07qbwfjHbkywAJxFtlnxbA", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "BcOSQ2sTfkC6Y1bwQUDwzw", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "OzlMeIunREmpcZOAWqbnMw", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yhLainJEZU6uJlBFKAYzcg", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0OvZDdON4UGP-MhvLpIkmw", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "p9wR_qEd2kq7Ivro5jR4MA", "cell_type": "markdown", "source": [ "# Test Map Template" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wpwTbPXYtE2ecKT7QHQp9g", "cell_type": "markdown", "source": [ "## Data Node" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wWGCIr86_0yXgnuWRYSopA", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", @@ -127,9 +184,13 @@ "\n.ExecuteAsync();", "\n", "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "vbfz9uVrmEC0qFFSYb2zlw", "cell_type": "code", "source": [ "await Export.ToExcel(filename)", @@ -140,9 +201,13 @@ "\n .GroupofContractConfiguration(typeof(InsurancePortfolio))", "\n .MainTabConfigurationWoScenario(partition)", "\n.ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5xqalt9bUEaXe1Sy6xOR6w", "cell_type": "code", "source": [ "// Run this only after having imported the file exported in the above cell.", @@ -172,21 +237,33 @@ "\nUtils.EqualityComparer(gics, Workspace.Query().ToArray());", "\nUtils.EqualityComparer(grics, Workspace.Query().ToArray());", "\n*/" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rir7jijjqk-YTZyHTWzY3A", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XnNuBPlC1kS4RpEgM99EFg", "cell_type": "markdown", "source": [ "## Data Node State" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pCBweGbCdEuZJs8OgKqxFQ", "cell_type": "code", "source": [ "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2021, Month = 3 };", @@ -211,9 +288,13 @@ "\n.ExecuteAsync();", "\n", "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "vJAZZKAcXE6xZTu-pHEr-g", "cell_type": "code", "source": [ "await Export.ToExcel(filename)", @@ -222,9 +303,13 @@ "\n .DataNodeStateConfiguration(dataNodeStates)", "\n .MainTabConfigurationWoScenario(partition)", "\n.ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "50DfYVJTrUi11ZM4hb0TrA", "cell_type": "code", "source": [ "// Run this only after having imported the file exported in the above cell.", @@ -245,21 +330,33 @@ "\n// Workspace is empty because ValidateDataNodeStatesAsync removes the entry, since this is already present in the DataSource.", "\nWorkspace.Query().ToArray().Should().BeEmpty();", "\n*/" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bJbigaiL_EaFa7Fwx7AH0Q", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pcaBVu-LgUu_4cP8fqy6Ug", "cell_type": "markdown", "source": [ "## DataNodeParameter" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "j05en4nLBkCnDSt4QqP_lw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", @@ -287,9 +384,13 @@ "\n.ExecuteAsync();", "\n", "\nexportResult.ActivityLog.Status.Should().Be(ActivityLogStatus.Succeeded);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zs5pxexv-k-GWOtbsvg3Ug", "cell_type": "code", "source": [ "await Export.ToExcel(filename)", @@ -297,9 +398,13 @@ "\n .DataNodeParameterConfiguration(dataNodeParameters)", "\n .MainTabConfiguration(partition)", "\n.ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Rmq7ED57Y02ZNBD8YHmwew", "cell_type": "code", "source": [ "// Run this only after having imported the file exported in the above cell.", @@ -327,27 +432,43 @@ "\nUtils.EqualityComparer(singleDataNodeParamBm, expectedSingleDataNodeParamBm);", "\nUtils.EqualityComparer(interDataNodeParamBm, expectedInterDataNodeParamBm);", "\n*/" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "e_0TmZvO70ejGkrK4F25ng", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Z4ZTJKWu00eZLDbEZb1V6g", "cell_type": "markdown", "source": [ "# Test Import Validation" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "R-p92PVOLUmM6Yv6RxKing", "cell_type": "markdown", "source": [ "## Data Node State: entries cannot be imported which change status from Inactive to Active" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dhRD96R8vE2HU59-grSaDg", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", @@ -373,21 +494,33 @@ "\nActivity.HasErrors().Should().Be(true);", "\nvar log = Activity.Finish().Errors.First().ToString().Substring(40);", "\n(log.Substring(0,log.Length-2) == Get(Error.ChangeDataNodeState, \"GIC1\")).Should().Be(true);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6Ax3adBDIkuMlpHuD259GA", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "OysWLQGElkmApA3NQlx07g", "cell_type": "markdown", "source": [ "## Data Node State: Validation removes the entry when the DataSource already contains a previous version " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3PbyoVI5ukuBQzBU3K4AGw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", @@ -411,21 +544,33 @@ "\n", "\n// Check that the new redundant State is removed from the Workspace", "\nWorkspace.Query().ToArray().Should().BeEmpty();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "VWtJVxUJek2A-Zhla7XVwQ", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "A_IYqoP4xEaSzN2_Vg5Utw", "cell_type": "markdown", "source": [ "## Data Node Parameters : Validations" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jnMxJBaIy0iLBPXrb0-spQ", "cell_type": "code", "source": [ "public async Task CheckErrors(string inputFileName, List errorBms)", @@ -434,9 +579,13 @@ "\n Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\n errorBms.Intersect(log.Errors.Select(x => x.ToString().Substring(0,x.ToString().Length-2).Substring(40)).ToArray()).Count().Should().Be(errorBms.Count());", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "GFhYIK8kQU2Qo1jjODs8_w", "cell_type": "code", "source": [ "var inputFileName = \"Data/DataNodeParameter_InvalidDataNode.csv\";", @@ -444,30 +593,45 @@ "\n Get(Error.InvalidDataNode, \"DataNodeInvalid1\"),", "\n Get(Error.InvalidDataNode, \"DataNodeInvalid2\")};", "\nawait CheckErrors(inputFileName, errorsBm);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "uY5fv5iAuUuPnKjSik1_qQ", "cell_type": "code", "source": [ "var inputFileName = \"Data/DataNodeParameter_Duplicate.csv\";", "\nvar errorsBm = new List(){Get(Error.DuplicateSingleDataNode, \"DT1.1\"),", "\n Get(Error.DuplicateInterDataNode, \"DT1.1\",\"DTR1.1\"),};", "\nawait CheckErrors(inputFileName, errorsBm);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "S_PoUgCd3kWhDZ0K3Dp5ng", "cell_type": "code", "source": [ "var inputFileName = \"Data/DataNodeParameter_InvalidReinsCov.csv\";", "\nvar errorsBm = new List(){Get(Error.ReinsuranceCoverageDataNode, \"DT1.1\",\"DT1.1\")};", "\nawait CheckErrors(inputFileName, errorsBm);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CPwWIPYorkGHUKRtmHIkdw", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/ReportStorageTest.ipynb b/full-ifrs17-template/Test/ReportStorageTest.ipynb index 5fc57968..45305ec0 100644 --- a/full-ifrs17-template/Test/ReportStorageTest.ipynb +++ b/full-ifrs17-template/Test/ReportStorageTest.ipynb @@ -18,25 +18,38 @@ "nbformat_minor": 5, "cells": [ { + "id": "D-7JQE_SnUOihXCor_sygQ", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rSHUxHrWf0eGpJlmtEieVw", "cell_type": "markdown", "source": [ "# Test Exchange Rate Query" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bfJP3e-LP0uEsVPX1d-owg", "cell_type": "code", "source": [ "Workspace.Initialize(x => x.FromSource(DataSource)", "\n .DisableInitialization());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "O-C-vhVxNkupDBDl38H7hw", "cell_type": "code", "source": [ "public async Task CheckGetFx(string currentCurrency, string targetCurrency, int year, int month, IEnumerable testData, double fxBOPBenchmark, double fxAVGBenchmark, double fxEOPBenchmark)", @@ -60,9 +73,13 @@ "\n ", "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "mbralKJV4Uu31Rk1uV7qzA", "cell_type": "code", "source": [ "var testData = new ExchangeRate[] {new ExchangeRate{ Currency = \"EUR\", Year = 2020, Month = 12, FxType = FxType.Spot, FxToGroupCurrency = 10 }, ", @@ -73,19 +90,30 @@ "\n new ExchangeRate{ Currency = \"USD\", Year = 2021, Month = 6, FxType = FxType.Average, FxToGroupCurrency = 2 },", "\n new ExchangeRate{ Currency = \"USD\", Year = 2021, Month = 6, FxType = FxType.Spot, FxToGroupCurrency = 0.5 }};", "\nawait CheckGetFx(\"EUR\", \"USD\", 2021, 6, testData, 2, 10, 60);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3unkYVADQEGtn7_7XVHPEg", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rQ4xwp8ggUKcrL-V3XIOcA", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/ReportVariablesTest.ipynb b/full-ifrs17-template/Test/ReportVariablesTest.ipynb index cbaca38e..4e8088c9 100644 --- a/full-ifrs17-template/Test/ReportVariablesTest.ipynb +++ b/full-ifrs17-template/Test/ReportVariablesTest.ipynb @@ -18,94 +18,151 @@ "nbformat_minor": 5, "cells": [ { + "id": "n3ED-3EkxkuED3NiSerohA", "cell_type": "markdown", "source": [ "

Test Reports

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jEW2JcFV1UqH9OxxrCWEEg", "cell_type": "markdown", "source": [ "# Infrastructure and Configuration" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jrvWTVmt0U2tdCG7sYizeg", "cell_type": "markdown", "source": [ "## Imports and Configurations" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "2HW97YdZKUOnq-DRyvt3Uw", "cell_type": "code", "source": [ "#r \"nuget:FluentAssertions\" " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "w7sYIzs9ykulzszdiIyXGg", "cell_type": "code", "source": [ "#!import \"ReportVariablesTestBase\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jk5ZRZUAoUCXUNcy1_1eXA", "cell_type": "markdown", "source": [ "## Storage" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "C7GJzm1J-EuPR9aGuWZwQg", "cell_type": "code", "source": [ "var reportStorage = new ReportStorage(Workspace, Report);", "\nawait reportStorage.InitializeReportIndependentCacheAsync();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "LzDL_aRFO0etCQGzAUu0vg", "cell_type": "markdown", "source": [ "## Configurations" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Y42oT-3UIU-VktHZCgIgMA", "cell_type": "code", "source": [ "var path = \"./Data/ReportVariableBenchmarks/\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "a8qO17ZhGk2lD513BUl1kg", "cell_type": "code", "source": [ "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args;", "\nICollection scopesData;", "\nICollection benchmarkData;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yNI1-7C-DkCwPylFdztLLg", "cell_type": "markdown", "source": [ "# Test Cases" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DG6J_osu7EG_geAlI15nDQ", "cell_type": "markdown", "source": [ "## ((2020, 12), \"CH\", null, CurrencyType.Contractual)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_9qOvBWy9kWXqjvg2Ojx-Q", "cell_type": "code", "source": [ "args = ((2020, 12), \"CH\", null, CurrencyType.Contractual);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oZphaPxRS0Cr60WeHFtueA", "cell_type": "code", "source": [ "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", "\nbenchmarkData = await GetBenchmarkDataAsync(args, path, Workspace, Import);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ezagEsinVkq0-jfyCtYp9A", "cell_type": "code", "source": [ "scopesData.Should().BeEquivalentTo(benchmarkData,", @@ -118,28 +175,44 @@ "\n .Using(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, BenchmarkPrecision))", "\n .WhenTypeIs()", "\n );" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Rll-mqrAM0-4SIC9DLFDwA", "cell_type": "markdown", "source": [ "## ((2021, 3), \"CH\", null, CurrencyType.Contractual)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "O9tsdJU1VUWk5_AsCG7iQA", "cell_type": "code", "source": [ "args = ((2021, 3), \"CH\", null, CurrencyType.Contractual);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "NrAH0jftEkKUA-mvSJBY8w", "cell_type": "code", "source": [ "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", "\nbenchmarkData = await GetBenchmarkDataAsync(args, path, Workspace, Import);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "vBqjLjwokUKpiME0hFnzxQ", "cell_type": "code", "source": [ "scopesData.Should().BeEquivalentTo(benchmarkData,", @@ -152,13 +225,20 @@ "\n .Using(ctx => ctx.Subject.Should().BeApproximately(ctx.Expectation, Precision))", "\n .WhenTypeIs()", "\n );" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Q2klv4_48EmNfNAi7QNdZQ", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb index 99e9ac16..5593b6f7 100644 --- a/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb +++ b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb @@ -18,48 +18,77 @@ "nbformat_minor": 5, "cells": [ { + "id": "OfXdxxCELEGQtjyg7Em6yQ", "cell_type": "markdown", "source": [ "

Report Variable Test Base

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "MXuHvMBcyU6DSwnzBvDrOw", "cell_type": "code", "source": [ "#!import \"../Initialization/InitSystemorphToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "r3DErbUXa0GbhAkpyzPxCw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KK8NJ8Kn1kqC5rY_2kCkRg", "cell_type": "markdown", "source": [ "# Helpers" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_jzXNzU3P02T6qxgFz5DGg", "cell_type": "code", "source": [ "const string benchmarkFileNamePrefix = \"ReportVariableBenchmarks_\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CH-fLI1W7kqtm9mGUtCEfw", "cell_type": "code", "source": [ "static string GetBenchmarkFileName(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args) => args.ToString().Replace(\"(\", \"\").Replace(\")\", \"\").Replace(\" \", \"\").Replace(\",\", \"_\");" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sW00wUjChEa73rX2vWQAoA", "cell_type": "markdown", "source": [ "# Calculated" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oV0C7FIcU0e_8DCrad0TkA", "cell_type": "code", "source": [ "static ICollection GetScopesData(Systemorph.Vertex.Scopes.IScopeWithStorage universe, ICollection<(ReportIdentity, CurrencyType)> identities) {", @@ -98,9 +127,13 @@ "\n .OrderBy(v => v.GroupOfContract).ThenBy(v => v.Scenario).ThenBy(v => v.Projection).ThenBy(v => v.AccidentYear).ThenBy(v => v.EstimateType).ThenBy(v => (v.VariableType, v.Novelty))", "\n .ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8lMXT1ZNw0KM3pDqhdlmsQ", "cell_type": "code", "source": [ "static async Task> GetScopesDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, ReportStorage reportStorage, Systemorph.Vertex.Scopes.Proxy.IScopeFactory scopes ) {", @@ -109,15 +142,23 @@ "\n var universe = scopes.ForSingleton().WithStorage(reportStorage).ToScope();", "\n return GetScopesData(universe, identities);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8vcku7aLC0WSTTyYO5gapQ", "cell_type": "markdown", "source": [ "# Benchmarks" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "eUmau60eO0CVOS0nctUgDQ", "cell_type": "code", "source": [ "static async Task> GetBenchmarkDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, string path, IWorkspace workspace, IImportVariable importVariable) {", @@ -129,7 +170,10 @@ "\n workspace.Reset(x => x.ResetCurrentPartitions().ResetType());", "\n return ret;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/ScenarioTest.ipynb b/full-ifrs17-template/Test/ScenarioTest.ipynb index c86a432b..88646c21 100644 --- a/full-ifrs17-template/Test/ScenarioTest.ipynb +++ b/full-ifrs17-template/Test/ScenarioTest.ipynb @@ -16,48 +16,73 @@ "nbformat_minor": 5, "cells": [ { + "id": "AxJoK7p0ZEikTWZszSK7UQ", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bgViMPoQM02MCvRfuRHl7w", "cell_type": "markdown", "source": [ "# Context" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7Xfmz9pFvE6I6S2B4NHMGw", "cell_type": "code", "source": [ "var log = await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync();", "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\nWorkspace.Initialize(x => x.FromSource(DataSource));", "\nlog" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0VAf4yddEUOUDuScbDjM_w", "cell_type": "code", "source": [ "var log = await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync();", "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\nWorkspace.Initialize(x => x.FromSource(DataSource));", "\nlog" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "M9d9pYiEbk6gAY96p8hI2A", "cell_type": "code", "source": [ "var defaultVarsBE = Workspace.Query().ToArray();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_-nNIt_H2k2zv5Ibul0djQ", "cell_type": "markdown", "source": [ "# Scenario Cashflows" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3eInMKlI1kmMxVzPEbL7fw", "cell_type": "code", "source": [ "var cashflows_scenarioTest = @\"", @@ -70,9 +95,13 @@ "\nDT1.1,NIC,CL,C,,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5,-27.5", "\nDT1.1,CU,CL,C,,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-5.5,-3.3", "\nDT1.1,RA,CL,C,,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75,-2.75\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "S9PeLiV2B0SNvYbYxid_xA", "cell_type": "code", "source": [ "var cashflows_scenarioTest_equalTo_BestEstimate = @\"", @@ -85,18 +114,26 @@ "\nDT1.1,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25", "\nDT1.1,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3", "\nDT1.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "D62FZxiYFEunrBSsfdn96A", "cell_type": "code", "source": [ "var log = await Import.FromString(cashflows_scenarioTest).WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync();", "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\nWorkspace.Initialize(x => x.FromSource(DataSource));", "\nlog" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "TZowMnri7EaX3jCDg7pEmw", "cell_type": "code", "source": [ "await Workspace.Partition.SetAsync(new{ReportingNode = \"CH\", Scenario = \"Test\", Year = 2020, Month = 12});", @@ -104,15 +141,23 @@ "\nvar diffs = Workspace.Query().Except(defaultVarsBE, IfrsVariableComparer.Instance());", "\ndiffs.Where(x => (new[]{\"A\",\"AA\",\"OA\",\"DA\"}).Contains(x.EstimateType)).ToArray().Length.Should().Be(0);", "\ndiffs.Where(x => !(new[]{\"A\",\"AA\",\"OA\",\"DA\"}).Contains(x.EstimateType)).ToArray().Length.Should().NotBe(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "PMUFzN4SSUCmJ1DPrFqlpQ", "cell_type": "markdown", "source": [ "# Scenario Actuals" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wcUzBjX4rkmEmLoUol7Weg", "cell_type": "code", "source": [ "var actuals_scenarioTest = @\"", @@ -122,9 +167,13 @@ "\n@@Actual", "\nDataNode,AocType,ValueType,AccidentYear,Value", "\nDT1.1,CF,NIC,,-308\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "layYHEbmVky9lqX_ZWDryg", "cell_type": "code", "source": [ "var actuals_scenarioTest_equalTo_BestEstimate = @\"", @@ -134,18 +183,26 @@ "\n@@Actual", "\nDataNode,AocType,ValueType,AccidentYear,Value", "\nDT1.1,CF,NIC,,-280\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "j-dxFUVPfEaRhZpGuDPd8g", "cell_type": "code", "source": [ "var log = await Import.FromString(actuals_scenarioTest).WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync();", "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\nWorkspace.Initialize(x => x.FromSource(DataSource));", "\nlog" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZJQHdd7UWUWU5kC0i4eisw", "cell_type": "code", "source": [ "await Workspace.Partition.SetAsync(new{ReportingNode = \"CH\", Scenario = \"Test\", Year = 2020, Month = 12});", @@ -153,43 +210,66 @@ "\nvar diffs = Workspace.Query().Except(defaultVarsBE, IfrsVariableComparer.Instance());", "\ndiffs.Where(x => (new[]{\"A\",\"AA\",\"OA\",\"DA\"}).Contains(x.EstimateType)).ToArray().Length.Should().NotBe(0);", "\ndiffs.Where(x => x.EstimateType == \"CU\").ToArray().Length.Should().Be(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "csPTUe173UWekIIcmPUCuw", "cell_type": "markdown", "source": [ "# Robustness: back to Best Estimate" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "crKKS7_XGk6NeuFAgakr0g", "cell_type": "code", "source": [ "var log = await Import.FromString(actuals_scenarioTest_equalTo_BestEstimate).WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync();", "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\nWorkspace.Initialize(x => x.FromSource(DataSource));", "\nlog" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "P-sUQjsyOUSNfI7RLgEJMQ", "cell_type": "code", "source": [ "var log = await Import.FromString(cashflows_scenarioTest_equalTo_BestEstimate).WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync();", "\nWorkspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\nWorkspace.Initialize(x => x.FromSource(DataSource));", "\nlog" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Q2FeKDKw7kedk-qOC3uK4A", "cell_type": "code", "source": [ "Workspace.Query().Except(defaultVarsBE, IfrsVariableComparer.Instance()).ToArray().Length.Should().Be(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sC_GMD2sbECP6PN620THIg", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/SequenceImportTest.ipynb b/full-ifrs17-template/Test/SequenceImportTest.ipynb index cfbc24c3..927dacc9 100644 --- a/full-ifrs17-template/Test/SequenceImportTest.ipynb +++ b/full-ifrs17-template/Test/SequenceImportTest.ipynb @@ -16,106 +16,170 @@ "nbformat_minor": 5, "cells": [ { + "id": "lT6-ULeaLkCjHnJPRMVzZw", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "r8NoIEbwSUOe4IGLlZFmKw", "cell_type": "markdown", "source": [ "# Cashflow -> Actuals" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0gDULLGzvEW8v5jg0vRrjQ", "cell_type": "code", "source": [ "var ws1 = Workspace.CreateNew();", "\nws1.InitializeFrom(DataSource);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Pz3H5OYg0E26NZvdiCWCeg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(ws1).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0kv-mqLlQkquKj4WurtKzQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(ws1).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "2UA1ZnfH3UipDQ1TnW8J9A", "cell_type": "code", "source": [ "ws1.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\nws1.Initialize(x => x.FromSource(DataSource));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6Zv5wDEHp0ejngPzm70Uug", "cell_type": "code", "source": [ "var ifrsVars1 = await ws1.Query().ToArrayAsync();", "\nifrsVars1.Count()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6Ptjc2FbG0-LBe6nw1BIdA", "cell_type": "markdown", "source": [ "# Actuals -> Cashflow" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "82iAzppfNkqb5SpUKsi8pA", "cell_type": "code", "source": [ "var ws2 = Workspace.CreateNew();", "\nws2.InitializeFrom(DataSource);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "UgadDCbuM0qHwMnrQkN-TQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(ws2).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4S9H9rEKb0yCeAF4IyKWMw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(ws2).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "JqkyqzHW9Eazf8YuELjfOg", "cell_type": "code", "source": [ "ws2.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", "\nws2.Initialize(x => x.FromSource(DataSource));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "EpWHnU8f10qpBtUfsHT6MA", "cell_type": "code", "source": [ "var ifrsVars2 = await ws2.Query().ToArrayAsync();", "\nifrsVars2.Count()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HNS3Oub88kqttNJZXJ3xjw", "cell_type": "markdown", "source": [ "# Test" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XHa4H0YDOEuNvjfy0CL-8A", "cell_type": "code", "source": [ "ifrsVars1.Except(ifrsVars2, IfrsVariableComparer.Instance()).Count().Should().Be(0);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "q7E4H2BDAke4TLC0oSQtuA", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/TechnicalMarginTest.ipynb b/full-ifrs17-template/Test/TechnicalMarginTest.ipynb index 827833ed..8256ed07 100644 --- a/full-ifrs17-template/Test/TechnicalMarginTest.ipynb +++ b/full-ifrs17-template/Test/TechnicalMarginTest.ipynb @@ -18,45 +18,70 @@ "nbformat_minor": 5, "cells": [ { + "id": "i-PJ_EbKKUuy-mN1LlBMNQ", "cell_type": "markdown", "source": [ "

Technical Margin Allocation

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0nWYqIzjFEiBzB7hPQOrWw", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6Wpl9e-2Ike62_H1mswKBQ", "cell_type": "markdown", "source": [ "# Workspace Initialization " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "hXJrXlCyBUWqzF9TYY4pQg", "cell_type": "code", "source": [ "Workspace.Initialize(x => x.FromSource(DataSource)", "\n .DisableInitialization()", "\n .DisableInitialization());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dsGn5owwTkSqoOzILS2fuA", "cell_type": "markdown", "source": [ "# Test switch logic" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "FAJtV21jM0SnurHMD958jw", "cell_type": "code", "source": [ "//define group of contract", "\nvar groupOfContract = \"DT1.1\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_r9tBgRmo0yWpWOrVOogww", "cell_type": "code", "source": [ "//Define partition", @@ -64,9 +89,13 @@ "\n var partition = Workspace.Query().FirstOrDefault(x => x.ReportingNode == args.ReportingNode && x.Year == args.Year && ", "\n x.Month == args.Month && x.Scenario == args.Scenario);", "\n if(partition == null) ApplicationMessage.Log(Error.PartitionNotFound);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jT2AUILrHUyhaSmU-w039g", "cell_type": "code", "source": [ "public async Task CheckSwitchLogicAsync(IEnumerable inputDataSet, Dictionary csmLcSwitchBenchmark)", @@ -134,9 +163,13 @@ "\n ", "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "f5gdp2GlKUehTXeQ_SvCIw", "cell_type": "code", "source": [ "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", @@ -161,9 +194,13 @@ "\n };", "\n", "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WPvTHMwp5EqJmWNsjt81fA", "cell_type": "code", "source": [ "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", @@ -188,9 +225,13 @@ "\n };", "\n", "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fRgoEiIujky1sZ9hnyj78A", "cell_type": "code", "source": [ "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", @@ -211,9 +252,13 @@ "\n };", "\n", "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "xdTbysPGFkeRLHr0sUBUlA", "cell_type": "code", "source": [ "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", @@ -247,13 +292,20 @@ "\n };", "\n", "\nawait CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dTZEjO9WM0uCJgoboB4qhw", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/full-ifrs17-template/Test/Tests.ipynb b/full-ifrs17-template/Test/Tests.ipynb index 2b7fefcb..1c330cb5 100644 --- a/full-ifrs17-template/Test/Tests.ipynb +++ b/full-ifrs17-template/Test/Tests.ipynb @@ -18,82 +18,134 @@ "nbformat_minor": 5, "cells": [ { + "id": "MQ7XPYnTFEOMHrtoB3Oerg", "cell_type": "markdown", "source": [ "

Tests

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8IHp-7c15Uq0vxaFsrXmzQ", "cell_type": "code", "source": [ "#!eval-notebook \"IfrsVariablesTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-uvPzzVPT0-Y54bxFtKl0g", "cell_type": "code", "source": [ "#!eval-notebook \"ImportStorageTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HvLhnrHPakG-RHLDv1YlTw", "cell_type": "code", "source": [ "#!eval-notebook \"ReportStorageTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "GHLqatm6zEix6r7rBO-VVg", "cell_type": "code", "source": [ "#!eval-notebook \"AocStructureTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "H39eZoIm9Uu2XuyAa0Sg_Q", "cell_type": "code", "source": [ "#!eval-notebook \"TechnicalMarginTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sLb7AsZlOUyGeRzwfKoM-Q", "cell_type": "code", "source": [ "#!eval-notebook \"SequenceImportTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "B_dzy6sUvUKc2e3m81pOJg", "cell_type": "code", "source": [ "#!eval-notebook \"ScenarioTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "hWVGU3WYHkycqipZOO1fFw", "cell_type": "markdown", "source": [ "---" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dZoX6ICHOkGWZZzUHjZ9DQ", "cell_type": "code", "source": [ "#!eval-notebook \"MapTemplateAndImportTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1YHxPQejxkGzdzCOLao7HQ", "cell_type": "markdown", "source": [ "---" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kXdtF5erPkm1bfIJoQ7S6g", "cell_type": "code", "source": [ "#!eval-notebook \"ReportVariablesTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "W9Bknri1XkC2erPpRjyrjQ", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/CalculationEngine.ipynb b/ifrs17/CalculationEngine.ipynb index 13b87df7..a130e870 100644 --- a/ifrs17/CalculationEngine.ipynb +++ b/ifrs17/CalculationEngine.ipynb @@ -16,6 +16,7 @@ "nbformat_minor": 5, "cells": [ { + "id": "lx6moIFczkyb5a8hEBu_6Q", "cell_type": "code", "source": [ "#!import \"DataModel/DataStructure\"", @@ -23,13 +24,20 @@ "\n#!import \"Import/Importers\"", "\n#!import \"Export/ExportConfiguration\"", "\n#!import \"Utils/TestHelper\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Tc-fiN15c0q-DNnqPEEVQg", "cell_type": "code", "source": [ "var ifrs17Report = new Ifrs17Reports(Workspace, Scopes, Report);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb index 9d54b276..0e0a411d 100644 --- a/ifrs17/Constants/Consts.ipynb +++ b/ifrs17/Constants/Consts.ipynb @@ -19,120 +19,197 @@ "nbformat_minor": 5, "cells": [ { + "id": "tozdHqMbAkO8Ttd_Z-FPQw", "cell_type": "markdown", "source": [ "

Consts

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "lqga2fWJikO2K6CkYd0uNQ", "cell_type": "markdown", "source": [ "# Numerical Precision" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "92t7bfloDk-X5dbxj8-BzA", "cell_type": "code", "source": [ "public const double Precision = 1E-5;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "tU4Y0UN8FkWG4j6fdhnEdg", "cell_type": "code", "source": [ "public const double ProjectionPrecision = 1E-3;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "AQz0euBRNkyhgAPTzk8kJA", "cell_type": "code", "source": [ "public const double BenchmarkPrecision = 1E-4;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZEsXT31ETE--9F4_5F7OoQ", "cell_type": "markdown", "source": [ "# Time Period" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-PEstjbAfE2GTGXiNFlkzA", "cell_type": "code", "source": [ "public const int CurrentPeriod = 0; " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Lt52PYx8LUSbxE-o4dGlUQ", "cell_type": "code", "source": [ "public const int PreviousPeriod = -1; " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KBZJtyq_206bd_HK1F6yNw", "cell_type": "code", "source": [ "public const int MonthInAYear = 12;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7o1TktT0akubYO5_0tMJ5w", "cell_type": "markdown", "source": [ "# Defaults" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Tibnci4N-0-dkhVAS2c69g", "cell_type": "code", "source": [ "public const int DefaultDataNodeActivationMonth = 1;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nMozFF7qoUKtssTOwgYi2A", "cell_type": "code", "source": [ "public const double DefaultPremiumExperienceAdjustmentFactor = 1.0;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CzLFY5d-nEmoKLUyhvG9aA", "cell_type": "markdown", "source": [ "# Names" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9nQYRJNFO0OR5QKOtr40ZQ", "cell_type": "code", "source": [ "public const string Main = nameof(Main);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4vArq04Dc0SUQ1B8pnTYIg", "cell_type": "code", "source": [ "public const string Default = nameof(Default);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bTl8GyvuRkGBooAK9zlXLg", "cell_type": "code", "source": [ "public const string ValueType = nameof(ValueType);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ziRQ7cjXbESP3l2CdNBYGQ", "cell_type": "markdown", "source": [ "GroupCurrency defines the SystemName (from Currency Dimension) to be used as the Group Currency." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "A9ITNucOV02h-mBUmn3lsQ", "cell_type": "code", "source": [ "public const string GroupCurrency = \"CHF\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "QlC_r7WQ7kOmdj8kKb5aNw", "cell_type": "markdown", "source": [ "# Import Formats" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "C8v98kZ_aEWi1JyDSiGkzA", "cell_type": "code", "source": [ "public static class ImportFormats{", @@ -147,15 +224,23 @@ "\n", "\n public const string AocConfiguration = nameof(AocConfiguration); // Importer for Analysis of Change Configuration settings", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XWnM8TzYv0ytgc74W9RuiA", "cell_type": "markdown", "source": [ "# IFRS specific" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "phrHTtbxI0OYX3MaAVo2Tg", "cell_type": "code", "source": [ "public static class ValuationApproaches{", @@ -163,18 +248,26 @@ "\n public const string VFA = nameof(VFA); //Variable Fee Approach", "\n public const string PAA = nameof(PAA); //Premium Allocation Approach", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Db-Dvk_gpU2pI_BFacjbCg", "cell_type": "code", "source": [ "public static class LiabilityTypes{", "\n public const string LRC = nameof(LRC); //Liability for Remaining Coverage", "\n public const string LIC = nameof(LIC); //Liability Incurred Claims", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fQo3LSnzhUGkWwVbf21L1A", "cell_type": "code", "source": [ "public static class EstimateTypes{", @@ -195,9 +288,13 @@ "\n public const string AAPA = nameof(AAPA); //Experience Adjusted Advance Actual Premium to Csm", "\n public const string OAPA = nameof(OAPA); //Experience Adjusted Overdue Actual Premium to Csm", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "B7toQMiP_0qZXm43pyxShw", "cell_type": "code", "source": [ "public static class AocTypes{", @@ -219,9 +316,13 @@ "\n public const string FX = nameof(FX); // Foreing Exchange", "\n public const string EOP = nameof(EOP); // End of Period (closing value of an AOC chain)", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HulL6n-6IkWevFLCSC9hDQ", "cell_type": "code", "source": [ "public static class Novelties{", @@ -229,9 +330,13 @@ "\n public const string N = nameof(N); //New Business", "\n public const string C = nameof(C); //All Novelties Combined", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yejc0ve4BEe-oAi5YgJJDw", "cell_type": "code", "source": [ "public static class EconomicBases{", @@ -239,9 +344,13 @@ "\n public const string C = nameof(C); //Current Interest Rates", "\n public const string N = nameof(N); //Nominal Interest Rates", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "qeXt2V5wQ0S2TiixZhHlHg", "cell_type": "code", "source": [ "public static class AmountTypes{", @@ -258,9 +367,13 @@ "\n public const string AC = nameof(AC); // Attributable Commissions", "\n public const string AE = nameof(AE); // Attributable Expenses", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nuYnoG2NB0WPGTggymtcLg", "cell_type": "code", "source": [ "public static class Scenarios{", @@ -281,22 +394,33 @@ "\n public const string LICUP10pct = nameof(LICUP10pct); // Lic Up 10pct", "\n public const string LICDW10pct = nameof(LICDW10pct); // Lic Down 10pct", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "aX8Ixs4Q3EOw3EmvsvyFng", "cell_type": "markdown", "source": [ "# Insurance specific" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "xO1Ga-uPsES_cjwlbNf1yw", "cell_type": "code", "source": [ "public static class LineOfBusinesses{", "\n public const string LI = nameof(LI); //Life", "\n public const string NL = nameof(NL); //Non-Life", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Constants/Enums.ipynb b/ifrs17/Constants/Enums.ipynb index 04c87848..5b4ccc1a 100644 --- a/ifrs17/Constants/Enums.ipynb +++ b/ifrs17/Constants/Enums.ipynb @@ -19,40 +19,61 @@ "nbformat_minor": 5, "cells": [ { + "id": "xWFL-UDyVkKeoXQRsDI7YQ", "cell_type": "markdown", "source": [ "# Enumerables", "\n", "\nIn the case of data which is not expected to change over time, it is convenient to introduce such data as variables of type \"enumerable\"." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "lYFecRN4gkuJ-bMXNO9DnQ", "cell_type": "markdown", "source": [ "## Exchange Rates", "\n", "\nFor exchange rates, we set the type for which the rates apply:" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "h_kYaWMEjkGKhJBHv5ZTOA", "cell_type": "code", "source": [ "public enum FxType { Spot, Average }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "79eI1G0CiE2WMkFq2s3ung", "cell_type": "code", "source": [ "public enum FxPeriod { NotApplicable, BeginningOfPeriod, Average, EndOfPeriod }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bMmXBU5L1EiXVURfzYrfhg", "cell_type": "markdown", "source": [ "## Currency Types" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ThheUoz160CrIXKT0-N2NQ", "cell_type": "markdown", "source": [ "Currency Types define which currency is used as standard at different aggregation levels (in the Data Level hierarchy).", @@ -60,101 +81,165 @@ "\n- Group: this is the standard Currency Type at Group level", "\n- Contractual: this is the standard Currency Type at Data Node level", "\n- Transactional: this is the standard Currency Type at Transactional level (used typically for Actuals)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jFSshWJs3km8UAmJUvoUWA", "cell_type": "code", "source": [ "public enum CurrencyType { Functional, Group, Contractual, Transactional }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HcVv9bIVN0CTv_BR3h38KA", "cell_type": "markdown", "source": [ "## Period Type" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "QQ_1DwAHIUWlTKSktjtX5w", "cell_type": "code", "source": [ "public enum PeriodType { NotApplicable, BeginningOfPeriod, EndOfPeriod }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "IWLntYaWLUCby854KcCzPQ", "cell_type": "markdown", "source": [ "## Valuation Period" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fxCUAx87AEKTJXenM6OrSw", "cell_type": "code", "source": [ "public enum ValuationPeriod { NotApplicable, BeginningOfPeriod, MidOfPeriod, Delta, EndOfPeriod }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Iua4aiPYeUSkSdOZBIHwNQ", "cell_type": "markdown", "source": [ "## Portfolio View" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "N7qSoOiDaEG0mbO_prv_9w", "cell_type": "code", "source": [ "[Flags] public enum PortfolioView { Gross = 1, Reinsurance = 2, Net = Gross | Reinsurance }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ofzaBHXeLUGsPwp53tWk4A", "cell_type": "markdown", "source": [ "## Structure Type" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "NJmE1eEV_Uuey166OH3U_g", "cell_type": "code", "source": [ "public enum StructureType { None, AoC }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "t6CUcWp67ESaBdUmxsyJ8A", "cell_type": "markdown", "source": [ "## State" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YSkBfw3IHEuyoW2lvsOC7g", "cell_type": "markdown", "source": [ "State describes the state in which a Data Node can be - There are two types of states:", "\n- Active: visible in reports and queries", "\n- Inactive: not visible in reports and queries" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sqXQ1mcVxEit4CgNnQPAXA", "cell_type": "code", "source": [ "public enum State { Active, Inactive }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oThs73B7kkyDAHtyVfg5QA", "cell_type": "markdown", "source": [ "## Periodicity" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "TAHQhWhLr0mR59KmOekVrQ", "cell_type": "code", "source": [ "public enum Periodicity { Monthly, Quarterly, Yearly }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kBck_5hoX0yAEEWJHOKRsg", "cell_type": "markdown", "source": [ "## Input Source" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rfBIAwenWUa1zipcMY1qnQ", "cell_type": "code", "source": [ "[Flags]", @@ -163,31 +248,50 @@ "\n//Opening + Cashflow = 5", "\n//Actual + Cashflow = 6", "\n//Opening + Actual + Cashflow = 7" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7dL-4X1fUEiQSzYaooPprg", "cell_type": "markdown", "source": [ "## Data Type" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WPim6MSI-UWnSqnOfEbFxw", "cell_type": "code", "source": [ "public enum DataType { Optional, Mandatory, Calculated, CalculatedTelescopic }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nPBJqeOjdEibtyin5hzeUQ", "cell_type": "markdown", "source": [ "## Import Scope" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pU2UM-nbJ0-aG0rhi86JLw", "cell_type": "code", "source": [ "public enum ImportScope { Primary, Secondary }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Constants/Validations.ipynb b/ifrs17/Constants/Validations.ipynb index 61e79c34..9c7fc17c 100644 --- a/ifrs17/Constants/Validations.ipynb +++ b/ifrs17/Constants/Validations.ipynb @@ -19,25 +19,38 @@ "nbformat_minor": 5, "cells": [ { + "id": "XVEH7X-d10OpDfN_HGsgWw", "cell_type": "markdown", "source": [ "

Errors and Warnings

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "X6KZCCXZXUiL9T5SxOhs6Q", "cell_type": "code", "source": [ "#!import \"Enums\"", "\n#!import \"Consts\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XeX545EVhUujhEkMkdUSbQ", "cell_type": "markdown", "source": [ "# Codes" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "BPYWZkdC6UaNstT83ZmPqQ", "cell_type": "code", "source": [ "public enum Warning {", @@ -46,9 +59,13 @@ "\n // Default", "\n Generic", "\n}; " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-g7L46bNBUi0ZX88o37kBw", "cell_type": "code", "source": [ "public enum Error { ", @@ -77,15 +94,23 @@ "\n // Default", "\n Generic", "\n};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "NLh7KHTP4ESl-nGxh_T64Q", "cell_type": "markdown", "source": [ "# Messages" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "N0nqsxkmUka6GK5XzE71xg", "cell_type": "code", "source": [ "public static string Get (Error e, params string[] s) => (e, s.Length) switch ", @@ -153,9 +178,13 @@ "\n (Error.Generic , _) => $\"{s[0]}\",", "\n (_ , _) => $\"Error not found.\"", "\n};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "qxv841q1gkOJt-zqkEwcZQ", "cell_type": "code", "source": [ "public static string Get (Warning w, params string[] s) => (w, s.Length) switch {", @@ -165,13 +194,20 @@ "\n (Warning.Generic , _) => $\"{s[0]}\",", "\n (_ , _) => $\"Warning not found.\"", "\n};" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DobUDUwhxUWanDJDmzxJ8Q", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] -} +} \ No newline at end of file diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index 2f63475c..dc35c01d 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -19,28 +19,41 @@ "nbformat_minor": 5, "cells": [ { + "id": "vvMYbQ5-bEKq_A2vJ_DmRA", "cell_type": "markdown", "source": [ "", "\n

Data Model

", "\n", "\nThis notebook has the main structures used to hold data - This is usually called the **data model**." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6fcBzsfTH0e5CiWZtlKLtw", "cell_type": "markdown", "source": [ "# References", "\nThis section initializes libraries and code from other notebooks, which will be used here, as well as information needed for querying data from the database." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "n4jj6X3ycEap0QydisZJvw", "cell_type": "markdown", "source": [ "## Libraries" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zUmmhub5NES3DO-kz0dAnQ", "cell_type": "code", "source": [ "#r \"nuget:Systemorph.Activities,1.5.7\"", @@ -57,15 +70,23 @@ "\n#r \"nuget:Systemorph.DataSource,1.5.4\"", "\n#r \"nuget:Systemorph.DataSource.Conversions,1.5.4\"", "\n#r \"nuget:Systemorph.Reporting,1.5.7\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "D9W0OLZ5G0qyvEYQxfSLew", "cell_type": "markdown", "source": [ "## Usings" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nlOhRlJHvk-F0uDp6VMMlw", "cell_type": "code", "source": [ "using System.ComponentModel.DataAnnotations;", @@ -75,29 +96,45 @@ "\nusing Systemorph.Vertex.Activities;", "\nusing Systemorph.Vertex.Import;", "\nusing static Systemorph.Vertex.Arithmetics.ArithmeticOperations;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "50Tr9UVLkE-2gM0G6oVEnQ", "cell_type": "markdown", "source": [ "## Notebooks" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "NKLM1yXTtU2Ti8W3ihDigw", "cell_type": "code", "source": [ "#!import \"../Constants/Enums\"", "\n#!import \"../Constants/Consts\"", "\n#!import \"../Constants/Validations\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WrFH5QlWuk2M_JmM06sq8A", "cell_type": "markdown", "source": [ "# Data Infrastructure" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ohM1Biwwe0eZ1b-HaHop9Q", "cell_type": "markdown", "source": [ "", @@ -105,51 +142,79 @@ "\nThe following interfaces are used to define the granularity at which data is stored.", "\n", "\nFor instance, the IKeyed interface corresponds to the lowest granularity which is simply a unique identifier for a certain generic piece of data:" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-MQGfu51EkyCmQryoyg9mg", "cell_type": "code", "source": [ "public interface IKeyed", "\n{ ", "\n public Guid Id { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "12_68uyAs0GIWjs7tV5EQA", "cell_type": "markdown", "source": [ "The interface IPartition identifies the partitions in the system." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "AlL0TcQlpkq8jqpV2BKhkw", "cell_type": "code", "source": [ "public interface IPartition : IKeyed {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0YssLND4Ake3pVnlzyDWDw", "cell_type": "markdown", "source": [ "The interface IPartitioned simply assigns a unique identifier for elements of a data partition - The exact definition of such elements can be found in the [partition](#partition) section below." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "C_K3oA4OAU-LQiaHkTW4Tw", "cell_type": "code", "source": [ "public interface IPartitioned", "\n{", "\n public Guid Partition { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "z-6_NJX8rEeP2QxJvJ1iOw", "cell_type": "markdown", "source": [ "The interface IHierarchy is used for modelling dimensions which have an hierarchical structure, such as [Amount Type](#amount-type)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kl63jpe0oE6L_8z668bdPQ", "cell_type": "code", "source": [ "public interface IHierarchy", @@ -160,15 +225,23 @@ "\n ", "\n public string Child { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0Ute_DjaYE2kd2UHUcFnDA", "cell_type": "markdown", "source": [ "The interface IWithYearAndMonth allows to speficy to which year and month a certain piece of data applies to:" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WsvB3-kq7UGjOBaBu7IJ-Q", "cell_type": "code", "source": [ "public interface IWithYearAndMonth", @@ -177,33 +250,49 @@ "\n ", "\n public int Month { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "LC_mdbBTsUGl9YAFXVcTpg", "cell_type": "markdown", "source": [ "The interface IWithYearMonthAndScenario allows to identify the year, month and scenario associated to the data:", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Iq8rP4E8k0eGgF2BjhQZGg", "cell_type": "code", "source": [ "public interface IWithYearMonthAndScenario : IWithYearAndMonth", "\n{", "\n public string Scenario { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HtTP2eQc90eX8Ldk4oC4bw", "cell_type": "markdown", "source": [ "", "\n## Abstract Classes", "\nThese classes are not reflected in the database, i.e. are not persisted." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "hev6GlsneUqQtJultvGUFQ", "cell_type": "code", "source": [ "public abstract record KeyedRecord : IKeyed {", @@ -211,9 +300,13 @@ "\n [NotVisible] ", "\n public Guid Id { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "01cW7mL7aU6ojJyBRYnoRw", "cell_type": "code", "source": [ "public abstract record KeyedDimension : INamed {", @@ -227,18 +320,26 @@ "\n [NotVisible]", "\n public string DisplayName { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "G4Du5Lq4ekyLtRBqqmY8KQ", "cell_type": "code", "source": [ "public abstract record KeyedOrderedDimension : KeyedDimension, IOrdered {", "\n [NotVisible]", "\n public int Order { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "apV-0FaPCUC53iF8dtg4bA", "cell_type": "code", "source": [ "public abstract record KeyedOrderedDimensionWithExternalId : KeyedOrderedDimension {", @@ -246,9 +347,13 @@ "\n [Conversion(typeof(JsonConverter))]", "\n public string[] ExternalId { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "c99r-95hxEGNlSWFap4psw", "cell_type": "markdown", "source": [ "", @@ -260,9 +365,13 @@ "\n- The data is easier to maintain (the data is said to be 'normalized');", "\n- The business logic is easier to read;", "\n- Easier scructuring of the data, e.g. in a data-cube." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "OLKX7adzcEiBfX4ViPGUAw", "cell_type": "markdown", "source": [ "", @@ -270,23 +379,35 @@ "\nHierarchical dimensions are useful to define for example the legal structure of a company (reporting nodes and their parents).", "\n", "\nBelow we introduce the concept of a hierarchical dimension with level, which is a simple way to keep track of the \"level\" in a hierarchical dimension." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kosUH41ZvEy3T-sTMgijyg", "cell_type": "code", "source": [ "//TODO: Should this be abstract or have a reference to the type?", "\npublic record HierarchicalDimensionWithLevel(string SystemName, string DisplayName, string Parent, int Level) : IHierarchicalDimension;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Tp-41ZIa1kub9oJSD5ibqQ", "cell_type": "markdown", "source": [ "", "\n## Amount Type" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8eBHNXGQzEyLbfkkhfefWQ", "cell_type": "markdown", "source": [ "Amount Type is a dimension used to describe the nature of numbers. For example: Numbers associated to the payment of premiums have Amount Type 'Premiums'; Numbers associated to the payment of claims have Amount Type 'Claims'; Numbers associated to expenses have Amount Type 'Expenses'. ", @@ -294,9 +415,13 @@ "\nIt is defined as a hierarchical dimension so that higher-granularity types can be introduced. For example: 'Claim Expenses' have parent 'Claims'.", "\n", "\nAmount Types are a central piece in the IFRS 17 application and are used for instance to name the different types of cashflows. For example: There might be cashflows for 'Premiums'; Cashflows for 'Claims', etc. In case the mapping between cash flow and amount type is non-trivial, then specific mappings are introduced through the use of ExternalId." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "QJYJ1Q90-UavXxYFeCGs-A", "cell_type": "code", "source": [ "public record AmountType : KeyedOrderedDimensionWithExternalId, IHierarchicalDimension", @@ -309,23 +434,35 @@ "\n [Dimension(typeof(PeriodType))]", "\n public PeriodType PeriodType { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zwL1mP_fyEaPJIo7MRDj0g", "cell_type": "markdown", "source": [ "We distinguish between amount types used for cashflows and actuals (**Present Value Amount Types**), and amount types used for deferrable values (**Deferrable Amount Types**). In particular, deferrable amount types are for costs and expenses that can be deferred to the future. These amounts are treated separately from the Present Value Amount Types because they are not considered for the calculation of Contractual Service Margin and Loss Component." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "xXvF54kBF0C6mNNLJGYH9Q", "cell_type": "code", "source": [ "public record PvAmountType : AmountType {} //TODO Rename ", "\n", "\npublic record DeferrableAmountType : AmountType {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "40iqJ-O9qEGg2OiuWQvabA", "cell_type": "markdown", "source": [ "", @@ -334,9 +471,13 @@ "\nRisk drivers are used to distinguish between the different Risk Adjustment numbers. For instance: Mortality, Disability, Longevity, etc.", "\n", "\nWhen only total risk adjustment values are used, then there is no need to use risk drivers." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "SORci-jtcEW5a8OFmDj2Fg", "cell_type": "code", "source": [ "public record RiskDriver : KeyedOrderedDimension, IHierarchicalDimension", @@ -345,18 +486,26 @@ "\n [Dimension(typeof(RiskDriver))]", "\n public string Parent { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nYMm-mQrj0KEBCHoXoH5hQ", "cell_type": "markdown", "source": [ "", "\n## Estimate Type", "\n", "\nEstimate Type is a dimension used to distinguish the context to which numbers belong to. For instance: Numbers for present values have Estimate Type 'Present Value'; Numbers for Risk Adjustments have Estimate Type 'Risk Adjustment'." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "m8jX-ECAtECu0gFbBS1s7g", "cell_type": "code", "source": [ "public record EstimateType : KeyedOrderedDimensionWithExternalId", @@ -370,31 +519,47 @@ "\n [Dimension(typeof(PeriodType))]", "\n public PeriodType PeriodType { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kPTZ7_RnoUqohThIWWYy0A", "cell_type": "markdown", "source": [ "", "\n## Novelty", "\n", "\nNovelty is a [dimension](#dimensions) used to identity the novelty of the business. Typical examples of Novelty are New Busines, In-Force, and Combined." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "K0d74Xw5i0iPT4baRGhcPw", "cell_type": "code", "source": [ "public record Novelty : KeyedOrderedDimension {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7EP52ewzjk293OCh5CO0iA", "cell_type": "markdown", "source": [ "", "\n## Variable Type" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "b5paXRuxKUus4Bm6tLyi9w", "cell_type": "code", "source": [ "public record VariableType : KeyedOrderedDimension, IHierarchicalDimension", @@ -402,9 +567,13 @@ "\n [Display(Order = 10)]", "\n public string Parent { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wFBlWBk4c0in2LsXyLqbBA", "cell_type": "markdown", "source": [ "", @@ -418,9 +587,13 @@ "\n- It is the first AocType for the Combined Novelty and therefore it carries the contribution of combining In force and New business.", "\n- Its present value is computed as telescoping difference with the last AoC Step for the In-Force novelty and the New Business novelty.", "\n- In the technical margin calculation it is used to merge the profitability of the In-Force and New business components, which may result in a forced switch." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kDoD4QjYMUGAzXwEvCwf-A", "cell_type": "code", "source": [ "public record AocType : VariableType", @@ -429,92 +602,144 @@ "\n [Dimension(typeof(AocType))]", "\n public string Parent { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nDI4hKR530udvpIoO6ixsQ", "cell_type": "code", "source": [ "public record AocStep(string AocType, string Novelty){}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "U4FRFJw6u0eSeSy4yO1pWg", "cell_type": "markdown", "source": [ "", "\n### PnL Variable Type", "\n", "\nThe PnlVariableType is used to describe the various profit and loss sections and the corresponding hierarchy." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "LMKMAXnc3EqZp672ZjbR-g", "cell_type": "code", "source": [ "public record PnlVariableType : VariableType {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bVzzi7gJVUOAENq25I1JUQ", "cell_type": "markdown", "source": [ "", "\n## Balance Sheet Variable Type", "\n", "\nThe BsVariableType is used to descibe the Anlysis of change of the Balance Sheet reports." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Azjq6-w3xU6XO28qySfeEQ", "cell_type": "code", "source": [ "public record BsVariableType : VariableType {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "tnri9RIpOEO8xYbVkcSDaw", "cell_type": "markdown", "source": [ "## Accounting Variable Type", "\nThe AccountingVariableType is used to describe the accounting events that are posted in the accounting output file." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_ITqpse1tkOzZIOiGx5RCg", "cell_type": "code", "source": [ "public record AccountingVariableType : VariableType {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4-lSJ9zaOUeDX79K04UlPQ", "cell_type": "markdown", "source": [ "", "\n## Scenario", "\nThe Scenario record holds the various scenarios for which calculations should also be performed." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_LV67wZghEKrJhiuaRhbmQ", "cell_type": "code", "source": [ "public record Scenario : KeyedDimension {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7b7N1_AF0UehwCPAqas-Mw", "cell_type": "markdown", "source": [ " The 'neutral' Scenario (i.e. the default one, with no-stress situations applied) is designated as 'Best Estimate'." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ta7e8UWrjUO1NU-lBUgTeA", "cell_type": "markdown", "source": [ "", "\n## Line Of Business" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "o0OA9JhZYU2nHM2f_Udg9A", "cell_type": "markdown", "source": [ "Line Of Business is a dimension used to identity insurance business according to usual business classifications (usually a market or company-specific business classification representing a convolution of risk covered, 1st party / 3rd party cover type, product type, etc...)", "\nTypical examples of Line of Business are Motor, Property, Endowment, etc... This is a hierarchical dimension." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "QGo_JuZyVkuYVndoizxDOw", "cell_type": "code", "source": [ "public record LineOfBusiness : KeyedOrderedDimension, IHierarchicalDimension", @@ -523,66 +748,102 @@ "\n [Dimension(typeof(LineOfBusiness))]", "\n public string Parent { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dbbd2ggxGE6mHjqrwgHL1g", "cell_type": "markdown", "source": [ "", "\n## Currency" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nqDwmu8MDEO3jL-H-woh2Q", "cell_type": "markdown", "source": [ "Currency is a dimension used to identity the currency.", "\nTypical examples of Currency are EUR, CHF, USD, etc..." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XA10ILHLkUWbpQzJBAkXZQ", "cell_type": "code", "source": [ "public record Currency : KeyedDimension {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wsLO89dcuE27G1nHtDuN0Q", "cell_type": "markdown", "source": [ "", "\n## Economic Basis", "\n", "\nThe Economic Basis defines the discount type which is used in calculations. Examples are: Nominal, Current and Locked." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_YZihbxs1kq82s_4uJ50rw", "cell_type": "code", "source": [ "public record EconomicBasis : KeyedDimension {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1rEXbs0tE0ixs2PKxuzijw", "cell_type": "markdown", "source": [ "", "\n## Valuation Approach", "\nThis dimension holds the various methodologies used in the calculations: BBA, VFA and PAA." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8xWDJeD0HUSL7cCWWfxB2A", "cell_type": "code", "source": [ "public record ValuationApproach : KeyedDimension {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-VuXuyWx-UeVrmyIH4tynw", "cell_type": "markdown", "source": [ "", "\n## Liability Type", "\nThe Liability Type distinguishes betweeen e.g. liabilities for incurred claims and liabilities for remaining coverage." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pBn2RHZYH0mvlWDyMqWAYQ", "cell_type": "code", "source": [ "public record LiabilityType : KeyedDimension, IHierarchicalDimension", @@ -591,79 +852,123 @@ "\n [Dimension(typeof(LiabilityType))]", "\n public string Parent { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "JqUkEBkxEUyu9LWoQ9edog", "cell_type": "markdown", "source": [ "", "\n## OCI Type", "\nOther Comprehensive Income (OCI) Type describes how the financial contributions to the IFRS17 Financial Performance is apportioned between the P&L and the OCI sections." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-pft1geAOkqbKgubPnY0PA", "cell_type": "code", "source": [ "public record OciType : KeyedDimension {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "S5jtO-BT_EWHwNwFWnSteQ", "cell_type": "markdown", "source": [ "", "\n## Profitability" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "agAepHAWC0aM8vwzMiATxA", "cell_type": "markdown", "source": [ "Profitability is a dimension used in IFRS 17 to describe the profitability of a Group of Contracts (GIC/GRIC).", "\nTypical examples of Profitability are Profitable, Non-Profitable, etc.." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4s8YBnMHfEy5nNG3RvtvQg", "cell_type": "code", "source": [ "public record Profitability : KeyedDimension {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sG9C9SlT80Sa9yKzTmomHg", "cell_type": "markdown", "source": [ "", "\n## Partner", "\nPartner is the counterparty of a reinsurance contract." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "2PWRjN6ClE2h1_mjVLnjVA", "cell_type": "code", "source": [ "public record Partner : KeyedDimension {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "xFvb4itG9kGr-znXcMtZmg", "cell_type": "markdown", "source": [ "", "\n## Credit Risk Rating", "\nThis holds the credit risk rating of each Partner." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "aBpP5Oc4Eke83JkSwrVEyA", "cell_type": "code", "source": [ "public record CreditRiskRating : KeyedDimension {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "JYBlHEuf2EeBJK2agw9PTg", "cell_type": "markdown", "source": [ "", "\n## Reporting Node", "\nA Reporting Node is an element in the reporting structure of the company. It has a hierarchical structure and the end nodes is the level at which data is imported." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sdTROCNthU-SbN8qtndCug", "cell_type": "code", "source": [ "public record ReportingNode : KeyedDimension, IHierarchicalDimension ", @@ -677,16 +982,24 @@ "\n [Dimension(typeof(Currency))]", "\n public virtual string Currency { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "f3cgPrGYWEuewvULtOePgw", "cell_type": "markdown", "source": [ "", "\n## Projection Configuration" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "OscX2jPkaUKAsAMmlWbnLA", "cell_type": "markdown", "source": [ "Projections are configured by defining the following 2 parameters:", @@ -696,9 +1009,13 @@ "\n", "\nBoth Shift and TimeStep are measured in terms of number of months.", "\nFor instance, for the current year and year-to-date view we have $\\rm{Shift}=0$ and $TimeStep=3$ for the first quarter, $TimeStep=6$ for the 2nd quarter and so on." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Y6oQoI4XX0CwFsNhatS-RQ", "cell_type": "code", "source": [ "public record ProjectionConfiguration : KeyedDimension", @@ -708,23 +1025,35 @@ "\n [IdentityProperty]", "\n public int TimeStep { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WYjnvQgpH06wl1eIrT8woA", "cell_type": "markdown", "source": [ "", "\n# Parameters" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "E5oOYjdJEUCETU2i9e-Qug", "cell_type": "markdown", "source": [ "", "\n## Aoc Step Configuration" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6GbflKhoxUiG2pAgS_I-0A", "cell_type": "markdown", "source": [ "The record below holds parameters over time for each combination of AocType and Novelty. In particular:", @@ -737,9 +1066,13 @@ "\n- RcPeriod identifies which Reinsurance Coverage should be used (from current or previous period).", "\n", "\n
The values for each parameter can be found in [Enums Notebook](./Constants/Enums)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "x8qrzUb0PEOCGxJSra4XXg", "cell_type": "code", "source": [ "public record AocConfiguration : KeyedRecord, IWithYearAndMonth, IOrdered", @@ -801,9 +1134,13 @@ "\n [NotVisible]", "\n public int Order { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "QVPcX4AOT0uI2pyntN7nxw", "cell_type": "markdown", "source": [ "", @@ -811,9 +1148,13 @@ "\nThe record below holds the Exchange Rates over time and for each exchange type ([FxType](./Constants/Enums)). Exchange Rate must be updated every reporting period as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. ", "\n", "\nIn case the Exchange Rate for the current period is missing, an error is returned. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fjWZFfSVXUuuznBgoCdv3g", "cell_type": "code", "source": [ "public record ExchangeRate : KeyedRecord, IWithYearMonthAndScenario", @@ -853,9 +1194,13 @@ "\n [Dimension(typeof(Scenario))]", "\n public string Scenario { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZKgLspAsdEC-hOZtcXzNPg", "cell_type": "markdown", "source": [ "", @@ -865,9 +1210,13 @@ "\nThe Credit Default Rate values must be entered with monthly granularity, i.e. every value corresponds to the default rate for a certain month. The first month entered in column Values0 always corresponds to January of the year entered in column Year. The last value is considered valid also for the following years (for which no value has been provided). ", "\n", "\nThe latest Credit Default Rate available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used as the current value during calculation." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "tMR0fSlBv0Krf5Y3YbA8SA", "cell_type": "code", "source": [ "public record CreditDefaultRate : KeyedRecord, IWithYearMonthAndScenario", @@ -903,9 +1252,13 @@ "\n [Dimension(typeof(Scenario))]", "\n public string Scenario { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7dQwcrF4RUaBa9E-lwlRJg", "cell_type": "markdown", "source": [ "", @@ -916,9 +1269,13 @@ "\nThe Yield Curve values must be entered with **yearly** granularity, i.e. every value corresponds to the rate of the whole year starting from the year entered in column Year. The last value is considered valid also for the following years (for which no value has been provided). ", "\n", "\nWhen the current Yield Curve must be used in the calculation, the latest Yield Curve available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5_Tdu0mOuUKPDS1__w7oKw", "cell_type": "code", "source": [ "public record YieldCurve : KeyedRecord, IWithYearMonthAndScenario", @@ -954,17 +1311,25 @@ "\n [Display(Order = 40)]", "\n public double[] Values { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nOgE_q28hEOm1sKGlkVYFQ", "cell_type": "markdown", "source": [ "", "\n## Partner Rating", "\nThe record below holds the [Credit Risk Rating](#credit-risk-partner) for each [Partner](#partner) across time. Partner Rating can be updated every month as part of the close preparation. In general, the last month of the reporting period should be use to import the new data for the period. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "NsO44SR5NEmuCID96R3hkg", "cell_type": "code", "source": [ "public record PartnerRating : KeyedRecord, IWithYearMonthAndScenario", @@ -1001,17 +1366,25 @@ "\n [Dimension(typeof(Scenario))]", "\n public string Scenario { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "BEbzTJO6dE2xO4j5NLPSOg", "cell_type": "markdown", "source": [ "", "\n# Partitions", "\nThe notion of Partition is used to define small but meaningful sets of data, called partitions. Partitions are then used to optimize the extraction of data from the database, i.e. only the data for a certain partition is retrieved." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "QkFB_IgHtkGLWDYc5tCu2g", "cell_type": "code", "source": [ "public abstract record IfrsPartition : IPartition {", @@ -1030,27 +1403,43 @@ "\n [IdentityProperty]", "\n public string Scenario { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "VHEBFc1800ql7zqmcDgZSA", "cell_type": "markdown", "source": [ "For instance, the data pertaining to a certain [Reporting Node](#reporting-node) for a certain [Scenario](#scenario) is called an IfrsPartition and assigned a unique identifier:" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bfSp5T3pV0KWnxNftKMGeQ", "cell_type": "code", "source": [ "public record PartitionByReportingNode : IfrsPartition {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "s-Z9GAJm7kSMmpdCbP93bA", "cell_type": "markdown", "source": [ "The partition PartitionByReportingNodeAndPeriod is a further partition of the IfrsPartition sets - In particular, it defines sets for the data pertaining to a certain [Reporting Node](#reporting-node), [Scenario](#scenario), year and month. The value of the Month is the last month of the reporting period to which the data belongs to. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zISZyAdnkEyzTE1zpuwyyg", "cell_type": "code", "source": [ "public record PartitionByReportingNodeAndPeriod : IfrsPartition {", @@ -1064,18 +1453,26 @@ "\n [IdentityProperty]", "\n public int Month { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "SqNVh5wtfUezX47Ykwro3g", "cell_type": "markdown", "source": [ "", "\n# Policy-related Data Structures", "\n", "\nThe data structures below are the pieces of the data model where policy-related data is held." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kQT5JYjIskOeFjgMZ1w69g", "cell_type": "markdown", "source": [ "", @@ -1089,9 +1486,13 @@ "\n- LineOfBusiness", "\n- ValuationApproach", "\n- OCI Type" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sDuxslDif0Sc7ayoPFDBvw", "cell_type": "code", "source": [ "public record DataNode : KeyedDimension, IPartitioned {", @@ -1125,9 +1526,13 @@ "\n //[Immutable]", "\n public string OciType { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "FSa402W3TkiFSw4IlrT0JQ", "cell_type": "markdown", "source": [ "", @@ -1136,18 +1541,26 @@ "\nA Portfolio is a set of Group of Contracts. The relationship is set on the Group of Contracts (see below).", "\n", "\nPortfolios are of type DataNode and there are two types: Insurance Portfolio and Reinsurance Portfolios." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "FyJPLygckkiVEUELn08X3A", "cell_type": "code", "source": [ "public record Portfolio : DataNode {}", "\n", "\npublic record InsurancePortfolio : Portfolio {}", "\npublic record ReinsurancePortfolio : Portfolio {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-hbDX86jWke27T_Qi4yjUQ", "cell_type": "markdown", "source": [ "", @@ -1156,9 +1569,13 @@ "\nA Group of Contract is a set of contracts with the same Annual Cohort, Liability Type, Profitability and Partner (in case the contracts are done with a re-insurer).", "\n", "\nVarious Group of Contracts are put together into portfolios." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rElVpacAmUegdwqcG3mmGw", "cell_type": "code", "source": [ "public record GroupOfContract : DataNode {", @@ -1185,18 +1602,26 @@ "\n ", "\n public virtual string Partner { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "UoH8t8Gr3EeGXaXp2w6Vyg", "cell_type": "markdown", "source": [ "A group of insurance contracts is called a **GIC** and has no information on Partner.", "\n", "\nOnly Groups of Reinsurance Contracts, defined below and usually called **GRIC**s, have Partner information.", "\nAgain, there are Insurance GRICs and Reinsurance GRICs:" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fxV6ONW9S02XR3zAH5RGdw", "cell_type": "code", "source": [ "public record GroupOfInsuranceContract : GroupOfContract {", @@ -1224,9 +1649,13 @@ "\n //[Immutable]", "\n public string Portfolio { get => base.Portfolio; init => base.Portfolio = value; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "2RcBhR-gLEi1fyPfMVmLuA", "cell_type": "markdown", "source": [ "", @@ -1234,9 +1663,13 @@ "\n", "\nThe Data State is used to track whether a GOC is Active or Inactive across time (year and month). ", "\nIt is only possible to update the state of a Group of Contract from Active to Inactive." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Aaigxy_oXE6AunRElFSYAw", "cell_type": "code", "source": [ "public record DataNodeState : KeyedRecord, IPartitioned, IWithYearMonthAndScenario", @@ -1278,9 +1711,13 @@ "\n [Dimension(typeof(Scenario))]", "\n public string Scenario { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "iDKOuanhL0i6psYc1KBeHw", "cell_type": "markdown", "source": [ "", @@ -1291,9 +1728,13 @@ "\n
ReinsuranceCoverage : defines the weight of the underlying gross business to be considered in the computation of the allocation of the Technical Margin in a Reinsurance case.", "\n", "\nThe latest Data Node Parameters available in the system with Year and Month earlier or equal to Year and Month of the closing period will be used as the current value during calculation." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-lkGCfDzo0SbSF7dZDXIUQ", "cell_type": "code", "source": [ "public record DataNodeParameter : KeyedRecord, IPartitioned, IWithYearMonthAndScenario", @@ -1330,9 +1771,13 @@ "\n [Dimension(typeof(Scenario))]", "\n public string Scenario { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zpfXY4qd10-jnedhyiVr-Q", "cell_type": "code", "source": [ "public record SingleDataNodeParameter : DataNodeParameter {", @@ -1351,16 +1796,24 @@ "\n [Range(0, 1, ErrorMessage = \"Value for {0} must be between {1} and {2}.\")]", "\n public double ReinsuranceCoverage { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kxGsVzfJE0y6EdlnIRcskg", "cell_type": "markdown", "source": [ "## DataNodeData PocoType", "\nThe DataNodeData type is not persisted (i.e. not stored in the database) and is used in order to hold Data Node data during data manipulations." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "vIbSqkxEAEimfOTb5df1lw", "cell_type": "code", "source": [ "public record DataNodeData {", @@ -1390,9 +1843,13 @@ "\n public string Scenario { get; init; }", "\n public DataNodeData(){}", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "GoHhGqOtG0-OVZzbd26MIQ", "cell_type": "markdown", "source": [ "", @@ -1401,9 +1858,13 @@ "\nRaw Variables are used to store **cashflows** on the database during import, i.e. *after* mappings are applied and *before* calculations are applied.", "\n", "\nThey are stored on the database for both audit and re-calculation purposes." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1uBvKkke9E-jE50KJE63Kg", "cell_type": "code", "source": [ "public abstract record BaseVariableIdentity {", @@ -1422,9 +1883,13 @@ "\n [IdentityProperty]", "\n public string Novelty { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "09RqJAd98k-0yKxsVJoj7A", "cell_type": "code", "source": [ "public abstract record BaseDataRecord : BaseVariableIdentity, IKeyed, IPartitioned {", @@ -1446,15 +1911,23 @@ "\n [IdentityProperty]", "\n public int? AccidentYear { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "MNQBq-sMm0qE88pJs4TI0w", "cell_type": "markdown", "source": [ "Basically, RawVariable is defined for a certain Reporting Node, Scenario, Year, Month, Amount Type and Calculation Type:" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KWxQ2RGp3U-5Si5Yn8_TxQ", "cell_type": "code", "source": [ "public record RawVariable : BaseDataRecord", @@ -1467,9 +1940,13 @@ "\n [IdentityProperty]", "\n public string EstimateType { get; init; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "32EH_CRHdkaqykLzNiRMlA", "cell_type": "markdown", "source": [ "", @@ -1483,9 +1960,13 @@ "\nPresent Values are calculated from the [raw variables](#raw-variables) during the import of cashflows.", "\n", "\nIfrs Variables are stored on the database, i.e. they are 'persisted', for performance purposes." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ATEjwkbM7EmskgkBl5iDXA", "cell_type": "code", "source": [ "public record IfrsVariable : BaseDataRecord", @@ -1504,17 +1985,25 @@ "\n ", "\n public IfrsVariable (){}", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "IEgWB97Takeh-qD2nT3RMA", "cell_type": "markdown", "source": [ "", "\n## Import Identity", "\nThe Import Identity contains the data elements used to determine the data sets which are used when performing data manipulations, e.g. during a [data import](./Import/ImportScopeCalculation) - In particular, an Import Identity is defined by: DataNode, AocType, Novelty, and whether it's reinsurance data or not:" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "QzLZ4ykjzUmtv-rANE7xIw", "cell_type": "code", "source": [ "public record ImportIdentity : BaseVariableIdentity {", @@ -1546,18 +2035,26 @@ "\n", "\n public ImportIdentity(){}", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "o5bDYrCFbEq9Q86kAQ8M2A", "cell_type": "markdown", "source": [ "", "\n# Report Variable", "\n", "\nReport Variables are used to hold data after data manipulations and before being outputed in the form of a report. They are not persisted, i.e. they are not saved on the database." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "uJSztRmWuUqUk4sLXE3pqQ", "cell_type": "code", "source": [ "public record ReportVariable {", @@ -1726,21 +2223,33 @@ "\n Value = iv.Value;", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5KnkxM7jkkq7I_q6uVn55w", "cell_type": "markdown", "source": [ "# Args" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3Q9oP3-cLUqSGJRmFqlnTA", "cell_type": "code", "source": [ "public record Args(string ReportingNode, int Year, int Month, Periodicity Periodicity, string Scenario){}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "cR_ZU4RxdECNosEby4pYNQ", "cell_type": "code", "source": [ "public record ImportArgs : Args", @@ -1753,9 +2262,13 @@ "\n ImportFormat = importFormat;", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "GioFDTgmvEmQbwUEAS8ywA", "cell_type": "code", "source": [ "public record ReportArgs : Args", @@ -1773,7 +2286,10 @@ "\n HierarchyName = hierarchyName;", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Export/ExportConfiguration.ipynb b/ifrs17/Export/ExportConfiguration.ipynb index 622371c3..81651f36 100644 --- a/ifrs17/Export/ExportConfiguration.ipynb +++ b/ifrs17/Export/ExportConfiguration.ipynb @@ -18,31 +18,48 @@ "nbformat_minor": 5, "cells": [ { + "id": "P-g7GArHA0aKcY2PxC5q8Q", "cell_type": "markdown", "source": [ "

Export Configuration

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rsDJFZee4EKdQ35EUXjOKA", "cell_type": "code", "source": [ "#!import \"../DataModel/DataStructure\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Xz94Khhs1kmnH1IVWMSmaw", "cell_type": "code", "source": [ "using Systemorph.Vertex.Export.Builders.Interfaces;", "\nusing Systemorph.Vertex.Export.Excel.Builders.Interfaces;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ou65UNaKpEyCJRGlrLysBQ", "cell_type": "markdown", "source": [ "# Main Tab" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "BWX9kQ_c00uLzpJKNyOhew", "cell_type": "code", "source": [ "public static IDocumentBuilder MainTabConfigurationWoScenario(this IDocumentBuilder builder, T args) where T : IfrsPartition", @@ -51,9 +68,13 @@ "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", "\n .WithColumn(x => x.Id, x => x.Delete())", "\n .WithColumn(x => x.Scenario, x => x.Delete()));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "uvnoDsE4oUSt0PB0WNhadA", "cell_type": "code", "source": [ "public static IDocumentBuilder MainTabConfiguration(this IDocumentBuilder builder, T args) where T : IfrsPartition", @@ -61,15 +82,23 @@ "\n .WithName(Main) ", "\n .WithSource(source => args.RepeatOnce().AsQueryable()) ", "\n .WithColumn(x => x.Id, x => x.Delete()));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "hQK8WsGMl0mDnOVj_sjG-A", "cell_type": "markdown", "source": [ "# Porfolio" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ozokghlNa0ODKC1mTz08zw", "cell_type": "code", "source": [ "public static IDocumentBuilder PortfolioConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : Portfolio", @@ -82,15 +111,23 @@ "\n .WithColumn(x => x.Partition, x => x.Delete())", "\n .WithColumn(x => x.FunctionalCurrency, x => x.Delete());", "\n });" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KWuLpwNT0Ui1wDosD3-3UA", "cell_type": "markdown", "source": [ "# Group of Contract" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0uiDgQgJTkO85SFnjbGm0w", "cell_type": "code", "source": [ "public static IDocumentBuilder GroupofContractConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : GroupOfContract", @@ -109,27 +146,43 @@ "\n .WithColumn(x => x.OciType, x => x.Delete())", "\n .WithColumn(x => x.ValuationApproach, x => x.Delete());", "\n });" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yHfYqYJoYEOI-zwzcrmiTA", "cell_type": "markdown", "source": [ "# Data Node State" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dPWh1L5KDkOezW6JgfkpVA", "cell_type": "code", "source": [ "using DocumentFormat.OpenXml.Spreadsheet;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9wuPH7XlmUmQii3J5fpAXQ", "cell_type": "code", "source": [ "public record HelperState { public string State {get; init;} }" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "07W-etuVhUCGCNpWWgHgXQ", "cell_type": "code", "source": [ "public static IExcelDocumentBuilder DataNodeStateConfiguration (this IExcelDocumentBuilder builder, DataNodeState[] data)", @@ -153,9 +206,13 @@ "\n .WithColumn(x => x.Id, x => x.Delete())", "\n .WithColumn(x => x.State, y => y.WithDataValidation(z => z.WithReferenceTo(t => t.State)))", "\n );" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HU5u0yMp_U68TZhQJQ7Pug", "cell_type": "code", "source": [ "public static IExcelDocumentBuilder StateEnumConfiguration (this IExcelDocumentBuilder builder)", @@ -166,15 +223,23 @@ "\n .WithColumn(x => x.State, z => z.WithDefaultNamedRange())", "\n .WithSource(source => helperState.AsQueryable()) );", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "aVQIFdhD-kCArwh73N3GYA", "cell_type": "markdown", "source": [ "# Data Node Parameter" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rnyY1JSYWkaeU1B5vAG6Ng", "cell_type": "code", "source": [ "public static IExcelDocumentBuilder DataNodeParameterConfiguration (this IExcelDocumentBuilder builder, Dictionary data)", @@ -207,13 +272,20 @@ "\n .WithColumn(x => x.Year, x => x.Delete())", "\n .WithColumn(x => x.Id, x => x.Delete())", "\n );" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fAsIOPFhGUO054zF6vyX0A", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Import/ImportScopeCalculation.ipynb b/ifrs17/Import/ImportScopeCalculation.ipynb index f930054f..92be02bf 100644 --- a/ifrs17/Import/ImportScopeCalculation.ipynb +++ b/ifrs17/Import/ImportScopeCalculation.ipynb @@ -18,38 +18,59 @@ "nbformat_minor": 5, "cells": [ { + "id": "IZg63U-r4Uq_ro4hRUgeRw", "cell_type": "markdown", "source": [ "", "\n

Import Scopes (IFRS17 Methodology Business Logic)

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HGJXnMwy4kWKjzkHkvX8iw", "cell_type": "markdown", "source": [ "This notebook contains the logic used to perform calculations upon import of data (actuals and cashflows). This is also called 'Data Loading' and the concept of Scope is used here to define the logic and provide the means of executing the logic." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "e-Y5r2I4OUCIlOVCJaGGgg", "cell_type": "markdown", "source": [ "# References", "\nLibraries and other notebooks which are needed for this notebook are imported below." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "D25xwuzaa0Ok5fW4jO2zzg", "cell_type": "markdown", "source": [ "## Notebooks" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-meq1BlgnEO_9Qi9rN8PKQ", "cell_type": "code", "source": [ "#!import \"ImportStorage\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "q7mCfe8spkiYyz0WXIYsng", "cell_type": "markdown", "source": [ "", @@ -57,15 +78,23 @@ "\nScopes are used to define and perform data handling in a structured and easy-to-read-through fashion.", "\n", "\nThe IModel interface below will be used to execute calculations (i.e. evaluate the scopes) based on imported data." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "K3W7iT04JUmcnpM2pQHY5A", "cell_type": "code", "source": [ "public interface IModel : IMutableScopeWithStorage{}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "JrH9-tdBRkum_Pb0wxjsvw", "cell_type": "markdown", "source": [ "## Getting Existing Identities", @@ -73,9 +102,13 @@ "\nAn [Identity](../DataModel/DataStructure#import-identity) is a set of identifiers for a certain set of data. In particular, an identity consists of a certain [AoC Type](../DataModel/DataStructure#aoc-type), [Novelty](../DataModel/DataStructure#novelty), [Data Node](../DataModel/DataStructure#data-node), Accident Year, and information on whether the data is for reinsurance or not. ", "\n", "\nGiven a certain Data Node and Accident Year, the interface GetIdentities returns all the existing identities (e.g. for Actuals and Cashflows) which have that Data Node and Accident Year." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Dr6JlCAOa0qTLmEK7mkBRQ", "cell_type": "code", "source": [ "public interface AllCfIdentities : IScope // string represents a DataNode", @@ -87,9 +120,13 @@ "\n DataNode = Identity", "\n });", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "AoUS_cRh0U-AkCOrRjqHQA", "cell_type": "code", "source": [ "public interface GetIdentities : IScope", @@ -178,17 +215,25 @@ "\n DataNode = Identity,", "\n }));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jE0aaaKrhka02hbasl8sXw", "cell_type": "markdown", "source": [ "## Getting Amount Types", "\n", "\nSimilarly, given a certain Data Node and Accident Year, the interface ValidAmountType returns all the amount types which are used in imported data with that Data Node and Accident Year." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3ZoSi02F8UqASGhq1HtvUw", "cell_type": "code", "source": [ "public interface ValidAmountType : IScope", @@ -216,18 +261,26 @@ "\n .Select(x => x.AmountType)", "\n .ToHashSet();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "O-LqZH86kkyVyuFwRmE5Ng", "cell_type": "markdown", "source": [ "", "\n## AoC Step Structure", "\n", "\nThe Aoc step structure is constructed from the data which is delivered as input. It is assumed that it depends only on the Group of Contrat (i.e. it is invariant across Amount types or Accident Year). " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "cAjg0RqZuU6dxyD4BHjSaw", "cell_type": "markdown", "source": [ "### ParentAocStep ", @@ -248,9 +301,13 @@ "\n\\right.", "\n$$", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sGX4WCgwCEWf2CpcEzCASQ", "cell_type": "code", "source": [ "public interface ParentAocStep : IScope<(ImportIdentity Id, string AmountType), ImportStorage>", @@ -279,9 +336,13 @@ "\n IEnumerable ParentAocStep.CalculatedTelescopicAocStep => ", "\n GetStorage().GetCalculatedTelescopicAocSteps().Where(aoc => aoc.AocType != AocTypes.CRU);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZQKnYOpT6EKVKhyDAHuKHw", "cell_type": "markdown", "source": [ "### ReferenceAocStep", @@ -304,9 +365,13 @@ "\n$$", "\n", "\nwhere the last AocStep is obtained by ordering the AocSteps according to their order (as defined by its AocType) and taking the last one." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "52TfWUCcQUyc39rYcKe5KA", "cell_type": "code", "source": [ "public interface ReferenceAocStep : IScope ", @@ -332,9 +397,13 @@ "\n ? GetReferenceAocStep(Identity.AocType)", "\n : identityAocStep;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XSykc2IcnUu5GLwIp9a5xQ", "cell_type": "markdown", "source": [ "### PreviousAocSteps", @@ -357,9 +426,13 @@ "\n$$", "\n", "\nThis scope depends on the InputSource (Actual or Cashflow) for which the PreviousSteps are requested due to the AocChain differences between Actual reports and the rest." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "LFMQRLnGDUeBO3zmMY_IgA", "cell_type": "code", "source": [ "public interface PreviousAocSteps : IScope<(ImportIdentity Id, InputSource ScopeInputSource), ImportStorage> ", @@ -377,24 +450,36 @@ "\n .OrderBy(aoc => GetStorage().AocConfigurationByAocStep[aoc].Order)", "\n : Enumerable.Empty();", "\n} " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ki7yLCpDS0Wgdmiahnjg7g", "cell_type": "markdown", "source": [ "The exact structure being return depends on the **order** of the AoC Steps (which is set by the [AoC Type](../DataModel/DataStructure#aoc-type)), and on which AoC steps exist." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "EHEOFcljGkOYAoWWvUEJjQ", "cell_type": "markdown", "source": [ "", "\n## Discounting", "\n", "\nThe calculation of IFRS17 figures is based on cumulated discounted cashflows." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "o-nF81nHo0O2pGOpaMZPOA", "cell_type": "markdown", "source": [ "", @@ -407,9 +492,13 @@ "\n- Whereas for the **Current** economic base, the yield curve used is the latest available as per the current period.", "\n", "\nThe algorithm which retrieves the latest available yield curve is [here](../Utils/Queries#yield-curve)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "y-3vJArEak2Gxm9Aya6jOA", "cell_type": "markdown", "source": [ "", @@ -426,9 +515,13 @@ "\n$$", "\n", "\nwhere the index $i$ denotes years." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5Vjdb4UUeUWnuDe1HDkF2Q", "cell_type": "code", "source": [ "public interface MonthlyRate : IScope", @@ -443,9 +536,13 @@ "\n ", "\n double[] Discount => Interest.Select(x => Math.Pow(x, -1)).ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "gD7ZdyMyvkmzaiszXR_dqw", "cell_type": "markdown", "source": [ "", @@ -455,9 +552,13 @@ "\n
These values are stored in the database as [RawVariable](../DataModel/DataStructure#raw-variables).", "\n
Refer to the ReferenceAocStep of the AocStructure calculation to identify the correct AocType and Novelty to retrieve.", "\n
Due to the Credit Default Risk of a reinsurance partner, the logic to compute the Nominal Cashflows for this Amount Type must be defined separately. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZmO1j4uGlkGdbfvcSEXJQg", "cell_type": "code", "source": [ "public interface NominalCashflow : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", @@ -493,15 +594,23 @@ "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.EstimateType, Identity.AccidentYear))", "\n .Aggregate();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "IIkemYfM30ytcItha5eYDw", "cell_type": "markdown", "source": [ "For a given month $i$ they are denoted as $\\rm{Nominal}_i$." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_PYIAO14FkCWaGjw_h3sjg", "cell_type": "markdown", "source": [ "", @@ -510,9 +619,13 @@ "\nPresent Values are calculated during the import of the cashflows and stored on the database. They are computed for the relevant Economic Basis, depending on the Valuation Basis.", "\n", "\nTheir calculation is described in the following sections and is summarized in the $\\rm{PV}$ formula [below](#present-value)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "PaIuIxDLMUymcYHNicfmFw", "cell_type": "markdown", "source": [ "", @@ -532,9 +645,13 @@ "\nwhere Transaction Period depends on which Best Estimate value is being computed, in particular on what its [Amount Type](../DataModel/DataStructure#amount-type) is (each Amount Type has its own [Period Type](../Constants/Enums)); and $\\text{Valid Discount}$ stands for the fact that in case the Discount Curves are shorter than the required index, then their last element is returned. We also need to flip the sign of the discounted and cumulated values, to create a reserve view and be consistent with the usual [Cashflow Sign Convention](https://en.wikipedia.org/wiki/Cash_flow_sign_convention). ", "\n", "\n
Also here, the Credit Default Risk contribution is calculated separately. Since it is based on Claims, the Period Type is implicitly defined." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "85QfNxNpt06PAgYiZIqTLg", "cell_type": "code", "source": [ "public interface DiscountedCashflow : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? Accidentyear), ImportStorage>", @@ -562,9 +679,13 @@ "\n ", "\n double[] DiscountedCashflow.Values => Multiply(-1d, NominalValues.ComputeDiscountAndCumulateWithCreditDefaultRisk(MonthlyDiscounting, nonPerformanceRiskRate)); // we need to flip the sign to create a reserve view", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Yyg3nKDMaUegdQgSZmJfhg", "cell_type": "markdown", "source": [ "", @@ -583,9 +704,13 @@ "\n$$", "\n", "\nwhere AocType is the AoC Type of the AoC Step for which the calculations are being performed." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "c6EYdq9zZ0uT4yfFAynddw", "cell_type": "code", "source": [ "public interface TelescopicDifference : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? Accidentyear), ImportStorage>", @@ -602,9 +727,13 @@ "\n ", "\n double[] Values => Subtract(CurrentValues, PreviousValues);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DKL8osruCU-DbEb-tO_8wA", "cell_type": "markdown", "source": [ "", @@ -627,9 +756,13 @@ "\n", "\nFor instance, for the current year and year-to-date view we have $S=0$ and $TS=3$ for the first quarter, $TS=6$ for the 2nd quarter and so on.", "\nFor the projection values of next year first quarter we would have $S=12$ and $TS=3$, etc." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wmAA753Li0Osew0Rx9zS6A", "cell_type": "code", "source": [ "public interface IWithGetValueFromValues : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", @@ -648,9 +781,13 @@ "\n };", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XDKoRCKk-ESOsrY7vOJ-Ew", "cell_type": "markdown", "source": [ "", @@ -668,9 +805,13 @@ "\n$$", "\n", "\n
Due to the Credit Default Risk of a reinsurance partner, the logic to compute the Interest Accretion for this Amount Type must be defined separately. Since it is based on Claims, the Period Type is implicitly defined." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "k8NFcJLF20-kg-ZccJEv5A", "cell_type": "code", "source": [ "public interface IWithInterestAccretion : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", @@ -720,9 +861,13 @@ "\n return Subtract(nominalValuesCreditRisk, effectCreditRisk);", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dM2KZ1PPx0u8-5bNcF2Ccg", "cell_type": "markdown", "source": [ "", @@ -744,9 +889,13 @@ "\n$$", "\n", "\nwhere $i$ denotes the months, and the [$\\rm{TelescopingDifference}_i$](#telescopic-difference) and the [$\\rm{InterestAccretion}_i$](#interest-accretion) quantities are defined above." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8GRVgEhgUECARHHffZ47qg", "cell_type": "code", "source": [ "public interface PresentValue : IWithGetValueFromValues", @@ -805,9 +954,13 @@ "\n [NotVisible]", "\n double[] PresentValue.Values => Enumerable.Empty().ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0kSvVBqlrkKl9AsILO34Rw", "cell_type": "markdown", "source": [ "", @@ -837,9 +990,13 @@ "\n$$", "\n", "\nThese are used in the BBA methodology, whereby in the CSM calculations only PV Locked is used, and both of them are stored in the database under the [IfrsVariable](../DataModel/DataStructure#ifrs-variable) data structure." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rwsQvKBwpEKmspbkigTlhA", "cell_type": "code", "source": [ "public interface PvLocked : IScope", @@ -878,9 +1035,13 @@ "\n ", "\n double Value => PresentValues.Aggregate().Value;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "p2piX2ZdiUu8ZvUw9tRc7g", "cell_type": "markdown", "source": [ "", @@ -897,9 +1058,13 @@ "\n$$", "\n", "\nwhere PV is defined [above](#present-value) and uses the input cashflows with Calculation Type = RA." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "IxvlLZjNpkeg3-puzDYTog", "cell_type": "code", "source": [ "public interface RaLocked : IScope", @@ -930,18 +1095,26 @@ "\n ", "\n double Value => PresentValues.Aggregate().Value;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "d4HlvRMhakijU2gChsTaBg", "cell_type": "markdown", "source": [ "", "\n## Amortization", "\n", "\nFor the Amortization AoC Step (AoC Type **AM**), the amortization factors to be used are defined below." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DeqWNbrHikiG4bMQfqXG2w", "cell_type": "markdown", "source": [ "", @@ -951,9 +1124,13 @@ "\nmeasured by considering the quantity of benefits provided as well as the expected coverage period of the GIC.", "\n", "\nThe cashflows of coverage units are retrieved from the discounted cashflows with [EstimateType](../DataModel/DataStructure#estimate-type) CU." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_ELmzzZJN0uiiI1FeT0svQ", "cell_type": "code", "source": [ "public interface CoverageUnitCashflow : IScope", @@ -965,16 +1142,24 @@ "\n ", "\n double[] Values => GetScope((Identity, (string)null, EstimateType, (int?)null)).Values;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "T8Y3hoFpOUuOHW_Ykmzvmw", "cell_type": "markdown", "source": [ "", "\n### Amortization Factor" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HeJtygvtGk6eh7_xoPz94w", "cell_type": "markdown", "source": [ "For a certain GIC, the monthly Amortization Factors $\\text{Monthly }AF_i$ are computed from the cashflows of the underlying coverage unit for that GIC:", @@ -987,9 +1172,13 @@ "\n- $i$ denotes a monthly period;", "\n- the nominal cash flows $\\text{Nominal}_i(CL)$ are the nominal cashflows of the coverage unit for the AoC Step **Combined Liability** (CL) (input data);", "\n- and the corresponding cumulated discounted cashflows $\\text{CDC}_i$ are defined [above](#cumulated-discounted-cashflows)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6LTCrGSIBUC8NNCHa7XoSw", "cell_type": "code", "source": [ "public interface MonthlyAmortizationFactorCashflow : IScope", @@ -1007,9 +1196,13 @@ "\n _ => Enumerable.Empty().ToArray(),", "\n };", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "T-KevHUzMU6jtx0febbk3Q", "cell_type": "markdown", "source": [ "For a certain projection period - defined by the Shift, $S$, and the Time-Step, $TS$, parameters - the Amortization Factor is then given by the product of the corresponding monthly amortization factors:", @@ -1021,9 +1214,13 @@ "\nEach GIC will have his own AF.", "\n", "\nIn order to run off the business of a given Group of Contract one should provide a cashflow of 0s for the AocStep with AocType CL and Novelty C. When computing the AF this results in the product of the monthly amortization factors of the period to be 1. In this case, the computed AF does not follow the formula above but is 1 allowing for the full release of the Technical Margin in the AM AocStep." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XMjWT533GUeMzhXBqcbNQQ", "cell_type": "code", "source": [ "public interface CurrentPeriodAmortizationFactor : IScope", @@ -1052,9 +1249,13 @@ "\n{", "\n double CurrentPeriodAmortizationFactor.Value => GetStorage().GetValue(Identity, (string)null, EstimateType, EconomicBasis, (int?)null);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4Fjpb-dp4kKfTVXN_ZcKZQ", "cell_type": "markdown", "source": [ "", @@ -1073,9 +1274,13 @@ "\n
 Release", "\n
 Write-off", "\n
 EOP" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "cEHGz5WS5E-Ii9iLJJsfQw", "cell_type": "markdown", "source": [ "", @@ -1094,9 +1299,13 @@ "\n$$", "\n", "\nwhere the value is also function of the [Estimate Type](../DataModel/DataStructure#EstimateType) and [Amount Type](../DataModel/DataStructure#AmountType), and the $\\text{Imported Actual}$ value is described [here]()." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "xxzl252E4UqfccTJZC6Yxw", "cell_type": "code", "source": [ "public interface ActualBase : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", @@ -1123,9 +1332,13 @@ "\n{", "\n double ActualBase.Value => 0;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "f5KR23M1rku81r40flA3WQ", "cell_type": "markdown", "source": [ "", @@ -1136,9 +1349,13 @@ "\n$$", "\n\\text{Actual} (\\text{Release}) = \\text{Actual Base} (\\text{Release})|_{\\text{Estimate Type} = A}", "\n$$" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "qn7r5BBOzEOndYaSAj9Xdg", "cell_type": "code", "source": [ "public interface Actual : IScope", @@ -1153,9 +1370,13 @@ "\n .SelectMany(at => accidentYears", "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "k7EQao6-V0KRhEJwrzUb9Q", "cell_type": "markdown", "source": [ "", @@ -1171,9 +1392,13 @@ "\n$$", "\n\\text{Advance Actual} (\\text{AoC step}) = \\text{Actual Base} (\\text{AoC step})|_{\\text{Estimate Type} = AA}", "\n$$" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "S0pnzxS5wEW8KgMHCvHTBA", "cell_type": "code", "source": [ "public interface AdvanceActual : IScope", @@ -1188,9 +1413,13 @@ "\n .SelectMany(at => accidentYears", "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "k8Nl310aM06j_MP1MVjzvw", "cell_type": "markdown", "source": [ "", @@ -1208,9 +1437,13 @@ "\n$$", "\n\\text{Overdue Actual} (\\text{AoC step}) = \\text{Actual Base} (\\text{AoC step})|_{\\text{Estimate Type} = OA}", "\n$$" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "f7C3NzK97EiGVPP6pEN7BA", "cell_type": "code", "source": [ "public interface OverdueActual : IScope", @@ -1225,9 +1458,13 @@ "\n .SelectMany(at => accidentYears", "\n .Select(ay => GetScope((Identity, at, EstimateType, ay)))).ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "As4FInLuokOmKXArqSH_pg", "cell_type": "markdown", "source": [ "", @@ -1247,9 +1484,13 @@ "\n$$", "\n", "\nwhere $ACA$ and $AEA$ are *Aquisition* Amount Types from **Attributable Commission** and **Attributable Expenses**, respectively." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ca6TvbsWNUqcgsiEXoNsxg", "cell_type": "code", "source": [ "public interface DeferrableActual : IScope", @@ -1293,24 +1534,36 @@ "\n double DeferrableActual.Value => GetScope((Identity, InputSource.Actual)).Values", "\n .Sum(aocStep => GetScope(Identity with {AocType = aocStep.AocType, Novelty = aocStep.Novelty}).Value);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "h9P0A4w8mkuZ-TOMU_ONEw", "cell_type": "markdown", "source": [ "", "\n## Contractual Service Margin, Loss Component and Loss Recovery Component", "\n", "\nThe Contractual Service Margin ($CSM$) denotes the unearned profit from an insurance contract or group of insurance contracts and plays a critical role in the calculation of profit & loss values. Similarly, the unearned loss is denoted by Loss Component ($LC$), Loss Recovery Component in the case of reinsurance contracts." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Jk5HEkRb2EOEir320okRBg", "cell_type": "markdown", "source": [ "## Experience Adjustment on Premium" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oJfwg9hckEmVYLOQDafYxQ", "cell_type": "markdown", "source": [ "The Experience Adjustment (EA) on Premiums weights the cash-flow (CF aocSteps) for premium amount types by the PremiumAllocationFactor input for each group of insurance contract. ", @@ -1323,9 +1576,13 @@ "\nEA (\\text{Actual}) = \\text{Premium Allocation Factor} \\cdot \\big( \\text{Actual}(\\text{AocType = CF}) + \\text{Advance Actual}(\\text{AocType = CF})+ \\text{Overdue Actual}(\\text{AocType = CF}) \\big) ~,", "\n$$", "\nwhere amount type premium and its children are considered, novelties in-force and new business are considered for $PV$ whereas novelty combined is considered for Actual. The allocation is always done in the finest granularity (novelty, line of business, ..) possible." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "gR_oBLnGjkCdbSR1Xv36KQ", "cell_type": "code", "source": [ "public interface BeExperienceAdjustmentForPremium : IScope", @@ -1346,9 +1603,13 @@ "\n{", "\n PresentValue[] BeExperienceAdjustmentForPremium.ByAmountType => Enumerable.Empty().ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "k0CqaQ-_ok2vg6GE1FC75A", "cell_type": "code", "source": [ "public interface ActualExperienceAdjustmentForPremium : IScope", @@ -1366,9 +1627,13 @@ "\n{", "\n ActualBase[] ActualExperienceAdjustmentForPremium.ByAmountTypeAndEstimateType => Enumerable.Empty().ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zPtJDlQU6k-Z5r6O60RZaw", "cell_type": "markdown", "source": [ "", @@ -1430,9 +1695,13 @@ "\n$$", "\n", "\nwhere the AoC Step **CF** is implicit for all formulas, $PV$ is the [present value](#present-value) with Estimate Type **BE**, and Actuals have Estimate Types **A**, **AA**, and **OA** (see details [here](#actual-values))." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "19jPup_Bx0GSC7YLpp-7aA", "cell_type": "code", "source": [ "public interface TechnicalMargin : IScope", @@ -1520,9 +1789,13 @@ "\n{", "\n double TechnicalMargin.Value => -1d * AggregatedValue * GetScope(Identity, o => o.WithContext(EconomicBasis)).Value;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "EL8bVpKgg0mqV06dSFrnyg", "cell_type": "markdown", "source": [ "", @@ -1641,9 +1914,13 @@ "\n### Reinsurance case", "\n", "\nFor the reinsurance case, the switch logic is identical to the one described above, except that it uses the gross Technical Margins multiplied by the weights coming from the Reinsurance Coverage Parameter (see [Data Node Parameters](../DataModel/DataStructure#data-node-parameters)). In case a GRIC has multiple GICs, then these weighted $TM$s are aggregated." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wNL0WqL5DEWHPLdAu6D-Qg", "cell_type": "code", "source": [ "public interface AllocateTechnicalMargin: IScope", @@ -1767,21 +2044,33 @@ "\n .Sum(aoc => GetScope(Identity with {AocType = aoc.AocType, Novelty = aoc.Novelty}).Value);", "\n [NotVisible] string AllocateTechnicalMargin.ComputedEstimateType => ComputeEstimateType(AggregatedTechnicalMargin);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "q9wQO79KLE6XecsW71bHug", "cell_type": "markdown", "source": [ "For the **Group of Reinsurance Contracts** (GRICs), the switch is computed within the underlying GIC context and $CSM$ and $LR$ are then computed in the same manner as for the underlying GICs CSM and LC." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wtSp81Pr5k2osiHdsbp9IQ", "cell_type": "markdown", "source": [ "The scopes below are simply used to set the appropriate Estimate Type (C for $CSM$, L for $LC$ and LR for $LoReCo$), as well as to set $CSM$ values to be positive:" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YikKMJsnVkabj5NdPZgtRA", "cell_type": "code", "source": [ "public interface ContractualServiceMargin : IScope", @@ -1790,9 +2079,13 @@ "\n ", "\n double Value => -1d * GetScope(Identity, o => o.WithContext(EstimateType)).Value;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Z7iybzoX0kOwNsxQO5PGHg", "cell_type": "code", "source": [ "public interface LossComponent : IScope", @@ -1801,9 +2094,13 @@ "\n ", "\n double Value => GetScope(Identity, o => o.WithContext(EstimateType)).Value;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WDtHHWXvdUmzUQSyWWjScQ", "cell_type": "code", "source": [ "public interface LossRecoveryComponent : IScope", @@ -1812,17 +2109,25 @@ "\n ", "\n double Value => GetScope(Identity, o => o.WithContext(EstimateType)).Value;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZktIv7ZYt0qmFTGek6WDHA", "cell_type": "markdown", "source": [ "## Computing All Scopes", "\n", "\nSince all the calculations defined in the various scopes are to be performed together, it is useful to introduce the scope ComputeAllScopes below, which given a certain Import Identity and Import Storage, performs all the calculations (defined above) based on the corresponding data:" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "senAlJILrECJzpbfr5ar4A", "cell_type": "code", "source": [ "public interface ComputeAllScopes: IScope //ComputeIfrsVariable", @@ -1993,13 +2298,20 @@ "\n .Concat(Csms).Concat(Loss),", "\n };", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "p-LnlEZSK0W1q5f2SrxZMQ", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Import/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb index 41731861..db6aebee 100644 --- a/ifrs17/Import/ImportStorage.ipynb +++ b/ifrs17/Import/ImportStorage.ipynb @@ -18,6 +18,7 @@ "nbformat_minor": 5, "cells": [ { + "id": "b-AJSwH1T0q6LGMLygwVYQ", "cell_type": "markdown", "source": [ "", @@ -39,23 +40,35 @@ "\n- [DataNodes](../DataModel/DataStructure)", "\n", "\nSuch storage is then passed to calculations defined in the corresponding [Import Scopes](./ImportScopeCalculation)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "tB8k622IxkexI_F9H3qDew", "cell_type": "code", "source": [ "#!import \"../Utils/EqualityComparers\"", "\n#!import \"../Utils/ImportCalculationMethods\"", "\n#!import \"../Utils/Queries\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "F3zQ1GvRyUyHAKF0DboHiw", "cell_type": "markdown", "source": [ "# Import Storage" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5OFxFeAcmES2tfGQNvWgHw", "cell_type": "code", "source": [ "public class ImportStorage", @@ -377,13 +390,20 @@ "\n public IEnumerable GetPremiums() => hierarchyCache.Get(AmountTypes.PR).Descendants(includeSelf : true).Select(x => x.SystemName);", "\n public IEnumerable GetClaims() => hierarchyCache.Get(AmountTypes.CL).Descendants().Select(x => x.SystemName);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jVpRLSU0bk6kufLUDDNU3Q", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index d3f3eacf..53fd5640 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -19,29 +19,42 @@ "nbformat_minor": 5, "cells": [ { + "id": "GEBNBjd7AESlxlt81wmoXQ", "cell_type": "markdown", "source": [ "", "\n

Importer Methods

", "\n" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6aPxAWjoMEGEYwn_2mU05g", "cell_type": "code", "source": [ "#!import \"ImportScopeCalculation\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "x_-nRNU4fU6Dnxx46JV05A", "cell_type": "markdown", "source": [ "# Parsing Storage", "\n", "\nThe Parsing storage collects data required for the import of a file. ", "\nSuch storage is then passed to parsing format definitions to map the content of the file into variables." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "97QSbHoWKEGb8n7ygLi1dg", "cell_type": "code", "source": [ "public class ParsingStorage", @@ -208,23 +221,35 @@ "\n ApplicationMessage.Log(Error.InvalidAmountTypeEstimateType, estimateType, amountType);", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nEV2GklBnUqC8JIi92ETNw", "cell_type": "markdown", "source": [ "# Basics", "\n", "\nBasic methods to delete variable and update variables to the data source are defined." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pFCSFdMzVkehiGs_gLbbUg", "cell_type": "markdown", "source": [ "## Clean the Database" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WbGNfikYmUOK7NYwj-HfkQ", "cell_type": "code", "source": [ "async public Task CleanDatabaseAsync (Expression> filter = null) where T : class", @@ -232,9 +257,13 @@ "\n var loadData = await DataSource.Query().Where(filter?? (Expression>)(x => true)).ToListAsync();", "\n await DataSource.DeleteAsync(loadData);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "B09ETZusIUyL99bgkGPjRA", "cell_type": "code", "source": [ "async public Task CleanDatabaseFromPartitionAsync (Guid partitionId, Func filter = null) where T : class, IPartitioned", @@ -243,15 +272,23 @@ "\n .Where(filter?? (Func)(x => true)).ToList();", "\n await DataSource.DeleteAsync(loadData);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "PMbRolQ05UuKOPa9451dEg", "cell_type": "markdown", "source": [ "## Update the Database" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "EjST6sz8JEurnRLnwPYl1Q", "cell_type": "code", "source": [ "async public Task CommitToDatabase (Guid partitionId, bool snapshot = true, Func filter = null) where T : class, IPartitioned", @@ -260,15 +297,23 @@ "\n await DataSource.UpdateAsync( await Workspace.Query().ToArrayAsync() );", "\n await DataSource.CommitAsync();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pQiCmfx0i0qTKU8MrX7n5w", "cell_type": "markdown", "source": [ "## Data Node Factory" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "iefdpcJCZE2JSkpcLQ_yAA", "cell_type": "code", "source": [ "public async Task DataNodeFactoryAsync(IDataSet dataSet, string tableName, ImportArgs args)", @@ -296,21 +341,33 @@ "\n", "\n await DataSource.CommitAsync();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5zZRjIRbVk6RvrXn7GTtHA", "cell_type": "markdown", "source": [ "# Importers" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8psLQ8lKpU-50HR8Z9fFeg", "cell_type": "markdown", "source": [ "## Analysis of Change Configuration" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ptM1upQYJUSJ3HgrC0UyOQ", "cell_type": "markdown", "source": [ "The [Analysis of Change configuration](../DataModel/DataStructure#aoc-step-configuration) is parsed from the input file and complemented with defaults to allow for an easy insertion of new Aoc steps. ", @@ -329,9 +386,13 @@ "\n| WO < Order < CL | WO with Novelty C (only for Import Source = Actual) |", "\n", "\nThe new Aoc Configurations are created with the same order of the Aoc Types. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "PXcWmb1qTkKlCSVOjJDHxw", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.AocConfiguration, async (options, dataSet) => {", @@ -406,17 +467,25 @@ "\n await workspace.CommitToTargetAsync(options.TargetDataSource);", "\n return Activity.Finish().Merge(logConfig); ", "\n});" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0sc5KOQvKEicxmEkg9I2Nw", "cell_type": "markdown", "source": [ "## Parse Main Tab and return Args", "\n", "\nThe main table of our custom import formats contains the information which are required to identify the data partition. These information are temporarily stored in [Args](../DataModel/DataStructure#args) and used in the next methods. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YiFEJAxq8Eeo4f1pOhrslA", "cell_type": "code", "source": [ "public async Task GetArgsFromMainAsync(IDataSet dataSet)", @@ -473,23 +542,35 @@ "\n await DataSource.CommitAsync();", "\n return args;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "D_Yg7U6xL0iEu2J5dYGGQQ", "cell_type": "markdown", "source": [ "## Parse and Upload: Data Nodes", "\n", "\n[Portfolios](../DataModel/DataStructure#portfolios) and [Group of Contracts](../DataModel/DataStructure#group-of-contracts) are imported in the same file. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_YEY_T29PEuM6hOitLi_yA", "cell_type": "markdown", "source": [ "### Portfolio and Group of contract" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "iPkLnvWBw0K_vugEhM6eEA", "cell_type": "code", "source": [ "public async Task UploadDataNodesToWorkspaceAsync(IDataSet dataSet)", @@ -590,9 +671,13 @@ "\n ", "\n return Activity.Finish().Merge(importLogPortfolios).Merge(importLogGroupOfContracts);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dZee9zb4hU-600lxQvKKfA", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.DataNode, async (options, dataSet) => {", @@ -604,15 +689,23 @@ "\n await CommitToDatabase(partition);", "\n return log;", "\n});" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "OvJQpOepfUKs9HO05RZt3g", "cell_type": "markdown", "source": [ "### Data Node State" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "twd-9JphDkKWlYMzzMHRZg", "cell_type": "code", "source": [ "public async Task ValidateDataNodeStatesAsync(Dictionary persistentDataNodeByDataNode)", @@ -631,9 +724,13 @@ "\n }", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "11oMaqji9ESPXtnfGdol1A", "cell_type": "code", "source": [ "public async Task UploadDataNodeStateToWorkspaceAsync(IDataSet dataSet)", @@ -667,9 +764,13 @@ "\n await ValidateDataNodeStatesAsync(storage.DataNodeDataBySystemName);", "\n return Activity.Finish().Merge(importLog);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bLmthg_F0UmHmuC_hebLZg", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.DataNodeState, async (options, dataSet) => {", @@ -677,15 +778,23 @@ "\n await CommitToDatabase((Guid)Workspace.Partition.GetCurrent(nameof(PartitionByReportingNode)), snapshot: false); ", "\n return log;", "\n});" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rveYUL5bPUC82CbWaGi4lQ", "cell_type": "markdown", "source": [ "### DataNode Parameters" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8BBfuwsh-kKG9CE8LIqlIg", "cell_type": "code", "source": [ "public async Task UploadDataNodeParameterToWorkspaceAsync(IDataSet dataSet, Guid targetPartitionByReportingNodeId)", @@ -771,9 +880,13 @@ "\n targetPartitionByReportingNodeId = storage.TargetPartitionByReportingNode.Id;", "\n return Activity.Finish().Merge(importLog);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "qresbZmRKUGDdhb2Qg2bYQ", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.DataNodeParameter, async (options, dataSet) => {", @@ -785,9 +898,13 @@ "\n ", "\n return log;", "\n});" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pbi5WLybL0WeWvmp48L8dA", "cell_type": "markdown", "source": [ "## Parse and Upload: Variables", @@ -798,15 +915,23 @@ "\n", "\nSome computed variables depend on both cash flow and actual input, requiring recalculation at each new import. ", "\n
In order to improve performance and maximize computational efficiency, we only (re)compute the set of variables that are expected to change given the underlying business logic. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0qtpigTMXUeFOJBGAhD64A", "cell_type": "markdown", "source": [ "### Validation for Active Data Node States" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "df6Q6O4n8UGZ6QMEHXWp7Q", "cell_type": "code", "source": [ "public async Task ValidateForDataNodeStateActiveAsync(Dictionary dataNodes) where T : BaseDataRecord", @@ -815,15 +940,23 @@ "\n if(!dataNodes.ContainsKey(item.First().DataNode))", "\n ApplicationMessage.Log(Error.InactiveDataNodeState, item.First().DataNode);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zer3DehdW0OXTbIW-BE5wQ", "cell_type": "markdown", "source": [ "### Cashflow as Raw Variable and Ifrs Variable" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "qxiTr4OQU02FSTwnCLjAqg", "cell_type": "code", "source": [ "public async Task ParseCashflowsToWorkspaceAsync(IDataSet dataSet, ImportArgs args)", @@ -889,9 +1022,13 @@ "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", "\n return Activity.Finish().Merge(importLog);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "d2PR6nE090qnEhAx26W4Fw", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.Cashflow, async (options, dataSet) => {", @@ -923,15 +1060,23 @@ "\n", "\n return Activity.Finish().Merge(parsingLog); ", "\n});" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "F_ov9xx25ECCgKn8LjsZgw", "cell_type": "markdown", "source": [ "### Actuals as Ifrs Variable" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kEyrQCxqEkmoUupmjE-B8Q", "cell_type": "code", "source": [ "public async Task ParseActualsToWorkspaceAsync(IDataSet dataSet, ImportArgs args)", @@ -991,9 +1136,13 @@ "\n await ValidateForDataNodeStateActiveAsync(parsingStorage.DataNodeDataBySystemName);", "\n return Activity.Finish().Merge(importLog);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HqDpHFbZNkynz3nM9TSiDA", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.Actual, async (options, dataSet) => {", @@ -1022,9 +1171,13 @@ "\n", "\n return Activity.Finish().Merge(parsingLog);", "\n});" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "cl1ZHPkmTk66Nh-WZoQ0Ag", "cell_type": "markdown", "source": [ "# Simple Value Import", @@ -1033,15 +1186,23 @@ "\n
It can be used in two very different scenarios: ", "\n- Simple Value : to import final figures as computed by an independent tool. In this case our IFRS 17 calculation is not applied and variable are stored in the Database for being consumed in reports with our powerful reporting tooling. ", "\n- Opening value : in the **fair value approach** this importer allows the import of in force opening values (Aoc step BOP and novelty I) for EstimateTypes C, L, LR, AA, OA, DA." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jjIv6ndV_EeSuPrStrKGNQ", "cell_type": "markdown", "source": [ "## Simple Value to Workspace" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "k8vc0EGeGk2hVkNAYZzgig", "cell_type": "code", "source": [ "public async Task ParseSimpleValueToWorkspaceAsync(IDataSet dataSet, ImportArgs args, Guid targetPartitionByReportingNodeAndPeriodId)", @@ -1103,15 +1264,23 @@ "\n targetPartitionByReportingNodeAndPeriodId = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id;", "\n return Activity.Finish().Merge(importLog);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "RQi9nkdXQEmaeLBlImg__A", "cell_type": "markdown", "source": [ "## Simple Value as IfrsVariable" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DJPGRNmcW0u6oJJTFjNFLg", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.SimpleValue, async (options, dataSet) => {", @@ -1132,15 +1301,23 @@ "\n ", "\n return Activity.Finish().Merge(parsingLog);", "\n});" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "uAVHYz0MD0SFk1IMsDUcIw", "cell_type": "markdown", "source": [ "## Openings as IfrsVariable" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oyD6qvynF0Or3udnGnPqoQ", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.Opening, async (options, dataSet) => {", @@ -1170,13 +1347,20 @@ "\n", "\n return Activity.Finish().Merge(parsingLog);", "\n});" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "PijxDGahGkKV1GD0j9HrCg", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/OverviewCalculationEngine.ipynb b/ifrs17/OverviewCalculationEngine.ipynb index 651ab74b..62ff16a0 100644 --- a/ifrs17/OverviewCalculationEngine.ipynb +++ b/ifrs17/OverviewCalculationEngine.ipynb @@ -18,12 +18,17 @@ "nbformat_minor": 5, "cells": [ { + "id": "3f2xh5L6m0OJIHBDr3UlXg", "cell_type": "markdown", "source": [ "

IFRS 17 Calculation Engine - an Overview

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CUdOibiJDEewI_wagM7MpA", "cell_type": "markdown", "source": [ "# Introduction", @@ -33,9 +38,13 @@ "\nThis notebook provides an **overview** of Systemorph's IFRS 17 Calculation Engine with brief introductions to all the main steps.", "\n", "\nThere are numerous **links** to several notebooks of the Calculation Engine. These notebooks contain specifications, code and also some detailed explanations with formulas in markdown blocks. The most important ones in this respect are [DataStructure](./DataModel/DataStructure#data-structure), [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) and [ReportScopes](./Report/ReportScopes#report-scopes)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3IgPzAqQsEa9vnFOg7U30g", "cell_type": "markdown", "source": [ "", @@ -66,9 +75,13 @@ "\n - Liability for Incurred Claims (LIC)", "\n - Financial Performance", "\n - Accounting Events" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "p2eQ-g5oYUKG2H4ZlhOBWw", "cell_type": "markdown", "source": [ "", @@ -77,9 +90,13 @@ "\nThe IFRS 17 calculations are based on a well-defined [DataModel](./DataModel/DataStructure#data-structure). The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model.", "\n", "\nThe IFRS 17 calculations start by importing data input files, and the more complex IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CvHU8yPgcku6OEvcmEIpSQ", "cell_type": "markdown", "source": [ "", @@ -92,9 +109,13 @@ "\nThe [input files](#data-input-dim-nodes) for ReportingNodes and especially Dimensions provide an overview of data structures actually used. Some dimensions are hierarchical, so some entries have parent entries.", "\n", "\nMany abbreviations and acronyms used later in the documentation and the code are the **system names**, where the corresponding display names can be found in the corresponding input files together with the attributes." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jOqvoH1Bl0ewf9in5N9NIQ", "cell_type": "markdown", "source": [ "", @@ -107,9 +128,13 @@ "\nImportStorage --> ImportScopeCalculation --> Importers", "\n", "\nThe calculations of ImportScopeCalculation cover a large part of the IFRS 17 methodology and are explained in the section below." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "k_CuwJdj_UOGz6TPZHdngQ", "cell_type": "markdown", "source": [ "", @@ -150,9 +175,13 @@ "\n - [Fulfillment Cashflow (FCF)](./Import/ImportScopeCalculation#fulfillment-cashflow), same as the aforementioned cumulated discounted cashflow, now adding the risk adjustment component as a basis for CSM and LC calculations", "\n - [Technical Margin](./Import/ImportScopeCalculation#technical-margin), which is the FCF with special rules for different AoC steps including the Amortization step, also using and calculating the Interest Accretion Factor, Premiums, Deferrals and Investment Claims", "\n - [Switch Logic for CSM and LC](./Import/ImportScopeCalculation#technical-margin), switching between CSM and LC for a given AoC step in the AoC period; one of the two is always zero depending on the sign of the Technical Margin; distinguishing the [gross case](./Import/ImportScopeCalculation#gross-case) (no reinsurance) from the [reinsurance case](./Import/ImportScopeCalculation#reinsurance-case) which applies reinsurance coverage weights" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "RzhAC13vCE6swA2hTa2Sqw", "cell_type": "markdown", "source": [ "", @@ -165,7 +194,10 @@ "\nSome reports of ReportScopes just present existing data from the database, namely the imported data and the results already calculated using the methods of [ImportScopes](#model-calc).", "\n", "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#ifrs-17-financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#ifrs-17-financial-performance)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Report/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb index 43ecc78c..e6c85b7d 100644 --- a/ifrs17/Report/ReportConfigurationAndUtils.ipynb +++ b/ifrs17/Report/ReportConfigurationAndUtils.ipynb @@ -18,19 +18,28 @@ "nbformat_minor": 5, "cells": [ { + "id": "G81HH-rybkeg0vlY1DNDgA", "cell_type": "markdown", "source": [ "

Report Configuration And Utils

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8YLIovEcLkm_r75W6SD-tQ", "cell_type": "code", "source": [ "#!import \"../Utils/EqualityComparers\"", "\n#!import \"../Utils/Queries\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YDShzSvSMEydbrp8JkeGsQ", "cell_type": "code", "source": [ "using Systemorph.Vertex.Pivot.Builder;", @@ -51,15 +60,23 @@ "\n .ToArray())", "\n .WithAutoGroupColumn(c => c.WithWidth(headerColumnWidth) with { Pinned = \"left\" })", "\n with { Height = reportHeight, GroupDefaultExpanded = groupDefaultExpanded, OnGridReady = null } );" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "n6rie8G-ykemdglb-7PEvw", "cell_type": "markdown", "source": [ "# Currency methods" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "puLk5ud_Ck6vPZU4g9XFFQ", "cell_type": "code", "source": [ "public static double GetCurrencyToGroupFx(Dictionary> exchangeRates, string currency, FxPeriod fxPeriod, string groupCurrency)", @@ -75,21 +92,33 @@ "\n", "\n return currencyToGroupFx;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nqjo4v0cw0-uU5WuJwKR6g", "cell_type": "markdown", "source": [ "# Queries" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "JH81cH0s3k-O6MdnNoeqVA", "cell_type": "markdown", "source": [ "## Query Report Variables" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "uRooxq8TMEqondN6Rh6pAw", "cell_type": "code", "source": [ "public static async Task QueryReportVariablesSingleScenarioAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", @@ -141,9 +170,13 @@ "\n await workspace.Partition.SetAsync(null);", "\n return reportVariables;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "mSy1fCO1M0ONNi3ki_Pmxw", "cell_type": "code", "source": [ "public static async Task> QueryReportVariablesAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", @@ -153,13 +186,20 @@ "\n return (await workspace.QueryReportVariablesSingleScenarioAsync((args.Year, args.Month, args.ReportingNode, args.Scenario)))", "\n .Union(reportVariables.Select(x => x with {Scenario = args.Scenario}), EqualityComparer.Instance).ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Sv4LupuFhkaAnNNufoj3ag", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Report/ReportMutableScopes.ipynb b/ifrs17/Report/ReportMutableScopes.ipynb index ffc3f5df..f76e992e 100644 --- a/ifrs17/Report/ReportMutableScopes.ipynb +++ b/ifrs17/Report/ReportMutableScopes.ipynb @@ -16,50 +16,79 @@ "nbformat_minor": 5, "cells": [ { + "id": "4-B50jXklE2YDIuIe3HA2w", "cell_type": "markdown", "source": [ "", "\n

Report Mutable Scopes

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "FYMR6GSWdUyCG1R-fIE1Vw", "cell_type": "markdown", "source": [ "This notebook contains the set up of mutable scopes used to achieve high interactivity with reports." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "0JhA_sNpO0izpVqyzUX_Eg", "cell_type": "markdown", "source": [ "# References", "\nLibraries and other notebooks which are needed for this notebook are imported below." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "UvJZERnCKUCBkDX8E0AU4g", "cell_type": "code", "source": [ "#!import \"ReportScopes\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "LtTQpqceO0G0az5CE1YolA", "cell_type": "markdown", "source": [ "# Mutable Scope" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rwM6oqgcL0STU-YscKiCQQ", "cell_type": "markdown", "source": [ "The IIfrs17Report mutable scope is created with applicabilities to control how the data for each individual report is retrieved from the [report scopes](./ReportScopes)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XNQ232XQiUOqTdvMRJCv1w", "cell_type": "code", "source": [ "public interface ReportUniverse : IMutableScopeWithStorage{}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "eBl7wxcU4EaUPLogx9wtYg", "cell_type": "code", "source": [ "[InitializeScope(nameof(InitAsync))]", @@ -259,21 +288,33 @@ "\n ? GetScopes(GetIdentities()).Aggregate().FinancialPerformance", "\n : GetScopes(GetIdentities()).Aggregate().FinancialPerformance.Filter(dataFilter);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "gU99z__YGU2k9S64YWfNoQ", "cell_type": "markdown", "source": [ "# IFRS 17 Reports" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bxYmQqMxw0atpKUxyO_Vsg", "cell_type": "markdown", "source": [ "This class is used to trigger the calculation of the reports and it is exposed to the end-user in the reports." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6GqpaLYsskm-MRqPqzLMvg", "cell_type": "code", "source": [ "public class Ifrs17Reports ", @@ -310,13 +351,20 @@ "\n public IIfrs17Report Lic => reportUniverse.GetScope(nameof(LicReport));", "\n public IIfrs17Report FinancialPerformance => reportUniverse.GetScope(nameof(FpReport));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "osiVbq3V10aq7PZzUsHrdA", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb index b8a73b15..fe17e3d7 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -18,74 +18,119 @@ "nbformat_minor": 5, "cells": [ { + "id": "_jUdggiDrUyBhzYT-zsKlg", "cell_type": "markdown", "source": [ "", "\n

Report Scopes (IFRS17 Methodology Business Logic)

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "FCENXAo530GTEsahnzh3Zg", "cell_type": "markdown", "source": [ "This notebook contains the logic used to perform calculations upon reporting of data." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "k-67Zop3rk6rPomMgZXjpg", "cell_type": "markdown", "source": [ "# References", "\nLibraries and other notebooks which are needed for this notebook are imported below." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kmL7X4N-cEiLhdpkQ-IxCQ", "cell_type": "markdown", "source": [ "## Notebooks" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "F2Ak5SkrkkKRPq9k2iDyvw", "cell_type": "code", "source": [ "#!import \"ReportStorage\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rtjV1Wjggk-Q5YLDgDjl4A", "cell_type": "markdown", "source": [ "# Scopes" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jI7xd2iiDk6piQEpKjxoEQ", "cell_type": "markdown", "source": [ "## Helper Scopes" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4yXIuwsJmUuwuLKrj4iWWQ", "cell_type": "markdown", "source": [ "### Universe" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "r6QP8peSmkyuJm6uEbonxw", "cell_type": "code", "source": [ "public interface IUniverse: IScopeWithStorage {}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zFL_sMbgU0CN5e4NZ813YA", "cell_type": "markdown", "source": [ "## Data Transformation" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nQVTU_-Eg0yRndbemAgtXA", "cell_type": "markdown", "source": [ "### Retrieve Raw Data" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ymr0ZlbYG0um2uqiz3v6UA", "cell_type": "code", "source": [ "public interface Data: IScope<(ReportIdentity ReportIdentity, string EstimateType), ReportStorage>, IDataCube {", @@ -110,15 +155,23 @@ "\npublic interface DataWrittenActual: Data {", "\n IDataCube Data.Data => RawData;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "2vgu3Y_ASU29KA6DDK4lpQ", "cell_type": "markdown", "source": [ "### Foreign Exchange (FX) Rates" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rbuEOG3Gq0O68H41e9mDaA", "cell_type": "code", "source": [ "public interface Fx: IScope<(string ContractualCurrency, string FunctionalCurrency, FxPeriod FxPeriod, (int, int) Period, CurrencyType CurrencyType), ReportStorage> { ", @@ -134,9 +187,13 @@ "\n ", "\n double Fx => GetFunctionalFxRate(Identity.FxPeriod) * groupFxRate;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "OL1a5GVDXUePbsqWJV1SFA", "cell_type": "code", "source": [ "public interface FxData: IScope<(ReportIdentity ReportIdentity, CurrencyType CurrencyType, string EstimateType), ReportStorage>, IDataCube {", @@ -166,24 +223,36 @@ "\npublic interface FxDataWrittenActual: FxData {", "\n IDataCube FxData.FxData => Data;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "NIBuXEsJL06BDspV6kTFjA", "cell_type": "markdown", "source": [ "## Present Value" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "tfD7_v70RkiwMtqIi9PUGg", "cell_type": "markdown", "source": [ "", "\n### Best Estimate", "\n", "\nBest Estimate of Present Value (PV) report includes contributions from the [Present Value](../Import/ImportScopeCalculation#present-values) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "E63asVZNJkm2FlOPo5UiaQ", "cell_type": "code", "source": [ "public interface BestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -201,18 +270,26 @@ "\n IDataCube CurrentBestEstimate => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BE)).FxData", "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.C));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "OSD06OKuX024WjdhfeUpKg", "cell_type": "markdown", "source": [ "", "\n### Risk Adjustment", "\n", "\nRisk Adjustment (RA) report includes contributions from the [Risk Adjustment](../Import/ImportScopeCalculation#risk-adjustment) calculation. The result of the Locked-in calculation is used when the Valuation Approach is BBA and the flag for Oci is active." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "s6YtyFfYD0-IBvSoruABxQ", "cell_type": "code", "source": [ "public interface RiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -230,17 +307,25 @@ "\n IDataCube CurrentRiskAdjustment => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.RA)).FxData", "\n .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.C));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "2lAiiNzYE024n3K2gWD5TA", "cell_type": "markdown", "source": [ "", "\n## Fulfillment Cashflows", "\nFulfillment Cashflows (FCF) report includes contributions from the [Best Estimate](#best-estimate) of Present Value and [Risk Adjustment](#risk-adjustment) Present Value." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "32lphidM90CypfxohxRmPA", "cell_type": "code", "source": [ "public interface Fcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -263,42 +348,62 @@ "\n ", "\n IDataCube LockedFcf => BestEstimate + RiskAdjustment;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "c_u6A_a9WU2mKDRqKmdzFQ", "cell_type": "markdown", "source": [ "", "\n## LRC Technical Margin: CSM, LC, LoReCo", "\n", "\nContractual Service Margin (CSM), Loss Component (LC), Loss Recovery Component (LoReCo) reports of the Liability for Remaining Coverage (LRC) include contributions from the calculation of [CSM](../Import/ImportScopeCalculation#csm), [LC](../Import/ImportScopeCalculation#csm), and [LoReCo](../Import/ImportScopeCalculation#csm), respectively." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "TUE27vAmQkWg0ezEqXWxRQ", "cell_type": "code", "source": [ "public interface Csm: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", "\n IDataCube Csm => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.C)).FxData;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-SGsILz87kComI2ryE1PPw", "cell_type": "code", "source": [ "public interface Lc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", "\n IDataCube Lc => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.L)).FxData;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7Lzjmyf7fkSxbTm5DqqS9Q", "cell_type": "code", "source": [ "public interface Loreco: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", "\n IDataCube Loreco => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.LR)).FxData;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YEqw7EtuUEqkhmOGvwd-Xg", "cell_type": "code", "source": [ "public interface LrcTechnicalMargin: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -308,9 +413,13 @@ "\n ", "\n IDataCube LrcTechnicalMargin => Lc + Loreco - 1 * Csm;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "lM0v7sd3zUmm29lWswyOgg", "cell_type": "markdown", "source": [ "", @@ -319,9 +428,13 @@ "\nWritten Actual (Actual) report includes contributions from the [Actual](../Import/ImportScopeCalculation#actuals) import. ", "\n
Accrual Actuals (Advance, Overdue Actual) report includes contributions from the [Advance](../Import/ImportScopeCalculation#advance-actuals) and [Overdue](../Import/ImportScopeCalculation#overdue-actuals) Actual calculation.", "\n
Deferral (Deferral Actual) report includes contributions from the calculation of [Deferral](../Import/ImportScopeCalculation#deferrable-actuals) Actual." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6XEGR7p1mUCG81V7tcooHA", "cell_type": "code", "source": [ "public interface WrittenAndAccruals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -329,25 +442,37 @@ "\n IDataCube Advance => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.AA)).FxData;", "\n IDataCube Overdue => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.OA)).FxData;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "GmCd7oNDAE2xXgDVnfPpQg", "cell_type": "code", "source": [ "public interface Deferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", "\n IDataCube Deferrals => GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.DA)).FxData;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "QbqNuXbyKEyPhcyRLIMeTw", "cell_type": "markdown", "source": [ "## Experience Adjustment", "\n", "\nExperience Adjustment (EA) report includes contributions from the [Written](#written-accrual-deferral) Actual report and the [Best Estimate](#best-estimate) of Present Value report (only the *Cash flow* AocStep). " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "daTkuCMpPE6-KM2VA5EiVA", "cell_type": "code", "source": [ "public interface ExperienceAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -360,35 +485,51 @@ "\n", "\n IDataCube ActuarialExperienceAdjustment => WrittenCashflow - BestEstimateCashflow;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7BLBDJJG60imA4l4SJTO8g", "cell_type": "markdown", "source": [ "", "\n## LIC Actuarial (Actuarial Liability for Incurred Claims)", "\n", "\nActuarial Liability of Incurred Claims (LIC Actuarial) report includes the contributions from [Fulfillment cashflow](#fulfillment-cashflows)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_AULGacqNUum95KZX-PBMg", "cell_type": "code", "source": [ "public interface LicActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", "\n IDataCube LicActuarial => GetScope(Identity).CurrentFcf.Filter((\"LiabilityType\", LiabilityTypes.LIC));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_uefLxRQg0mTthc9-Nq4IA", "cell_type": "markdown", "source": [ "", "\n## LIC (Liability for Incurred Claims)", "\n", "\nLiability of Incurred Claims (LIC) report includes the contributions from [LIC Actuarial](#lic-actuarial) (Fullfilment Cashflow), [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "zpDmC1m_QkioS6c5DCwG1g", "cell_type": "code", "source": [ "public interface Lic: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -405,18 +546,26 @@ "\n ", "\n IDataCube Lic => bop + delta + eop;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5QxEG_hUsk2V1Qr7j222CA", "cell_type": "markdown", "source": [ "", "\n## LRC Actuarial (Actuarial Liability for Remaining Coverage)", "\n", "\nActuarial Liability for Remaining Coverage (LRC) report includes all the contributions from [Fulfillment cashflow](#fulfillment-cashflows), [Contructual Sevice Margin](#technical-margin), [Loss Component](#technical-margin), and [Loss Recovery Component](#technical-margin)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "a9T_pIpBd0yGYTlAWfXkpw", "cell_type": "code", "source": [ "public interface LrcActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -426,18 +575,26 @@ "\n ", "\n IDataCube LrcActuarial => Fcf + Csm + Loreco;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pRaL_4nHG02rEuyl_ad4CA", "cell_type": "markdown", "source": [ "", "\n## LRC (Liability for Remaining Coverage)", "\n", "\nLiability for Remaining Coverage (LRC) report includes all the contributions from [LRC Actuarial](#lrc-actuarial) (Fulfillment Cashflow, Contructual Sevice Margin, Loss Component, Loss Recovery Component) and, [Advance](#written-accrual-deferral) Actual, and [Overdue](#written-accrual-deferral) Actual." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WO319mP3Y0i-8FXf9phGoQ", "cell_type": "code", "source": [ "public interface Lrc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -454,16 +611,24 @@ "\n ", "\n IDataCube Lrc => bop + delta + eop;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "olUh-gLctUKqNfn8A1FU4g", "cell_type": "markdown", "source": [ "", "\n# IFRS 17 Financial Performance" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-pWSLHQ6BEiVRhO7lJSW0w", "cell_type": "markdown", "source": [ "The IFRS 17 Financial Performance aims at disclosing the deltas (i.e. difference between EoP and BoP, or the Change in Estimate) of the IFRS 17 Balance Sheet items (LRC, LIC) and the relevant incurred cashflows (Premiums, Claims, Expenses, etc...) for the given period.", @@ -505,15 +670,23 @@ "\n$$", "\n", "\nUsually, some more details on the items above are desired (e.g. separating the LRC into its components FCF, RA, CSM/LC or explicitly showing the CSM Amortization vs. other financial/non-financial adjustments to the CSM estimation). These are specific to each implementation and depend on the data granularity (e.g. how the Amount Types, AoC steps are detailed and structured). This level of detail is omitted from the generic documentation presented here, but are implicit to the way each item above is calculated. Nevertheless, this extra granularity is available when the reports are generated and sliced by the corresponding dimensions. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "87HgSSgPc0esWEFkSSQbYg", "cell_type": "markdown", "source": [ "## Fulfillment Cashflows (excluding the Loss Component)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "iRZKr4GKJUypzzUVaj_FaA", "cell_type": "markdown", "source": [ "Let us first describe the Balance Sheet items, where we need to disclose the Changes in Estimate in the Financial Performance.", @@ -534,9 +707,13 @@ "\nThe Financial contributions are reported in 'Financial LIC Changes' for a Group of Contract with Liability Type LIC and to 'Financial LRC Changes' for a Group of Contract with Liability Type LRC.", "\n
The Non Financial contributions are reported in 'Non Financial LIC Changes' for a Group of Contract with Liability Type LIC. For a Group of Contract with Liability Type LRC, they are reported in 'Non-Financial LRC Changes (Exc. CSM Amortization)' for a Group of Insurance Contract and in 'Non-Financial Reinsurance LRC Changes (Exc. LC/LoReCo)' for a Group of Reinsurance Contract.", "\n
The Oci contributions are reported in the 'Other Comprehensive Income' section under 'Financial LIC Changes' or a Group of Contract with Liability Type LIC and to 'Financial LRC Changes' for a Group of Contract with Liability Type LRC." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yGaOPpu5p0G1MQls1BXj7g", "cell_type": "code", "source": [ "public interface FcfChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -594,15 +771,23 @@ "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(rv => rv with { Novelty = Novelties.C, VariableType = variableTypeOciFinancial});", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "6yzD7vGt10uiK-1r4mR6PQ", "cell_type": "markdown", "source": [ "Subsequently, the Contractual Service Margin (CSM), Loss Component (LC) and Loss Recovery Component (LoReCo) are also divided into non-financial and financial components. In addition the corresponding amortization/releases (CSM Amortization, LC Release and LoReCo Release) are also explicitly shown." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "2JE11m-Dn0qxXR5pl8cLEw", "cell_type": "markdown", "source": [ "## Contractual Service Margin (CSM)", @@ -616,9 +801,13 @@ "\n
The Amortization contribution is reported in 'Insurance Revenue' under 'CSM Amortization' or in 'Insurance Service Expense' under 'Reinsurance CSM Amortization' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively. ", "\n
The Financial contributions are reported in 'Financial LRC Changes'.", "\n
The Non Financial contributions are reported in 'Non-Financial LRC Changes (Exc. CSM Amortization)' and 'Non-Financial Reinsurance LRC Changes (Exc. LC/LoReCo)' for a Group of Insurance Contract and a Group of Reinsurance Contract, respectively. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "wBzBXtv0WU-4jYPn9U-wjQ", "cell_type": "code", "source": [ "public interface CsmChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -648,9 +837,13 @@ "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7We5gUppukC5PIKD6AvRtQ", "cell_type": "markdown", "source": [ "## Loss Component (LC)", @@ -664,9 +857,13 @@ "\n
The Amortization contribution is reported in 'Loss Component Release'.", "\n
The Financial contributions are reported in 'Financial LRC Changes'.", "\n
The Non Financial contributions are reported in 'Loss Component / LoReCo Changes (Exc. Releases)'." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1OX7jmo1u0qucu_hK3fc2Q", "cell_type": "code", "source": [ "public interface LcChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -691,9 +888,13 @@ "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1U-L40Fnh02n4EVojEwt_g", "cell_type": "markdown", "source": [ "## Loss Recovery Component (LoReCo)", @@ -707,9 +908,13 @@ "\n
The Amortization contribution is reported in 'LoReCo Release'.", "\n
The Financial contributions are reported in 'Financial LRC Changes'.", "\n
The Non Financial contributions are reported in 'Loss Component / LoReCo Changes (Exc. Releases)'." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "mff2Ff27G0mYqJQPfGD8AA", "cell_type": "code", "source": [ "public interface LorecoChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -734,15 +939,23 @@ "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IFIE1\" });", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "nXJNTJrviEOmKUkfCkhiiw", "cell_type": "markdown", "source": [ "## Incurred Actuals" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "cnTgM4V6M067D6fex6xYiw", "cell_type": "markdown", "source": [ "After the main Balance Sheet items, we need to disclose the Incurred Cashflows (i.e. Actuals) for the period in the Financial Performance (which includes the effect of Advance and Overdue Accruals, but Write-Off amounts are not taken into account).", @@ -754,9 +967,13 @@ "\n- Claims Investment Component contributions are reported under 'Insurance Service Expense' in 'Acquisition Expenses' section and under 'Insurance Revenue' in 'Exc. Investment Components' section with a sign change,", "\n- Expenses contributions are reported under 'Insurance Service Expense' in 'Expenses' section,", "\n- Commissions contributions are reported under 'Insurance Service Expense' in 'Commissions' section." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "GcIzXWU8AUq2EvF-1feb_g", "cell_type": "code", "source": [ "public interface IncurredActuals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -789,21 +1006,33 @@ "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.AC))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE4\" });", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XJJJPF92_E-e0GD3rJSWQQ", "cell_type": "markdown", "source": [ "## Incurred Deferrals and Acquisition Expenses" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XSS55G_c7UiKAwnsGXRUPg", "cell_type": "markdown", "source": [ "The next item are the Deferrals, where the Amortization is the only contribution explicitly shown, but these do not have any direct impact on the Financial Performance under the current methodology assumptions. The Amortization contribution is here considered with its sign changed. This contribution is allocated under 'Insurance Service Expense' in 'Acquisition Expenses' section and under 'Insurance Revenue' in 'Acquistion Expenses Amortization' section with a sign change. " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "yvtBdx8DfkC1Ovp_U8RSgw", "cell_type": "code", "source": [ "public interface IncurredDeferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -815,22 +1044,34 @@ "\n IDataCube AmortizationToIr => (-1 * Amortization).SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR4\" });", "\n IDataCube AmortizationToIse => Amortization.SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE6\" });", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "hDUy7NYvt0yV69m-BBvghQ", "cell_type": "markdown", "source": [ "## Experience Adjustment on Premium (allocation to CSM vs P&L recognition)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ryvagAUg8U6YShWSSB9glg", "cell_type": "markdown", "source": [ "The figures disclosed in the Financial Performance as described above consider full Premiums for past, current and future services (for Best Estimate and Actuals).", "\nHowever, we applied the Premium Allocation factor in the CSM computations to adjust for the experience. To correct this, we need to exclude the Experience Adjustment on Premium part in the Financial Performance to avoid double counting and it is allocated under 'Insurance Revenue' in the 'Exc. Experience Adjustment on Premiums' section." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sU1M91XJ0UK6I31YdF86mg", "cell_type": "code", "source": [ "public interface ExperienceAdjustmentOnPremium: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -843,21 +1084,33 @@ "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR6\" });", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "AEQ0pDhL5UKqmPJVbk-5dQ", "cell_type": "markdown", "source": [ "## Financial Performance" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DptCmibiyESCNqXKLfX2dg", "cell_type": "markdown", "source": [ "As the last step, all the contributions above are calculated and combined into the Financial Performance, which will be used to generate the final report." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ii5nhJOlykOUsHamB2X5pQ", "cell_type": "code", "source": [ "public interface FinancialPerformance: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -872,13 +1125,20 @@ "\n ", "\n IDataCube FinancialPerformance => FcfChangeInEstimate + CsmChangeInEstimate + LcChangeInEstimate + LorecoChangeInEstimate + IncurredActuals + IncurredDeferrals + ExperienceAdjustmentOnPremium;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YlhbqrDEhEqxO83nS1Jqkg", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Report/ReportStorage.ipynb b/ifrs17/Report/ReportStorage.ipynb index f71ce9e8..fb5fff54 100644 --- a/ifrs17/Report/ReportStorage.ipynb +++ b/ifrs17/Report/ReportStorage.ipynb @@ -18,6 +18,7 @@ "nbformat_minor": 5, "cells": [ { + "id": "1PJN6PAzZkuiz9CSQFSHuQ", "cell_type": "markdown", "source": [ "", @@ -28,21 +29,33 @@ "\nThe Report Storage collects the required data and parameters used in the calculations.", "\n", "\nBoth Storage and Identity are defined to support the calculations defined in the corresponding [Report Scopes](./ReportScopes)." - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fiz_NudplEqKgTW2opTLTQ", "cell_type": "code", "source": [ "#!import \"ReportConfigurationAndUtils\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Y_VqzYOdekWZUm6JV8ylqw", "cell_type": "markdown", "source": [ "# Report Identity" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "XDkSxyikzECrdEnqADyjJQ", "cell_type": "code", "source": [ "[IdentityAggregationBehaviour(IdentityAggregationBehaviour.Aggregate)]", @@ -80,15 +93,23 @@ "\n ", "\n public bool IsOci { get; init; } ", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZDfc2OninkSDvaY7EQF9Rg", "cell_type": "markdown", "source": [ "# Report Storage" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "TD8VjJUqrUW3Hya0qH8Lkg", "cell_type": "code", "source": [ "public class ReportStorage {", @@ -207,13 +228,20 @@ "\n return descendants.Where(x => !descendants.Select(y => y.Parent).Contains(x.SystemName)).Select(x => x.SystemName).ToHashSet();", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "X8pPD9yFS0euioBXF3GJyA", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Test/AocConfigurationTest.ipynb b/ifrs17/Test/AocConfigurationTest.ipynb index 501b0574..a19ffac1 100644 --- a/ifrs17/Test/AocConfigurationTest.ipynb +++ b/ifrs17/Test/AocConfigurationTest.ipynb @@ -16,24 +16,37 @@ "nbformat_minor": 5, "cells": [ { + "id": "RvStBkOdQ0qCjIE9nw6vXg", "cell_type": "markdown", "source": [ "

Test Aoc Configuration

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Q6WMnHkb20q4NHKjIkv7PQ", "cell_type": "code", "source": [ "#!import \"../CalculationEngine\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oErV2qfnK0Oj3-gnLxBzQw", "cell_type": "markdown", "source": [ "# Workspace Initialization " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "53B8s-spOkmfP6SngEWjAA", "cell_type": "code", "source": [ "string novelties = ", @@ -42,28 +55,44 @@ "\nI,In Force,,1", "\nN,New Business,,10", "\nC,Combined,,20\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ENCsBW3eVEycGgR5HwvThA", "cell_type": "code", "source": [ "await Import.FromString(novelties).WithType().WithTarget(DataSource).ExecuteAsync()" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YBmxdsvzoEGKiEaf5FOOAg", "cell_type": "code", "source": [ "var workspace = Workspace.CreateNew();", "\nworkspace.InitializeFrom(DataSource);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "BkjPwerC0E2S87WaUdeOfg", "cell_type": "markdown", "source": [ "# Canonical Aoc Types and Configurations" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5CJAH8_bR0aj6rOjfxeSiw", "cell_type": "code", "source": [ "string canonicalAocTypes = ", @@ -86,9 +115,13 @@ "\nAM,Amortization,,150,,,,,,,,", "\nFX,FX Impact,,160,,,,,,,,", "\nEOP,Closing Balance,,170,,,,,,,,\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "O2-y9gewBEK4CDCWSPoTcg", "cell_type": "code", "source": [ "string canonicalAocConfig = ", @@ -115,15 +148,23 @@ "\nAM,C,Calculated,6,EndOfPeriod,NotApplicable,NotApplicable,NotApplicable,EndOfPeriod,200,1900,1", "\nFX,C,Calculated,0,NotApplicable,NotApplicable,NotApplicable,NotApplicable,NotApplicable,210,1900,1", "\nEOP,C,Calculated,6,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,EndOfPeriod,220,1900,1\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "fXmeKnWrMkipdOdvmDEdYg", "cell_type": "markdown", "source": [ "# Test" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1dYHTh43rUip61jayTv9VQ", "cell_type": "code", "source": [ "public async Task CheckAocConfigurationDefault(AocType[] newAocTypes)", @@ -140,174 +181,266 @@ "\n", "\n return await Import.FromString(canonicalAocConfig).WithFormat(\"AocConfiguration\").WithTarget(workspace).ExecuteAsync();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "SIYcSk5kNUms-ILsc7Fc9g", "cell_type": "markdown", "source": [ "## NewAoc < RCU" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "gCHBZZiJZkKsAgsn81BU8Q", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 25} } );", "\naocConfigLog.Errors.Any().Should().Be(false);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Pj5C8V1V4kOJGNPAPZNP7Q", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", "\n x.AocType == AocTypes.MC && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 21, DataType = DataType.Optional};", "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", "\nnewConfigCalculated.Count().Should().Be(1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "RaeGfGDv20OR0lBo7tL98Q", "cell_type": "markdown", "source": [ "## RCU < NewAoc < CF" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9hBKJlQyeEO9TpeNwxhCqA", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 45} } );", "\naocConfigLog.Errors.Any().Should().Be(false);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "vSrtK8_4k0uMWWB9xWF-wg", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", "\n x.AocType == AocTypes.RCU && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 31, DataType = DataType.Optional};", "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", "\nnewConfigCalculated.Count().Should().Be(1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1ipfwQM1NkaeqopEOOGQMQ", "cell_type": "markdown", "source": [ "## IA < NewAoc < YCU" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oCF44mYnYkiJ3b4OyniJDg", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 82} } );", "\naocConfigLog.Errors.Any().Should().Be(false);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sEfq7iYvaEmysMRMzhJJRg", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", "\n x.AocType == AocTypes.AU && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 61, DataType = DataType.Optional};", "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", "\nnewConfigCalculated.Count().Should().Be(1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Am5-CmdiEUuOaphZ2xGo0g", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", "\n x.AocType == AocTypes.AU && x.Novelty == Novelties.N) with {AocType = \"A1\", Order = 131, DataType = DataType.Optional};", "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", "\nnewConfigCalculated.Count().Should().Be(1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "h9RDWoiWoEmTB_a1jHk7Ag", "cell_type": "markdown", "source": [ "## CRU < NewAoc < EV" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "11o-ltR8wk650EqHmKcVlA", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 106} } );", "\naocConfigLog.Errors.Any().Should().Be(false);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "mW4K3Q9IZUa3eWjVQVy_Bw", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", "\n x.AocType == AocTypes.EV && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 81};", "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", "\nnewConfigCalculated.Count().Should().Be(1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Kg_NacjnKEa2gIH1OeS76A", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", "\n x.AocType == AocTypes.EV && x.Novelty == Novelties.N) with {AocType = \"A1\", Order = 131};", "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", "\nnewConfigCalculated.Count().Should().Be(1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "b7L0eUNUmk-CIXbI4j1tOA", "cell_type": "markdown", "source": [ "## EV < NewAoc < WO" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "xxKajX96jkyljqCugz69EA", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 116} } );", "\naocConfigLog.Errors.Any().Should().Be(false);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "LOnPRjuIoEyyt9aiNWiXYA", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", "\n x.AocType == AocTypes.EV && x.Novelty == Novelties.I) with {AocType = \"A1\", Order = 91};", "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", "\nnewConfigCalculated.Count().Should().Be(1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "00jPx2RmPkS5eNv7uftM2A", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", "\n x.AocType == AocTypes.EV && x.Novelty == Novelties.N) with {AocType = \"A1\", Order = 141};", "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", "\nnewConfigCalculated.Count().Should().Be(1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "LcyGd3hXF0uWCX5LKfozug", "cell_type": "markdown", "source": [ "## WO < NewAoc < CL" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KwwQI25owUCfnoQgEbAA6g", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 125} } );", "\naocConfigLog.Errors.Any().Should().Be(false);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Kfjgb1gbwkq8DAteZPY4jQ", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", "\n x.AocType == AocTypes.WO && x.Novelty == Novelties.C) with {AocType = \"A1\", Order = 171};", "\nvar newConfigCalculated = await workspace.Query().Where(x => x == newConfigExpected).ToArrayAsync();", "\nnewConfigCalculated.Count().Should().Be(1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8gHymelTSUy7cigprRzYjA", "cell_type": "markdown", "source": [ "## Two or more Aoc Config with same Order" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WHY91p0GgEi9BppkYtLjew", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 111},", @@ -316,13 +449,20 @@ "\n new AocType{SystemName = \"A4\", DisplayName = \"a1\", Order = 114},", "\n new AocType{SystemName = \"A5\", DisplayName = \"a1\", Order = 115} } );", "\n(aocConfigLog.Errors.First().ToString() == \"ActivityMessageNotification { Message = Two or more Aoc Configurations have the same Order. }\").Should().Be(true);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kLp5Mr2wmEGr-avkMByaDg", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Test/QueriesTest.ipynb b/ifrs17/Test/QueriesTest.ipynb index 6b91461e..4b7b2bdc 100644 --- a/ifrs17/Test/QueriesTest.ipynb +++ b/ifrs17/Test/QueriesTest.ipynb @@ -18,31 +18,48 @@ "nbformat_minor": 5, "cells": [ { + "id": "NTIr8pfNRUG9v1rz8xmpmw", "cell_type": "code", "source": [ "#!import \"../CalculationEngine\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "plOzpIasQkGNAf30KoXM0w", "cell_type": "code", "source": [ "var gic = \"DT1.1\";", "\nvar scenario = \"MTUP\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5tdLFj2NXEGuOW74rTYVpQ", "cell_type": "markdown", "source": [ "# Test Load Current and Previous Parameter for Yield Curve" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DWSAoP5ltkaMOSp03MyfIA", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KFB4S_jzpku_e4E1QCF6Cw", "cell_type": "code", "source": [ "public async Task CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(Args args, IEnumerable testData, ", @@ -64,88 +81,128 @@ "\n ", "\n await Workspace.DeleteAsync(Workspace.Query().ToArray());", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YR7Ds1eSw0eeuBWg6pC_tQ", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2020, 9, null),(2020, 9, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bGwUfhJAL0WVLcJwx-g1Zg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", "\nvar testData = new[] { new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9, Scenario = scenario }, ", "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9 } };", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, scenario),(2020, 9, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pHPnD9INVECBXJCkAZQECg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", "\nvar testData = new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData.RepeatOnce(), (2019, 12, null), (2019, 12, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "KGJ2HY_UdEuIxuNWoAdNAw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9, Scenario = scenario},", "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, scenario), (2019, 12, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "jpLrgab2eEWK83fcpK6ukA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}, ", "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2020, 6, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "679b2tiitkmmP1P-PKnNYQ", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}, ", "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 3, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2020, 6, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "axsxcDx2K0aO6jgzo7jliw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}, ", "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 3, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2019, 3, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ycXFIXbC_0aw9Kv0vxBhwA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9, Scenario = null}, ", "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 6, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, null), (2020, 9, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ek8T4yoF8kibcfRRiC9LGw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9, Scenario = null}, ", "\n new YieldCurve{ Currency = \"EUR\", Year = 2020, Month = 9, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, null), (2019, 9, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "19ioyaUzHkqelLWINjrBJQ", "cell_type": "code", "source": [ "var args = new Args(\"EUR\",2020,9,Periodicity.Monthly,scenario);", @@ -153,27 +210,39 @@ "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = scenario},", "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 9, scenario), (2019, 12, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "U1iy3VALHESu8R42kYbXpg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null}, ", "\n new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 9, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12, null), (2019, 12, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "8LEJFkLz7UObFQjBwvOxjg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", "\nvar testData = new YieldCurve[] {new YieldCurve{ Currency = \"EUR\", Year = 2019, Month = 12, Scenario = null}, ", "\n new YieldCurve{ Currency = \"EUR\", Year = 2018, Month = 9, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 12, null), (2019, 12, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "X6DmfAY4XkewNDJ2FNoMSw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -181,9 +250,13 @@ "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 9, Scenario = null},", "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 6, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 6, null), (2019, 6, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ofyBo-TEyESmYRURsUqWsg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly, scenario);", @@ -192,9 +265,13 @@ "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 9, Scenario = null},", "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 6, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2019, 6, null), (2019, 6, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9rf-JkSGr0uNL5SeX9Klgg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -203,9 +280,13 @@ "\n new YieldCurve{ Currency = \"EUR\", Year = 2015, Month = 9, Scenario = null},", "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3, Scenario = null}};", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2016, 3, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "rj4pcMyboE-oEhMl3Rs5-w", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -215,15 +296,23 @@ "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3, Scenario = null}};", "\n", "\nawait CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(args, testData, (2020, 6, null), (2016, 3, null));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "TSlFdPDzxk6CAkX57WjS_A", "cell_type": "markdown", "source": [ "# Test Data Node State Query" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7UZrdvTKHUqRUDxSqwFsXQ", "cell_type": "code", "source": [ "public async Task CheckLoadDataNodeStateAsync(Args args, IEnumerable testData, bool isExpectedToBeActive)", @@ -236,33 +325,49 @@ "\n ", "\n Workspace.Reset(x => x.ResetCurrentPartitions());", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3frqAxWAb0-iRoIjC0x0bA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", "\nvar testData = new DataNodeState[] {new DataNodeState{ DataNode = gic, Year = 2019, Month = 12, State = State.Active },", "\n new DataNodeState{ DataNode = gic, Year = 2020, Month = 6, State = State.Inactive }};", "\nawait CheckLoadDataNodeStateAsync(args, testData, false);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "x5o02N_2yEqNFaUnCf27LA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", "\nvar testData = new DataNodeState[] {new DataNodeState{ DataNode = gic, Year = 2020, Month = 3, State = State.Active },", "\n new DataNodeState{ DataNode = gic, Year = 2020, Month = 9, State = State.Inactive }};", "\nawait CheckLoadDataNodeStateAsync(args, testData, false);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "tEke28UUmk63X5X3t8-NZQ", "cell_type": "markdown", "source": [ "# Test Load Yield Curve" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Yg49scOm9kC3fsYCLvns2Q", "cell_type": "code", "source": [ "public async Task CheckLoadYieldCurveAsync(Args args, IEnumerable testData, ", @@ -296,9 +401,13 @@ "\n ", "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors)); ", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "m3_gugcNbk-GBVbWxV57Gw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -308,23 +417,35 @@ "\n new YieldCurve{ Currency = \"EUR\", Year = 2016, Month = 3, Values = new double[]{6.1,6.2,6.3,6.4,6.5,6.6} }};", "\n", "\nawait CheckLoadYieldCurveAsync(args, testData, (2016, 6), 6.1, 0.1, 6.1);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oqe6zXHpG0GJbLONZfGj3w", "cell_type": "markdown", "source": [ "# Test Load Data Node Parameter" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "5MJtyunB80GSP-alkKjOwA", "cell_type": "code", "source": [ "var gic2 = \"gic2\";", "\nvar xgic = \"xgic\";", "\nvar gric1 = \"gric1\";" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "lUU-biiLX0ibSzMuSzMh5A", "cell_type": "code", "source": [ "public async Task CheckLoadInterDataNodeParameterAsync(Args args, IEnumerable testData, ", @@ -411,9 +532,13 @@ "\n ", "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4RaLKB7k-UajGf1Y1Zu6fQ", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -425,9 +550,13 @@ "\n };", "\n", "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "GeSYU4-OaUO9yOc8NBoZCw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -443,9 +572,13 @@ "\n };", "\n", "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZQ0UWivBMkaecxy1ZES6TQ", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -458,9 +591,13 @@ "\n };", "\n", "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "t4W8kuYz4EWT7eheyHepVA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -473,13 +610,20 @@ "\n };", "\n", "\nawait CheckLoadInterDataNodeParameterAsync(args, testData, previousYear, currentYear);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kkwtnEW9N0WyXdhPCi9tIQ", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Test/Tests.ipynb b/ifrs17/Test/Tests.ipynb index e49d0f33..94626ecf 100644 --- a/ifrs17/Test/Tests.ipynb +++ b/ifrs17/Test/Tests.ipynb @@ -16,22 +16,34 @@ "nbformat_minor": 5, "cells": [ { + "id": "tIV7Q4vx8UeFi8kmrwPcEg", "cell_type": "markdown", "source": [ "

Tests

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "afu9qRQM0EK0X8DYxEDABQ", "cell_type": "code", "source": [ "#!eval-notebook \"AocConfigurationTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "eiuXjlas1kCmW7Fty4gKoQ", "cell_type": "code", "source": [ "#!eval-notebook \"QueriesTest\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Utils/ApplicationMessage.ipynb b/ifrs17/Utils/ApplicationMessage.ipynb index b826668d..fe7025d8 100644 --- a/ifrs17/Utils/ApplicationMessage.ipynb +++ b/ifrs17/Utils/ApplicationMessage.ipynb @@ -19,19 +19,28 @@ "nbformat_minor": 5, "cells": [ { + "id": "wLzDwTbQ9Uaiyx6Djl_hGQ", "cell_type": "markdown", "source": [ "

Application Message

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "de93et2JM0KcfJdU0ydEuw", "cell_type": "code", "source": [ "#!import \"../Constants/Validations\"", "\n#!import \"../DataModel/DataStructure\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CZ5guP7mh0mpnrz00G3S0g", "cell_type": "code", "source": [ "using Microsoft.Extensions.Logging;", @@ -53,21 +62,33 @@ "\n public static bool HasErrors () => activity.HasErrors();", "\n public static bool HasWarnings () => activity.HasWarnings();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "VQkVErt-S0290QjxpeU_pg", "cell_type": "code", "source": [ "ApplicationMessage.Configure(Log, Activity)" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "drAxOrfkYUW3-64_fh5Ddw", "cell_type": "markdown", "source": [ "# Utils" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "JhD11IJpqEe5iKVccpEdOg", "cell_type": "code", "source": [ "public static bool HasErrors (this ActivityLog[] logs) {", @@ -76,9 +97,13 @@ "\n return true;", "\n return false;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-nHLgnv6CkGmjrCtmn-FfQ", "cell_type": "code", "source": [ "public static ActivityLog Merge (this ActivityLog a, ActivityLog b) {", @@ -101,13 +126,20 @@ "\n", "\npublic static ActivityLog Merge (this ActivityLog[] logs, ActivityLog log) => logs.Merge().Merge(log);", "\npublic static ActivityLog Merge (this ActivityLog log, ActivityLog[] logs) => log.Merge(logs.Merge());" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sYT7OFkE8Eu3GY-TUwLWdQ", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] -} +} \ No newline at end of file diff --git a/ifrs17/Utils/EqualityComparers.ipynb b/ifrs17/Utils/EqualityComparers.ipynb index bd3021eb..39d798e8 100644 --- a/ifrs17/Utils/EqualityComparers.ipynb +++ b/ifrs17/Utils/EqualityComparers.ipynb @@ -16,18 +16,27 @@ "nbformat_minor": 5, "cells": [ { + "id": "ogmxH-FTpEGc4-ymE-mFYg", "cell_type": "markdown", "source": [ "

Equality Comparers

" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "-Y69asl-c0OSbbvFliOOCg", "cell_type": "code", "source": [ "#!import \"../DataModel/DataStructure\"" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "cewEsMJ9cUyBQhfByCbaAg", "cell_type": "code", "source": [ "class RawVariableComparer: IEqualityComparer", @@ -51,9 +60,13 @@ "\n return new RawVariableComparer(ignoreValues);", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "sWecJZ9b5UWdmf2iaZSduA", "cell_type": "code", "source": [ "class IfrsVariableComparer: IEqualityComparer", @@ -77,9 +90,13 @@ "\n return new IfrsVariableComparer(ignoreValue);", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dxFBW3aXtEeO1ZVIRlC_XA", "cell_type": "code", "source": [ "using System;", @@ -92,9 +109,13 @@ "\n//using Systemorph.Domain;", "\n//using Systemorph.Utils.Reflection;", "\nusing static Systemorph.Vertex.Equality.IdentityPropertyExtensions;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ejquQGmoSEK5L6HGwXrM9A", "cell_type": "code", "source": [ "class EqualityComparer : IEqualityComparer", @@ -127,13 +148,20 @@ "\n return Expression.Lambda>(equalityExpr, prm1, prm2).Compile();", "\n }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "dQkdrzS8s0i1J4MQfOER6w", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Utils/Extensions.ipynb b/ifrs17/Utils/Extensions.ipynb index e006c87e..898a83a4 100644 --- a/ifrs17/Utils/Extensions.ipynb +++ b/ifrs17/Utils/Extensions.ipynb @@ -18,25 +18,38 @@ "nbformat_minor": 5, "cells": [ { + "id": "37QLGftFt0GR52lqdw-HNQ", "cell_type": "markdown", "source": [ "

Extention Methods (this IList array, int index)\"? ", @@ -52,45 +65,73 @@ "\n ? array.ElementAt(index)", "\n : array.ElementAt(count -1);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "A-JqTxL5pE21nMgEZ1JTAg", "cell_type": "code", "source": [ "public static Dictionary ToDictionaryGrouped(this IEnumerable source, Func keySelector, Func, TResult> elementSelector) => source.GroupBy(keySelector).ToDictionary(g => g.Key, elementSelector);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "MAeKIQ5QvECLkH8cmeI75w", "cell_type": "code", "source": [ "public static IDataCube SelectToDataCube(this IEnumerable source, Func whereClause, Func selector) => source.Where(whereClause).Select(selector).ToDataCube();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "izvvatd1rE21dda6NHFZPg", "cell_type": "code", "source": [ "public static IDataCube SelectToDataCube(this IEnumerable source, Func selector) => source.SelectToDataCube(x => true, selector);" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "bNj5qyvo3kue3cwR_5Azsw", "cell_type": "code", "source": [ "public static double[] Prune (this IEnumerable source, double precision = Precision) => source.Reverse().SkipWhile(x => Math.Abs(x) < precision).Reverse().ToArray();" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "DrWpMND_l0mojje8dHygRA", "cell_type": "markdown", "source": [ "# String Extensions" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "s2mmvm2-A02lMpUVEQb-4A", "cell_type": "code", "source": [ "using System.Globalization;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Bnfm2rWKHEme4-DjALszfQ", "cell_type": "code", "source": [ "public static double CheckStringForExponentialAndConvertToDouble (this string s)", @@ -99,15 +140,23 @@ "\n if (double.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out var doubleValue)) return doubleValue;", "\n else { ApplicationMessage.Log(Error.ParsingScientificNotation, s); return 1; }", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "CMA8w5ro8UGCKdLzCLQZjg", "cell_type": "markdown", "source": [ "# Enum Extentions" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7PBYRiDYtUCiAzeiZoNS3Q", "cell_type": "code", "source": [ "public static bool Contains(this T value, T lookingForFlag) ", @@ -117,15 +166,23 @@ "\n int intLookingForFlag = (int) (object) lookingForFlag;", "\n return ((intValue & intLookingForFlag) == intLookingForFlag);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "kJ91UizKf0eoJht6A0xCgw", "cell_type": "markdown", "source": [ "# ToIdentityString" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "v_U3DILjyUqmOf__msiQCw", "cell_type": "code", "source": [ "using System.Text;", @@ -139,13 +196,20 @@ "\n .Select(x => sb.Append(x.Name).Append(\":\").Append(v.GetType().GetProperty(x.Name)?.GetValue(v, null)).Append(\", \")).ToArray();", "\n return propertyInfos.Count() == 0? v.ToString() : propertyInfos.Select(p => p.ToString()).ToArray().Last();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "72YmbK18UEC9lOicYn7zRQ", "cell_type": "code", "source": [ "" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Utils/ImportCalculationMethods.ipynb b/ifrs17/Utils/ImportCalculationMethods.ipynb index 0ae789e3..81b9d57d 100644 --- a/ifrs17/Utils/ImportCalculationMethods.ipynb +++ b/ifrs17/Utils/ImportCalculationMethods.ipynb @@ -18,24 +18,37 @@ "nbformat_minor": 5, "cells": [ { + "id": "dm2BpbZSZ0y3Rm2xKWMh0A", "cell_type": "markdown", "source": [ "

Import Calculation Methods > GetPreviousIdentities(IEnumerable identities)", @@ -49,15 +62,23 @@ "\n previousStep[x.Novelty] = new AocStep(x.AocType, x.Novelty);", "\n return ret;});", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Q-zkjr-DsUye5AKQihTa6w", "cell_type": "markdown", "source": [ "# Get Reference AocStep for calculated steps" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "oMMELTAwO02FIHDVa5WP8w", "cell_type": "code", "source": [ "public static AocStep GetReferenceAocStepForCalculated(this IEnumerable identities, Dictionary aocConfigurationByAocStep, AocStep identityAocStep)", @@ -68,15 +89,23 @@ "\n && aocStep.Novelty == identityAocStep.Novelty) ", "\n ?? new AocStep(default, default);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "IyQ1h7IPzUqnUGBTT9vlWA", "cell_type": "markdown", "source": [ "# Discount and Cumulate" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "COS5E2hpRka2paEchEV85A", "cell_type": "code", "source": [ "public static double[] ComputeDiscountAndCumulate(this double[] nominalValues, double[] monthlyDiscounting, PeriodType periodType) ", @@ -97,9 +126,13 @@ "\n ", "\n return ret;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "1jcSQCWC-UOP2rpI3vcXhw", "cell_type": "code", "source": [ "public static double[] ComputeDiscountAndCumulateWithCreditDefaultRisk(this double[] nominalValues, double[] monthlyDiscounting, double nonPerformanceRiskRate) //Is it correct that NonPerformanceRiskRate is a double? Should it be an array that takes as input tau/t?", @@ -110,51 +143,83 @@ "\n .Sum() )", "\n .ToArray();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "peOs8OplG0Km9WLVYerNLg", "cell_type": "markdown", "source": [ "# Import Configuration " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "C-ywsGdsCUqqw4-y32DtDA", "cell_type": "markdown", "source": [ "## Data Nodes" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "FaimY7RfJU28U8LOflKePQ", "cell_type": "code", "source": [ "public GroupOfInsuranceContract ExtendGroupOfContract(GroupOfInsuranceContract gic, IDataRow datarow) => gic;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "D0amuqeOkkmg6Bgrns581A", "cell_type": "code", "source": [ "public GroupOfReinsuranceContract ExtendGroupOfContract(GroupOfReinsuranceContract gric, IDataRow datarow) => gric;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "w1toWOQWFEy8EQVu7pTCng", "cell_type": "markdown", "source": [ "## Change Sign Rules" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "et9tX4p4UkuwJsMFOuKnHw", "cell_type": "code", "source": [ "public static int GetSign((string AocType, string AmountType, string EstimateType, bool IsReinsurance) variable, Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache) => 1;" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "_FOFZ-JqNEC7R6nwFYMFUg", "cell_type": "markdown", "source": [ "## EstimateType And AmountType" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3DI_KVkmz0KSb_7hr6gpSQ", "cell_type": "code", "source": [ "public static Dictionary> GetAmountTypesByEstimateType(Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", @@ -166,22 +231,33 @@ "\n {EstimateTypes.LR, new string[]{}.ToHashSet()},", "\n };", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "K8et8EQkfk-iSDvi3aF6sw", "cell_type": "markdown", "source": [ "## Technical Margin EstimateType" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "tqX2rC2hv0q0W8nRW9Ug0g", "cell_type": "code", "source": [ "public static HashSet GetTechnicalMarginEstimateType()", "\n{", "\n return new []{EstimateTypes.C, EstimateTypes.L, EstimateTypes.LR, }.ToHashSet();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Utils/Queries.ipynb b/ifrs17/Utils/Queries.ipynb index 83b6c1ef..9f3dfef8 100644 --- a/ifrs17/Utils/Queries.ipynb +++ b/ifrs17/Utils/Queries.ipynb @@ -18,30 +18,47 @@ "nbformat_minor": 5, "cells": [ { + "id": "fbab8KjyQkyLiXKGJyfa2A", "cell_type": "markdown", "source": [ "

Queries >> GetExchangeRatesDictionaryAsync(this IQuerySource querySource, int year, int month)", @@ -57,15 +74,23 @@ "\n (_, _, _) when y.Year == year && y.Month == month && y.FxType == FxType.Spot => FxPeriod.EndOfPeriod", "\n },", "\n y => y.FxToGroupCurrency));" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9oo-zuul8EKzrnCJFAzqQQ", "cell_type": "markdown", "source": [ "# Current and Previous Parameters" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "HuKjnIgTUEaGC4yIEllZdg", "cell_type": "code", "source": [ "public static async Task LoadParameterAsync(", @@ -80,9 +105,13 @@ "\n .Where(filterExpression?? (Expression>)(x => true))", "\n .ToArrayAsync();", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "em1hxyD6qEqWWc6s02QdKA", "cell_type": "code", "source": [ "public static async Task> LoadCurrentParameterAsync (", @@ -101,9 +130,13 @@ "\n .FirstOrDefault())", "\n .ToDictionary(identityExpression);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "7CWHPi_ERU-LT0Hkk1MSGQ", "cell_type": "code", "source": [ "public static async Task>> LoadCurrentAndPreviousParameterAsync (", @@ -132,22 +165,34 @@ "\n }", "\n return ret;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Ot_9jtjxvk6ShPq6_QndnA", "cell_type": "markdown", "source": [ "", "\n# Yield Curve" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "H6u21U5weU65vzmg7twmhw", "cell_type": "markdown", "source": [ "## Locked-in" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "3u_OXnhOjkKNpNivnkOuYQ", "cell_type": "code", "source": [ "public static async Task> LoadLockedInYieldCurveAsync(this IQuerySource querySource, Args args, ", @@ -167,15 +212,23 @@ "\n ", "\n return lockedInYieldCurveByGoc;", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "ZQl3LDNHKUCgaIvyB6G62w", "cell_type": "markdown", "source": [ "## Current" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "4uLD-gkkTU2DzKqGAi4WKg", "cell_type": "code", "source": [ "public static async Task>> LoadCurrentYieldCurveAsync(this IQuerySource querySource, Args args, ", @@ -187,15 +240,23 @@ "\n x => contractualCurrenciesInScope.Contains(x.Currency)", "\n ));", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "WVEn8m01vUW4RRliQ5T0-g", "cell_type": "markdown", "source": [ "# Data Node State" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "9VQcw0Oh20G7E1m1XrBZcw", "cell_type": "code", "source": [ "public static async Task> LoadDataNodeStateAsync(this IQuerySource querySource, Args args)", @@ -204,15 +265,23 @@ "\n .Where(x => x.Value[CurrentPeriod].State != State.Inactive)", "\n .ToDictionary(x => x.Key, x => x.Value[CurrentPeriod]);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "SxQLPtHgQ0ep3YzMpxVbUg", "cell_type": "markdown", "source": [ "# Data Nodes" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pfrZAbrPnUqrtPaJDeIUyg", "cell_type": "code", "source": [ "public static async Task> LoadDataNodesAsync(this IQuerySource querySource, Args args)", @@ -244,36 +313,56 @@ "\n }", "\n );", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Oew7zanlnUKPlmBc2trXBQ", "cell_type": "markdown", "source": [ "# Data Node Parameters" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "Mj2iGP3LDkKeLA7Cd8W7BA", "cell_type": "markdown", "source": [ "## Single data Node" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "YRhKcQ4Mzk2fcTyvycCDAw", "cell_type": "code", "source": [ "public static async Task>> LoadSingleDataNodeParametersAsync(this IQuerySource querySource, Args args)", "\n{", "\n return await querySource.LoadCurrentAndPreviousParameterAsync(args, x => x.DataNode);", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "W-tpkmQTjkeAKd9P26BEKA", "cell_type": "markdown", "source": [ "## Inter data Node" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "563xeprOJU2gJV_TNxa4GA", "cell_type": "code", "source": [ "public static async Task>>> LoadInterDataNodeParametersAsync(this IQuerySource querySource, Args args)", @@ -297,30 +386,45 @@ "\n x => new Dictionary>{ {CurrentPeriod, x.Select(y => y.currentPeriod).ToHashSet()},", "\n {PreviousPeriod, x.Select(y => y.previousPeriod).ToHashSet()}});", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "pWmi0o2H60SDDht7Au0x-g", "cell_type": "markdown", "source": [ "# Aoc Step Configuration" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "IbK-mlyTFEeWmk4cJZQNqw", "cell_type": "code", "source": [ "public static async Task> LoadAocStepConfigurationAsync(this IQuerySource querySource, int year, int month)", "\n => (await querySource.LoadParameterAsync(year, month))", "\n .GroupBy(x => (x.AocType, x.Novelty), ", "\n (k, v) => v.OrderByDescending(x => x.Year).ThenByDescending(x => x.Month).First()); " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] }, { + "id": "p4-Lxx_SzkWaUMWcuregEQ", "cell_type": "code", "source": [ "public static async Task> LoadAocStepConfigurationAsDictionaryAsync(this IQuerySource querySource, int year, int month) ", "\n => (await querySource.LoadAocStepConfigurationAsync(year, month))", "\n .ToDictionary(x => new AocStep(x.AocType, x.Novelty)); " - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17/Utils/TestHelper.ipynb b/ifrs17/Utils/TestHelper.ipynb index 741b3e11..756fe07e 100644 --- a/ifrs17/Utils/TestHelper.ipynb +++ b/ifrs17/Utils/TestHelper.ipynb @@ -18,18 +18,27 @@ "nbformat_minor": 5, "cells": [ { + "id": "qY8DKa9dQUWTSl9qUoJHmA", "cell_type": "markdown", "source": [ "

Test Helper Methods WithGridOptionsForIfrsVariable", @@ -114,7 +139,10 @@ "\n .WithAutoGroupColumn(c => c.WithWidth(250) with { Pinned = \"left\" }) with { Height = reportHeight, GroupDefaultExpanded = 2, OnGridReady = null }", "\n );", "\n}" - ] + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file From b6bb12be77765587dea3d96899b16b4f35301f32 Mon Sep 17 00:00:00 2001 From: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:40:27 +0100 Subject: [PATCH 30/43] Rename pv amount type (#88) * Use AmountType instead of PvAmountType * Filter out DeferrableAmountType --- full-ifrs17-template/Files/Dimensions.csv | 2 +- .../Initialization/InitSystemorphBaseToMemory.ipynb | 2 +- .../Initialization/InitSystemorphToDatabase.ipynb | 2 +- ifrs17/DataModel/DataStructure.ipynb | 4 +--- ifrs17/Import/Importers.ipynb | 10 +++++----- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/full-ifrs17-template/Files/Dimensions.csv b/full-ifrs17-template/Files/Dimensions.csv index d0a29c98..6f61a39c 100644 --- a/full-ifrs17-template/Files/Dimensions.csv +++ b/full-ifrs17-template/Files/Dimensions.csv @@ -1,4 +1,4 @@ -@@PvAmountType,,,,,,,,,,, +@@AmountType,,,,,,,,,,, SystemName,DisplayName,Parent,Order,PeriodType,ExternalId0,ExternalId1,,,,, PR,Premiums,,10,BeginningOfPeriod,PayablePR,ReceivablePR,,,,, CL,Claims,,20,EndOfPeriod,,,,,,, diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index c66f0472..7cd237ff 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb @@ -111,7 +111,7 @@ "\n .WithType()", "\n .WithType()", "\n .WithType()", - "\n .WithType()", + "\n .WithType()", "\n .WithType()", "\n .WithType()", "\n .WithType()", diff --git a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb index 9bb486c7..21faf6db 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb @@ -87,7 +87,7 @@ "\n .WithType()", "\n .WithType()", "\n .WithType()", - "\n .WithType()", + "\n .WithType()", "\n .WithType()", "\n .WithType()", "\n .WithType()", diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index dc35c01d..c179a578 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -453,9 +453,7 @@ "id": "xXvF54kBF0C6mNNLJGYH9Q", "cell_type": "code", "source": [ - "public record PvAmountType : AmountType {} //TODO Rename ", - "\n", - "\npublic record DeferrableAmountType : AmountType {}" + "public record DeferrableAmountType : AmountType {}" ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index 53fd5640..af7d117c 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -72,7 +72,7 @@ "\n ", "\n // Dimensions", "\n public Dictionary EstimateType;", - "\n public Dictionary PvAmountType; ", + "\n public Dictionary AmountType; ", "\n public HashSet AocTypeMap;", "\n private HashSet estimateTypes;", "\n private HashSet amountTypes;", @@ -145,7 +145,7 @@ "\n : await LoadDataNodesAsync(dataSource, args);", "\n // Dimensions", "\n EstimateType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", - "\n PvAmountType = (await dataSource.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", + "\n AmountType = (await dataSource.Query().Where(x =>!(x is DeferrableAmountType)).ToArrayAsync()).ToDictionary(x => x.SystemName);", "\n amountTypes = (await dataSource.Query().ToArrayAsync()).Select(at => at.SystemName).ToHashSet();", "\n estimateTypes = args.ImportFormat switch {", "\n ImportFormats.SimpleValue => (await dataSource.Query().ToArrayAsync()).Select(et => et.SystemName).ToHashSet(),", @@ -159,7 +159,7 @@ "\n // DimensionsWithExternalId", "\n DimensionsWithExternalId = new Dictionary>()", "\n {", - "\n { typeof(PvAmountType), await GetDimensionWithExternalIdDictionaryAsync() },", + "\n { typeof(AmountType), await GetDimensionWithExternalIdDictionaryAsync() },", "\n { typeof(EstimateType), await GetDimensionWithExternalIdDictionaryAsync() }", "\n };", "\n ", @@ -1105,8 +1105,8 @@ "\n return null; ", "\n }", "\n ", - "\n var amountType = parsingStorage.DimensionsWithExternalId[typeof(PvAmountType)].TryGetValue(valueType, out var at)? at : null;", - "\n var isStdActual = parsingStorage.PvAmountType.ContainsKey(valueType);", + "\n var amountType = parsingStorage.DimensionsWithExternalId[typeof(AmountType)].TryGetValue(valueType, out var at)? at : null;", + "\n var isStdActual = parsingStorage.AmountType.ContainsKey(valueType);", "\n var estimateType = isStdActual? EstimateTypes.A : parsingStorage.DimensionsWithExternalId[typeof(EstimateType)].TryGetValue(valueType, out var et)? et : null;", "\n if(estimateType == null || amountType == null) { ", "\n ApplicationMessage.Log(Error.ValueTypeNotValid, valueType);", From 810f68b17ef0707012ecd38e1ec46ee46638be59 Mon Sep 17 00:00:00 2001 From: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Wed, 16 Nov 2022 10:55:21 +0100 Subject: [PATCH 31/43] New metadatax2 (#91) * New metadatax2 * Undo changes in CalculationEngine NB * Undo changes in CalculationEngine NBx2 --- .../Constants/CalculationEngine.ipynb | 1 - full-ifrs17-template/Database/Configure.ipynb | 11 -- .../Database/PersonalConnectionExample.ipynb | 1 - .../Database/Schema Delete.ipynb | 6 - full-ifrs17-template/Export/MapTemplate.ipynb | 31 ----- .../Import/CloseImportTemplate.ipynb | 16 --- .../InitSystemorphBaseToMemory.ipynb | 23 ---- .../InitSystemorphToDatabase.ipynb | 26 ---- .../InitSystemorphToMemory.ipynb | 16 --- .../InputFormatDescription.ipynb | 6 - .../OverviewIFRS17Template.ipynb | 11 -- full-ifrs17-template/Report/Reports.ipynb | 34 ----- .../Test/AocStructureTest.ipynb | 39 ------ .../Test/ExportIfrsVariable.ipynb | 10 -- .../Test/ExportReportVariables.ipynb | 19 --- .../Test/IfrsVariablesTest.ipynb | 18 --- .../Test/ImportStorageTest.ipynb | 32 ----- .../Test/MapTemplateAndImportTest.ipynb | 41 ------ .../Test/ReportStorageTest.ipynb | 7 - .../Test/ReportVariablesTest.ipynb | 20 --- .../Test/ReportVariablesTestBase.ipynb | 11 -- full-ifrs17-template/Test/ScenarioTest.ipynb | 20 --- .../Test/SequenceImportTest.ipynb | 16 --- .../Test/TechnicalMarginTest.ipynb | 13 -- full-ifrs17-template/Test/Tests.ipynb | 13 -- ifrs17/CalculationEngine.ipynb | 2 - ifrs17/Constants/Consts.ipynb | 31 ----- ifrs17/Constants/Enums.ipynb | 26 ---- ifrs17/Constants/Validations.ipynb | 9 -- ifrs17/DataModel/DataStructure.ipynb | 129 ------------------ ifrs17/Export/ExportConfiguration.ipynb | 18 --- ifrs17/Import/ImportScopeCalculation.ipynb | 78 ----------- ifrs17/Import/ImportStorage.ipynb | 5 - ifrs17/Import/Importers.ipynb | 46 ------- ifrs17/OverviewCalculationEngine.ipynb | 8 -- .../Report/ReportConfigurationAndUtils.ipynb | 10 -- ifrs17/Report/ReportMutableScopes.ipynb | 12 -- ifrs17/Report/ReportScopes.ipynb | 65 --------- ifrs17/Report/ReportStorage.ipynb | 7 - ifrs17/Test/AocConfigurationTest.ipynb | 35 ----- ifrs17/Test/QueriesTest.ipynb | 36 ----- ifrs17/Test/Tests.ipynb | 3 - ifrs17/Utils/ApplicationMessage.ipynb | 8 -- ifrs17/Utils/EqualityComparers.ipynb | 7 - ifrs17/Utils/Extensions.ipynb | 16 --- ifrs17/Utils/ImportCalculationMethods.ipynb | 19 --- ifrs17/Utils/Queries.ipynb | 26 ---- ifrs17/Utils/TestHelper.ipynb | 7 - 48 files changed, 1044 deletions(-) diff --git a/full-ifrs17-template/Constants/CalculationEngine.ipynb b/full-ifrs17-template/Constants/CalculationEngine.ipynb index e30509df..af978b92 100644 --- a/full-ifrs17-template/Constants/CalculationEngine.ipynb +++ b/full-ifrs17-template/Constants/CalculationEngine.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "0lsQIC1gDEODx-OkvAl3pQ", "cell_type": "code", "source": [ "var projectName = \"ifrs17\";", diff --git a/full-ifrs17-template/Database/Configure.ipynb b/full-ifrs17-template/Database/Configure.ipynb index 84f668d3..c536ff36 100644 --- a/full-ifrs17-template/Database/Configure.ipynb +++ b/full-ifrs17-template/Database/Configure.ipynb @@ -19,7 +19,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "4pCtjml9b0qsW_qdBuJO6w", "cell_type": "markdown", "source": [ "

DataSource Configuration

" @@ -29,7 +28,6 @@ "outputs": [] }, { - "id": "Vfn_7rax10adJW_1ZtDM8A", "cell_type": "code", "source": [ "#!import \"../Constants/CalculationEngine\"", @@ -40,7 +38,6 @@ "outputs": [] }, { - "id": "KhBa0fF-l0a93pgXYgVuFw", "cell_type": "code", "source": [ "#!import \"PersonalConnection\"" @@ -50,7 +47,6 @@ "outputs": [] }, { - "id": "Vh7nAxVvy0iUuSAGzjmDaw", "cell_type": "code", "source": [ "using System.Reflection;" @@ -60,7 +56,6 @@ "outputs": [] }, { - "id": "ZMZQjqRWTUGnPoJJpxkdLw", "cell_type": "markdown", "source": [ "# Database Configure" @@ -70,7 +65,6 @@ "outputs": [] }, { - "id": "M452PsrooEqiMehPCaxUyQ", "cell_type": "code", "source": [ "var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())", @@ -84,7 +78,6 @@ "outputs": [] }, { - "id": "0N7ABGO-n06LsiMOOHcdJw", "cell_type": "code", "source": [ "await DataSource.Configure().UseMsSql(opt => opt.WithConnectionString(connectionStringMsSql)", @@ -95,7 +88,6 @@ "outputs": [] }, { - "id": "RmBLxQdX_kOIeA0ktt94xQ", "cell_type": "code", "source": [ "await DataSource.CommitAsync();" @@ -105,7 +97,6 @@ "outputs": [] }, { - "id": "BA0VOza8rEajIHBmKBrSXA", "cell_type": "markdown", "source": [ "# Reset Workspace" @@ -115,7 +106,6 @@ "outputs": [] }, { - "id": "9InVK4PX5EGrE4_tARwXLw", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules());" @@ -125,7 +115,6 @@ "outputs": [] }, { - "id": "oYFbN_9RAU6NiE_F3qNY1A", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Database/PersonalConnectionExample.ipynb b/full-ifrs17-template/Database/PersonalConnectionExample.ipynb index a7877df3..58813866 100644 --- a/full-ifrs17-template/Database/PersonalConnectionExample.ipynb +++ b/full-ifrs17-template/Database/PersonalConnectionExample.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "PacHtppMCEiAbT28F8yC9Q", "cell_type": "code", "source": [ "var connectionStringMsSql = \"here enter your connection string\";" diff --git a/full-ifrs17-template/Database/Schema Delete.ipynb b/full-ifrs17-template/Database/Schema Delete.ipynb index 0894d1dd..68be7e2c 100644 --- a/full-ifrs17-template/Database/Schema Delete.ipynb +++ b/full-ifrs17-template/Database/Schema Delete.ipynb @@ -17,7 +17,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "kZ8F8V4tB0Wn8FeC8OhusQ", "cell_type": "code", "source": [ "#!import \"PersonalConnection\"" @@ -27,7 +26,6 @@ "outputs": [] }, { - "id": "ns9rbHPX0kSH-ZK7AejMeA", "cell_type": "code", "source": [ "#r \"nuget:SqlConnection,1.0.4\"" @@ -37,7 +35,6 @@ "outputs": [] }, { - "id": "4PUwLlVsK0uhCCfeGwRHFg", "cell_type": "code", "source": [ "string[] split = connectionStringMsSql.Split(new char[] { '=', ':', ',', ';' });", @@ -52,7 +49,6 @@ "outputs": [] }, { - "id": "_tMxxfxtoU-Ji32JWMtCRw", "cell_type": "code", "source": [ "using SQLConnection;", @@ -64,7 +60,6 @@ "outputs": [] }, { - "id": "4vlEnuUvfkqV87nAO3Zbsg", "cell_type": "code", "source": [ "string query = \"DECLARE @sql NVARCHAR(max)='' SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; 'FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' Exec Sp_executesql @sql\";" @@ -74,7 +69,6 @@ "outputs": [] }, { - "id": "wseyK5F-cE-ZP_jy2OkS8Q", "cell_type": "code", "source": [ "int rowAffect = SqlServer.AzureSqlConnection(serverName, database, userID, password, query);" diff --git a/full-ifrs17-template/Export/MapTemplate.ipynb b/full-ifrs17-template/Export/MapTemplate.ipynb index 8d0c70b3..931953b7 100644 --- a/full-ifrs17-template/Export/MapTemplate.ipynb +++ b/full-ifrs17-template/Export/MapTemplate.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "fjKBauyn0Uyuk0uljGsArg", "cell_type": "markdown", "source": [ "

Map Template

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "A4j8UHGNc0697n1iNB4Z7g", "cell_type": "markdown", "source": [ "This notebook exports the data nodes, data node states, and data node parameters belonging to a specific data partition into an excel file.", @@ -40,7 +38,6 @@ "outputs": [] }, { - "id": "WuQQ_5xug0mco92fji7LKw", "cell_type": "markdown", "source": [ "After setting the desired target Partition, the Data present in the workspace is ready to be exported. ", @@ -52,7 +49,6 @@ "outputs": [] }, { - "id": "91ew-zbV-kyChbcoiWA4Pg", "cell_type": "markdown", "source": [ "# Select Initialization" @@ -62,7 +58,6 @@ "outputs": [] }, { - "id": "Qv_pfuGhMk6HAPOyqqo4RA", "cell_type": "markdown", "source": [ "Choose to run the Map Template either with the set of Systemorph data in memory or with the data present in the Database: ", @@ -76,7 +71,6 @@ "outputs": [] }, { - "id": "jYRWlCvih0ih3Qb-VCnJxw", "cell_type": "code", "source": [ "#!eval-notebook \"../Import/CloseImportTemplate\"" @@ -86,7 +80,6 @@ "outputs": [] }, { - "id": "f0i5Zqm2k0CiHXxvSxfEMw", "cell_type": "markdown", "source": [ "# Workspace Initialization " @@ -96,7 +89,6 @@ "outputs": [] }, { - "id": "eyUx5D6bFkeK-e_YOjcKcw", "cell_type": "markdown", "source": [ "Firstly, the Workspace is initialized with basic dimensions and with Data Nodes. For a list of the dimensions please refer to the DataModel/DataStructure notebook." @@ -106,7 +98,6 @@ "outputs": [] }, { - "id": "XLZRzQo0h0KkxPio3o_pQA", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" @@ -116,7 +107,6 @@ "outputs": [] }, { - "id": "yaG0mhZJ4USG66zLvyOp8A", "cell_type": "markdown", "source": [ "# Map Template: Data Node", @@ -128,7 +118,6 @@ "outputs": [] }, { - "id": "ZwUv99iEz0-BpQlAkBB0MQ", "cell_type": "markdown", "source": [ "## Set Partition" @@ -138,7 +127,6 @@ "outputs": [] }, { - "id": "KZS8p8Zgm0aL-Acn-8hUUQ", "cell_type": "code", "source": [ "static var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };", @@ -149,7 +137,6 @@ "outputs": [] }, { - "id": "L64PC131ukOuV4NLTc8U8g", "cell_type": "markdown", "source": [ "## Export" @@ -159,7 +146,6 @@ "outputs": [] }, { - "id": "36zerkOEh0ChbLDtD5sf9Q", "cell_type": "code", "source": [ "await Export.ToExcel(\"DataNodes\")", @@ -176,7 +162,6 @@ "outputs": [] }, { - "id": "LHS727tkQ06vfv6NhHl_sg", "cell_type": "markdown", "source": [ "# Map Template: Data Node State", @@ -188,7 +173,6 @@ "outputs": [] }, { - "id": "5jGzLrGmT0Gj9wlvkzSy9Q", "cell_type": "markdown", "source": [ "## Set Partition" @@ -198,7 +182,6 @@ "outputs": [] }, { - "id": "vV883PT1KUOnvMOnG7uAoA", "cell_type": "code", "source": [ "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", @@ -209,7 +192,6 @@ "outputs": [] }, { - "id": "cGT1t9x9WkiwDWDsmfpnCw", "cell_type": "markdown", "source": [ "## Export" @@ -219,7 +201,6 @@ "outputs": [] }, { - "id": "3xILTNiIAk2QthF03nLqeQ", "cell_type": "markdown", "source": [ "The data is retrieved for the Workspace and prepared for export." @@ -229,7 +210,6 @@ "outputs": [] }, { - "id": "1WrPhQtQwkic6piAumGUmw", "cell_type": "code", "source": [ "var dataNodeStates = (await Workspace.Query()", @@ -244,7 +224,6 @@ "outputs": [] }, { - "id": "oJW1Sg5FsUyI5evdcvmJ_A", "cell_type": "markdown", "source": [ "Export is performed." @@ -254,7 +233,6 @@ "outputs": [] }, { - "id": "p2h3e_gKYkSWAenN52sRYQ", "cell_type": "code", "source": [ "await Export.ToExcel(\"DataNodeState\")", @@ -269,7 +247,6 @@ "outputs": [] }, { - "id": "B9bFvDffqES-eH1DaAJaEw", "cell_type": "markdown", "source": [ "# Map Template: Data Node Parameter", @@ -281,7 +258,6 @@ "outputs": [] }, { - "id": "ZvrsiiVNcU6R9eFqGvFb8A", "cell_type": "markdown", "source": [ "## Set Partition" @@ -291,7 +267,6 @@ "outputs": [] }, { - "id": "YFFB0fSxIEKDyRQ75hVt2g", "cell_type": "code", "source": [ "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", @@ -302,7 +277,6 @@ "outputs": [] }, { - "id": "Iy02_lvUWkqaWMeXB2KfpQ", "cell_type": "markdown", "source": [ "## Export" @@ -312,7 +286,6 @@ "outputs": [] }, { - "id": "l2jxOmpye0iihraZH8DCdg", "cell_type": "markdown", "source": [ "The data is retrieved for the Workspace and prepared for export." @@ -322,7 +295,6 @@ "outputs": [] }, { - "id": "LYzzjVLUkk-ts_ulw22Z4A", "cell_type": "code", "source": [ "var dataNodeParameters = (await Workspace.Query()", @@ -339,7 +311,6 @@ "outputs": [] }, { - "id": "DVUmvzU18kiplnYxpVJ6Aw", "cell_type": "markdown", "source": [ "Export is performed." @@ -349,7 +320,6 @@ "outputs": [] }, { - "id": "CAMD-p4UT0CPgGf2pt0gDQ", "cell_type": "code", "source": [ "await Export.ToExcel(\"DataNodeParameter\")", @@ -363,7 +333,6 @@ "outputs": [] }, { - "id": "TMlydk8uOUKGO2LOiMpREw", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Import/CloseImportTemplate.ipynb b/full-ifrs17-template/Import/CloseImportTemplate.ipynb index 50d70692..6c27c72e 100644 --- a/full-ifrs17-template/Import/CloseImportTemplate.ipynb +++ b/full-ifrs17-template/Import/CloseImportTemplate.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "FEKLEJqGf0Oz-qMZllkbng", "cell_type": "markdown", "source": [ "*Note: before configuring your data please refer to [Map Template](../Export/MapTemplate) Notebook.*" @@ -26,7 +25,6 @@ "outputs": [] }, { - "id": "hMb1v4Hbz0uLUbhvmm6Y1A", "cell_type": "markdown", "source": [ "

Close Import Template

" @@ -36,7 +34,6 @@ "outputs": [] }, { - "id": "ArK9WxF3XUGSRdpNv0aa0A", "cell_type": "markdown", "source": [ "All imports are triggered via the Import command. Several options can be fluently appended to customize the import action:", @@ -51,7 +48,6 @@ "outputs": [] }, { - "id": "D5wNqWFLo0-UlPV4sPO33A", "cell_type": "markdown", "source": [ "# Set up data and configuration", @@ -63,7 +59,6 @@ "outputs": [] }, { - "id": "c7It4DDk0UaGqiW6TZG_iA", "cell_type": "markdown", "source": [ "Choose to run the Close Import Template notebook either on top of the set of Systemorph data in memory or on top to the data present in the Database: ", @@ -77,7 +72,6 @@ "outputs": [] }, { - "id": "USHMPCizs0G_kBACuX-dDA", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" @@ -87,7 +81,6 @@ "outputs": [] }, { - "id": "U3F6pMBgdUyHgBU8qjiYJQ", "cell_type": "markdown", "source": [ "# DataNode and Parameters", @@ -105,7 +98,6 @@ "outputs": [] }, { - "id": "AaFS-0j0sEWW5SxoRYq4Vw", "cell_type": "code", "source": [ "var pathToFile = \"../Files/DataNodes/DataNodes_CH.csv\";" @@ -115,7 +107,6 @@ "outputs": [] }, { - "id": "ubGP1EsDNUC7xBL5VK7W7Q", "cell_type": "code", "source": [ "var format = ImportFormats.DataNode;" @@ -125,7 +116,6 @@ "outputs": [] }, { - "id": "-tgk2OJzaUWeC73huuAIAg", "cell_type": "code", "source": [ "await Import.FromFile(pathToFile).WithFormat(format).WithTarget(DataSource).ExecuteAsync()" @@ -135,7 +125,6 @@ "outputs": [] }, { - "id": "HHeBgnlDRkui1KTpqRPtaA", "cell_type": "markdown", "source": [ "# Transactional Data", @@ -152,7 +141,6 @@ "outputs": [] }, { - "id": "FQeU-8odV0ql_WZJ1jHEWQ", "cell_type": "code", "source": [ "var pathToFile = \"../Files/TransactionalData/Openings_CH_2020_12.csv\";" @@ -162,7 +150,6 @@ "outputs": [] }, { - "id": "iNUyEWfT3EamYL5mRG4amg", "cell_type": "code", "source": [ "var format = ImportFormats.Opening;" @@ -172,7 +159,6 @@ "outputs": [] }, { - "id": "98WY7o4cn06YizVrcR94xA", "cell_type": "code", "source": [ "await Import.FromFile(pathToFile).WithFormat(format).WithTarget(DataSource).ExecuteAsync()" @@ -182,7 +168,6 @@ "outputs": [] }, { - "id": "19kLJ4wFEkqfyJbhSgoIcg", "cell_type": "markdown", "source": [ "# Workspace reset" @@ -192,7 +177,6 @@ "outputs": [] }, { - "id": "zd61cWGdzkGJptkix9ISbA", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index 7cd237ff..86be515b 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "Jw20XG4x1EilMCJAihQP9g", "cell_type": "markdown", "source": [ "

In Memory Initialization of unconfigured DataSource

", @@ -31,7 +30,6 @@ "outputs": [] }, { - "id": "CJ391fe1PkqmNCzrbe2e9A", "cell_type": "code", "source": [ "#!import \"../Constants/CalculationEngine\"", @@ -42,7 +40,6 @@ "outputs": [] }, { - "id": "6_xa9moxtkyL3ihz07u5jw", "cell_type": "markdown", "source": [ "# Set default DataSource" @@ -52,7 +49,6 @@ "outputs": [] }, { - "id": "bxuByZKrEEGaJlJhmI9osQ", "cell_type": "code", "source": [ "await DataSource.SetAsync();", @@ -63,7 +59,6 @@ "outputs": [] }, { - "id": "s0AlrC6liUWQOtiQVIhETw", "cell_type": "markdown", "source": [ "# Initialize Workspace" @@ -73,7 +68,6 @@ "outputs": [] }, { - "id": "z4343SXng06FxPSXN2Aeow", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -83,7 +77,6 @@ "outputs": [] }, { - "id": "WL51QeoKJUmjFus2UMroPw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" @@ -93,7 +86,6 @@ "outputs": [] }, { - "id": "2-aLOC4J4kGoki0zyUlMYA", "cell_type": "markdown", "source": [ "# Import Dimensions, Partitions" @@ -103,7 +95,6 @@ "outputs": [] }, { - "id": "K0kR1Ex6GUuSxR9UWW6lAw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Dimensions.csv\")", @@ -134,7 +125,6 @@ "outputs": [] }, { - "id": "gQrym4Or-UK0l0KA6Oo1Ag", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Dimensions.csv\").WithFormat(ImportFormats.AocConfiguration).WithTarget(DataSource).ExecuteAsync()" @@ -144,7 +134,6 @@ "outputs": [] }, { - "id": "pVnKfqXxqkOFmEN6oMqzXA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" @@ -154,7 +143,6 @@ "outputs": [] }, { - "id": "CeFL2feAYEm4_iQf1FF-kw", "cell_type": "markdown", "source": [ "# Import Parameters" @@ -164,7 +152,6 @@ "outputs": [] }, { - "id": "jh9UF6J2W0yN7wPYYlWH3A", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" @@ -174,7 +161,6 @@ "outputs": [] }, { - "id": "-yXSxX1SlkCP7ItYBNxBzQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" @@ -184,7 +170,6 @@ "outputs": [] }, { - "id": "g62eclyU5keZInFB-XjOuA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" @@ -194,7 +179,6 @@ "outputs": [] }, { - "id": "DBD01bxBz0ybP_0ZJWx6pQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" @@ -204,7 +188,6 @@ "outputs": [] }, { - "id": "mzOil6-bnEOxaKRmzJkALA", "cell_type": "markdown", "source": [ "# Import DataNodes and DataNodeParameters" @@ -214,7 +197,6 @@ "outputs": [] }, { - "id": "7-ashq1f2UamoHI5eVd6TQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" @@ -224,7 +206,6 @@ "outputs": [] }, { - "id": "vfjAuDCj4E6udIDEPDpi5g", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" @@ -234,7 +215,6 @@ "outputs": [] }, { - "id": "gyPlZm5h-kyEEdSBKnxjQw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" @@ -244,7 +224,6 @@ "outputs": [] }, { - "id": "j9T1pkXp8Ui_6fUppmZStQ", "cell_type": "markdown", "source": [ "# Reset Workspace" @@ -254,7 +233,6 @@ "outputs": [] }, { - "id": "oIEu2CZCckC-kJlVOOIFUA", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -264,7 +242,6 @@ "outputs": [] }, { - "id": "jPzyibohbkO7BcQpOMcOfg", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb index 21faf6db..e1bf22ca 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "dXiMOEAkhUS3szd2gfF6AA", "cell_type": "markdown", "source": [ "

Physical Database Initialization

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "_W0Ol9Yp9UeBergpPJwHJQ", "cell_type": "code", "source": [ "#!import \"../Database/Configure\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "65YliV-tKkmoSPy38bJF1Q", "cell_type": "markdown", "source": [ "# Initialize Workspace" @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "a-PRJMIuu0-d1Wc9Vdzexw", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules());" @@ -58,7 +54,6 @@ "outputs": [] }, { - "id": "MiNtGH15D0yiZ7EBxZapSw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" @@ -68,7 +63,6 @@ "outputs": [] }, { - "id": "ly36ekMIOEmIr3ecEcrcLw", "cell_type": "markdown", "source": [ "# Import Dimensions, Partitions" @@ -78,7 +72,6 @@ "outputs": [] }, { - "id": "x-MizAOJUE2I94Jd_HMpBA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Dimensions.csv\")", @@ -110,7 +103,6 @@ "outputs": [] }, { - "id": "dH5kihXlfU-Ipg3yKL6HZQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" @@ -120,7 +112,6 @@ "outputs": [] }, { - "id": "ptLGGIqwaU-rOpJwqkDPMQ", "cell_type": "markdown", "source": [ "# Import Parameters" @@ -130,7 +121,6 @@ "outputs": [] }, { - "id": "nyVjHWMCwkq5BzpPbVxpSg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" @@ -140,7 +130,6 @@ "outputs": [] }, { - "id": "EnJEQa5B1kSZWSMWzVP6iQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" @@ -150,7 +139,6 @@ "outputs": [] }, { - "id": "nlxEPvEV8ke7pYuCdyx_Kw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" @@ -160,7 +148,6 @@ "outputs": [] }, { - "id": "MKh8LPhn8EWNCzMIjw0FPg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" @@ -170,7 +157,6 @@ "outputs": [] }, { - "id": "6Lg4ijhfp02NEI7_K7WLeg", "cell_type": "markdown", "source": [ "# Import DataNodes and DataNodeParameters" @@ -180,7 +166,6 @@ "outputs": [] }, { - "id": "wybN1I0PzE60Q8fsBQncNA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" @@ -190,7 +175,6 @@ "outputs": [] }, { - "id": "lDVi2RgwC0KBfSTM0haXLA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" @@ -200,7 +184,6 @@ "outputs": [] }, { - "id": "RZGXHFwlhUa4QElkgnabrA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" @@ -210,7 +193,6 @@ "outputs": [] }, { - "id": "ZRzbVWjGt0CQWMBmcdV6xA", "cell_type": "markdown", "source": [ "# Import Cashflow and Actuals" @@ -220,7 +202,6 @@ "outputs": [] }, { - "id": "AQ2a6_t30kK9G1SpuPzbXA", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" @@ -230,7 +211,6 @@ "outputs": [] }, { - "id": "czdzFh4XYE6tgQIH0X5PeQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" @@ -240,7 +220,6 @@ "outputs": [] }, { - "id": "4oyINCcm00aOGDsmy3uYCg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" @@ -250,7 +229,6 @@ "outputs": [] }, { - "id": "4QCb8Aedd0SGt_lDSgoLZg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" @@ -260,7 +238,6 @@ "outputs": [] }, { - "id": "PpdBhbl5XUOHeuneQTuqHg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" @@ -270,7 +247,6 @@ "outputs": [] }, { - "id": "cuqbrXADgESQzMGmdJNbKA", "cell_type": "markdown", "source": [ "# Reset Workspace" @@ -280,7 +256,6 @@ "outputs": [] }, { - "id": "yH5itqeYMkKbcSt0cjJdBw", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -290,7 +265,6 @@ "outputs": [] }, { - "id": "hQT5R1kCBUSQ-acs3AO6yg", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb index c3796999..92e0deb5 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "cbbGg6wjDk-TVYeStR4qBQ", "cell_type": "markdown", "source": [ "

In Memory Initialization of unconfigured DataSource

", @@ -30,7 +29,6 @@ "outputs": [] }, { - "id": "IpRteNYsKEaP0_-LNWk1cw", "cell_type": "code", "source": [ "#!eval-notebook \"InitSystemorphBaseToMemory\"" @@ -40,7 +38,6 @@ "outputs": [] }, { - "id": "SoE3gUys8EKp3ltftwtJ6A", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -50,7 +47,6 @@ "outputs": [] }, { - "id": "a7zceRktk0Oj53N2bl_YgQ", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" @@ -60,7 +56,6 @@ "outputs": [] }, { - "id": "VNVvjMUDfUyw_34VpV0mKw", "cell_type": "markdown", "source": [ "# Import of Transactional Data" @@ -70,7 +65,6 @@ "outputs": [] }, { - "id": "fUkB1KS4Uk-UGYu3OGnZVQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" @@ -80,7 +74,6 @@ "outputs": [] }, { - "id": "4eI7O5E33kO7J2A17OzgkQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" @@ -90,7 +83,6 @@ "outputs": [] }, { - "id": "yZwiP28TokCPvTjooQvb3w", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" @@ -100,7 +92,6 @@ "outputs": [] }, { - "id": "-pwL5OY8Zk-MVsjCcc0GBw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" @@ -110,7 +101,6 @@ "outputs": [] }, { - "id": "_BBWqUgvVEGssR-nINMZzw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" @@ -120,7 +110,6 @@ "outputs": [] }, { - "id": "fZkRZKEuA0yPF2yeLMm9Nw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/SimpleValue_CH_2020_12.csv\").WithFormat(ImportFormats.SimpleValue ).WithTarget(DataSource).ExecuteAsync()" @@ -130,7 +119,6 @@ "outputs": [] }, { - "id": "n9gNpRaqN0OZp7FW0xzn8Q", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" @@ -140,7 +128,6 @@ "outputs": [] }, { - "id": "nT-Kxk8_wEmlJuFiTIyo4g", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" @@ -150,7 +137,6 @@ "outputs": [] }, { - "id": "RxVrDBGSckmToNXY8u0qNA", "cell_type": "markdown", "source": [ "# Reset Workspace" @@ -160,7 +146,6 @@ "outputs": [] }, { - "id": "zJuYHgo2HkKTEErlOcc0tg", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -170,7 +155,6 @@ "outputs": [] }, { - "id": "1OoKa9wkCkSVyawbxgUPJA", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/InputFormatDescription.ipynb b/full-ifrs17-template/InputFormatDescription.ipynb index 02a51dce..691a245c 100644 --- a/full-ifrs17-template/InputFormatDescription.ipynb +++ b/full-ifrs17-template/InputFormatDescription.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "KxjjzFMIGE2XG47MupU_Rw", "cell_type": "markdown", "source": [ "

Structure of the Cashflows, Actuals and Openings Files

", @@ -36,7 +35,6 @@ "outputs": [] }, { - "id": "b_ujMXfzKkK739lQz4lDLA", "cell_type": "markdown", "source": [ "A cashflow file is named **NominalCashflows** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Cashflow**.", @@ -58,7 +56,6 @@ "outputs": [] }, { - "id": "3ZvTFE0td0OhuzUYPSQNYg", "cell_type": "markdown", "source": [ "", @@ -72,7 +69,6 @@ "outputs": [] }, { - "id": "TmexPVnf9UOLk5M-rBIOFQ", "cell_type": "markdown", "source": [ "An Actuals file is named **Actuals** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Actual**.", @@ -90,7 +86,6 @@ "outputs": [] }, { - "id": "8q7t_L66eUCR0RPDomX5vw", "cell_type": "markdown", "source": [ "", @@ -104,7 +99,6 @@ "outputs": [] }, { - "id": "KeCG80BBU0mkKTrFyzYswg", "cell_type": "markdown", "source": [ "An Openings file is named **Openings** *\\_* *\\_* *\\_* and is composed of two sections: **Main** and **Opening**. In an AoC for one period, we only need one file with the year/month combination of the beginning of the period. Some GICs do not need any entries in Openings.", diff --git a/full-ifrs17-template/OverviewIFRS17Template.ipynb b/full-ifrs17-template/OverviewIFRS17Template.ipynb index 46b1daf1..e20401bf 100644 --- a/full-ifrs17-template/OverviewIFRS17Template.ipynb +++ b/full-ifrs17-template/OverviewIFRS17Template.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "XqP6oT3oEUG8gfJACppeEA", "cell_type": "markdown", "source": [ "

IFRS17 Template - an Overview

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "fLQXzK7btES7Yy94RU7hPg", "cell_type": "markdown", "source": [ "# Introduction", @@ -44,7 +42,6 @@ "outputs": [] }, { - "id": "mgx2RMH1lU2loBaAni5g_A", "cell_type": "markdown", "source": [ "", @@ -80,7 +77,6 @@ "outputs": [] }, { - "id": "MzVwAqqUUU2txhGSipf7JQ", "cell_type": "markdown", "source": [ "# Data input", @@ -92,7 +88,6 @@ "outputs": [] }, { - "id": "nWSvAb7SxEKuYE10AgcJ3g", "cell_type": "markdown", "source": [ "", @@ -109,7 +104,6 @@ "outputs": [] }, { - "id": "Y-wDmfD8GUCqW-pX9i8oLA", "cell_type": "markdown", "source": [ "", @@ -129,7 +123,6 @@ "outputs": [] }, { - "id": "EeU9UVGsoEuSU1mmM-28cQ", "cell_type": "markdown", "source": [ "", @@ -152,7 +145,6 @@ "outputs": [] }, { - "id": "sLBXsjIWDUuSBmO6_bb3aQ", "cell_type": "markdown", "source": [ "", @@ -176,7 +168,6 @@ "outputs": [] }, { - "id": "EKBiTpxkLkKpIEhzVuZ-kw", "cell_type": "markdown", "source": [ "# Initialization", @@ -198,7 +189,6 @@ "outputs": [] }, { - "id": "ovtyPj3BG0OpMirbW0a-vg", "cell_type": "markdown", "source": [ "" @@ -208,7 +198,6 @@ "outputs": [] }, { - "id": "A_hBKHHrgEWrhwl60wgegQ", "cell_type": "markdown", "source": [ "", diff --git a/full-ifrs17-template/Report/Reports.ipynb b/full-ifrs17-template/Report/Reports.ipynb index 771699ba..e7e1391c 100644 --- a/full-ifrs17-template/Report/Reports.ipynb +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "u7uIwzix5EikOZED39lDSQ", "cell_type": "markdown", "source": [ "", @@ -29,7 +28,6 @@ "outputs": [] }, { - "id": "4igmSVIW0E6Kv5_vkT9DLg", "cell_type": "markdown", "source": [ "For demonstration purposes we import here data for some *Group of Insurance Contract* (GIC) and *Group of Reinsurance Contract* (GRIC) - the import is triggered in the [Set up data and configuration](#set-up-data-and-configuration).", @@ -44,7 +42,6 @@ "outputs": [] }, { - "id": "hLLR1wkcZkyJXyEFLqPMMA", "cell_type": "markdown", "source": [ "# Set up data and configuration", @@ -60,7 +57,6 @@ "outputs": [] }, { - "id": "eKD8BZm_xUOZQuA6m8UmTg", "cell_type": "code", "source": [ "#!eval-notebook \"../Import/CloseImportTemplate\"" @@ -70,7 +66,6 @@ "outputs": [] }, { - "id": "U7KdEKhA_EOYfJ4pQQNz5A", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", @@ -81,7 +76,6 @@ "outputs": [] }, { - "id": "poAVlQqeLkiV37sb_NpveQ", "cell_type": "markdown", "source": [ "# Best Estimate", @@ -98,7 +92,6 @@ "outputs": [] }, { - "id": "vtm0lBQIJEGfynjBvvZOrA", "cell_type": "code", "source": [ "var pvReport = ifrs17Report.PresentValues;", @@ -114,7 +107,6 @@ "outputs": [] }, { - "id": "ldw5kzK-mUSWoT7wyZhjcw", "cell_type": "markdown", "source": [ "# Risk Adjustment", @@ -128,7 +120,6 @@ "outputs": [] }, { - "id": "6qXICBD8FUOKmE7kKFNOdw", "cell_type": "code", "source": [ "var raReport = ifrs17Report.RiskAdjustments;", @@ -143,7 +134,6 @@ "outputs": [] }, { - "id": "v073-6zoBUOkEN0NkPMINA", "cell_type": "markdown", "source": [ "# Written Actuals", @@ -158,7 +148,6 @@ "outputs": [] }, { - "id": "Bqo2fJLwn02ro4jOw7UcAQ", "cell_type": "code", "source": [ "var writtenActualReport = ifrs17Report.WrittenActuals;", @@ -173,7 +162,6 @@ "outputs": [] }, { - "id": "h3gavlvtO0u2bh1A333Oew", "cell_type": "markdown", "source": [ "## Advance, Overdue Actuals", @@ -188,7 +176,6 @@ "outputs": [] }, { - "id": "g5vadolJpEykmOcUutrCRg", "cell_type": "code", "source": [ "var accrualActualReport = ifrs17Report.AccrualActuals;", @@ -203,7 +190,6 @@ "outputs": [] }, { - "id": "yxg6Q5NzBE2TOmApSlpCKw", "cell_type": "markdown", "source": [ "## Deferrable Actuals", @@ -215,7 +201,6 @@ "outputs": [] }, { - "id": "1I7E2WC9I0SuubPYwDRh0w", "cell_type": "code", "source": [ "var deferrableActualReport = ifrs17Report.DeferralActuals;", @@ -230,7 +215,6 @@ "outputs": [] }, { - "id": "b21x1Qg4zka-PSLZ2_VVtw", "cell_type": "markdown", "source": [ "# Fulfilment Cashflow", @@ -246,7 +230,6 @@ "outputs": [] }, { - "id": "fQuP9scuY0GkBt5BDKH4rQ", "cell_type": "code", "source": [ "var fulfillmentCashflowsReport = ifrs17Report.FulfillmentCashflows;", @@ -261,7 +244,6 @@ "outputs": [] }, { - "id": "-Klq4DH4K0qG8aZqN3oSew", "cell_type": "markdown", "source": [ "# Actuarial Experience Adjustment", @@ -273,7 +255,6 @@ "outputs": [] }, { - "id": "Ed6yzeiYa0-3UyyBO7W0Rg", "cell_type": "code", "source": [ "var experienceAdjustmentsReport = ifrs17Report.ExperienceAdjustments;", @@ -288,7 +269,6 @@ "outputs": [] }, { - "id": "5cscmHZq0U2qZkBjPplHRA", "cell_type": "markdown", "source": [ "# LRC Technical Margin", @@ -301,7 +281,6 @@ "outputs": [] }, { - "id": "a3POL_T-EUqCOxc6-th4Ew", "cell_type": "code", "source": [ "var technicalMarginsReport = ifrs17Report.TechnicalMargins;", @@ -316,7 +295,6 @@ "outputs": [] }, { - "id": "gPdzoyThOU--U7xX2ECoQQ", "cell_type": "markdown", "source": [ "# Contractual Service Margin / Loss Component / Loss Recovery Component", @@ -330,7 +308,6 @@ "outputs": [] }, { - "id": "FmXWfR1g2EmvLBkN1e-E9w", "cell_type": "code", "source": [ "var allocatedTechnicalMarginsReport = ifrs17Report.AllocatedTechnicalMargins;", @@ -345,7 +322,6 @@ "outputs": [] }, { - "id": "wy3GYkeG5UKsa50J8R17YQ", "cell_type": "markdown", "source": [ "# LRC Actuarial", @@ -357,7 +333,6 @@ "outputs": [] }, { - "id": "Xpp0x9HDlkihJkci0h4Fmw", "cell_type": "code", "source": [ "var actuarialLrcReport = ifrs17Report.ActuarialLrc;", @@ -372,7 +347,6 @@ "outputs": [] }, { - "id": "k6LnLkmNYkytkmkTkJLNJg", "cell_type": "markdown", "source": [ "# LRC", @@ -384,7 +358,6 @@ "outputs": [] }, { - "id": "pnSRXZw4G0mlrw6Balh3Eg", "cell_type": "code", "source": [ "var lrcReport = ifrs17Report.Lrc;", @@ -399,7 +372,6 @@ "outputs": [] }, { - "id": "IEpuI6z2ZkSjC4N-wWpnXw", "cell_type": "markdown", "source": [ "# LIC Actuarial", @@ -411,7 +383,6 @@ "outputs": [] }, { - "id": "yS3hZ7c9YEWHWZPTNX-rhw", "cell_type": "code", "source": [ "var actuarialLicReport = ifrs17Report.ActuarialLic;", @@ -426,7 +397,6 @@ "outputs": [] }, { - "id": "bo9xgnvtk0CRHOeS9vTULg", "cell_type": "markdown", "source": [ "# LIC", @@ -438,7 +408,6 @@ "outputs": [] }, { - "id": "88vqIH2CvUaR5ukjOZzJwQ", "cell_type": "code", "source": [ "var licReport = ifrs17Report.Lic;", @@ -453,7 +422,6 @@ "outputs": [] }, { - "id": "euXCVCpFJ0-az91gK8ZAjg", "cell_type": "markdown", "source": [ "# Financial Performance", @@ -467,7 +435,6 @@ "outputs": [] }, { - "id": "s-A7Z24en0CV_hj-p9F5rQ", "cell_type": "code", "source": [ "var financialPerformanceReport = ifrs17Report.FinancialPerformance;", @@ -482,7 +449,6 @@ "outputs": [] }, { - "id": "K9KFyJWxWEeHa2Pc1M54LQ", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/AocStructureTest.ipynb b/full-ifrs17-template/Test/AocStructureTest.ipynb index b84e90da..36b7fec6 100644 --- a/full-ifrs17-template/Test/AocStructureTest.ipynb +++ b/full-ifrs17-template/Test/AocStructureTest.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "2SRO3ShzLkaZ7qWN8RvZ7Q", "cell_type": "markdown", "source": [ "

Test Aoc Management

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "M1VllEPGS0OhlSQ3uJd1eQ", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "hNl7XCToMUKSzhT3hzDPeQ", "cell_type": "markdown", "source": [ "# Workspace Initialization " @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "bQMzNpxXeUuoDw7sLQ_FJA", "cell_type": "code", "source": [ "Workspace.Initialize(x => x.FromSource(DataSource)", @@ -60,7 +56,6 @@ "outputs": [] }, { - "id": "_wLRhB1_zkK24aHF4LmP7Q", "cell_type": "markdown", "source": [ "# Test" @@ -70,7 +65,6 @@ "outputs": [] }, { - "id": "vNuhxD_Qo0GuHabTN1NA5g", "cell_type": "code", "source": [ "var reportingNode = \"CH\";", @@ -81,7 +75,6 @@ "outputs": [] }, { - "id": "9v46vtb-bUqHEbNG5SyPhw", "cell_type": "code", "source": [ "//Define partition", @@ -99,7 +92,6 @@ "outputs": [] }, { - "id": "Btn83FlNYE6_Ql5XGVzmIg", "cell_type": "code", "source": [ "public async Task CheckAocStepStructureAsync(IEnumerable inputVariables, ", @@ -248,7 +240,6 @@ "outputs": [] }, { - "id": "aFfmV7Ms80WfX9f9H0_wXQ", "cell_type": "markdown", "source": [ "# Use Cases" @@ -258,7 +249,6 @@ "outputs": [] }, { - "id": "mzSm3LewcEmN0pzLELyAoQ", "cell_type": "markdown", "source": [ "## Gross Cashflow: InForce, NewBusiness, and Combined" @@ -268,7 +258,6 @@ "outputs": [] }, { - "id": "_4kokfPYeUyHMwvE0QmYfA", "cell_type": "code", "source": [ "var groupOfContract = \"DT1.1\";" @@ -278,7 +267,6 @@ "outputs": [] }, { - "id": "0e0Hl6UeEkeKZFmm1F23BA", "cell_type": "code", "source": [ "var inputRawVariables = new RawVariable[]{", @@ -294,7 +282,6 @@ "outputs": [] }, { - "id": "Dz725xYrTU2lcT7unwrpWg", "cell_type": "code", "source": [ "var parentBm = new Dictionary>()", @@ -310,7 +297,6 @@ "outputs": [] }, { - "id": "gJi4A4oY9kSR1jm_-0Ottw", "cell_type": "code", "source": [ "var referenceBm = new Dictionary()", @@ -336,7 +322,6 @@ "outputs": [] }, { - "id": "o71ZpBEymEioQHtRrczoDw", "cell_type": "code", "source": [ "var fullAocBm = new Dictionary>()", @@ -374,7 +359,6 @@ "outputs": [] }, { - "id": "c2lCvWF2M0KxFyXg23xR5Q", "cell_type": "code", "source": [ "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" @@ -384,7 +368,6 @@ "outputs": [] }, { - "id": "fQPs1GfVgUGI3A2oi6ES_Q", "cell_type": "markdown", "source": [ "## Reinsurance Cashflow: InForce, NewBusiness, and Combined" @@ -394,7 +377,6 @@ "outputs": [] }, { - "id": "Y5UQw3aQ00Kwj2FwQlwFqA", "cell_type": "code", "source": [ "groupOfContract = \"DTR1.1\";" @@ -404,7 +386,6 @@ "outputs": [] }, { - "id": "gmZ98jyVhE-gKbFFWdRM_A", "cell_type": "code", "source": [ "inputRawVariables = new RawVariable[]{", @@ -420,7 +401,6 @@ "outputs": [] }, { - "id": "CASGAQ4Tfk-r5qegnk_VTg", "cell_type": "code", "source": [ "parentBm = new Dictionary>()", @@ -437,7 +417,6 @@ "outputs": [] }, { - "id": "CLL4jQwmfEe6fmoqWNjZGw", "cell_type": "code", "source": [ "var parentBm_CDR = new Dictionary>()", @@ -454,7 +433,6 @@ "outputs": [] }, { - "id": "6WWtvNB4FUO7jnbMl-3d6Q", "cell_type": "code", "source": [ "referenceBm = new Dictionary()", @@ -482,7 +460,6 @@ "outputs": [] }, { - "id": "I_If6UTWpUCQqU0iKSjSng", "cell_type": "code", "source": [ "fullAocBm = new Dictionary>()", @@ -523,7 +500,6 @@ "outputs": [] }, { - "id": "HtMAFjHCU0qgleOtt6J70A", "cell_type": "code", "source": [ "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm, parentBm_CDR)" @@ -533,7 +509,6 @@ "outputs": [] }, { - "id": "C7fWPcfSOU2tKgZUhmqOQA", "cell_type": "markdown", "source": [ "## Cashflow: InForce, and Combined" @@ -543,7 +518,6 @@ "outputs": [] }, { - "id": "zKke0guumkSXcJBCS71Uew", "cell_type": "code", "source": [ "var groupOfContract = \"DT1.1\";" @@ -553,7 +527,6 @@ "outputs": [] }, { - "id": "_18dqpvWvUqCFX2z2M5WfA", "cell_type": "code", "source": [ "inputRawVariables = new RawVariable[]{", @@ -567,7 +540,6 @@ "outputs": [] }, { - "id": "9J919h-K1kqu1tAGwVWYdw", "cell_type": "code", "source": [ "parentBm = new Dictionary>()", @@ -582,7 +554,6 @@ "outputs": [] }, { - "id": "ZE7AsxQoG02Qol7pRFbtXA", "cell_type": "code", "source": [ "referenceBm = new Dictionary()", @@ -604,7 +575,6 @@ "outputs": [] }, { - "id": "Ay6veykrjkKNWneUWBpL7Q", "cell_type": "code", "source": [ "fullAocBm = new Dictionary>()", @@ -632,7 +602,6 @@ "outputs": [] }, { - "id": "eHYrP4DJXUy7BsFDUCcJwg", "cell_type": "code", "source": [ "await CheckAocStepStructureAsync(inputRawVariables, parentBm, referenceBm, fullAocBm)" @@ -642,7 +611,6 @@ "outputs": [] }, { - "id": "m7BQFO0kqUiHx6TEe7OuIw", "cell_type": "markdown", "source": [ "## Actual" @@ -652,7 +620,6 @@ "outputs": [] }, { - "id": "_ic5CYtWrE24qDPr1qGI1Q", "cell_type": "code", "source": [ "var groupOfContract = \"DT1.1\";" @@ -662,7 +629,6 @@ "outputs": [] }, { - "id": "uANg5ulWwkiuBtfSR0K1eg", "cell_type": "code", "source": [ "var inputIfrsVariables = new IfrsVariable[]{", @@ -677,7 +643,6 @@ "outputs": [] }, { - "id": "l0y2QdR_O0mtdza797CLAw", "cell_type": "code", "source": [ "parentBm = null;" @@ -687,7 +652,6 @@ "outputs": [] }, { - "id": "SnSLmJ6Ph0SdiyWLD5gXAg", "cell_type": "code", "source": [ "referenceBm = null;" @@ -697,7 +661,6 @@ "outputs": [] }, { - "id": "pFoRvT0Vj0qccKEeuynz9w", "cell_type": "code", "source": [ "fullAocBm = new Dictionary>()", @@ -714,7 +677,6 @@ "outputs": [] }, { - "id": "fCPrGixu902KzS2gDA_COA", "cell_type": "code", "source": [ "await CheckAocStepStructureAsync(inputIfrsVariables, parentBm, referenceBm, fullAocBm)" @@ -724,7 +686,6 @@ "outputs": [] }, { - "id": "UKC3B3KBzEu2chdA44RYWQ", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/ExportIfrsVariable.ipynb b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb index 268dbcda..3370546c 100644 --- a/full-ifrs17-template/Test/ExportIfrsVariable.ipynb +++ b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "gyniYqnKikqyyeZwKE3w_A", "cell_type": "markdown", "source": [ "

Test Reports

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "b-vYp0gzsEG2ZbVtT_7kZA", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "AnHy7aq_1UCdpDokxEg1ug", "cell_type": "markdown", "source": [ "# BenchMarks" @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "jYkLXYmEE0SzZNcORVzVyg", "cell_type": "code", "source": [ "var pathToBm = \"./Data/ReportBenchmarks/\";" @@ -58,7 +54,6 @@ "outputs": [] }, { - "id": "ntINVSp7zUe_bdSYQISwRQ", "cell_type": "code", "source": [ "var argsArray = new ImportArgs[]{", @@ -71,7 +66,6 @@ "outputs": [] }, { - "id": "XQD2qkj4kEmun05vfKjBXg", "cell_type": "code", "source": [ "var scenario = \"MTUP10pct\";" @@ -81,7 +75,6 @@ "outputs": [] }, { - "id": "K0v3eoXQ-0GR5wQUavZZdA", "cell_type": "code", "source": [ "var args = new ImportArgs (\"CH\", 2020, 12, Periodicity.Quarterly, scenario, null);", @@ -93,7 +86,6 @@ "outputs": [] }, { - "id": "RLE-nEp_AEC80dTOOpOuEw", "cell_type": "code", "source": [ "(0, computedVariables.Keys)" @@ -103,7 +95,6 @@ "outputs": [] }, { - "id": "JLu16Jzr1E2J_BrBOUhoAQ", "cell_type": "code", "source": [ "var estimateType = \"BEPA\";", @@ -129,7 +120,6 @@ "outputs": [] }, { - "id": "VMRDuKeShkua9CR3XEa9Uw", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/ExportReportVariables.ipynb b/full-ifrs17-template/Test/ExportReportVariables.ipynb index d9e1a630..74b2f841 100644 --- a/full-ifrs17-template/Test/ExportReportVariables.ipynb +++ b/full-ifrs17-template/Test/ExportReportVariables.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "w3hTos8PYE2anJHmCX5-og", "cell_type": "markdown", "source": [ "

Report Variable Exporter

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "HpEqqWuC7kuRLHoeY6YLaA", "cell_type": "markdown", "source": [ "# Infrastructure and Configuration" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "3Gteb02znkyyorr1rK8qrg", "cell_type": "markdown", "source": [ "## Initialize Workspace" @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "CHzk0G-F6EqVRewucQ24Tw", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" @@ -58,7 +54,6 @@ "outputs": [] }, { - "id": "BYSXWDg9fkKVxwArMwDo2w", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" @@ -68,7 +63,6 @@ "outputs": [] }, { - "id": "EhBxY5wLOkSrpUozXxisOA", "cell_type": "markdown", "source": [ "## Imports and Configurations" @@ -78,7 +72,6 @@ "outputs": [] }, { - "id": "S02JZwmkG0epPmZbsUR7dg", "cell_type": "code", "source": [ "#!import \"ReportVariablesTestBase\"" @@ -88,7 +81,6 @@ "outputs": [] }, { - "id": "oJbkEK0FXkirjq30Wu873w", "cell_type": "markdown", "source": [ "## Storage" @@ -98,7 +90,6 @@ "outputs": [] }, { - "id": "r-VrgwtMV0WNk2B4EJSZ7w", "cell_type": "code", "source": [ "var reportStorage = new ReportStorage(Workspace, Report);", @@ -109,7 +100,6 @@ "outputs": [] }, { - "id": "D2-Sfwcbk0S_kDpIUPw9qw", "cell_type": "markdown", "source": [ "## Configurations" @@ -119,7 +109,6 @@ "outputs": [] }, { - "id": "fST1ooZG606uxzvrn9n86w", "cell_type": "code", "source": [ "//var path = \"./Data/ReportVariableBenchmarks/\";" @@ -129,7 +118,6 @@ "outputs": [] }, { - "id": "YG-CpjjbQk6oQcpgxXt23w", "cell_type": "markdown", "source": [ "# Defining Scope for the Reports and Tests" @@ -139,7 +127,6 @@ "outputs": [] }, { - "id": "_0V0ZWihnk-d3zNj56ZvcQ", "cell_type": "markdown", "source": [ "### Defining the Period and Reporting Node (...) for the Reports" @@ -149,7 +136,6 @@ "outputs": [] }, { - "id": "QPJPvzqJqU20dfRXkgSKCA", "cell_type": "code", "source": [ "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType)[] exportScope = {", @@ -167,7 +153,6 @@ "outputs": [] }, { - "id": "doLfGk3ZY0O0B-1OJ93Eww", "cell_type": "markdown", "source": [ "# Export" @@ -177,7 +162,6 @@ "outputs": [] }, { - "id": "J-gceJlUTEWA3b-_lA8jqQ", "cell_type": "code", "source": [ "// foreach(var args in exportScope){", @@ -191,7 +175,6 @@ "outputs": [] }, { - "id": "wimBAI-AxUamvGEoBsgvLQ", "cell_type": "code", "source": [ "var args = exportScope.First();" @@ -201,7 +184,6 @@ "outputs": [] }, { - "id": "g7w8cfsKC0uqqa8Hk-tvig", "cell_type": "code", "source": [ "var scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", @@ -212,7 +194,6 @@ "outputs": [] }, { - "id": "qIKmkC8tI0afnRzqSzu3Bg", "cell_type": "code", "source": [ "await Export.ToCsv(bmFileName)", diff --git a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb index 95525812..159124cd 100644 --- a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb +++ b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "6scxNAfeaEKQpsdiYwPBiQ", "cell_type": "markdown", "source": [ "

Ifrs Variable

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "M5pmNZSIl0-IBqNKyS2OJw", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "eEnHiGXZuk-HmFq5k-uskQ", "cell_type": "markdown", "source": [ "# BenchMarks" @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "c8Ih_f5ou0GfWn7tGD0NjA", "cell_type": "code", "source": [ "var pathToBm = \"./Data/IfrsVariableBenchmarks/\";" @@ -58,7 +54,6 @@ "outputs": [] }, { - "id": "Ady4_q_75kOPCb0L_OoTuA", "cell_type": "code", "source": [ "public record BenchmarkMetadata(string FileName, string ReportingNode, int Year, int Month, string Scenario = null){} " @@ -68,7 +63,6 @@ "outputs": [] }, { - "id": "FxYB_odz5kauR7Tzov4FBA", "cell_type": "code", "source": [ "var bmFiles = new BenchmarkMetadata[]{", @@ -113,7 +107,6 @@ "outputs": [] }, { - "id": "Jpf73ojEzEuugf6Eb4VxLg", "cell_type": "code", "source": [ "var excludedDataNodes = new[] {\"DT5.1\"}; // DT5.1 is simple importer and tested at report variable level" @@ -123,7 +116,6 @@ "outputs": [] }, { - "id": "Obh-9GjSVk-Kzliv3vZWlA", "cell_type": "markdown", "source": [ "# Functions" @@ -133,7 +125,6 @@ "outputs": [] }, { - "id": "_CiTAc6k0UGmQqN2FL2rpQ", "cell_type": "code", "source": [ "public static NumberStyles AllowedNumberStyles = NumberStyles.Float | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowLeadingSign | NumberStyles.AllowTrailingSign | NumberStyles.AllowDecimalPoint;" @@ -143,7 +134,6 @@ "outputs": [] }, { - "id": "8qbu0w9W6kOkf3L8Z9xYmQ", "cell_type": "code", "source": [ "public IfrsVariable CreateVariable (IDataRow row, Guid partition)", @@ -168,7 +158,6 @@ "outputs": [] }, { - "id": "ZSYfIGNm802cO89G2pEZJg", "cell_type": "code", "source": [ "public class BenchmarkTestResult", @@ -193,7 +182,6 @@ "outputs": [] }, { - "id": "WJCUw1Sgj0CdzcF6Odsd5w", "cell_type": "code", "source": [ "public List CompareAgainstBm (List errors, IEnumerable expected, IEnumerable computed)", @@ -240,7 +228,6 @@ "outputs": [] }, { - "id": "DdmDeyIpBUmkeNdMAzoCzw", "cell_type": "markdown", "source": [ "# Test Runner" @@ -250,7 +237,6 @@ "outputs": [] }, { - "id": "Z0IH9izEb0ShMy_VUmBNnA", "cell_type": "code", "source": [ "public bool ValidateMainTab(IDataRow mainRow, string reportingNode, int year, int month)", @@ -269,7 +255,6 @@ "outputs": [] }, { - "id": "Dsc_qCZWK0K7nrTWLfr_8A", "cell_type": "code", "source": [ "var errorList = new List();", @@ -323,7 +308,6 @@ "outputs": [] }, { - "id": "uhA9D1gG6UC-WWEIVAGg6g", "cell_type": "code", "source": [ "errorList.Count().Should().Be(0);" @@ -333,7 +317,6 @@ "outputs": [] }, { - "id": "yZXBFdNw30mnd_LjNJ-WeQ", "cell_type": "code", "source": [ "errorList" @@ -343,7 +326,6 @@ "outputs": [] }, { - "id": "q7f3jcfZBUC5JR4OObHU8Q", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/ImportStorageTest.ipynb b/full-ifrs17-template/Test/ImportStorageTest.ipynb index 0fa50ad3..bbc1ebb8 100644 --- a/full-ifrs17-template/Test/ImportStorageTest.ipynb +++ b/full-ifrs17-template/Test/ImportStorageTest.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "4V1Y85K3S0mh2c_A3peNmQ", "cell_type": "markdown", "source": [ "

Import Storage Test

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "PWZUG1NwMkCYuH0xNoicJQ", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "oYCixA-P702eBHkRn7BP-A", "cell_type": "markdown", "source": [ "# Workspace Initialization " @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "klkTq3g0X0ShwTF3rFiJug", "cell_type": "code", "source": [ "Workspace.Initialize(x => x.FromSource(DataSource)", @@ -60,7 +56,6 @@ "outputs": [] }, { - "id": "5LVp8kBA5kq29eX43K0yDA", "cell_type": "markdown", "source": [ "# Test IfrsVariables Query" @@ -70,7 +65,6 @@ "outputs": [] }, { - "id": "Cz4yiK0cikSAdKQTs5lIiw", "cell_type": "code", "source": [ "var gic = \"DT1.1\";", @@ -83,7 +77,6 @@ "outputs": [] }, { - "id": "ek6ue64fhU2TykP20XAnng", "cell_type": "code", "source": [ "//Define partition", @@ -107,7 +100,6 @@ "outputs": [] }, { - "id": "sbwZeNrQ8EOHB4SUYpHtSg", "cell_type": "code", "source": [ "public async Task CheckIfrsVariablesFromImportStorageAsync(string importFormat, IEnumerable inputDataSetForWorkspace, IEnumerable inputDataSetForDataSource, IEnumerable ivsBenchmark)", @@ -147,7 +139,6 @@ "outputs": [] }, { - "id": "Anr6vl-t3UC5nTGfEVzRxA", "cell_type": "code", "source": [ "//There is a previous year, and it's the first time Actuals are imported for the current year", @@ -176,7 +167,6 @@ "outputs": [] }, { - "id": "tE0Ru932CUGtOoYd5VsKgw", "cell_type": "code", "source": [ "//There is a previous year, and it's the second time Actuals are imported for the current year (reimport)", @@ -210,7 +200,6 @@ "outputs": [] }, { - "id": "fWKZntzNbUSeFnicGWY8qg", "cell_type": "code", "source": [ "//There is a previous year, Cashflows were already imported and Actuals are imported for the first time", @@ -246,7 +235,6 @@ "outputs": [] }, { - "id": "AVGmHZJBB0eWrY6cU1ZGHw", "cell_type": "code", "source": [ "//There is a previous year, Cashflows and Actuals were already imported and Actuals are imported again", @@ -290,7 +278,6 @@ "outputs": [] }, { - "id": "WZ5UNLEbQEaqkkw1Eal-Sg", "cell_type": "code", "source": [ "//There is a previous year for Primary Scope (GRIC10) ", @@ -344,7 +331,6 @@ "outputs": [] }, { - "id": "U-aIdwuQhEO1mNg6s_O8RQ", "cell_type": "markdown", "source": [ "# Data Node Parameter related logic" @@ -354,7 +340,6 @@ "outputs": [] }, { - "id": "CgIPciXcd0yoh5eSyjtWLQ", "cell_type": "markdown", "source": [ "## Data Preparation" @@ -364,7 +349,6 @@ "outputs": [] }, { - "id": "8sToc40RHEyX6mnl6-2JeQ", "cell_type": "code", "source": [ "//Define partition", @@ -388,7 +372,6 @@ "outputs": [] }, { - "id": "dj0d1i45IUCPGcUYSFqF1g", "cell_type": "code", "source": [ "var sampleGic = new GroupOfInsuranceContract(){Portfolio = \"P1\"};", @@ -431,7 +414,6 @@ "outputs": [] }, { - "id": "5tLIwPwQlE6Q-Mmjt5qABw", "cell_type": "code", "source": [ "public async Task PrepareWorkspaceDataNodes()", @@ -447,7 +429,6 @@ "outputs": [] }, { - "id": "lvmU4I0au0KQSSOu4P0Oaw", "cell_type": "code", "source": [ "public async Task CleanWorkspaceDataNodes()", @@ -463,7 +444,6 @@ "outputs": [] }, { - "id": "8RVSgsGTckq6uDozpgV2Xg", "cell_type": "markdown", "source": [ "## Get Underlying Gic" @@ -473,7 +453,6 @@ "outputs": [] }, { - "id": "g7MyEgjcT0mIl4njOQldiA", "cell_type": "code", "source": [ "public async Task CheckGetUnderlyingGicsAsync(RawVariable[] inputDataVariable, Dictionary> underlyingGicBm)", @@ -504,7 +483,6 @@ "outputs": [] }, { - "id": "_LC1ibvA6k-LB8A_F-ZPJA", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -522,7 +500,6 @@ "outputs": [] }, { - "id": "wt4c0eVk5EiGCnz9mj-E6g", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins2\"},", @@ -538,7 +515,6 @@ "outputs": [] }, { - "id": "rHRLxr4v60KlzL_XBkR4dg", "cell_type": "markdown", "source": [ "## Get Reinsurance Coverage" @@ -548,7 +524,6 @@ "outputs": [] }, { - "id": "y3-b6njLFkOwrNvRICbFTw", "cell_type": "code", "source": [ "public async Task CheckGetReinsuranceCoverageAsync(RawVariable[] inputDataVariable, ", @@ -598,7 +573,6 @@ "outputs": [] }, { - "id": "3DoFFjphUk23ycw7uCoS-Q", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -623,7 +597,6 @@ "outputs": [] }, { - "id": "9SN-SI-1Z0yDm8u66Z2x9Q", "cell_type": "markdown", "source": [ "## Primary and Secondary Scope" @@ -633,7 +606,6 @@ "outputs": [] }, { - "id": "0rLWKbTR00WV1wWkicVaaQ", "cell_type": "code", "source": [ "public async Task CheckSecondaryScopeAsync(RawVariable[] inputDataVariable, string[] primaryScopeBm, string[] secondaryScopeBm)", @@ -674,7 +646,6 @@ "outputs": [] }, { - "id": "YdutG30Sxkit5d7-NlYKpg", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -689,7 +660,6 @@ "outputs": [] }, { - "id": "Ktz7zDRMKUayJsk8d4qJDg", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -703,7 +673,6 @@ "outputs": [] }, { - "id": "roTIyck4jUGmeXE_NdMzFA", "cell_type": "code", "source": [ "var inputDataVariable = new RawVariable[]{ sampleRawVar with {DataNode = \"Reins1\"},", @@ -718,7 +687,6 @@ "outputs": [] }, { - "id": "Ia3QbwB_qE-OLOF3bFIIow", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb index 313984c2..9a72bb31 100644 --- a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb +++ b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "5pJ9_h3JCkqu1VYGsHT6Ig", "cell_type": "markdown", "source": [ "

Test Map Template Export and Import

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "wKj_RnoNyEmjYuzGN_J2ug", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "etRLzU1SR0KckKJ-yD-P8Q", "cell_type": "markdown", "source": [ "# Test Empty Database" @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "yKo9EdsuY0SaaQ7gp23QdQ", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" @@ -58,7 +54,6 @@ "outputs": [] }, { - "id": "g50tzVTlvEqwzOtT6Vpj7A", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" @@ -68,7 +63,6 @@ "outputs": [] }, { - "id": "DU0jOj1B-0-pm6boDCGI4A", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" @@ -78,7 +72,6 @@ "outputs": [] }, { - "id": "4IuR29t8mkK5gCycGzQoeA", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" @@ -88,7 +81,6 @@ "outputs": [] }, { - "id": "07qbwfjHbkywAJxFtlnxbA", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" @@ -98,7 +90,6 @@ "outputs": [] }, { - "id": "BcOSQ2sTfkC6Y1bwQUDwzw", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" @@ -108,7 +99,6 @@ "outputs": [] }, { - "id": "OzlMeIunREmpcZOAWqbnMw", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" @@ -118,7 +108,6 @@ "outputs": [] }, { - "id": "yhLainJEZU6uJlBFKAYzcg", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" @@ -128,7 +117,6 @@ "outputs": [] }, { - "id": "0OvZDdON4UGP-MhvLpIkmw", "cell_type": "code", "source": [ "(await DataSource.Query().ToArrayAsync()).Length.Should().NotBe(0);" @@ -138,7 +126,6 @@ "outputs": [] }, { - "id": "p9wR_qEd2kq7Ivro5jR4MA", "cell_type": "markdown", "source": [ "# Test Map Template" @@ -148,7 +135,6 @@ "outputs": [] }, { - "id": "wpwTbPXYtE2ecKT7QHQp9g", "cell_type": "markdown", "source": [ "## Data Node" @@ -158,7 +144,6 @@ "outputs": [] }, { - "id": "wWGCIr86_0yXgnuWRYSopA", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", @@ -190,7 +175,6 @@ "outputs": [] }, { - "id": "vbfz9uVrmEC0qFFSYb2zlw", "cell_type": "code", "source": [ "await Export.ToExcel(filename)", @@ -207,7 +191,6 @@ "outputs": [] }, { - "id": "5xqalt9bUEaXe1Sy6xOR6w", "cell_type": "code", "source": [ "// Run this only after having imported the file exported in the above cell.", @@ -243,7 +226,6 @@ "outputs": [] }, { - "id": "rir7jijjqk-YTZyHTWzY3A", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -253,7 +235,6 @@ "outputs": [] }, { - "id": "XnNuBPlC1kS4RpEgM99EFg", "cell_type": "markdown", "source": [ "## Data Node State" @@ -263,7 +244,6 @@ "outputs": [] }, { - "id": "pCBweGbCdEuZJs8OgKqxFQ", "cell_type": "code", "source": [ "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2021, Month = 3 };", @@ -294,7 +274,6 @@ "outputs": [] }, { - "id": "vJAZZKAcXE6xZTu-pHEr-g", "cell_type": "code", "source": [ "await Export.ToExcel(filename)", @@ -309,7 +288,6 @@ "outputs": [] }, { - "id": "50DfYVJTrUi11ZM4hb0TrA", "cell_type": "code", "source": [ "// Run this only after having imported the file exported in the above cell.", @@ -336,7 +314,6 @@ "outputs": [] }, { - "id": "bJbigaiL_EaFa7Fwx7AH0Q", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -346,7 +323,6 @@ "outputs": [] }, { - "id": "pcaBVu-LgUu_4cP8fqy6Ug", "cell_type": "markdown", "source": [ "## DataNodeParameter" @@ -356,7 +332,6 @@ "outputs": [] }, { - "id": "j05en4nLBkCnDSt4QqP_lw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", @@ -390,7 +365,6 @@ "outputs": [] }, { - "id": "zs5pxexv-k-GWOtbsvg3Ug", "cell_type": "code", "source": [ "await Export.ToExcel(filename)", @@ -404,7 +378,6 @@ "outputs": [] }, { - "id": "Rmq7ED57Y02ZNBD8YHmwew", "cell_type": "code", "source": [ "// Run this only after having imported the file exported in the above cell.", @@ -438,7 +411,6 @@ "outputs": [] }, { - "id": "e_0TmZvO70ejGkrK4F25ng", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -448,7 +420,6 @@ "outputs": [] }, { - "id": "Z4ZTJKWu00eZLDbEZb1V6g", "cell_type": "markdown", "source": [ "# Test Import Validation" @@ -458,7 +429,6 @@ "outputs": [] }, { - "id": "R-p92PVOLUmM6Yv6RxKing", "cell_type": "markdown", "source": [ "## Data Node State: entries cannot be imported which change status from Inactive to Active" @@ -468,7 +438,6 @@ "outputs": [] }, { - "id": "dhRD96R8vE2HU59-grSaDg", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", @@ -500,7 +469,6 @@ "outputs": [] }, { - "id": "6Ax3adBDIkuMlpHuD259GA", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -510,7 +478,6 @@ "outputs": [] }, { - "id": "OysWLQGElkmApA3NQlx07g", "cell_type": "markdown", "source": [ "## Data Node State: Validation removes the entry when the DataSource already contains a previous version " @@ -520,7 +487,6 @@ "outputs": [] }, { - "id": "3PbyoVI5ukuBQzBU3K4AGw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);", @@ -550,7 +516,6 @@ "outputs": [] }, { - "id": "VWtJVxUJek2A-Zhla7XVwQ", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -560,7 +525,6 @@ "outputs": [] }, { - "id": "A_IYqoP4xEaSzN2_Vg5Utw", "cell_type": "markdown", "source": [ "## Data Node Parameters : Validations" @@ -570,7 +534,6 @@ "outputs": [] }, { - "id": "jnMxJBaIy0iLBPXrb0-spQ", "cell_type": "code", "source": [ "public async Task CheckErrors(string inputFileName, List errorBms)", @@ -585,7 +548,6 @@ "outputs": [] }, { - "id": "GFhYIK8kQU2Qo1jjODs8_w", "cell_type": "code", "source": [ "var inputFileName = \"Data/DataNodeParameter_InvalidDataNode.csv\";", @@ -599,7 +561,6 @@ "outputs": [] }, { - "id": "uY5fv5iAuUuPnKjSik1_qQ", "cell_type": "code", "source": [ "var inputFileName = \"Data/DataNodeParameter_Duplicate.csv\";", @@ -612,7 +573,6 @@ "outputs": [] }, { - "id": "S_PoUgCd3kWhDZ0K3Dp5ng", "cell_type": "code", "source": [ "var inputFileName = \"Data/DataNodeParameter_InvalidReinsCov.csv\";", @@ -624,7 +584,6 @@ "outputs": [] }, { - "id": "CPwWIPYorkGHUKRtmHIkdw", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/ReportStorageTest.ipynb b/full-ifrs17-template/Test/ReportStorageTest.ipynb index 45305ec0..851ea575 100644 --- a/full-ifrs17-template/Test/ReportStorageTest.ipynb +++ b/full-ifrs17-template/Test/ReportStorageTest.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "D-7JQE_SnUOihXCor_sygQ", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "rSHUxHrWf0eGpJlmtEieVw", "cell_type": "markdown", "source": [ "# Test Exchange Rate Query" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "bfJP3e-LP0uEsVPX1d-owg", "cell_type": "code", "source": [ "Workspace.Initialize(x => x.FromSource(DataSource)", @@ -49,7 +46,6 @@ "outputs": [] }, { - "id": "O-C-vhVxNkupDBDl38H7hw", "cell_type": "code", "source": [ "public async Task CheckGetFx(string currentCurrency, string targetCurrency, int year, int month, IEnumerable testData, double fxBOPBenchmark, double fxAVGBenchmark, double fxEOPBenchmark)", @@ -79,7 +75,6 @@ "outputs": [] }, { - "id": "mbralKJV4Uu31Rk1uV7qzA", "cell_type": "code", "source": [ "var testData = new ExchangeRate[] {new ExchangeRate{ Currency = \"EUR\", Year = 2020, Month = 12, FxType = FxType.Spot, FxToGroupCurrency = 10 }, ", @@ -96,7 +91,6 @@ "outputs": [] }, { - "id": "3unkYVADQEGtn7_7XVHPEg", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -106,7 +100,6 @@ "outputs": [] }, { - "id": "rQ4xwp8ggUKcrL-V3XIOcA", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/ReportVariablesTest.ipynb b/full-ifrs17-template/Test/ReportVariablesTest.ipynb index 4e8088c9..30a7ab8b 100644 --- a/full-ifrs17-template/Test/ReportVariablesTest.ipynb +++ b/full-ifrs17-template/Test/ReportVariablesTest.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "n3ED-3EkxkuED3NiSerohA", "cell_type": "markdown", "source": [ "

Test Reports

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "jEW2JcFV1UqH9OxxrCWEEg", "cell_type": "markdown", "source": [ "# Infrastructure and Configuration" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "jrvWTVmt0U2tdCG7sYizeg", "cell_type": "markdown", "source": [ "## Imports and Configurations" @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "2HW97YdZKUOnq-DRyvt3Uw", "cell_type": "code", "source": [ "#r \"nuget:FluentAssertions\" " @@ -58,7 +54,6 @@ "outputs": [] }, { - "id": "w7sYIzs9ykulzszdiIyXGg", "cell_type": "code", "source": [ "#!import \"ReportVariablesTestBase\"" @@ -68,7 +63,6 @@ "outputs": [] }, { - "id": "jk5ZRZUAoUCXUNcy1_1eXA", "cell_type": "markdown", "source": [ "## Storage" @@ -78,7 +72,6 @@ "outputs": [] }, { - "id": "C7GJzm1J-EuPR9aGuWZwQg", "cell_type": "code", "source": [ "var reportStorage = new ReportStorage(Workspace, Report);", @@ -89,7 +82,6 @@ "outputs": [] }, { - "id": "LzDL_aRFO0etCQGzAUu0vg", "cell_type": "markdown", "source": [ "## Configurations" @@ -99,7 +91,6 @@ "outputs": [] }, { - "id": "Y42oT-3UIU-VktHZCgIgMA", "cell_type": "code", "source": [ "var path = \"./Data/ReportVariableBenchmarks/\";" @@ -109,7 +100,6 @@ "outputs": [] }, { - "id": "a8qO17ZhGk2lD513BUl1kg", "cell_type": "code", "source": [ "((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args;", @@ -121,7 +111,6 @@ "outputs": [] }, { - "id": "yNI1-7C-DkCwPylFdztLLg", "cell_type": "markdown", "source": [ "# Test Cases" @@ -131,7 +120,6 @@ "outputs": [] }, { - "id": "DG6J_osu7EG_geAlI15nDQ", "cell_type": "markdown", "source": [ "## ((2020, 12), \"CH\", null, CurrencyType.Contractual)" @@ -141,7 +129,6 @@ "outputs": [] }, { - "id": "_9qOvBWy9kWXqjvg2Ojx-Q", "cell_type": "code", "source": [ "args = ((2020, 12), \"CH\", null, CurrencyType.Contractual);" @@ -151,7 +138,6 @@ "outputs": [] }, { - "id": "oZphaPxRS0Cr60WeHFtueA", "cell_type": "code", "source": [ "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", @@ -162,7 +148,6 @@ "outputs": [] }, { - "id": "ezagEsinVkq0-jfyCtYp9A", "cell_type": "code", "source": [ "scopesData.Should().BeEquivalentTo(benchmarkData,", @@ -181,7 +166,6 @@ "outputs": [] }, { - "id": "Rll-mqrAM0-4SIC9DLFDwA", "cell_type": "markdown", "source": [ "## ((2021, 3), \"CH\", null, CurrencyType.Contractual)" @@ -191,7 +175,6 @@ "outputs": [] }, { - "id": "O9tsdJU1VUWk5_AsCG7iQA", "cell_type": "code", "source": [ "args = ((2021, 3), \"CH\", null, CurrencyType.Contractual);" @@ -201,7 +184,6 @@ "outputs": [] }, { - "id": "NrAH0jftEkKUA-mvSJBY8w", "cell_type": "code", "source": [ "scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", @@ -212,7 +194,6 @@ "outputs": [] }, { - "id": "vBqjLjwokUKpiME0hFnzxQ", "cell_type": "code", "source": [ "scopesData.Should().BeEquivalentTo(benchmarkData,", @@ -231,7 +212,6 @@ "outputs": [] }, { - "id": "Q2klv4_48EmNfNAi7QNdZQ", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb index 5593b6f7..d4bf9f98 100644 --- a/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb +++ b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "OfXdxxCELEGQtjyg7Em6yQ", "cell_type": "markdown", "source": [ "

Report Variable Test Base

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "MXuHvMBcyU6DSwnzBvDrOw", "cell_type": "code", "source": [ "#!import \"../Initialization/InitSystemorphToMemory\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "r3DErbUXa0GbhAkpyzPxCw", "cell_type": "code", "source": [ "Workspace.InitializeFrom(DataSource);" @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "KK8NJ8Kn1kqC5rY_2kCkRg", "cell_type": "markdown", "source": [ "# Helpers" @@ -58,7 +54,6 @@ "outputs": [] }, { - "id": "_jzXNzU3P02T6qxgFz5DGg", "cell_type": "code", "source": [ "const string benchmarkFileNamePrefix = \"ReportVariableBenchmarks_\";" @@ -68,7 +63,6 @@ "outputs": [] }, { - "id": "CH-fLI1W7kqtm9mGUtCEfw", "cell_type": "code", "source": [ "static string GetBenchmarkFileName(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args) => args.ToString().Replace(\"(\", \"\").Replace(\")\", \"\").Replace(\" \", \"\").Replace(\",\", \"_\");" @@ -78,7 +72,6 @@ "outputs": [] }, { - "id": "sW00wUjChEa73rX2vWQAoA", "cell_type": "markdown", "source": [ "# Calculated" @@ -88,7 +81,6 @@ "outputs": [] }, { - "id": "oV0C7FIcU0e_8DCrad0TkA", "cell_type": "code", "source": [ "static ICollection GetScopesData(Systemorph.Vertex.Scopes.IScopeWithStorage universe, ICollection<(ReportIdentity, CurrencyType)> identities) {", @@ -133,7 +125,6 @@ "outputs": [] }, { - "id": "8lMXT1ZNw0KM3pDqhdlmsQ", "cell_type": "code", "source": [ "static async Task> GetScopesDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, ReportStorage reportStorage, Systemorph.Vertex.Scopes.Proxy.IScopeFactory scopes ) {", @@ -148,7 +139,6 @@ "outputs": [] }, { - "id": "8vcku7aLC0WSTTyYO5gapQ", "cell_type": "markdown", "source": [ "# Benchmarks" @@ -158,7 +148,6 @@ "outputs": [] }, { - "id": "eUmau60eO0CVOS0nctUgDQ", "cell_type": "code", "source": [ "static async Task> GetBenchmarkDataAsync(((int Year, int Month) Period, string ReportingNode, string Scenario, CurrencyType CurrencyType) args, string path, IWorkspace workspace, IImportVariable importVariable) {", diff --git a/full-ifrs17-template/Test/ScenarioTest.ipynb b/full-ifrs17-template/Test/ScenarioTest.ipynb index 88646c21..befedf0d 100644 --- a/full-ifrs17-template/Test/ScenarioTest.ipynb +++ b/full-ifrs17-template/Test/ScenarioTest.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "AxJoK7p0ZEikTWZszSK7UQ", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" @@ -26,7 +25,6 @@ "outputs": [] }, { - "id": "bgViMPoQM02MCvRfuRHl7w", "cell_type": "markdown", "source": [ "# Context" @@ -36,7 +34,6 @@ "outputs": [] }, { - "id": "7Xfmz9pFvE6I6S2B4NHMGw", "cell_type": "code", "source": [ "var log = await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync();", @@ -49,7 +46,6 @@ "outputs": [] }, { - "id": "0VAf4yddEUOUDuScbDjM_w", "cell_type": "code", "source": [ "var log = await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync();", @@ -62,7 +58,6 @@ "outputs": [] }, { - "id": "M9d9pYiEbk6gAY96p8hI2A", "cell_type": "code", "source": [ "var defaultVarsBE = Workspace.Query().ToArray();" @@ -72,7 +67,6 @@ "outputs": [] }, { - "id": "_-nNIt_H2k2zv5Ibul0djQ", "cell_type": "markdown", "source": [ "# Scenario Cashflows" @@ -82,7 +76,6 @@ "outputs": [] }, { - "id": "3eInMKlI1kmMxVzPEbL7fw", "cell_type": "code", "source": [ "var cashflows_scenarioTest = @\"", @@ -101,7 +94,6 @@ "outputs": [] }, { - "id": "S9PeLiV2B0SNvYbYxid_xA", "cell_type": "code", "source": [ "var cashflows_scenarioTest_equalTo_BestEstimate = @\"", @@ -120,7 +112,6 @@ "outputs": [] }, { - "id": "D62FZxiYFEunrBSsfdn96A", "cell_type": "code", "source": [ "var log = await Import.FromString(cashflows_scenarioTest).WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync();", @@ -133,7 +124,6 @@ "outputs": [] }, { - "id": "TZowMnri7EaX3jCDg7pEmw", "cell_type": "code", "source": [ "await Workspace.Partition.SetAsync(new{ReportingNode = \"CH\", Scenario = \"Test\", Year = 2020, Month = 12});", @@ -147,7 +137,6 @@ "outputs": [] }, { - "id": "PMUFzN4SSUCmJ1DPrFqlpQ", "cell_type": "markdown", "source": [ "# Scenario Actuals" @@ -157,7 +146,6 @@ "outputs": [] }, { - "id": "wcUzBjX4rkmEmLoUol7Weg", "cell_type": "code", "source": [ "var actuals_scenarioTest = @\"", @@ -173,7 +161,6 @@ "outputs": [] }, { - "id": "layYHEbmVky9lqX_ZWDryg", "cell_type": "code", "source": [ "var actuals_scenarioTest_equalTo_BestEstimate = @\"", @@ -189,7 +176,6 @@ "outputs": [] }, { - "id": "j-dxFUVPfEaRhZpGuDPd8g", "cell_type": "code", "source": [ "var log = await Import.FromString(actuals_scenarioTest).WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync();", @@ -202,7 +188,6 @@ "outputs": [] }, { - "id": "ZJQHdd7UWUWU5kC0i4eisw", "cell_type": "code", "source": [ "await Workspace.Partition.SetAsync(new{ReportingNode = \"CH\", Scenario = \"Test\", Year = 2020, Month = 12});", @@ -216,7 +201,6 @@ "outputs": [] }, { - "id": "csPTUe173UWekIIcmPUCuw", "cell_type": "markdown", "source": [ "# Robustness: back to Best Estimate" @@ -226,7 +210,6 @@ "outputs": [] }, { - "id": "crKKS7_XGk6NeuFAgakr0g", "cell_type": "code", "source": [ "var log = await Import.FromString(actuals_scenarioTest_equalTo_BestEstimate).WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync();", @@ -239,7 +222,6 @@ "outputs": [] }, { - "id": "P-sUQjsyOUSNfI7RLgEJMQ", "cell_type": "code", "source": [ "var log = await Import.FromString(cashflows_scenarioTest_equalTo_BestEstimate).WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync();", @@ -252,7 +234,6 @@ "outputs": [] }, { - "id": "Q2FeKDKw7kedk-qOC3uK4A", "cell_type": "code", "source": [ "Workspace.Query().Except(defaultVarsBE, IfrsVariableComparer.Instance()).ToArray().Length.Should().Be(0);" @@ -262,7 +243,6 @@ "outputs": [] }, { - "id": "sC_GMD2sbECP6PN620THIg", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/SequenceImportTest.ipynb b/full-ifrs17-template/Test/SequenceImportTest.ipynb index 927dacc9..0bf8a9f9 100644 --- a/full-ifrs17-template/Test/SequenceImportTest.ipynb +++ b/full-ifrs17-template/Test/SequenceImportTest.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "lT6-ULeaLkCjHnJPRMVzZw", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" @@ -26,7 +25,6 @@ "outputs": [] }, { - "id": "r8NoIEbwSUOe4IGLlZFmKw", "cell_type": "markdown", "source": [ "# Cashflow -> Actuals" @@ -36,7 +34,6 @@ "outputs": [] }, { - "id": "0gDULLGzvEW8v5jg0vRrjQ", "cell_type": "code", "source": [ "var ws1 = Workspace.CreateNew();", @@ -47,7 +44,6 @@ "outputs": [] }, { - "id": "Pz3H5OYg0E26NZvdiCWCeg", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(ws1).ExecuteAsync()" @@ -57,7 +53,6 @@ "outputs": [] }, { - "id": "0kv-mqLlQkquKj4WurtKzQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(ws1).ExecuteAsync()" @@ -67,7 +62,6 @@ "outputs": [] }, { - "id": "2UA1ZnfH3UipDQ1TnW8J9A", "cell_type": "code", "source": [ "ws1.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", @@ -78,7 +72,6 @@ "outputs": [] }, { - "id": "6Zv5wDEHp0ejngPzm70Uug", "cell_type": "code", "source": [ "var ifrsVars1 = await ws1.Query().ToArrayAsync();", @@ -89,7 +82,6 @@ "outputs": [] }, { - "id": "6Ptjc2FbG0-LBe6nw1BIdA", "cell_type": "markdown", "source": [ "# Actuals -> Cashflow" @@ -99,7 +91,6 @@ "outputs": [] }, { - "id": "82iAzppfNkqb5SpUKsi8pA", "cell_type": "code", "source": [ "var ws2 = Workspace.CreateNew();", @@ -110,7 +101,6 @@ "outputs": [] }, { - "id": "UgadDCbuM0qHwMnrQkN-TQ", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(ws2).ExecuteAsync()" @@ -120,7 +110,6 @@ "outputs": [] }, { - "id": "4S9H9rEKb0yCeAF4IyKWMw", "cell_type": "code", "source": [ "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(ws2).ExecuteAsync()" @@ -130,7 +119,6 @@ "outputs": [] }, { - "id": "JqkyqzHW9Eazf8YuELjfOg", "cell_type": "code", "source": [ "ws2.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());", @@ -141,7 +129,6 @@ "outputs": [] }, { - "id": "EpWHnU8f10qpBtUfsHT6MA", "cell_type": "code", "source": [ "var ifrsVars2 = await ws2.Query().ToArrayAsync();", @@ -152,7 +139,6 @@ "outputs": [] }, { - "id": "HNS3Oub88kqttNJZXJ3xjw", "cell_type": "markdown", "source": [ "# Test" @@ -162,7 +148,6 @@ "outputs": [] }, { - "id": "XHa4H0YDOEuNvjfy0CL-8A", "cell_type": "code", "source": [ "ifrsVars1.Except(ifrsVars2, IfrsVariableComparer.Instance()).Count().Should().Be(0);" @@ -172,7 +157,6 @@ "outputs": [] }, { - "id": "q7E4H2BDAke4TLC0oSQtuA", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/TechnicalMarginTest.ipynb b/full-ifrs17-template/Test/TechnicalMarginTest.ipynb index 8256ed07..1407c020 100644 --- a/full-ifrs17-template/Test/TechnicalMarginTest.ipynb +++ b/full-ifrs17-template/Test/TechnicalMarginTest.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "i-PJ_EbKKUuy-mN1LlBMNQ", "cell_type": "markdown", "source": [ "

Technical Margin Allocation

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "0nWYqIzjFEiBzB7hPQOrWw", "cell_type": "code", "source": [ "#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "6Wpl9e-2Ike62_H1mswKBQ", "cell_type": "markdown", "source": [ "# Workspace Initialization " @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "hXJrXlCyBUWqzF9TYY4pQg", "cell_type": "code", "source": [ "Workspace.Initialize(x => x.FromSource(DataSource)", @@ -60,7 +56,6 @@ "outputs": [] }, { - "id": "dsGn5owwTkSqoOzILS2fuA", "cell_type": "markdown", "source": [ "# Test switch logic" @@ -70,7 +65,6 @@ "outputs": [] }, { - "id": "FAJtV21jM0SnurHMD958jw", "cell_type": "code", "source": [ "//define group of contract", @@ -81,7 +75,6 @@ "outputs": [] }, { - "id": "_r9tBgRmo0yWpWOrVOogww", "cell_type": "code", "source": [ "//Define partition", @@ -95,7 +88,6 @@ "outputs": [] }, { - "id": "jT2AUILrHUyhaSmU-w039g", "cell_type": "code", "source": [ "public async Task CheckSwitchLogicAsync(IEnumerable inputDataSet, Dictionary csmLcSwitchBenchmark)", @@ -169,7 +161,6 @@ "outputs": [] }, { - "id": "f5gdp2GlKUehTXeQ_SvCIw", "cell_type": "code", "source": [ "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", @@ -200,7 +191,6 @@ "outputs": [] }, { - "id": "WPvTHMwp5EqJmWNsjt81fA", "cell_type": "code", "source": [ "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", @@ -231,7 +221,6 @@ "outputs": [] }, { - "id": "fRgoEiIujky1sZ9hnyj78A", "cell_type": "code", "source": [ "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", @@ -258,7 +247,6 @@ "outputs": [] }, { - "id": "xdTbysPGFkeRLHr0sUBUlA", "cell_type": "code", "source": [ "var basicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfContract, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", @@ -298,7 +286,6 @@ "outputs": [] }, { - "id": "dTZEjO9WM0uCJgoboB4qhw", "cell_type": "code", "source": [ "" diff --git a/full-ifrs17-template/Test/Tests.ipynb b/full-ifrs17-template/Test/Tests.ipynb index 1c330cb5..9a73127f 100644 --- a/full-ifrs17-template/Test/Tests.ipynb +++ b/full-ifrs17-template/Test/Tests.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "MQ7XPYnTFEOMHrtoB3Oerg", "cell_type": "markdown", "source": [ "

Tests

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "8IHp-7c15Uq0vxaFsrXmzQ", "cell_type": "code", "source": [ "#!eval-notebook \"IfrsVariablesTest\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "-uvPzzVPT0-Y54bxFtKl0g", "cell_type": "code", "source": [ "#!eval-notebook \"ImportStorageTest\"" @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "HvLhnrHPakG-RHLDv1YlTw", "cell_type": "code", "source": [ "#!eval-notebook \"ReportStorageTest\"" @@ -58,7 +54,6 @@ "outputs": [] }, { - "id": "GHLqatm6zEix6r7rBO-VVg", "cell_type": "code", "source": [ "#!eval-notebook \"AocStructureTest\"" @@ -68,7 +63,6 @@ "outputs": [] }, { - "id": "H39eZoIm9Uu2XuyAa0Sg_Q", "cell_type": "code", "source": [ "#!eval-notebook \"TechnicalMarginTest\"" @@ -78,7 +72,6 @@ "outputs": [] }, { - "id": "sLb7AsZlOUyGeRzwfKoM-Q", "cell_type": "code", "source": [ "#!eval-notebook \"SequenceImportTest\"" @@ -88,7 +81,6 @@ "outputs": [] }, { - "id": "B_dzy6sUvUKc2e3m81pOJg", "cell_type": "code", "source": [ "#!eval-notebook \"ScenarioTest\"" @@ -98,7 +90,6 @@ "outputs": [] }, { - "id": "hWVGU3WYHkycqipZOO1fFw", "cell_type": "markdown", "source": [ "---" @@ -108,7 +99,6 @@ "outputs": [] }, { - "id": "dZoX6ICHOkGWZZzUHjZ9DQ", "cell_type": "code", "source": [ "#!eval-notebook \"MapTemplateAndImportTest\"" @@ -118,7 +108,6 @@ "outputs": [] }, { - "id": "1YHxPQejxkGzdzCOLao7HQ", "cell_type": "markdown", "source": [ "---" @@ -128,7 +117,6 @@ "outputs": [] }, { - "id": "kXdtF5erPkm1bfIJoQ7S6g", "cell_type": "code", "source": [ "#!eval-notebook \"ReportVariablesTest\"" @@ -138,7 +126,6 @@ "outputs": [] }, { - "id": "W9Bknri1XkC2erPpRjyrjQ", "cell_type": "code", "source": [ "" diff --git a/ifrs17/CalculationEngine.ipynb b/ifrs17/CalculationEngine.ipynb index a130e870..1fa93770 100644 --- a/ifrs17/CalculationEngine.ipynb +++ b/ifrs17/CalculationEngine.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "lx6moIFczkyb5a8hEBu_6Q", "cell_type": "code", "source": [ "#!import \"DataModel/DataStructure\"", @@ -30,7 +29,6 @@ "outputs": [] }, { - "id": "Tc-fiN15c0q-DNnqPEEVQg", "cell_type": "code", "source": [ "var ifrs17Report = new Ifrs17Reports(Workspace, Scopes, Report);" diff --git a/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb index 0e0a411d..41649364 100644 --- a/ifrs17/Constants/Consts.ipynb +++ b/ifrs17/Constants/Consts.ipynb @@ -19,7 +19,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "tozdHqMbAkO8Ttd_Z-FPQw", "cell_type": "markdown", "source": [ "

Consts

" @@ -29,7 +28,6 @@ "outputs": [] }, { - "id": "lqga2fWJikO2K6CkYd0uNQ", "cell_type": "markdown", "source": [ "# Numerical Precision" @@ -39,7 +37,6 @@ "outputs": [] }, { - "id": "92t7bfloDk-X5dbxj8-BzA", "cell_type": "code", "source": [ "public const double Precision = 1E-5;" @@ -49,7 +46,6 @@ "outputs": [] }, { - "id": "tU4Y0UN8FkWG4j6fdhnEdg", "cell_type": "code", "source": [ "public const double ProjectionPrecision = 1E-3;" @@ -59,7 +55,6 @@ "outputs": [] }, { - "id": "AQz0euBRNkyhgAPTzk8kJA", "cell_type": "code", "source": [ "public const double BenchmarkPrecision = 1E-4;" @@ -69,7 +64,6 @@ "outputs": [] }, { - "id": "ZEsXT31ETE--9F4_5F7OoQ", "cell_type": "markdown", "source": [ "# Time Period" @@ -79,7 +73,6 @@ "outputs": [] }, { - "id": "-PEstjbAfE2GTGXiNFlkzA", "cell_type": "code", "source": [ "public const int CurrentPeriod = 0; " @@ -89,7 +82,6 @@ "outputs": [] }, { - "id": "Lt52PYx8LUSbxE-o4dGlUQ", "cell_type": "code", "source": [ "public const int PreviousPeriod = -1; " @@ -99,7 +91,6 @@ "outputs": [] }, { - "id": "KBZJtyq_206bd_HK1F6yNw", "cell_type": "code", "source": [ "public const int MonthInAYear = 12;" @@ -109,7 +100,6 @@ "outputs": [] }, { - "id": "7o1TktT0akubYO5_0tMJ5w", "cell_type": "markdown", "source": [ "# Defaults" @@ -119,7 +109,6 @@ "outputs": [] }, { - "id": "Tibnci4N-0-dkhVAS2c69g", "cell_type": "code", "source": [ "public const int DefaultDataNodeActivationMonth = 1;" @@ -129,7 +118,6 @@ "outputs": [] }, { - "id": "nMozFF7qoUKtssTOwgYi2A", "cell_type": "code", "source": [ "public const double DefaultPremiumExperienceAdjustmentFactor = 1.0;" @@ -139,7 +127,6 @@ "outputs": [] }, { - "id": "CzLFY5d-nEmoKLUyhvG9aA", "cell_type": "markdown", "source": [ "# Names" @@ -149,7 +136,6 @@ "outputs": [] }, { - "id": "9nQYRJNFO0OR5QKOtr40ZQ", "cell_type": "code", "source": [ "public const string Main = nameof(Main);" @@ -159,7 +145,6 @@ "outputs": [] }, { - "id": "4vArq04Dc0SUQ1B8pnTYIg", "cell_type": "code", "source": [ "public const string Default = nameof(Default);" @@ -169,7 +154,6 @@ "outputs": [] }, { - "id": "bTl8GyvuRkGBooAK9zlXLg", "cell_type": "code", "source": [ "public const string ValueType = nameof(ValueType);" @@ -179,7 +163,6 @@ "outputs": [] }, { - "id": "ziRQ7cjXbESP3l2CdNBYGQ", "cell_type": "markdown", "source": [ "GroupCurrency defines the SystemName (from Currency Dimension) to be used as the Group Currency." @@ -189,7 +172,6 @@ "outputs": [] }, { - "id": "A9ITNucOV02h-mBUmn3lsQ", "cell_type": "code", "source": [ "public const string GroupCurrency = \"CHF\";" @@ -199,7 +181,6 @@ "outputs": [] }, { - "id": "QlC_r7WQ7kOmdj8kKb5aNw", "cell_type": "markdown", "source": [ "# Import Formats" @@ -209,7 +190,6 @@ "outputs": [] }, { - "id": "C8v98kZ_aEWi1JyDSiGkzA", "cell_type": "code", "source": [ "public static class ImportFormats{", @@ -230,7 +210,6 @@ "outputs": [] }, { - "id": "XWnM8TzYv0ytgc74W9RuiA", "cell_type": "markdown", "source": [ "# IFRS specific" @@ -240,7 +219,6 @@ "outputs": [] }, { - "id": "phrHTtbxI0OYX3MaAVo2Tg", "cell_type": "code", "source": [ "public static class ValuationApproaches{", @@ -254,7 +232,6 @@ "outputs": [] }, { - "id": "Db-Dvk_gpU2pI_BFacjbCg", "cell_type": "code", "source": [ "public static class LiabilityTypes{", @@ -267,7 +244,6 @@ "outputs": [] }, { - "id": "fQo3LSnzhUGkWwVbf21L1A", "cell_type": "code", "source": [ "public static class EstimateTypes{", @@ -294,7 +270,6 @@ "outputs": [] }, { - "id": "B7toQMiP_0qZXm43pyxShw", "cell_type": "code", "source": [ "public static class AocTypes{", @@ -322,7 +297,6 @@ "outputs": [] }, { - "id": "HulL6n-6IkWevFLCSC9hDQ", "cell_type": "code", "source": [ "public static class Novelties{", @@ -336,7 +310,6 @@ "outputs": [] }, { - "id": "yejc0ve4BEe-oAi5YgJJDw", "cell_type": "code", "source": [ "public static class EconomicBases{", @@ -350,7 +323,6 @@ "outputs": [] }, { - "id": "qeXt2V5wQ0S2TiixZhHlHg", "cell_type": "code", "source": [ "public static class AmountTypes{", @@ -373,7 +345,6 @@ "outputs": [] }, { - "id": "nuYnoG2NB0WPGTggymtcLg", "cell_type": "code", "source": [ "public static class Scenarios{", @@ -400,7 +371,6 @@ "outputs": [] }, { - "id": "aX8Ixs4Q3EOw3EmvsvyFng", "cell_type": "markdown", "source": [ "# Insurance specific" @@ -410,7 +380,6 @@ "outputs": [] }, { - "id": "xO1Ga-uPsES_cjwlbNf1yw", "cell_type": "code", "source": [ "public static class LineOfBusinesses{", diff --git a/ifrs17/Constants/Enums.ipynb b/ifrs17/Constants/Enums.ipynb index 5b4ccc1a..fdfae548 100644 --- a/ifrs17/Constants/Enums.ipynb +++ b/ifrs17/Constants/Enums.ipynb @@ -19,7 +19,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "xWFL-UDyVkKeoXQRsDI7YQ", "cell_type": "markdown", "source": [ "# Enumerables", @@ -31,7 +30,6 @@ "outputs": [] }, { - "id": "lYFecRN4gkuJ-bMXNO9DnQ", "cell_type": "markdown", "source": [ "## Exchange Rates", @@ -43,7 +41,6 @@ "outputs": [] }, { - "id": "h_kYaWMEjkGKhJBHv5ZTOA", "cell_type": "code", "source": [ "public enum FxType { Spot, Average }" @@ -53,7 +50,6 @@ "outputs": [] }, { - "id": "79eI1G0CiE2WMkFq2s3ung", "cell_type": "code", "source": [ "public enum FxPeriod { NotApplicable, BeginningOfPeriod, Average, EndOfPeriod }" @@ -63,7 +59,6 @@ "outputs": [] }, { - "id": "bMmXBU5L1EiXVURfzYrfhg", "cell_type": "markdown", "source": [ "## Currency Types" @@ -73,7 +68,6 @@ "outputs": [] }, { - "id": "ThheUoz160CrIXKT0-N2NQ", "cell_type": "markdown", "source": [ "Currency Types define which currency is used as standard at different aggregation levels (in the Data Level hierarchy).", @@ -87,7 +81,6 @@ "outputs": [] }, { - "id": "jFSshWJs3km8UAmJUvoUWA", "cell_type": "code", "source": [ "public enum CurrencyType { Functional, Group, Contractual, Transactional }" @@ -97,7 +90,6 @@ "outputs": [] }, { - "id": "HcVv9bIVN0CTv_BR3h38KA", "cell_type": "markdown", "source": [ "## Period Type" @@ -107,7 +99,6 @@ "outputs": [] }, { - "id": "QQ_1DwAHIUWlTKSktjtX5w", "cell_type": "code", "source": [ "public enum PeriodType { NotApplicable, BeginningOfPeriod, EndOfPeriod }" @@ -117,7 +108,6 @@ "outputs": [] }, { - "id": "IWLntYaWLUCby854KcCzPQ", "cell_type": "markdown", "source": [ "## Valuation Period" @@ -127,7 +117,6 @@ "outputs": [] }, { - "id": "fxCUAx87AEKTJXenM6OrSw", "cell_type": "code", "source": [ "public enum ValuationPeriod { NotApplicable, BeginningOfPeriod, MidOfPeriod, Delta, EndOfPeriod }" @@ -137,7 +126,6 @@ "outputs": [] }, { - "id": "Iua4aiPYeUSkSdOZBIHwNQ", "cell_type": "markdown", "source": [ "## Portfolio View" @@ -147,7 +135,6 @@ "outputs": [] }, { - "id": "N7qSoOiDaEG0mbO_prv_9w", "cell_type": "code", "source": [ "[Flags] public enum PortfolioView { Gross = 1, Reinsurance = 2, Net = Gross | Reinsurance }" @@ -157,7 +144,6 @@ "outputs": [] }, { - "id": "ofzaBHXeLUGsPwp53tWk4A", "cell_type": "markdown", "source": [ "## Structure Type" @@ -167,7 +153,6 @@ "outputs": [] }, { - "id": "NJmE1eEV_Uuey166OH3U_g", "cell_type": "code", "source": [ "public enum StructureType { None, AoC }" @@ -177,7 +162,6 @@ "outputs": [] }, { - "id": "t6CUcWp67ESaBdUmxsyJ8A", "cell_type": "markdown", "source": [ "## State" @@ -187,7 +171,6 @@ "outputs": [] }, { - "id": "YSkBfw3IHEuyoW2lvsOC7g", "cell_type": "markdown", "source": [ "State describes the state in which a Data Node can be - There are two types of states:", @@ -199,7 +182,6 @@ "outputs": [] }, { - "id": "sqXQ1mcVxEit4CgNnQPAXA", "cell_type": "code", "source": [ "public enum State { Active, Inactive }" @@ -209,7 +191,6 @@ "outputs": [] }, { - "id": "oThs73B7kkyDAHtyVfg5QA", "cell_type": "markdown", "source": [ "## Periodicity" @@ -219,7 +200,6 @@ "outputs": [] }, { - "id": "TAHQhWhLr0mR59KmOekVrQ", "cell_type": "code", "source": [ "public enum Periodicity { Monthly, Quarterly, Yearly }" @@ -229,7 +209,6 @@ "outputs": [] }, { - "id": "kBck_5hoX0yAEEWJHOKRsg", "cell_type": "markdown", "source": [ "## Input Source" @@ -239,7 +218,6 @@ "outputs": [] }, { - "id": "rfBIAwenWUa1zipcMY1qnQ", "cell_type": "code", "source": [ "[Flags]", @@ -254,7 +232,6 @@ "outputs": [] }, { - "id": "7dL-4X1fUEiQSzYaooPprg", "cell_type": "markdown", "source": [ "## Data Type" @@ -264,7 +241,6 @@ "outputs": [] }, { - "id": "WPim6MSI-UWnSqnOfEbFxw", "cell_type": "code", "source": [ "public enum DataType { Optional, Mandatory, Calculated, CalculatedTelescopic }" @@ -274,7 +250,6 @@ "outputs": [] }, { - "id": "nPBJqeOjdEibtyin5hzeUQ", "cell_type": "markdown", "source": [ "## Import Scope" @@ -284,7 +259,6 @@ "outputs": [] }, { - "id": "pU2UM-nbJ0-aG0rhi86JLw", "cell_type": "code", "source": [ "public enum ImportScope { Primary, Secondary }" diff --git a/ifrs17/Constants/Validations.ipynb b/ifrs17/Constants/Validations.ipynb index 9c7fc17c..20b641d6 100644 --- a/ifrs17/Constants/Validations.ipynb +++ b/ifrs17/Constants/Validations.ipynb @@ -19,7 +19,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "XVEH7X-d10OpDfN_HGsgWw", "cell_type": "markdown", "source": [ "

Errors and Warnings

" @@ -29,7 +28,6 @@ "outputs": [] }, { - "id": "X6KZCCXZXUiL9T5SxOhs6Q", "cell_type": "code", "source": [ "#!import \"Enums\"", @@ -40,7 +38,6 @@ "outputs": [] }, { - "id": "XeX545EVhUujhEkMkdUSbQ", "cell_type": "markdown", "source": [ "# Codes" @@ -50,7 +47,6 @@ "outputs": [] }, { - "id": "BPYWZkdC6UaNstT83ZmPqQ", "cell_type": "code", "source": [ "public enum Warning {", @@ -65,7 +61,6 @@ "outputs": [] }, { - "id": "-g7L46bNBUi0ZX88o37kBw", "cell_type": "code", "source": [ "public enum Error { ", @@ -100,7 +95,6 @@ "outputs": [] }, { - "id": "NLh7KHTP4ESl-nGxh_T64Q", "cell_type": "markdown", "source": [ "# Messages" @@ -110,7 +104,6 @@ "outputs": [] }, { - "id": "N0nqsxkmUka6GK5XzE71xg", "cell_type": "code", "source": [ "public static string Get (Error e, params string[] s) => (e, s.Length) switch ", @@ -184,7 +177,6 @@ "outputs": [] }, { - "id": "qxv841q1gkOJt-zqkEwcZQ", "cell_type": "code", "source": [ "public static string Get (Warning w, params string[] s) => (w, s.Length) switch {", @@ -200,7 +192,6 @@ "outputs": [] }, { - "id": "DobUDUwhxUWanDJDmzxJ8Q", "cell_type": "code", "source": [ "" diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index c179a578..f18052af 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -19,7 +19,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "vvMYbQ5-bEKq_A2vJ_DmRA", "cell_type": "markdown", "source": [ "", @@ -32,7 +31,6 @@ "outputs": [] }, { - "id": "6fcBzsfTH0e5CiWZtlKLtw", "cell_type": "markdown", "source": [ "# References", @@ -43,7 +41,6 @@ "outputs": [] }, { - "id": "n4jj6X3ycEap0QydisZJvw", "cell_type": "markdown", "source": [ "## Libraries" @@ -53,7 +50,6 @@ "outputs": [] }, { - "id": "zUmmhub5NES3DO-kz0dAnQ", "cell_type": "code", "source": [ "#r \"nuget:Systemorph.Activities,1.5.7\"", @@ -76,7 +72,6 @@ "outputs": [] }, { - "id": "D9W0OLZ5G0qyvEYQxfSLew", "cell_type": "markdown", "source": [ "## Usings" @@ -86,7 +81,6 @@ "outputs": [] }, { - "id": "nlOhRlJHvk-F0uDp6VMMlw", "cell_type": "code", "source": [ "using System.ComponentModel.DataAnnotations;", @@ -102,7 +96,6 @@ "outputs": [] }, { - "id": "50Tr9UVLkE-2gM0G6oVEnQ", "cell_type": "markdown", "source": [ "## Notebooks" @@ -112,7 +105,6 @@ "outputs": [] }, { - "id": "NKLM1yXTtU2Ti8W3ihDigw", "cell_type": "code", "source": [ "#!import \"../Constants/Enums\"", @@ -124,7 +116,6 @@ "outputs": [] }, { - "id": "WrFH5QlWuk2M_JmM06sq8A", "cell_type": "markdown", "source": [ "# Data Infrastructure" @@ -134,7 +125,6 @@ "outputs": [] }, { - "id": "ohM1Biwwe0eZ1b-HaHop9Q", "cell_type": "markdown", "source": [ "", @@ -148,7 +138,6 @@ "outputs": [] }, { - "id": "-MQGfu51EkyCmQryoyg9mg", "cell_type": "code", "source": [ "public interface IKeyed", @@ -161,7 +150,6 @@ "outputs": [] }, { - "id": "12_68uyAs0GIWjs7tV5EQA", "cell_type": "markdown", "source": [ "The interface IPartition identifies the partitions in the system." @@ -171,7 +159,6 @@ "outputs": [] }, { - "id": "AlL0TcQlpkq8jqpV2BKhkw", "cell_type": "code", "source": [ "public interface IPartition : IKeyed {}" @@ -181,7 +168,6 @@ "outputs": [] }, { - "id": "0YssLND4Ake3pVnlzyDWDw", "cell_type": "markdown", "source": [ "The interface IPartitioned simply assigns a unique identifier for elements of a data partition - The exact definition of such elements can be found in the [partition](#partition) section below." @@ -191,7 +177,6 @@ "outputs": [] }, { - "id": "C_K3oA4OAU-LQiaHkTW4Tw", "cell_type": "code", "source": [ "public interface IPartitioned", @@ -204,7 +189,6 @@ "outputs": [] }, { - "id": "z-6_NJX8rEeP2QxJvJ1iOw", "cell_type": "markdown", "source": [ "The interface IHierarchy is used for modelling dimensions which have an hierarchical structure, such as [Amount Type](#amount-type)." @@ -214,7 +198,6 @@ "outputs": [] }, { - "id": "kl63jpe0oE6L_8z668bdPQ", "cell_type": "code", "source": [ "public interface IHierarchy", @@ -231,7 +214,6 @@ "outputs": [] }, { - "id": "0Ute_DjaYE2kd2UHUcFnDA", "cell_type": "markdown", "source": [ "The interface IWithYearAndMonth allows to speficy to which year and month a certain piece of data applies to:" @@ -241,7 +223,6 @@ "outputs": [] }, { - "id": "WsvB3-kq7UGjOBaBu7IJ-Q", "cell_type": "code", "source": [ "public interface IWithYearAndMonth", @@ -256,7 +237,6 @@ "outputs": [] }, { - "id": "LC_mdbBTsUGl9YAFXVcTpg", "cell_type": "markdown", "source": [ "The interface IWithYearMonthAndScenario allows to identify the year, month and scenario associated to the data:", @@ -267,7 +247,6 @@ "outputs": [] }, { - "id": "Iq8rP4E8k0eGgF2BjhQZGg", "cell_type": "code", "source": [ "public interface IWithYearMonthAndScenario : IWithYearAndMonth", @@ -280,7 +259,6 @@ "outputs": [] }, { - "id": "HtTP2eQc90eX8Ldk4oC4bw", "cell_type": "markdown", "source": [ "", @@ -292,7 +270,6 @@ "outputs": [] }, { - "id": "hev6GlsneUqQtJultvGUFQ", "cell_type": "code", "source": [ "public abstract record KeyedRecord : IKeyed {", @@ -306,7 +283,6 @@ "outputs": [] }, { - "id": "01cW7mL7aU6ojJyBRYnoRw", "cell_type": "code", "source": [ "public abstract record KeyedDimension : INamed {", @@ -326,7 +302,6 @@ "outputs": [] }, { - "id": "G4Du5Lq4ekyLtRBqqmY8KQ", "cell_type": "code", "source": [ "public abstract record KeyedOrderedDimension : KeyedDimension, IOrdered {", @@ -339,7 +314,6 @@ "outputs": [] }, { - "id": "apV-0FaPCUC53iF8dtg4bA", "cell_type": "code", "source": [ "public abstract record KeyedOrderedDimensionWithExternalId : KeyedOrderedDimension {", @@ -353,7 +327,6 @@ "outputs": [] }, { - "id": "c99r-95hxEGNlSWFap4psw", "cell_type": "markdown", "source": [ "", @@ -371,7 +344,6 @@ "outputs": [] }, { - "id": "OLKX7adzcEiBfX4ViPGUAw", "cell_type": "markdown", "source": [ "", @@ -385,7 +357,6 @@ "outputs": [] }, { - "id": "kosUH41ZvEy3T-sTMgijyg", "cell_type": "code", "source": [ "//TODO: Should this be abstract or have a reference to the type?", @@ -396,7 +367,6 @@ "outputs": [] }, { - "id": "Tp-41ZIa1kub9oJSD5ibqQ", "cell_type": "markdown", "source": [ "", @@ -407,7 +377,6 @@ "outputs": [] }, { - "id": "8eBHNXGQzEyLbfkkhfefWQ", "cell_type": "markdown", "source": [ "Amount Type is a dimension used to describe the nature of numbers. For example: Numbers associated to the payment of premiums have Amount Type 'Premiums'; Numbers associated to the payment of claims have Amount Type 'Claims'; Numbers associated to expenses have Amount Type 'Expenses'. ", @@ -421,7 +390,6 @@ "outputs": [] }, { - "id": "QJYJ1Q90-UavXxYFeCGs-A", "cell_type": "code", "source": [ "public record AmountType : KeyedOrderedDimensionWithExternalId, IHierarchicalDimension", @@ -440,7 +408,6 @@ "outputs": [] }, { - "id": "zwL1mP_fyEaPJIo7MRDj0g", "cell_type": "markdown", "source": [ "We distinguish between amount types used for cashflows and actuals (**Present Value Amount Types**), and amount types used for deferrable values (**Deferrable Amount Types**). In particular, deferrable amount types are for costs and expenses that can be deferred to the future. These amounts are treated separately from the Present Value Amount Types because they are not considered for the calculation of Contractual Service Margin and Loss Component." @@ -450,7 +417,6 @@ "outputs": [] }, { - "id": "xXvF54kBF0C6mNNLJGYH9Q", "cell_type": "code", "source": [ "public record DeferrableAmountType : AmountType {}" @@ -460,7 +426,6 @@ "outputs": [] }, { - "id": "40iqJ-O9qEGg2OiuWQvabA", "cell_type": "markdown", "source": [ "", @@ -475,7 +440,6 @@ "outputs": [] }, { - "id": "SORci-jtcEW5a8OFmDj2Fg", "cell_type": "code", "source": [ "public record RiskDriver : KeyedOrderedDimension, IHierarchicalDimension", @@ -490,7 +454,6 @@ "outputs": [] }, { - "id": "nYMm-mQrj0KEBCHoXoH5hQ", "cell_type": "markdown", "source": [ "", @@ -503,7 +466,6 @@ "outputs": [] }, { - "id": "m8jX-ECAtECu0gFbBS1s7g", "cell_type": "code", "source": [ "public record EstimateType : KeyedOrderedDimensionWithExternalId", @@ -523,7 +485,6 @@ "outputs": [] }, { - "id": "kPTZ7_RnoUqohThIWWYy0A", "cell_type": "markdown", "source": [ "", @@ -536,7 +497,6 @@ "outputs": [] }, { - "id": "K0d74Xw5i0iPT4baRGhcPw", "cell_type": "code", "source": [ "public record Novelty : KeyedOrderedDimension {}" @@ -546,7 +506,6 @@ "outputs": [] }, { - "id": "7EP52ewzjk293OCh5CO0iA", "cell_type": "markdown", "source": [ "", @@ -557,7 +516,6 @@ "outputs": [] }, { - "id": "b5paXRuxKUus4Bm6tLyi9w", "cell_type": "code", "source": [ "public record VariableType : KeyedOrderedDimension, IHierarchicalDimension", @@ -571,7 +529,6 @@ "outputs": [] }, { - "id": "wFBlWBk4c0in2LsXyLqbBA", "cell_type": "markdown", "source": [ "", @@ -591,7 +548,6 @@ "outputs": [] }, { - "id": "kDoD4QjYMUGAzXwEvCwf-A", "cell_type": "code", "source": [ "public record AocType : VariableType", @@ -606,7 +562,6 @@ "outputs": [] }, { - "id": "nDI4hKR530udvpIoO6ixsQ", "cell_type": "code", "source": [ "public record AocStep(string AocType, string Novelty){}" @@ -616,7 +571,6 @@ "outputs": [] }, { - "id": "U4FRFJw6u0eSeSy4yO1pWg", "cell_type": "markdown", "source": [ "", @@ -629,7 +583,6 @@ "outputs": [] }, { - "id": "LMKMAXnc3EqZp672ZjbR-g", "cell_type": "code", "source": [ "public record PnlVariableType : VariableType {}" @@ -639,7 +592,6 @@ "outputs": [] }, { - "id": "bVzzi7gJVUOAENq25I1JUQ", "cell_type": "markdown", "source": [ "", @@ -652,7 +604,6 @@ "outputs": [] }, { - "id": "Azjq6-w3xU6XO28qySfeEQ", "cell_type": "code", "source": [ "public record BsVariableType : VariableType {}" @@ -662,7 +613,6 @@ "outputs": [] }, { - "id": "tnri9RIpOEO8xYbVkcSDaw", "cell_type": "markdown", "source": [ "## Accounting Variable Type", @@ -673,7 +623,6 @@ "outputs": [] }, { - "id": "_ITqpse1tkOzZIOiGx5RCg", "cell_type": "code", "source": [ "public record AccountingVariableType : VariableType {}" @@ -683,7 +632,6 @@ "outputs": [] }, { - "id": "4-lSJ9zaOUeDX79K04UlPQ", "cell_type": "markdown", "source": [ "", @@ -695,7 +643,6 @@ "outputs": [] }, { - "id": "_LV67wZghEKrJhiuaRhbmQ", "cell_type": "code", "source": [ "public record Scenario : KeyedDimension {}" @@ -705,7 +652,6 @@ "outputs": [] }, { - "id": "7b7N1_AF0UehwCPAqas-Mw", "cell_type": "markdown", "source": [ " The 'neutral' Scenario (i.e. the default one, with no-stress situations applied) is designated as 'Best Estimate'." @@ -715,7 +661,6 @@ "outputs": [] }, { - "id": "Ta7e8UWrjUO1NU-lBUgTeA", "cell_type": "markdown", "source": [ "", @@ -726,7 +671,6 @@ "outputs": [] }, { - "id": "o0OA9JhZYU2nHM2f_Udg9A", "cell_type": "markdown", "source": [ "Line Of Business is a dimension used to identity insurance business according to usual business classifications (usually a market or company-specific business classification representing a convolution of risk covered, 1st party / 3rd party cover type, product type, etc...)", @@ -737,7 +681,6 @@ "outputs": [] }, { - "id": "QGo_JuZyVkuYVndoizxDOw", "cell_type": "code", "source": [ "public record LineOfBusiness : KeyedOrderedDimension, IHierarchicalDimension", @@ -752,7 +695,6 @@ "outputs": [] }, { - "id": "dbbd2ggxGE6mHjqrwgHL1g", "cell_type": "markdown", "source": [ "", @@ -763,7 +705,6 @@ "outputs": [] }, { - "id": "nqDwmu8MDEO3jL-H-woh2Q", "cell_type": "markdown", "source": [ "Currency is a dimension used to identity the currency.", @@ -774,7 +715,6 @@ "outputs": [] }, { - "id": "XA10ILHLkUWbpQzJBAkXZQ", "cell_type": "code", "source": [ "public record Currency : KeyedDimension {}" @@ -784,7 +724,6 @@ "outputs": [] }, { - "id": "wsLO89dcuE27G1nHtDuN0Q", "cell_type": "markdown", "source": [ "", @@ -797,7 +736,6 @@ "outputs": [] }, { - "id": "_YZihbxs1kq82s_4uJ50rw", "cell_type": "code", "source": [ "public record EconomicBasis : KeyedDimension {}" @@ -807,7 +745,6 @@ "outputs": [] }, { - "id": "1rEXbs0tE0ixs2PKxuzijw", "cell_type": "markdown", "source": [ "", @@ -819,7 +756,6 @@ "outputs": [] }, { - "id": "8xWDJeD0HUSL7cCWWfxB2A", "cell_type": "code", "source": [ "public record ValuationApproach : KeyedDimension {}" @@ -829,7 +765,6 @@ "outputs": [] }, { - "id": "-VuXuyWx-UeVrmyIH4tynw", "cell_type": "markdown", "source": [ "", @@ -841,7 +776,6 @@ "outputs": [] }, { - "id": "pBn2RHZYH0mvlWDyMqWAYQ", "cell_type": "code", "source": [ "public record LiabilityType : KeyedDimension, IHierarchicalDimension", @@ -856,7 +790,6 @@ "outputs": [] }, { - "id": "JqUkEBkxEUyu9LWoQ9edog", "cell_type": "markdown", "source": [ "", @@ -868,7 +801,6 @@ "outputs": [] }, { - "id": "-pft1geAOkqbKgubPnY0PA", "cell_type": "code", "source": [ "public record OciType : KeyedDimension {}" @@ -878,7 +810,6 @@ "outputs": [] }, { - "id": "S5jtO-BT_EWHwNwFWnSteQ", "cell_type": "markdown", "source": [ "", @@ -889,7 +820,6 @@ "outputs": [] }, { - "id": "agAepHAWC0aM8vwzMiATxA", "cell_type": "markdown", "source": [ "Profitability is a dimension used in IFRS 17 to describe the profitability of a Group of Contracts (GIC/GRIC).", @@ -900,7 +830,6 @@ "outputs": [] }, { - "id": "4s8YBnMHfEy5nNG3RvtvQg", "cell_type": "code", "source": [ "public record Profitability : KeyedDimension {}" @@ -910,7 +839,6 @@ "outputs": [] }, { - "id": "sG9C9SlT80Sa9yKzTmomHg", "cell_type": "markdown", "source": [ "", @@ -922,7 +850,6 @@ "outputs": [] }, { - "id": "2PWRjN6ClE2h1_mjVLnjVA", "cell_type": "code", "source": [ "public record Partner : KeyedDimension {}" @@ -932,7 +859,6 @@ "outputs": [] }, { - "id": "xFvb4itG9kGr-znXcMtZmg", "cell_type": "markdown", "source": [ "", @@ -944,7 +870,6 @@ "outputs": [] }, { - "id": "aBpP5Oc4Eke83JkSwrVEyA", "cell_type": "code", "source": [ "public record CreditRiskRating : KeyedDimension {}" @@ -954,7 +879,6 @@ "outputs": [] }, { - "id": "JYBlHEuf2EeBJK2agw9PTg", "cell_type": "markdown", "source": [ "", @@ -966,7 +890,6 @@ "outputs": [] }, { - "id": "sdTROCNthU-SbN8qtndCug", "cell_type": "code", "source": [ "public record ReportingNode : KeyedDimension, IHierarchicalDimension ", @@ -986,7 +909,6 @@ "outputs": [] }, { - "id": "f3cgPrGYWEuewvULtOePgw", "cell_type": "markdown", "source": [ "", @@ -997,7 +919,6 @@ "outputs": [] }, { - "id": "OscX2jPkaUKAsAMmlWbnLA", "cell_type": "markdown", "source": [ "Projections are configured by defining the following 2 parameters:", @@ -1013,7 +934,6 @@ "outputs": [] }, { - "id": "Y6oQoI4XX0CwFsNhatS-RQ", "cell_type": "code", "source": [ "public record ProjectionConfiguration : KeyedDimension", @@ -1029,7 +949,6 @@ "outputs": [] }, { - "id": "WYjnvQgpH06wl1eIrT8woA", "cell_type": "markdown", "source": [ "", @@ -1040,7 +959,6 @@ "outputs": [] }, { - "id": "E5oOYjdJEUCETU2i9e-Qug", "cell_type": "markdown", "source": [ "", @@ -1051,7 +969,6 @@ "outputs": [] }, { - "id": "6GbflKhoxUiG2pAgS_I-0A", "cell_type": "markdown", "source": [ "The record below holds parameters over time for each combination of AocType and Novelty. In particular:", @@ -1070,7 +987,6 @@ "outputs": [] }, { - "id": "x8qrzUb0PEOCGxJSra4XXg", "cell_type": "code", "source": [ "public record AocConfiguration : KeyedRecord, IWithYearAndMonth, IOrdered", @@ -1138,7 +1054,6 @@ "outputs": [] }, { - "id": "QVPcX4AOT0uI2pyntN7nxw", "cell_type": "markdown", "source": [ "", @@ -1152,7 +1067,6 @@ "outputs": [] }, { - "id": "fjWZFfSVXUuuznBgoCdv3g", "cell_type": "code", "source": [ "public record ExchangeRate : KeyedRecord, IWithYearMonthAndScenario", @@ -1198,7 +1112,6 @@ "outputs": [] }, { - "id": "ZKgLspAsdEC-hOZtcXzNPg", "cell_type": "markdown", "source": [ "", @@ -1214,7 +1127,6 @@ "outputs": [] }, { - "id": "tMR0fSlBv0Krf5Y3YbA8SA", "cell_type": "code", "source": [ "public record CreditDefaultRate : KeyedRecord, IWithYearMonthAndScenario", @@ -1256,7 +1168,6 @@ "outputs": [] }, { - "id": "7dQwcrF4RUaBa9E-lwlRJg", "cell_type": "markdown", "source": [ "", @@ -1273,7 +1184,6 @@ "outputs": [] }, { - "id": "5_Tdu0mOuUKPDS1__w7oKw", "cell_type": "code", "source": [ "public record YieldCurve : KeyedRecord, IWithYearMonthAndScenario", @@ -1315,7 +1225,6 @@ "outputs": [] }, { - "id": "nOgE_q28hEOm1sKGlkVYFQ", "cell_type": "markdown", "source": [ "", @@ -1327,7 +1236,6 @@ "outputs": [] }, { - "id": "NsO44SR5NEmuCID96R3hkg", "cell_type": "code", "source": [ "public record PartnerRating : KeyedRecord, IWithYearMonthAndScenario", @@ -1370,7 +1278,6 @@ "outputs": [] }, { - "id": "BEbzTJO6dE2xO4j5NLPSOg", "cell_type": "markdown", "source": [ "", @@ -1382,7 +1289,6 @@ "outputs": [] }, { - "id": "QkFB_IgHtkGLWDYc5tCu2g", "cell_type": "code", "source": [ "public abstract record IfrsPartition : IPartition {", @@ -1407,7 +1313,6 @@ "outputs": [] }, { - "id": "VHEBFc1800ql7zqmcDgZSA", "cell_type": "markdown", "source": [ "For instance, the data pertaining to a certain [Reporting Node](#reporting-node) for a certain [Scenario](#scenario) is called an IfrsPartition and assigned a unique identifier:" @@ -1417,7 +1322,6 @@ "outputs": [] }, { - "id": "bfSp5T3pV0KWnxNftKMGeQ", "cell_type": "code", "source": [ "public record PartitionByReportingNode : IfrsPartition {}" @@ -1427,7 +1331,6 @@ "outputs": [] }, { - "id": "s-Z9GAJm7kSMmpdCbP93bA", "cell_type": "markdown", "source": [ "The partition PartitionByReportingNodeAndPeriod is a further partition of the IfrsPartition sets - In particular, it defines sets for the data pertaining to a certain [Reporting Node](#reporting-node), [Scenario](#scenario), year and month. The value of the Month is the last month of the reporting period to which the data belongs to. " @@ -1437,7 +1340,6 @@ "outputs": [] }, { - "id": "zISZyAdnkEyzTE1zpuwyyg", "cell_type": "code", "source": [ "public record PartitionByReportingNodeAndPeriod : IfrsPartition {", @@ -1457,7 +1359,6 @@ "outputs": [] }, { - "id": "SqNVh5wtfUezX47Ykwro3g", "cell_type": "markdown", "source": [ "", @@ -1470,7 +1371,6 @@ "outputs": [] }, { - "id": "kQT5JYjIskOeFjgMZ1w69g", "cell_type": "markdown", "source": [ "", @@ -1490,7 +1390,6 @@ "outputs": [] }, { - "id": "sDuxslDif0Sc7ayoPFDBvw", "cell_type": "code", "source": [ "public record DataNode : KeyedDimension, IPartitioned {", @@ -1530,7 +1429,6 @@ "outputs": [] }, { - "id": "FSa402W3TkiFSw4IlrT0JQ", "cell_type": "markdown", "source": [ "", @@ -1545,7 +1443,6 @@ "outputs": [] }, { - "id": "FyJPLygckkiVEUELn08X3A", "cell_type": "code", "source": [ "public record Portfolio : DataNode {}", @@ -1558,7 +1455,6 @@ "outputs": [] }, { - "id": "-hbDX86jWke27T_Qi4yjUQ", "cell_type": "markdown", "source": [ "", @@ -1573,7 +1469,6 @@ "outputs": [] }, { - "id": "rElVpacAmUegdwqcG3mmGw", "cell_type": "code", "source": [ "public record GroupOfContract : DataNode {", @@ -1606,7 +1501,6 @@ "outputs": [] }, { - "id": "UoH8t8Gr3EeGXaXp2w6Vyg", "cell_type": "markdown", "source": [ "A group of insurance contracts is called a **GIC** and has no information on Partner.", @@ -1619,7 +1513,6 @@ "outputs": [] }, { - "id": "fxV6ONW9S02XR3zAH5RGdw", "cell_type": "code", "source": [ "public record GroupOfInsuranceContract : GroupOfContract {", @@ -1653,7 +1546,6 @@ "outputs": [] }, { - "id": "2RcBhR-gLEi1fyPfMVmLuA", "cell_type": "markdown", "source": [ "", @@ -1667,7 +1559,6 @@ "outputs": [] }, { - "id": "Aaigxy_oXE6AunRElFSYAw", "cell_type": "code", "source": [ "public record DataNodeState : KeyedRecord, IPartitioned, IWithYearMonthAndScenario", @@ -1715,7 +1606,6 @@ "outputs": [] }, { - "id": "iDKOuanhL0i6psYc1KBeHw", "cell_type": "markdown", "source": [ "", @@ -1732,7 +1622,6 @@ "outputs": [] }, { - "id": "-lkGCfDzo0SbSF7dZDXIUQ", "cell_type": "code", "source": [ "public record DataNodeParameter : KeyedRecord, IPartitioned, IWithYearMonthAndScenario", @@ -1775,7 +1664,6 @@ "outputs": [] }, { - "id": "zpfXY4qd10-jnedhyiVr-Q", "cell_type": "code", "source": [ "public record SingleDataNodeParameter : DataNodeParameter {", @@ -1800,7 +1688,6 @@ "outputs": [] }, { - "id": "kxGsVzfJE0y6EdlnIRcskg", "cell_type": "markdown", "source": [ "## DataNodeData PocoType", @@ -1811,7 +1698,6 @@ "outputs": [] }, { - "id": "vIbSqkxEAEimfOTb5df1lw", "cell_type": "code", "source": [ "public record DataNodeData {", @@ -1847,7 +1733,6 @@ "outputs": [] }, { - "id": "GoHhGqOtG0-OVZzbd26MIQ", "cell_type": "markdown", "source": [ "", @@ -1862,7 +1747,6 @@ "outputs": [] }, { - "id": "1uBvKkke9E-jE50KJE63Kg", "cell_type": "code", "source": [ "public abstract record BaseVariableIdentity {", @@ -1887,7 +1771,6 @@ "outputs": [] }, { - "id": "09RqJAd98k-0yKxsVJoj7A", "cell_type": "code", "source": [ "public abstract record BaseDataRecord : BaseVariableIdentity, IKeyed, IPartitioned {", @@ -1915,7 +1798,6 @@ "outputs": [] }, { - "id": "MNQBq-sMm0qE88pJs4TI0w", "cell_type": "markdown", "source": [ "Basically, RawVariable is defined for a certain Reporting Node, Scenario, Year, Month, Amount Type and Calculation Type:" @@ -1925,7 +1807,6 @@ "outputs": [] }, { - "id": "KWxQ2RGp3U-5Si5Yn8_TxQ", "cell_type": "code", "source": [ "public record RawVariable : BaseDataRecord", @@ -1944,7 +1825,6 @@ "outputs": [] }, { - "id": "32EH_CRHdkaqykLzNiRMlA", "cell_type": "markdown", "source": [ "", @@ -1964,7 +1844,6 @@ "outputs": [] }, { - "id": "ATEjwkbM7EmskgkBl5iDXA", "cell_type": "code", "source": [ "public record IfrsVariable : BaseDataRecord", @@ -1989,7 +1868,6 @@ "outputs": [] }, { - "id": "IEgWB97Takeh-qD2nT3RMA", "cell_type": "markdown", "source": [ "", @@ -2001,7 +1879,6 @@ "outputs": [] }, { - "id": "QzLZ4ykjzUmtv-rANE7xIw", "cell_type": "code", "source": [ "public record ImportIdentity : BaseVariableIdentity {", @@ -2039,7 +1916,6 @@ "outputs": [] }, { - "id": "o5bDYrCFbEq9Q86kAQ8M2A", "cell_type": "markdown", "source": [ "", @@ -2052,7 +1928,6 @@ "outputs": [] }, { - "id": "uJSztRmWuUqUk4sLXE3pqQ", "cell_type": "code", "source": [ "public record ReportVariable {", @@ -2227,7 +2102,6 @@ "outputs": [] }, { - "id": "5KnkxM7jkkq7I_q6uVn55w", "cell_type": "markdown", "source": [ "# Args" @@ -2237,7 +2111,6 @@ "outputs": [] }, { - "id": "3Q9oP3-cLUqSGJRmFqlnTA", "cell_type": "code", "source": [ "public record Args(string ReportingNode, int Year, int Month, Periodicity Periodicity, string Scenario){}" @@ -2247,7 +2120,6 @@ "outputs": [] }, { - "id": "cR_ZU4RxdECNosEby4pYNQ", "cell_type": "code", "source": [ "public record ImportArgs : Args", @@ -2266,7 +2138,6 @@ "outputs": [] }, { - "id": "GioFDTgmvEmQbwUEAS8ywA", "cell_type": "code", "source": [ "public record ReportArgs : Args", diff --git a/ifrs17/Export/ExportConfiguration.ipynb b/ifrs17/Export/ExportConfiguration.ipynb index 81651f36..2387d75f 100644 --- a/ifrs17/Export/ExportConfiguration.ipynb +++ b/ifrs17/Export/ExportConfiguration.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "P-g7GArHA0aKcY2PxC5q8Q", "cell_type": "markdown", "source": [ "

Export Configuration

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "rsDJFZee4EKdQ35EUXjOKA", "cell_type": "code", "source": [ "#!import \"../DataModel/DataStructure\"" @@ -38,7 +36,6 @@ "outputs": [] }, { - "id": "Xz94Khhs1kmnH1IVWMSmaw", "cell_type": "code", "source": [ "using Systemorph.Vertex.Export.Builders.Interfaces;", @@ -49,7 +46,6 @@ "outputs": [] }, { - "id": "Ou65UNaKpEyCJRGlrLysBQ", "cell_type": "markdown", "source": [ "# Main Tab" @@ -59,7 +55,6 @@ "outputs": [] }, { - "id": "BWX9kQ_c00uLzpJKNyOhew", "cell_type": "code", "source": [ "public static IDocumentBuilder MainTabConfigurationWoScenario(this IDocumentBuilder builder, T args) where T : IfrsPartition", @@ -74,7 +69,6 @@ "outputs": [] }, { - "id": "uvnoDsE4oUSt0PB0WNhadA", "cell_type": "code", "source": [ "public static IDocumentBuilder MainTabConfiguration(this IDocumentBuilder builder, T args) where T : IfrsPartition", @@ -88,7 +82,6 @@ "outputs": [] }, { - "id": "hQK8WsGMl0mDnOVj_sjG-A", "cell_type": "markdown", "source": [ "# Porfolio" @@ -98,7 +91,6 @@ "outputs": [] }, { - "id": "ozokghlNa0ODKC1mTz08zw", "cell_type": "code", "source": [ "public static IDocumentBuilder PortfolioConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : Portfolio", @@ -117,7 +109,6 @@ "outputs": [] }, { - "id": "KWuLpwNT0Ui1wDosD3-3UA", "cell_type": "markdown", "source": [ "# Group of Contract" @@ -127,7 +118,6 @@ "outputs": [] }, { - "id": "0uiDgQgJTkO85SFnjbGm0w", "cell_type": "code", "source": [ "public static IDocumentBuilder GroupofContractConfiguration(this IDocumentBuilder builder, Type DependsOnType = default) where T : GroupOfContract", @@ -152,7 +142,6 @@ "outputs": [] }, { - "id": "yHfYqYJoYEOI-zwzcrmiTA", "cell_type": "markdown", "source": [ "# Data Node State" @@ -162,7 +151,6 @@ "outputs": [] }, { - "id": "dPWh1L5KDkOezW6JgfkpVA", "cell_type": "code", "source": [ "using DocumentFormat.OpenXml.Spreadsheet;" @@ -172,7 +160,6 @@ "outputs": [] }, { - "id": "9wuPH7XlmUmQii3J5fpAXQ", "cell_type": "code", "source": [ "public record HelperState { public string State {get; init;} }" @@ -182,7 +169,6 @@ "outputs": [] }, { - "id": "07W-etuVhUCGCNpWWgHgXQ", "cell_type": "code", "source": [ "public static IExcelDocumentBuilder DataNodeStateConfiguration (this IExcelDocumentBuilder builder, DataNodeState[] data)", @@ -212,7 +198,6 @@ "outputs": [] }, { - "id": "HU5u0yMp_U68TZhQJQ7Pug", "cell_type": "code", "source": [ "public static IExcelDocumentBuilder StateEnumConfiguration (this IExcelDocumentBuilder builder)", @@ -229,7 +214,6 @@ "outputs": [] }, { - "id": "aVQIFdhD-kCArwh73N3GYA", "cell_type": "markdown", "source": [ "# Data Node Parameter" @@ -239,7 +223,6 @@ "outputs": [] }, { - "id": "rnyY1JSYWkaeU1B5vAG6Ng", "cell_type": "code", "source": [ "public static IExcelDocumentBuilder DataNodeParameterConfiguration (this IExcelDocumentBuilder builder, Dictionary data)", @@ -278,7 +261,6 @@ "outputs": [] }, { - "id": "fAsIOPFhGUO054zF6vyX0A", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Import/ImportScopeCalculation.ipynb b/ifrs17/Import/ImportScopeCalculation.ipynb index 92be02bf..6c12cedb 100644 --- a/ifrs17/Import/ImportScopeCalculation.ipynb +++ b/ifrs17/Import/ImportScopeCalculation.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "IZg63U-r4Uq_ro4hRUgeRw", "cell_type": "markdown", "source": [ "", @@ -29,7 +28,6 @@ "outputs": [] }, { - "id": "HGJXnMwy4kWKjzkHkvX8iw", "cell_type": "markdown", "source": [ "This notebook contains the logic used to perform calculations upon import of data (actuals and cashflows). This is also called 'Data Loading' and the concept of Scope is used here to define the logic and provide the means of executing the logic." @@ -39,7 +37,6 @@ "outputs": [] }, { - "id": "e-Y5r2I4OUCIlOVCJaGGgg", "cell_type": "markdown", "source": [ "# References", @@ -50,7 +47,6 @@ "outputs": [] }, { - "id": "D25xwuzaa0Ok5fW4jO2zzg", "cell_type": "markdown", "source": [ "## Notebooks" @@ -60,7 +56,6 @@ "outputs": [] }, { - "id": "-meq1BlgnEO_9Qi9rN8PKQ", "cell_type": "code", "source": [ "#!import \"ImportStorage\"" @@ -70,7 +65,6 @@ "outputs": [] }, { - "id": "q7mCfe8spkiYyz0WXIYsng", "cell_type": "markdown", "source": [ "", @@ -84,7 +78,6 @@ "outputs": [] }, { - "id": "K3W7iT04JUmcnpM2pQHY5A", "cell_type": "code", "source": [ "public interface IModel : IMutableScopeWithStorage{}" @@ -94,7 +87,6 @@ "outputs": [] }, { - "id": "JrH9-tdBRkum_Pb0wxjsvw", "cell_type": "markdown", "source": [ "## Getting Existing Identities", @@ -108,7 +100,6 @@ "outputs": [] }, { - "id": "Dr6JlCAOa0qTLmEK7mkBRQ", "cell_type": "code", "source": [ "public interface AllCfIdentities : IScope // string represents a DataNode", @@ -126,7 +117,6 @@ "outputs": [] }, { - "id": "AoUS_cRh0U-AkCOrRjqHQA", "cell_type": "code", "source": [ "public interface GetIdentities : IScope", @@ -221,7 +211,6 @@ "outputs": [] }, { - "id": "jE0aaaKrhka02hbasl8sXw", "cell_type": "markdown", "source": [ "## Getting Amount Types", @@ -233,7 +222,6 @@ "outputs": [] }, { - "id": "3ZoSi02F8UqASGhq1HtvUw", "cell_type": "code", "source": [ "public interface ValidAmountType : IScope", @@ -267,7 +255,6 @@ "outputs": [] }, { - "id": "O-LqZH86kkyVyuFwRmE5Ng", "cell_type": "markdown", "source": [ "", @@ -280,7 +267,6 @@ "outputs": [] }, { - "id": "cAjg0RqZuU6dxyD4BHjSaw", "cell_type": "markdown", "source": [ "### ParentAocStep ", @@ -307,7 +293,6 @@ "outputs": [] }, { - "id": "sGX4WCgwCEWf2CpcEzCASQ", "cell_type": "code", "source": [ "public interface ParentAocStep : IScope<(ImportIdentity Id, string AmountType), ImportStorage>", @@ -342,7 +327,6 @@ "outputs": [] }, { - "id": "ZQKnYOpT6EKVKhyDAHuKHw", "cell_type": "markdown", "source": [ "### ReferenceAocStep", @@ -371,7 +355,6 @@ "outputs": [] }, { - "id": "52TfWUCcQUyc39rYcKe5KA", "cell_type": "code", "source": [ "public interface ReferenceAocStep : IScope ", @@ -403,7 +386,6 @@ "outputs": [] }, { - "id": "XSykc2IcnUu5GLwIp9a5xQ", "cell_type": "markdown", "source": [ "### PreviousAocSteps", @@ -432,7 +414,6 @@ "outputs": [] }, { - "id": "LFMQRLnGDUeBO3zmMY_IgA", "cell_type": "code", "source": [ "public interface PreviousAocSteps : IScope<(ImportIdentity Id, InputSource ScopeInputSource), ImportStorage> ", @@ -456,7 +437,6 @@ "outputs": [] }, { - "id": "Ki7yLCpDS0Wgdmiahnjg7g", "cell_type": "markdown", "source": [ "The exact structure being return depends on the **order** of the AoC Steps (which is set by the [AoC Type](../DataModel/DataStructure#aoc-type)), and on which AoC steps exist." @@ -466,7 +446,6 @@ "outputs": [] }, { - "id": "EHEOFcljGkOYAoWWvUEJjQ", "cell_type": "markdown", "source": [ "", @@ -479,7 +458,6 @@ "outputs": [] }, { - "id": "o-nF81nHo0O2pGOpaMZPOA", "cell_type": "markdown", "source": [ "", @@ -498,7 +476,6 @@ "outputs": [] }, { - "id": "y-3vJArEak2Gxm9Aya6jOA", "cell_type": "markdown", "source": [ "", @@ -521,7 +498,6 @@ "outputs": [] }, { - "id": "5Vjdb4UUeUWnuDe1HDkF2Q", "cell_type": "code", "source": [ "public interface MonthlyRate : IScope", @@ -542,7 +518,6 @@ "outputs": [] }, { - "id": "gD7ZdyMyvkmzaiszXR_dqw", "cell_type": "markdown", "source": [ "", @@ -558,7 +533,6 @@ "outputs": [] }, { - "id": "ZmO1j4uGlkGdbfvcSEXJQg", "cell_type": "code", "source": [ "public interface NominalCashflow : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", @@ -600,7 +574,6 @@ "outputs": [] }, { - "id": "IIkemYfM30ytcItha5eYDw", "cell_type": "markdown", "source": [ "For a given month $i$ they are denoted as $\\rm{Nominal}_i$." @@ -610,7 +583,6 @@ "outputs": [] }, { - "id": "_PYIAO14FkCWaGjw_h3sjg", "cell_type": "markdown", "source": [ "", @@ -625,7 +597,6 @@ "outputs": [] }, { - "id": "PaIuIxDLMUymcYHNicfmFw", "cell_type": "markdown", "source": [ "", @@ -651,7 +622,6 @@ "outputs": [] }, { - "id": "85QfNxNpt06PAgYiZIqTLg", "cell_type": "code", "source": [ "public interface DiscountedCashflow : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? Accidentyear), ImportStorage>", @@ -685,7 +655,6 @@ "outputs": [] }, { - "id": "Yyg3nKDMaUegdQgSZmJfhg", "cell_type": "markdown", "source": [ "", @@ -710,7 +679,6 @@ "outputs": [] }, { - "id": "c6EYdq9zZ0uT4yfFAynddw", "cell_type": "code", "source": [ "public interface TelescopicDifference : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? Accidentyear), ImportStorage>", @@ -733,7 +701,6 @@ "outputs": [] }, { - "id": "DKL8osruCU-DbEb-tO_8wA", "cell_type": "markdown", "source": [ "", @@ -762,7 +729,6 @@ "outputs": [] }, { - "id": "wmAA753Li0Osew0Rx9zS6A", "cell_type": "code", "source": [ "public interface IWithGetValueFromValues : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", @@ -787,7 +753,6 @@ "outputs": [] }, { - "id": "XDKoRCKk-ESOsrY7vOJ-Ew", "cell_type": "markdown", "source": [ "", @@ -811,7 +776,6 @@ "outputs": [] }, { - "id": "k8NFcJLF20-kg-ZccJEv5A", "cell_type": "code", "source": [ "public interface IWithInterestAccretion : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", @@ -867,7 +831,6 @@ "outputs": [] }, { - "id": "dM2KZ1PPx0u8-5bNcF2Ccg", "cell_type": "markdown", "source": [ "", @@ -895,7 +858,6 @@ "outputs": [] }, { - "id": "8GRVgEhgUECARHHffZ47qg", "cell_type": "code", "source": [ "public interface PresentValue : IWithGetValueFromValues", @@ -960,7 +922,6 @@ "outputs": [] }, { - "id": "0kSvVBqlrkKl9AsILO34Rw", "cell_type": "markdown", "source": [ "", @@ -996,7 +957,6 @@ "outputs": [] }, { - "id": "rwsQvKBwpEKmspbkigTlhA", "cell_type": "code", "source": [ "public interface PvLocked : IScope", @@ -1041,7 +1001,6 @@ "outputs": [] }, { - "id": "p2piX2ZdiUu8ZvUw9tRc7g", "cell_type": "markdown", "source": [ "", @@ -1064,7 +1023,6 @@ "outputs": [] }, { - "id": "IxvlLZjNpkeg3-puzDYTog", "cell_type": "code", "source": [ "public interface RaLocked : IScope", @@ -1101,7 +1059,6 @@ "outputs": [] }, { - "id": "d4HlvRMhakijU2gChsTaBg", "cell_type": "markdown", "source": [ "", @@ -1114,7 +1071,6 @@ "outputs": [] }, { - "id": "DeqWNbrHikiG4bMQfqXG2w", "cell_type": "markdown", "source": [ "", @@ -1130,7 +1086,6 @@ "outputs": [] }, { - "id": "_ELmzzZJN0uiiI1FeT0svQ", "cell_type": "code", "source": [ "public interface CoverageUnitCashflow : IScope", @@ -1148,7 +1103,6 @@ "outputs": [] }, { - "id": "T8Y3hoFpOUuOHW_Ykmzvmw", "cell_type": "markdown", "source": [ "", @@ -1159,7 +1113,6 @@ "outputs": [] }, { - "id": "HeJtygvtGk6eh7_xoPz94w", "cell_type": "markdown", "source": [ "For a certain GIC, the monthly Amortization Factors $\\text{Monthly }AF_i$ are computed from the cashflows of the underlying coverage unit for that GIC:", @@ -1178,7 +1131,6 @@ "outputs": [] }, { - "id": "6LTCrGSIBUC8NNCHa7XoSw", "cell_type": "code", "source": [ "public interface MonthlyAmortizationFactorCashflow : IScope", @@ -1202,7 +1154,6 @@ "outputs": [] }, { - "id": "T-KevHUzMU6jtx0febbk3Q", "cell_type": "markdown", "source": [ "For a certain projection period - defined by the Shift, $S$, and the Time-Step, $TS$, parameters - the Amortization Factor is then given by the product of the corresponding monthly amortization factors:", @@ -1220,7 +1171,6 @@ "outputs": [] }, { - "id": "XMjWT533GUeMzhXBqcbNQQ", "cell_type": "code", "source": [ "public interface CurrentPeriodAmortizationFactor : IScope", @@ -1255,7 +1205,6 @@ "outputs": [] }, { - "id": "4Fjpb-dp4kKfTVXN_ZcKZQ", "cell_type": "markdown", "source": [ "", @@ -1280,7 +1229,6 @@ "outputs": [] }, { - "id": "cEHGz5WS5E-Ii9iLJJsfQw", "cell_type": "markdown", "source": [ "", @@ -1305,7 +1253,6 @@ "outputs": [] }, { - "id": "xxzl252E4UqfccTJZC6Yxw", "cell_type": "code", "source": [ "public interface ActualBase : IScope<(ImportIdentity Id, string AmountType, string EstimateType, int? AccidentYear), ImportStorage>", @@ -1338,7 +1285,6 @@ "outputs": [] }, { - "id": "f5KR23M1rku81r40flA3WQ", "cell_type": "markdown", "source": [ "", @@ -1355,7 +1301,6 @@ "outputs": [] }, { - "id": "qn7r5BBOzEOndYaSAj9Xdg", "cell_type": "code", "source": [ "public interface Actual : IScope", @@ -1376,7 +1321,6 @@ "outputs": [] }, { - "id": "k7EQao6-V0KRhEJwrzUb9Q", "cell_type": "markdown", "source": [ "", @@ -1398,7 +1342,6 @@ "outputs": [] }, { - "id": "S0pnzxS5wEW8KgMHCvHTBA", "cell_type": "code", "source": [ "public interface AdvanceActual : IScope", @@ -1419,7 +1362,6 @@ "outputs": [] }, { - "id": "k8Nl310aM06j_MP1MVjzvw", "cell_type": "markdown", "source": [ "", @@ -1443,7 +1385,6 @@ "outputs": [] }, { - "id": "f7C3NzK97EiGVPP6pEN7BA", "cell_type": "code", "source": [ "public interface OverdueActual : IScope", @@ -1464,7 +1405,6 @@ "outputs": [] }, { - "id": "As4FInLuokOmKXArqSH_pg", "cell_type": "markdown", "source": [ "", @@ -1490,7 +1430,6 @@ "outputs": [] }, { - "id": "Ca6TvbsWNUqcgsiEXoNsxg", "cell_type": "code", "source": [ "public interface DeferrableActual : IScope", @@ -1540,7 +1479,6 @@ "outputs": [] }, { - "id": "h9P0A4w8mkuZ-TOMU_ONEw", "cell_type": "markdown", "source": [ "", @@ -1553,7 +1491,6 @@ "outputs": [] }, { - "id": "Jk5HEkRb2EOEir320okRBg", "cell_type": "markdown", "source": [ "## Experience Adjustment on Premium" @@ -1563,7 +1500,6 @@ "outputs": [] }, { - "id": "oJfwg9hckEmVYLOQDafYxQ", "cell_type": "markdown", "source": [ "The Experience Adjustment (EA) on Premiums weights the cash-flow (CF aocSteps) for premium amount types by the PremiumAllocationFactor input for each group of insurance contract. ", @@ -1582,7 +1518,6 @@ "outputs": [] }, { - "id": "gR_oBLnGjkCdbSR1Xv36KQ", "cell_type": "code", "source": [ "public interface BeExperienceAdjustmentForPremium : IScope", @@ -1609,7 +1544,6 @@ "outputs": [] }, { - "id": "k0CqaQ-_ok2vg6GE1FC75A", "cell_type": "code", "source": [ "public interface ActualExperienceAdjustmentForPremium : IScope", @@ -1633,7 +1567,6 @@ "outputs": [] }, { - "id": "zPtJDlQU6k-Z5r6O60RZaw", "cell_type": "markdown", "source": [ "", @@ -1701,7 +1634,6 @@ "outputs": [] }, { - "id": "19jPup_Bx0GSC7YLpp-7aA", "cell_type": "code", "source": [ "public interface TechnicalMargin : IScope", @@ -1795,7 +1727,6 @@ "outputs": [] }, { - "id": "EL8bVpKgg0mqV06dSFrnyg", "cell_type": "markdown", "source": [ "", @@ -1920,7 +1851,6 @@ "outputs": [] }, { - "id": "wNL0WqL5DEWHPLdAu6D-Qg", "cell_type": "code", "source": [ "public interface AllocateTechnicalMargin: IScope", @@ -2050,7 +1980,6 @@ "outputs": [] }, { - "id": "q9wQO79KLE6XecsW71bHug", "cell_type": "markdown", "source": [ "For the **Group of Reinsurance Contracts** (GRICs), the switch is computed within the underlying GIC context and $CSM$ and $LR$ are then computed in the same manner as for the underlying GICs CSM and LC." @@ -2060,7 +1989,6 @@ "outputs": [] }, { - "id": "wtSp81Pr5k2osiHdsbp9IQ", "cell_type": "markdown", "source": [ "The scopes below are simply used to set the appropriate Estimate Type (C for $CSM$, L for $LC$ and LR for $LoReCo$), as well as to set $CSM$ values to be positive:" @@ -2070,7 +1998,6 @@ "outputs": [] }, { - "id": "YikKMJsnVkabj5NdPZgtRA", "cell_type": "code", "source": [ "public interface ContractualServiceMargin : IScope", @@ -2085,7 +2012,6 @@ "outputs": [] }, { - "id": "Z7iybzoX0kOwNsxQO5PGHg", "cell_type": "code", "source": [ "public interface LossComponent : IScope", @@ -2100,7 +2026,6 @@ "outputs": [] }, { - "id": "WDtHHWXvdUmzUQSyWWjScQ", "cell_type": "code", "source": [ "public interface LossRecoveryComponent : IScope", @@ -2115,7 +2040,6 @@ "outputs": [] }, { - "id": "ZktIv7ZYt0qmFTGek6WDHA", "cell_type": "markdown", "source": [ "## Computing All Scopes", @@ -2127,7 +2051,6 @@ "outputs": [] }, { - "id": "senAlJILrECJzpbfr5ar4A", "cell_type": "code", "source": [ "public interface ComputeAllScopes: IScope //ComputeIfrsVariable", @@ -2304,7 +2227,6 @@ "outputs": [] }, { - "id": "p-LnlEZSK0W1q5f2SrxZMQ", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Import/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb index db6aebee..cbf5ca60 100644 --- a/ifrs17/Import/ImportStorage.ipynb +++ b/ifrs17/Import/ImportStorage.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "b-AJSwH1T0q6LGMLygwVYQ", "cell_type": "markdown", "source": [ "", @@ -46,7 +45,6 @@ "outputs": [] }, { - "id": "tB8k622IxkexI_F9H3qDew", "cell_type": "code", "source": [ "#!import \"../Utils/EqualityComparers\"", @@ -58,7 +56,6 @@ "outputs": [] }, { - "id": "F3zQ1GvRyUyHAKF0DboHiw", "cell_type": "markdown", "source": [ "# Import Storage" @@ -68,7 +65,6 @@ "outputs": [] }, { - "id": "5OFxFeAcmES2tfGQNvWgHw", "cell_type": "code", "source": [ "public class ImportStorage", @@ -396,7 +392,6 @@ "outputs": [] }, { - "id": "jVpRLSU0bk6kufLUDDNU3Q", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb index af7d117c..848abb61 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -19,7 +19,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "GEBNBjd7AESlxlt81wmoXQ", "cell_type": "markdown", "source": [ "", @@ -31,7 +30,6 @@ "outputs": [] }, { - "id": "6aPxAWjoMEGEYwn_2mU05g", "cell_type": "code", "source": [ "#!import \"ImportScopeCalculation\"" @@ -41,7 +39,6 @@ "outputs": [] }, { - "id": "x_-nRNU4fU6Dnxx46JV05A", "cell_type": "markdown", "source": [ "# Parsing Storage", @@ -54,7 +51,6 @@ "outputs": [] }, { - "id": "97QSbHoWKEGb8n7ygLi1dg", "cell_type": "code", "source": [ "public class ParsingStorage", @@ -227,7 +223,6 @@ "outputs": [] }, { - "id": "nEV2GklBnUqC8JIi92ETNw", "cell_type": "markdown", "source": [ "# Basics", @@ -239,7 +234,6 @@ "outputs": [] }, { - "id": "pFCSFdMzVkehiGs_gLbbUg", "cell_type": "markdown", "source": [ "## Clean the Database" @@ -249,7 +243,6 @@ "outputs": [] }, { - "id": "WbGNfikYmUOK7NYwj-HfkQ", "cell_type": "code", "source": [ "async public Task CleanDatabaseAsync (Expression> filter = null) where T : class", @@ -263,7 +256,6 @@ "outputs": [] }, { - "id": "B09ETZusIUyL99bgkGPjRA", "cell_type": "code", "source": [ "async public Task CleanDatabaseFromPartitionAsync (Guid partitionId, Func filter = null) where T : class, IPartitioned", @@ -278,7 +270,6 @@ "outputs": [] }, { - "id": "PMbRolQ05UuKOPa9451dEg", "cell_type": "markdown", "source": [ "## Update the Database" @@ -288,7 +279,6 @@ "outputs": [] }, { - "id": "EjST6sz8JEurnRLnwPYl1Q", "cell_type": "code", "source": [ "async public Task CommitToDatabase (Guid partitionId, bool snapshot = true, Func filter = null) where T : class, IPartitioned", @@ -303,7 +293,6 @@ "outputs": [] }, { - "id": "pQiCmfx0i0qTKU8MrX7n5w", "cell_type": "markdown", "source": [ "## Data Node Factory" @@ -313,7 +302,6 @@ "outputs": [] }, { - "id": "iefdpcJCZE2JSkpcLQ_yAA", "cell_type": "code", "source": [ "public async Task DataNodeFactoryAsync(IDataSet dataSet, string tableName, ImportArgs args)", @@ -347,7 +335,6 @@ "outputs": [] }, { - "id": "5zZRjIRbVk6RvrXn7GTtHA", "cell_type": "markdown", "source": [ "# Importers" @@ -357,7 +344,6 @@ "outputs": [] }, { - "id": "8psLQ8lKpU-50HR8Z9fFeg", "cell_type": "markdown", "source": [ "## Analysis of Change Configuration" @@ -367,7 +353,6 @@ "outputs": [] }, { - "id": "ptM1upQYJUSJ3HgrC0UyOQ", "cell_type": "markdown", "source": [ "The [Analysis of Change configuration](../DataModel/DataStructure#aoc-step-configuration) is parsed from the input file and complemented with defaults to allow for an easy insertion of new Aoc steps. ", @@ -392,7 +377,6 @@ "outputs": [] }, { - "id": "PXcWmb1qTkKlCSVOjJDHxw", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.AocConfiguration, async (options, dataSet) => {", @@ -473,7 +457,6 @@ "outputs": [] }, { - "id": "0sc5KOQvKEicxmEkg9I2Nw", "cell_type": "markdown", "source": [ "## Parse Main Tab and return Args", @@ -485,7 +468,6 @@ "outputs": [] }, { - "id": "YiFEJAxq8Eeo4f1pOhrslA", "cell_type": "code", "source": [ "public async Task GetArgsFromMainAsync(IDataSet dataSet)", @@ -548,7 +530,6 @@ "outputs": [] }, { - "id": "D_Yg7U6xL0iEu2J5dYGGQQ", "cell_type": "markdown", "source": [ "## Parse and Upload: Data Nodes", @@ -560,7 +541,6 @@ "outputs": [] }, { - "id": "_YEY_T29PEuM6hOitLi_yA", "cell_type": "markdown", "source": [ "### Portfolio and Group of contract" @@ -570,7 +550,6 @@ "outputs": [] }, { - "id": "iPkLnvWBw0K_vugEhM6eEA", "cell_type": "code", "source": [ "public async Task UploadDataNodesToWorkspaceAsync(IDataSet dataSet)", @@ -677,7 +656,6 @@ "outputs": [] }, { - "id": "dZee9zb4hU-600lxQvKKfA", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.DataNode, async (options, dataSet) => {", @@ -695,7 +673,6 @@ "outputs": [] }, { - "id": "OvJQpOepfUKs9HO05RZt3g", "cell_type": "markdown", "source": [ "### Data Node State" @@ -705,7 +682,6 @@ "outputs": [] }, { - "id": "twd-9JphDkKWlYMzzMHRZg", "cell_type": "code", "source": [ "public async Task ValidateDataNodeStatesAsync(Dictionary persistentDataNodeByDataNode)", @@ -730,7 +706,6 @@ "outputs": [] }, { - "id": "11oMaqji9ESPXtnfGdol1A", "cell_type": "code", "source": [ "public async Task UploadDataNodeStateToWorkspaceAsync(IDataSet dataSet)", @@ -770,7 +745,6 @@ "outputs": [] }, { - "id": "bLmthg_F0UmHmuC_hebLZg", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.DataNodeState, async (options, dataSet) => {", @@ -784,7 +758,6 @@ "outputs": [] }, { - "id": "rveYUL5bPUC82CbWaGi4lQ", "cell_type": "markdown", "source": [ "### DataNode Parameters" @@ -794,7 +767,6 @@ "outputs": [] }, { - "id": "8BBfuwsh-kKG9CE8LIqlIg", "cell_type": "code", "source": [ "public async Task UploadDataNodeParameterToWorkspaceAsync(IDataSet dataSet, Guid targetPartitionByReportingNodeId)", @@ -886,7 +858,6 @@ "outputs": [] }, { - "id": "qresbZmRKUGDdhb2Qg2bYQ", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.DataNodeParameter, async (options, dataSet) => {", @@ -904,7 +875,6 @@ "outputs": [] }, { - "id": "pbi5WLybL0WeWvmp48L8dA", "cell_type": "markdown", "source": [ "## Parse and Upload: Variables", @@ -921,7 +891,6 @@ "outputs": [] }, { - "id": "0qtpigTMXUeFOJBGAhD64A", "cell_type": "markdown", "source": [ "### Validation for Active Data Node States" @@ -931,7 +900,6 @@ "outputs": [] }, { - "id": "df6Q6O4n8UGZ6QMEHXWp7Q", "cell_type": "code", "source": [ "public async Task ValidateForDataNodeStateActiveAsync(Dictionary dataNodes) where T : BaseDataRecord", @@ -946,7 +914,6 @@ "outputs": [] }, { - "id": "zer3DehdW0OXTbIW-BE5wQ", "cell_type": "markdown", "source": [ "### Cashflow as Raw Variable and Ifrs Variable" @@ -956,7 +923,6 @@ "outputs": [] }, { - "id": "qxiTr4OQU02FSTwnCLjAqg", "cell_type": "code", "source": [ "public async Task ParseCashflowsToWorkspaceAsync(IDataSet dataSet, ImportArgs args)", @@ -1028,7 +994,6 @@ "outputs": [] }, { - "id": "d2PR6nE090qnEhAx26W4Fw", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.Cashflow, async (options, dataSet) => {", @@ -1066,7 +1031,6 @@ "outputs": [] }, { - "id": "F_ov9xx25ECCgKn8LjsZgw", "cell_type": "markdown", "source": [ "### Actuals as Ifrs Variable" @@ -1076,7 +1040,6 @@ "outputs": [] }, { - "id": "kEyrQCxqEkmoUupmjE-B8Q", "cell_type": "code", "source": [ "public async Task ParseActualsToWorkspaceAsync(IDataSet dataSet, ImportArgs args)", @@ -1142,7 +1105,6 @@ "outputs": [] }, { - "id": "HqDpHFbZNkynz3nM9TSiDA", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.Actual, async (options, dataSet) => {", @@ -1177,7 +1139,6 @@ "outputs": [] }, { - "id": "cl1ZHPkmTk66Nh-WZoQ0Ag", "cell_type": "markdown", "source": [ "# Simple Value Import", @@ -1192,7 +1153,6 @@ "outputs": [] }, { - "id": "jjIv6ndV_EeSuPrStrKGNQ", "cell_type": "markdown", "source": [ "## Simple Value to Workspace" @@ -1202,7 +1162,6 @@ "outputs": [] }, { - "id": "k8vc0EGeGk2hVkNAYZzgig", "cell_type": "code", "source": [ "public async Task ParseSimpleValueToWorkspaceAsync(IDataSet dataSet, ImportArgs args, Guid targetPartitionByReportingNodeAndPeriodId)", @@ -1270,7 +1229,6 @@ "outputs": [] }, { - "id": "RQi9nkdXQEmaeLBlImg__A", "cell_type": "markdown", "source": [ "## Simple Value as IfrsVariable" @@ -1280,7 +1238,6 @@ "outputs": [] }, { - "id": "DJPGRNmcW0u6oJJTFjNFLg", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.SimpleValue, async (options, dataSet) => {", @@ -1307,7 +1264,6 @@ "outputs": [] }, { - "id": "uAVHYz0MD0SFk1IMsDUcIw", "cell_type": "markdown", "source": [ "## Openings as IfrsVariable" @@ -1317,7 +1273,6 @@ "outputs": [] }, { - "id": "oyD6qvynF0Or3udnGnPqoQ", "cell_type": "code", "source": [ "Import.DefineFormat(ImportFormats.Opening, async (options, dataSet) => {", @@ -1353,7 +1308,6 @@ "outputs": [] }, { - "id": "PijxDGahGkKV1GD0j9HrCg", "cell_type": "code", "source": [ "" diff --git a/ifrs17/OverviewCalculationEngine.ipynb b/ifrs17/OverviewCalculationEngine.ipynb index 62ff16a0..9b6a8c65 100644 --- a/ifrs17/OverviewCalculationEngine.ipynb +++ b/ifrs17/OverviewCalculationEngine.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "3f2xh5L6m0OJIHBDr3UlXg", "cell_type": "markdown", "source": [ "

IFRS 17 Calculation Engine - an Overview

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "CUdOibiJDEewI_wagM7MpA", "cell_type": "markdown", "source": [ "# Introduction", @@ -44,7 +42,6 @@ "outputs": [] }, { - "id": "3IgPzAqQsEa9vnFOg7U30g", "cell_type": "markdown", "source": [ "", @@ -81,7 +78,6 @@ "outputs": [] }, { - "id": "p2eQ-g5oYUKG2H4ZlhOBWw", "cell_type": "markdown", "source": [ "", @@ -96,7 +92,6 @@ "outputs": [] }, { - "id": "CvHU8yPgcku6OEvcmEIpSQ", "cell_type": "markdown", "source": [ "", @@ -115,7 +110,6 @@ "outputs": [] }, { - "id": "jOqvoH1Bl0ewf9in5N9NIQ", "cell_type": "markdown", "source": [ "", @@ -134,7 +128,6 @@ "outputs": [] }, { - "id": "k_CuwJdj_UOGz6TPZHdngQ", "cell_type": "markdown", "source": [ "", @@ -181,7 +174,6 @@ "outputs": [] }, { - "id": "RzhAC13vCE6swA2hTa2Sqw", "cell_type": "markdown", "source": [ "", diff --git a/ifrs17/Report/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb index e6c85b7d..355fb97c 100644 --- a/ifrs17/Report/ReportConfigurationAndUtils.ipynb +++ b/ifrs17/Report/ReportConfigurationAndUtils.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "G81HH-rybkeg0vlY1DNDgA", "cell_type": "markdown", "source": [ "

Report Configuration And Utils

" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "8YLIovEcLkm_r75W6SD-tQ", "cell_type": "code", "source": [ "#!import \"../Utils/EqualityComparers\"", @@ -39,7 +37,6 @@ "outputs": [] }, { - "id": "YDShzSvSMEydbrp8JkeGsQ", "cell_type": "code", "source": [ "using Systemorph.Vertex.Pivot.Builder;", @@ -66,7 +63,6 @@ "outputs": [] }, { - "id": "n6rie8G-ykemdglb-7PEvw", "cell_type": "markdown", "source": [ "# Currency methods" @@ -76,7 +72,6 @@ "outputs": [] }, { - "id": "puLk5ud_Ck6vPZU4g9XFFQ", "cell_type": "code", "source": [ "public static double GetCurrencyToGroupFx(Dictionary> exchangeRates, string currency, FxPeriod fxPeriod, string groupCurrency)", @@ -98,7 +93,6 @@ "outputs": [] }, { - "id": "nqjo4v0cw0-uU5WuJwKR6g", "cell_type": "markdown", "source": [ "# Queries" @@ -108,7 +102,6 @@ "outputs": [] }, { - "id": "JH81cH0s3k-O6MdnNoeqVA", "cell_type": "markdown", "source": [ "## Query Report Variables" @@ -118,7 +111,6 @@ "outputs": [] }, { - "id": "uRooxq8TMEqondN6Rh6pAw", "cell_type": "code", "source": [ "public static async Task QueryReportVariablesSingleScenarioAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", @@ -176,7 +168,6 @@ "outputs": [] }, { - "id": "mSy1fCO1M0ONNi3ki_Pmxw", "cell_type": "code", "source": [ "public static async Task> QueryReportVariablesAsync(this IWorkspace workspace, (int Year, int Month, string ReportingNode, string Scenario) args ) {", @@ -192,7 +183,6 @@ "outputs": [] }, { - "id": "Sv4LupuFhkaAnNNufoj3ag", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Report/ReportMutableScopes.ipynb b/ifrs17/Report/ReportMutableScopes.ipynb index f76e992e..24b46333 100644 --- a/ifrs17/Report/ReportMutableScopes.ipynb +++ b/ifrs17/Report/ReportMutableScopes.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "4-B50jXklE2YDIuIe3HA2w", "cell_type": "markdown", "source": [ "", @@ -27,7 +26,6 @@ "outputs": [] }, { - "id": "FYMR6GSWdUyCG1R-fIE1Vw", "cell_type": "markdown", "source": [ "This notebook contains the set up of mutable scopes used to achieve high interactivity with reports." @@ -37,7 +35,6 @@ "outputs": [] }, { - "id": "0JhA_sNpO0izpVqyzUX_Eg", "cell_type": "markdown", "source": [ "# References", @@ -48,7 +45,6 @@ "outputs": [] }, { - "id": "UvJZERnCKUCBkDX8E0AU4g", "cell_type": "code", "source": [ "#!import \"ReportScopes\"" @@ -58,7 +54,6 @@ "outputs": [] }, { - "id": "LtTQpqceO0G0az5CE1YolA", "cell_type": "markdown", "source": [ "# Mutable Scope" @@ -68,7 +63,6 @@ "outputs": [] }, { - "id": "rwM6oqgcL0STU-YscKiCQQ", "cell_type": "markdown", "source": [ "The IIfrs17Report mutable scope is created with applicabilities to control how the data for each individual report is retrieved from the [report scopes](./ReportScopes)" @@ -78,7 +72,6 @@ "outputs": [] }, { - "id": "XNQ232XQiUOqTdvMRJCv1w", "cell_type": "code", "source": [ "public interface ReportUniverse : IMutableScopeWithStorage{}" @@ -88,7 +81,6 @@ "outputs": [] }, { - "id": "eBl7wxcU4EaUPLogx9wtYg", "cell_type": "code", "source": [ "[InitializeScope(nameof(InitAsync))]", @@ -294,7 +286,6 @@ "outputs": [] }, { - "id": "gU99z__YGU2k9S64YWfNoQ", "cell_type": "markdown", "source": [ "# IFRS 17 Reports" @@ -304,7 +295,6 @@ "outputs": [] }, { - "id": "bxYmQqMxw0atpKUxyO_Vsg", "cell_type": "markdown", "source": [ "This class is used to trigger the calculation of the reports and it is exposed to the end-user in the reports." @@ -314,7 +304,6 @@ "outputs": [] }, { - "id": "6GqpaLYsskm-MRqPqzLMvg", "cell_type": "code", "source": [ "public class Ifrs17Reports ", @@ -357,7 +346,6 @@ "outputs": [] }, { - "id": "osiVbq3V10aq7PZzUsHrdA", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb index fe17e3d7..2d580c86 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "_jUdggiDrUyBhzYT-zsKlg", "cell_type": "markdown", "source": [ "", @@ -29,7 +28,6 @@ "outputs": [] }, { - "id": "FCENXAo530GTEsahnzh3Zg", "cell_type": "markdown", "source": [ "This notebook contains the logic used to perform calculations upon reporting of data." @@ -39,7 +37,6 @@ "outputs": [] }, { - "id": "k-67Zop3rk6rPomMgZXjpg", "cell_type": "markdown", "source": [ "# References", @@ -50,7 +47,6 @@ "outputs": [] }, { - "id": "kmL7X4N-cEiLhdpkQ-IxCQ", "cell_type": "markdown", "source": [ "## Notebooks" @@ -60,7 +56,6 @@ "outputs": [] }, { - "id": "F2Ak5SkrkkKRPq9k2iDyvw", "cell_type": "code", "source": [ "#!import \"ReportStorage\"" @@ -70,7 +65,6 @@ "outputs": [] }, { - "id": "rtjV1Wjggk-Q5YLDgDjl4A", "cell_type": "markdown", "source": [ "# Scopes" @@ -80,7 +74,6 @@ "outputs": [] }, { - "id": "jI7xd2iiDk6piQEpKjxoEQ", "cell_type": "markdown", "source": [ "## Helper Scopes" @@ -90,7 +83,6 @@ "outputs": [] }, { - "id": "4yXIuwsJmUuwuLKrj4iWWQ", "cell_type": "markdown", "source": [ "### Universe" @@ -100,7 +92,6 @@ "outputs": [] }, { - "id": "r6QP8peSmkyuJm6uEbonxw", "cell_type": "code", "source": [ "public interface IUniverse: IScopeWithStorage {}" @@ -110,7 +101,6 @@ "outputs": [] }, { - "id": "zFL_sMbgU0CN5e4NZ813YA", "cell_type": "markdown", "source": [ "## Data Transformation" @@ -120,7 +110,6 @@ "outputs": [] }, { - "id": "nQVTU_-Eg0yRndbemAgtXA", "cell_type": "markdown", "source": [ "### Retrieve Raw Data" @@ -130,7 +119,6 @@ "outputs": [] }, { - "id": "ymr0ZlbYG0um2uqiz3v6UA", "cell_type": "code", "source": [ "public interface Data: IScope<(ReportIdentity ReportIdentity, string EstimateType), ReportStorage>, IDataCube {", @@ -161,7 +149,6 @@ "outputs": [] }, { - "id": "2vgu3Y_ASU29KA6DDK4lpQ", "cell_type": "markdown", "source": [ "### Foreign Exchange (FX) Rates" @@ -171,7 +158,6 @@ "outputs": [] }, { - "id": "rbuEOG3Gq0O68H41e9mDaA", "cell_type": "code", "source": [ "public interface Fx: IScope<(string ContractualCurrency, string FunctionalCurrency, FxPeriod FxPeriod, (int, int) Period, CurrencyType CurrencyType), ReportStorage> { ", @@ -193,7 +179,6 @@ "outputs": [] }, { - "id": "OL1a5GVDXUePbsqWJV1SFA", "cell_type": "code", "source": [ "public interface FxData: IScope<(ReportIdentity ReportIdentity, CurrencyType CurrencyType, string EstimateType), ReportStorage>, IDataCube {", @@ -229,7 +214,6 @@ "outputs": [] }, { - "id": "NIBuXEsJL06BDspV6kTFjA", "cell_type": "markdown", "source": [ "## Present Value" @@ -239,7 +223,6 @@ "outputs": [] }, { - "id": "tfD7_v70RkiwMtqIi9PUGg", "cell_type": "markdown", "source": [ "", @@ -252,7 +235,6 @@ "outputs": [] }, { - "id": "E63asVZNJkm2FlOPo5UiaQ", "cell_type": "code", "source": [ "public interface BestEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -276,7 +258,6 @@ "outputs": [] }, { - "id": "OSD06OKuX024WjdhfeUpKg", "cell_type": "markdown", "source": [ "", @@ -289,7 +270,6 @@ "outputs": [] }, { - "id": "s6YtyFfYD0-IBvSoruABxQ", "cell_type": "code", "source": [ "public interface RiskAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -313,7 +293,6 @@ "outputs": [] }, { - "id": "2lAiiNzYE024n3K2gWD5TA", "cell_type": "markdown", "source": [ "", @@ -325,7 +304,6 @@ "outputs": [] }, { - "id": "32lphidM90CypfxohxRmPA", "cell_type": "code", "source": [ "public interface Fcf: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -354,7 +332,6 @@ "outputs": [] }, { - "id": "c_u6A_a9WU2mKDRqKmdzFQ", "cell_type": "markdown", "source": [ "", @@ -367,7 +344,6 @@ "outputs": [] }, { - "id": "TUE27vAmQkWg0ezEqXWxRQ", "cell_type": "code", "source": [ "public interface Csm: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -379,7 +355,6 @@ "outputs": [] }, { - "id": "-SGsILz87kComI2ryE1PPw", "cell_type": "code", "source": [ "public interface Lc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -391,7 +366,6 @@ "outputs": [] }, { - "id": "7Lzjmyf7fkSxbTm5DqqS9Q", "cell_type": "code", "source": [ "public interface Loreco: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -403,7 +377,6 @@ "outputs": [] }, { - "id": "YEqw7EtuUEqkhmOGvwd-Xg", "cell_type": "code", "source": [ "public interface LrcTechnicalMargin: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -419,7 +392,6 @@ "outputs": [] }, { - "id": "lM0v7sd3zUmm29lWswyOgg", "cell_type": "markdown", "source": [ "", @@ -434,7 +406,6 @@ "outputs": [] }, { - "id": "6XEGR7p1mUCG81V7tcooHA", "cell_type": "code", "source": [ "public interface WrittenAndAccruals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -448,7 +419,6 @@ "outputs": [] }, { - "id": "GmCd7oNDAE2xXgDVnfPpQg", "cell_type": "code", "source": [ "public interface Deferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -460,7 +430,6 @@ "outputs": [] }, { - "id": "QbqNuXbyKEyPhcyRLIMeTw", "cell_type": "markdown", "source": [ "## Experience Adjustment", @@ -472,7 +441,6 @@ "outputs": [] }, { - "id": "daTkuCMpPE6-KM2VA5EiVA", "cell_type": "code", "source": [ "public interface ExperienceAdjustment: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -491,7 +459,6 @@ "outputs": [] }, { - "id": "7BLBDJJG60imA4l4SJTO8g", "cell_type": "markdown", "source": [ "", @@ -504,7 +471,6 @@ "outputs": [] }, { - "id": "_AULGacqNUum95KZX-PBMg", "cell_type": "code", "source": [ "public interface LicActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -516,7 +482,6 @@ "outputs": [] }, { - "id": "_uefLxRQg0mTthc9-Nq4IA", "cell_type": "markdown", "source": [ "", @@ -529,7 +494,6 @@ "outputs": [] }, { - "id": "zpDmC1m_QkioS6c5DCwG1g", "cell_type": "code", "source": [ "public interface Lic: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -552,7 +516,6 @@ "outputs": [] }, { - "id": "5QxEG_hUsk2V1Qr7j222CA", "cell_type": "markdown", "source": [ "", @@ -565,7 +528,6 @@ "outputs": [] }, { - "id": "a9T_pIpBd0yGYTlAWfXkpw", "cell_type": "code", "source": [ "public interface LrcActuarial: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -581,7 +543,6 @@ "outputs": [] }, { - "id": "pRaL_4nHG02rEuyl_ad4CA", "cell_type": "markdown", "source": [ "", @@ -594,7 +555,6 @@ "outputs": [] }, { - "id": "WO319mP3Y0i-8FXf9phGoQ", "cell_type": "code", "source": [ "public interface Lrc: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -617,7 +577,6 @@ "outputs": [] }, { - "id": "olUh-gLctUKqNfn8A1FU4g", "cell_type": "markdown", "source": [ "", @@ -628,7 +587,6 @@ "outputs": [] }, { - "id": "-pWSLHQ6BEiVRhO7lJSW0w", "cell_type": "markdown", "source": [ "The IFRS 17 Financial Performance aims at disclosing the deltas (i.e. difference between EoP and BoP, or the Change in Estimate) of the IFRS 17 Balance Sheet items (LRC, LIC) and the relevant incurred cashflows (Premiums, Claims, Expenses, etc...) for the given period.", @@ -676,7 +634,6 @@ "outputs": [] }, { - "id": "87HgSSgPc0esWEFkSSQbYg", "cell_type": "markdown", "source": [ "## Fulfillment Cashflows (excluding the Loss Component)" @@ -686,7 +643,6 @@ "outputs": [] }, { - "id": "iRZKr4GKJUypzzUVaj_FaA", "cell_type": "markdown", "source": [ "Let us first describe the Balance Sheet items, where we need to disclose the Changes in Estimate in the Financial Performance.", @@ -713,7 +669,6 @@ "outputs": [] }, { - "id": "yGaOPpu5p0G1MQls1BXj7g", "cell_type": "code", "source": [ "public interface FcfChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -777,7 +732,6 @@ "outputs": [] }, { - "id": "6yzD7vGt10uiK-1r4mR6PQ", "cell_type": "markdown", "source": [ "Subsequently, the Contractual Service Margin (CSM), Loss Component (LC) and Loss Recovery Component (LoReCo) are also divided into non-financial and financial components. In addition the corresponding amortization/releases (CSM Amortization, LC Release and LoReCo Release) are also explicitly shown." @@ -787,7 +741,6 @@ "outputs": [] }, { - "id": "2JE11m-Dn0qxXR5pl8cLEw", "cell_type": "markdown", "source": [ "## Contractual Service Margin (CSM)", @@ -807,7 +760,6 @@ "outputs": [] }, { - "id": "wBzBXtv0WU-4jYPn9U-wjQ", "cell_type": "code", "source": [ "public interface CsmChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -843,7 +795,6 @@ "outputs": [] }, { - "id": "7We5gUppukC5PIKD6AvRtQ", "cell_type": "markdown", "source": [ "## Loss Component (LC)", @@ -863,7 +814,6 @@ "outputs": [] }, { - "id": "1OX7jmo1u0qucu_hK3fc2Q", "cell_type": "code", "source": [ "public interface LcChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -894,7 +844,6 @@ "outputs": [] }, { - "id": "1U-L40Fnh02n4EVojEwt_g", "cell_type": "markdown", "source": [ "## Loss Recovery Component (LoReCo)", @@ -914,7 +863,6 @@ "outputs": [] }, { - "id": "mff2Ff27G0mYqJQPfGD8AA", "cell_type": "code", "source": [ "public interface LorecoChangeInEstimate: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -945,7 +893,6 @@ "outputs": [] }, { - "id": "nXJNTJrviEOmKUkfCkhiiw", "cell_type": "markdown", "source": [ "## Incurred Actuals" @@ -955,7 +902,6 @@ "outputs": [] }, { - "id": "cnTgM4V6M067D6fex6xYiw", "cell_type": "markdown", "source": [ "After the main Balance Sheet items, we need to disclose the Incurred Cashflows (i.e. Actuals) for the period in the Financial Performance (which includes the effect of Advance and Overdue Accruals, but Write-Off amounts are not taken into account).", @@ -973,7 +919,6 @@ "outputs": [] }, { - "id": "GcIzXWU8AUq2EvF-1feb_g", "cell_type": "code", "source": [ "public interface IncurredActuals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -1012,7 +957,6 @@ "outputs": [] }, { - "id": "XJJJPF92_E-e0GD3rJSWQQ", "cell_type": "markdown", "source": [ "## Incurred Deferrals and Acquisition Expenses" @@ -1022,7 +966,6 @@ "outputs": [] }, { - "id": "XSS55G_c7UiKAwnsGXRUPg", "cell_type": "markdown", "source": [ "The next item are the Deferrals, where the Amortization is the only contribution explicitly shown, but these do not have any direct impact on the Financial Performance under the current methodology assumptions. The Amortization contribution is here considered with its sign changed. This contribution is allocated under 'Insurance Service Expense' in 'Acquisition Expenses' section and under 'Insurance Revenue' in 'Acquistion Expenses Amortization' section with a sign change. " @@ -1032,7 +975,6 @@ "outputs": [] }, { - "id": "yvtBdx8DfkC1Ovp_U8RSgw", "cell_type": "code", "source": [ "public interface IncurredDeferrals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -1050,7 +992,6 @@ "outputs": [] }, { - "id": "hDUy7NYvt0yV69m-BBvghQ", "cell_type": "markdown", "source": [ "## Experience Adjustment on Premium (allocation to CSM vs P&L recognition)" @@ -1060,7 +1001,6 @@ "outputs": [] }, { - "id": "ryvagAUg8U6YShWSSB9glg", "cell_type": "markdown", "source": [ "The figures disclosed in the Financial Performance as described above consider full Premiums for past, current and future services (for Best Estimate and Actuals).", @@ -1071,7 +1011,6 @@ "outputs": [] }, { - "id": "sU1M91XJ0UK6I31YdF86mg", "cell_type": "code", "source": [ "public interface ExperienceAdjustmentOnPremium: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -1090,7 +1029,6 @@ "outputs": [] }, { - "id": "AEQ0pDhL5UKqmPJVbk-5dQ", "cell_type": "markdown", "source": [ "## Financial Performance" @@ -1100,7 +1038,6 @@ "outputs": [] }, { - "id": "DptCmibiyESCNqXKLfX2dg", "cell_type": "markdown", "source": [ "As the last step, all the contributions above are calculated and combined into the Financial Performance, which will be used to generate the final report." @@ -1110,7 +1047,6 @@ "outputs": [] }, { - "id": "Ii5nhJOlykOUsHamB2X5pQ", "cell_type": "code", "source": [ "public interface FinancialPerformance: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", @@ -1131,7 +1067,6 @@ "outputs": [] }, { - "id": "YlhbqrDEhEqxO83nS1Jqkg", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Report/ReportStorage.ipynb b/ifrs17/Report/ReportStorage.ipynb index fb5fff54..4effa761 100644 --- a/ifrs17/Report/ReportStorage.ipynb +++ b/ifrs17/Report/ReportStorage.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "1PJN6PAzZkuiz9CSQFSHuQ", "cell_type": "markdown", "source": [ "", @@ -35,7 +34,6 @@ "outputs": [] }, { - "id": "fiz_NudplEqKgTW2opTLTQ", "cell_type": "code", "source": [ "#!import \"ReportConfigurationAndUtils\"" @@ -45,7 +43,6 @@ "outputs": [] }, { - "id": "Y_VqzYOdekWZUm6JV8ylqw", "cell_type": "markdown", "source": [ "# Report Identity" @@ -55,7 +52,6 @@ "outputs": [] }, { - "id": "XDkSxyikzECrdEnqADyjJQ", "cell_type": "code", "source": [ "[IdentityAggregationBehaviour(IdentityAggregationBehaviour.Aggregate)]", @@ -99,7 +95,6 @@ "outputs": [] }, { - "id": "ZDfc2OninkSDvaY7EQF9Rg", "cell_type": "markdown", "source": [ "# Report Storage" @@ -109,7 +104,6 @@ "outputs": [] }, { - "id": "TD8VjJUqrUW3Hya0qH8Lkg", "cell_type": "code", "source": [ "public class ReportStorage {", @@ -234,7 +228,6 @@ "outputs": [] }, { - "id": "X8pPD9yFS0euioBXF3GJyA", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Test/AocConfigurationTest.ipynb b/ifrs17/Test/AocConfigurationTest.ipynb index a19ffac1..2404aa2b 100644 --- a/ifrs17/Test/AocConfigurationTest.ipynb +++ b/ifrs17/Test/AocConfigurationTest.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "RvStBkOdQ0qCjIE9nw6vXg", "cell_type": "markdown", "source": [ "

Test Aoc Configuration

" @@ -26,7 +25,6 @@ "outputs": [] }, { - "id": "Q6WMnHkb20q4NHKjIkv7PQ", "cell_type": "code", "source": [ "#!import \"../CalculationEngine\"" @@ -36,7 +34,6 @@ "outputs": [] }, { - "id": "oErV2qfnK0Oj3-gnLxBzQw", "cell_type": "markdown", "source": [ "# Workspace Initialization " @@ -46,7 +43,6 @@ "outputs": [] }, { - "id": "53B8s-spOkmfP6SngEWjAA", "cell_type": "code", "source": [ "string novelties = ", @@ -61,7 +57,6 @@ "outputs": [] }, { - "id": "ENCsBW3eVEycGgR5HwvThA", "cell_type": "code", "source": [ "await Import.FromString(novelties).WithType().WithTarget(DataSource).ExecuteAsync()" @@ -71,7 +66,6 @@ "outputs": [] }, { - "id": "YBmxdsvzoEGKiEaf5FOOAg", "cell_type": "code", "source": [ "var workspace = Workspace.CreateNew();", @@ -82,7 +76,6 @@ "outputs": [] }, { - "id": "BkjPwerC0E2S87WaUdeOfg", "cell_type": "markdown", "source": [ "# Canonical Aoc Types and Configurations" @@ -92,7 +85,6 @@ "outputs": [] }, { - "id": "5CJAH8_bR0aj6rOjfxeSiw", "cell_type": "code", "source": [ "string canonicalAocTypes = ", @@ -121,7 +113,6 @@ "outputs": [] }, { - "id": "O2-y9gewBEK4CDCWSPoTcg", "cell_type": "code", "source": [ "string canonicalAocConfig = ", @@ -154,7 +145,6 @@ "outputs": [] }, { - "id": "fXmeKnWrMkipdOdvmDEdYg", "cell_type": "markdown", "source": [ "# Test" @@ -164,7 +154,6 @@ "outputs": [] }, { - "id": "1dYHTh43rUip61jayTv9VQ", "cell_type": "code", "source": [ "public async Task CheckAocConfigurationDefault(AocType[] newAocTypes)", @@ -187,7 +176,6 @@ "outputs": [] }, { - "id": "SIYcSk5kNUms-ILsc7Fc9g", "cell_type": "markdown", "source": [ "## NewAoc < RCU" @@ -197,7 +185,6 @@ "outputs": [] }, { - "id": "gCHBZZiJZkKsAgsn81BU8Q", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 25} } );", @@ -208,7 +195,6 @@ "outputs": [] }, { - "id": "Pj5C8V1V4kOJGNPAPZNP7Q", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", @@ -221,7 +207,6 @@ "outputs": [] }, { - "id": "RaeGfGDv20OR0lBo7tL98Q", "cell_type": "markdown", "source": [ "## RCU < NewAoc < CF" @@ -231,7 +216,6 @@ "outputs": [] }, { - "id": "9hBKJlQyeEO9TpeNwxhCqA", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 45} } );", @@ -242,7 +226,6 @@ "outputs": [] }, { - "id": "vSrtK8_4k0uMWWB9xWF-wg", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", @@ -255,7 +238,6 @@ "outputs": [] }, { - "id": "1ipfwQM1NkaeqopEOOGQMQ", "cell_type": "markdown", "source": [ "## IA < NewAoc < YCU" @@ -265,7 +247,6 @@ "outputs": [] }, { - "id": "oCF44mYnYkiJ3b4OyniJDg", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 82} } );", @@ -276,7 +257,6 @@ "outputs": [] }, { - "id": "sEfq7iYvaEmysMRMzhJJRg", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", @@ -289,7 +269,6 @@ "outputs": [] }, { - "id": "Am5-CmdiEUuOaphZ2xGo0g", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", @@ -302,7 +281,6 @@ "outputs": [] }, { - "id": "h9RDWoiWoEmTB_a1jHk7Ag", "cell_type": "markdown", "source": [ "## CRU < NewAoc < EV" @@ -312,7 +290,6 @@ "outputs": [] }, { - "id": "11o-ltR8wk650EqHmKcVlA", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 106} } );", @@ -323,7 +300,6 @@ "outputs": [] }, { - "id": "mW4K3Q9IZUa3eWjVQVy_Bw", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", @@ -336,7 +312,6 @@ "outputs": [] }, { - "id": "Kg_NacjnKEa2gIH1OeS76A", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", @@ -349,7 +324,6 @@ "outputs": [] }, { - "id": "b7L0eUNUmk-CIXbI4j1tOA", "cell_type": "markdown", "source": [ "## EV < NewAoc < WO" @@ -359,7 +333,6 @@ "outputs": [] }, { - "id": "xxKajX96jkyljqCugz69EA", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 116} } );", @@ -370,7 +343,6 @@ "outputs": [] }, { - "id": "LOnPRjuIoEyyt9aiNWiXYA", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", @@ -383,7 +355,6 @@ "outputs": [] }, { - "id": "00jPx2RmPkS5eNv7uftM2A", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", @@ -396,7 +367,6 @@ "outputs": [] }, { - "id": "LcyGd3hXF0uWCX5LKfozug", "cell_type": "markdown", "source": [ "## WO < NewAoc < CL" @@ -406,7 +376,6 @@ "outputs": [] }, { - "id": "KwwQI25owUCfnoQgEbAA6g", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 125} } );", @@ -417,7 +386,6 @@ "outputs": [] }, { - "id": "Kfjgb1gbwkq8DAteZPY4jQ", "cell_type": "code", "source": [ "var newConfigExpected = (await workspace.Query().ToArrayAsync()).First(x => ", @@ -430,7 +398,6 @@ "outputs": [] }, { - "id": "8gHymelTSUy7cigprRzYjA", "cell_type": "markdown", "source": [ "## Two or more Aoc Config with same Order" @@ -440,7 +407,6 @@ "outputs": [] }, { - "id": "WHY91p0GgEi9BppkYtLjew", "cell_type": "code", "source": [ "var aocConfigLog = await CheckAocConfigurationDefault( new[]{ new AocType{SystemName = \"A1\", DisplayName = \"a1\", Order = 111},", @@ -455,7 +421,6 @@ "outputs": [] }, { - "id": "kLp5Mr2wmEGr-avkMByaDg", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Test/QueriesTest.ipynb b/ifrs17/Test/QueriesTest.ipynb index 4b7b2bdc..a3f67136 100644 --- a/ifrs17/Test/QueriesTest.ipynb +++ b/ifrs17/Test/QueriesTest.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "NTIr8pfNRUG9v1rz8xmpmw", "cell_type": "code", "source": [ "#!import \"../CalculationEngine\"" @@ -28,7 +27,6 @@ "outputs": [] }, { - "id": "plOzpIasQkGNAf30KoXM0w", "cell_type": "code", "source": [ "var gic = \"DT1.1\";", @@ -39,7 +37,6 @@ "outputs": [] }, { - "id": "5tdLFj2NXEGuOW74rTYVpQ", "cell_type": "markdown", "source": [ "# Test Load Current and Previous Parameter for Yield Curve" @@ -49,7 +46,6 @@ "outputs": [] }, { - "id": "DWSAoP5ltkaMOSp03MyfIA", "cell_type": "code", "source": [ "Workspace.Reset(x => x.ResetInitializationRules().ResetCurrentPartitions());" @@ -59,7 +55,6 @@ "outputs": [] }, { - "id": "KFB4S_jzpku_e4E1QCF6Cw", "cell_type": "code", "source": [ "public async Task CheckLoadCurrentAndPreviousParameterForYieldCurveAsync(Args args, IEnumerable testData, ", @@ -87,7 +82,6 @@ "outputs": [] }, { - "id": "YR7Ds1eSw0eeuBWg6pC_tQ", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -99,7 +93,6 @@ "outputs": [] }, { - "id": "bGwUfhJAL0WVLcJwx-g1Zg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", @@ -112,7 +105,6 @@ "outputs": [] }, { - "id": "pHPnD9INVECBXJCkAZQECg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -124,7 +116,6 @@ "outputs": [] }, { - "id": "KGJ2HY_UdEuIxuNWoAdNAw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", @@ -137,7 +128,6 @@ "outputs": [] }, { - "id": "jpLrgab2eEWK83fcpK6ukA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -150,7 +140,6 @@ "outputs": [] }, { - "id": "679b2tiitkmmP1P-PKnNYQ", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", @@ -163,7 +152,6 @@ "outputs": [] }, { - "id": "axsxcDx2K0aO6jgzo7jliw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,scenario);", @@ -176,7 +164,6 @@ "outputs": [] }, { - "id": "ycXFIXbC_0aw9Kv0vxBhwA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -189,7 +176,6 @@ "outputs": [] }, { - "id": "ek8T4yoF8kibcfRRiC9LGw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -202,7 +188,6 @@ "outputs": [] }, { - "id": "19ioyaUzHkqelLWINjrBJQ", "cell_type": "code", "source": [ "var args = new Args(\"EUR\",2020,9,Periodicity.Monthly,scenario);", @@ -216,7 +201,6 @@ "outputs": [] }, { - "id": "U1iy3VALHESu8R42kYbXpg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -229,7 +213,6 @@ "outputs": [] }, { - "id": "8LEJFkLz7UObFQjBwvOxjg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -242,7 +225,6 @@ "outputs": [] }, { - "id": "X6DmfAY4XkewNDJ2FNoMSw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -256,7 +238,6 @@ "outputs": [] }, { - "id": "ofyBo-TEyESmYRURsUqWsg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly, scenario);", @@ -271,7 +252,6 @@ "outputs": [] }, { - "id": "9rf-JkSGr0uNL5SeX9Klgg", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -286,7 +266,6 @@ "outputs": [] }, { - "id": "rj4pcMyboE-oEhMl3Rs5-w", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -302,7 +281,6 @@ "outputs": [] }, { - "id": "TSlFdPDzxk6CAkX57WjS_A", "cell_type": "markdown", "source": [ "# Test Data Node State Query" @@ -312,7 +290,6 @@ "outputs": [] }, { - "id": "7UZrdvTKHUqRUDxSqwFsXQ", "cell_type": "code", "source": [ "public async Task CheckLoadDataNodeStateAsync(Args args, IEnumerable testData, bool isExpectedToBeActive)", @@ -331,7 +308,6 @@ "outputs": [] }, { - "id": "3frqAxWAb0-iRoIjC0x0bA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", @@ -344,7 +320,6 @@ "outputs": [] }, { - "id": "x5o02N_2yEqNFaUnCf27LA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,12,Periodicity.Monthly,null);", @@ -357,7 +332,6 @@ "outputs": [] }, { - "id": "tEke28UUmk63X5X3t8-NZQ", "cell_type": "markdown", "source": [ "# Test Load Yield Curve" @@ -367,7 +341,6 @@ "outputs": [] }, { - "id": "Yg49scOm9kC3fsYCLvns2Q", "cell_type": "code", "source": [ "public async Task CheckLoadYieldCurveAsync(Args args, IEnumerable testData, ", @@ -407,7 +380,6 @@ "outputs": [] }, { - "id": "m3_gugcNbk-GBVbWxV57Gw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -423,7 +395,6 @@ "outputs": [] }, { - "id": "oqe6zXHpG0GJbLONZfGj3w", "cell_type": "markdown", "source": [ "# Test Load Data Node Parameter" @@ -433,7 +404,6 @@ "outputs": [] }, { - "id": "5MJtyunB80GSP-alkKjOwA", "cell_type": "code", "source": [ "var gic2 = \"gic2\";", @@ -445,7 +415,6 @@ "outputs": [] }, { - "id": "lUU-biiLX0ibSzMuSzMh5A", "cell_type": "code", "source": [ "public async Task CheckLoadInterDataNodeParameterAsync(Args args, IEnumerable testData, ", @@ -538,7 +507,6 @@ "outputs": [] }, { - "id": "4RaLKB7k-UajGf1Y1Zu6fQ", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -556,7 +524,6 @@ "outputs": [] }, { - "id": "GeSYU4-OaUO9yOc8NBoZCw", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -578,7 +545,6 @@ "outputs": [] }, { - "id": "ZQ0UWivBMkaecxy1ZES6TQ", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -597,7 +563,6 @@ "outputs": [] }, { - "id": "t4W8kuYz4EWT7eheyHepVA", "cell_type": "code", "source": [ "var args = new Args(\"CH\",2020,9,Periodicity.Monthly,null);", @@ -616,7 +581,6 @@ "outputs": [] }, { - "id": "kkwtnEW9N0WyXdhPCi9tIQ", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Test/Tests.ipynb b/ifrs17/Test/Tests.ipynb index 94626ecf..e2f0e955 100644 --- a/ifrs17/Test/Tests.ipynb +++ b/ifrs17/Test/Tests.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "tIV7Q4vx8UeFi8kmrwPcEg", "cell_type": "markdown", "source": [ "

Tests

" @@ -26,7 +25,6 @@ "outputs": [] }, { - "id": "afu9qRQM0EK0X8DYxEDABQ", "cell_type": "code", "source": [ "#!eval-notebook \"AocConfigurationTest\"" @@ -36,7 +34,6 @@ "outputs": [] }, { - "id": "eiuXjlas1kCmW7Fty4gKoQ", "cell_type": "code", "source": [ "#!eval-notebook \"QueriesTest\"" diff --git a/ifrs17/Utils/ApplicationMessage.ipynb b/ifrs17/Utils/ApplicationMessage.ipynb index fe7025d8..8f3dfbd6 100644 --- a/ifrs17/Utils/ApplicationMessage.ipynb +++ b/ifrs17/Utils/ApplicationMessage.ipynb @@ -19,7 +19,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "wLzDwTbQ9Uaiyx6Djl_hGQ", "cell_type": "markdown", "source": [ "

Application Message

" @@ -29,7 +28,6 @@ "outputs": [] }, { - "id": "de93et2JM0KcfJdU0ydEuw", "cell_type": "code", "source": [ "#!import \"../Constants/Validations\"", @@ -40,7 +38,6 @@ "outputs": [] }, { - "id": "CZ5guP7mh0mpnrz00G3S0g", "cell_type": "code", "source": [ "using Microsoft.Extensions.Logging;", @@ -68,7 +65,6 @@ "outputs": [] }, { - "id": "VQkVErt-S0290QjxpeU_pg", "cell_type": "code", "source": [ "ApplicationMessage.Configure(Log, Activity)" @@ -78,7 +74,6 @@ "outputs": [] }, { - "id": "drAxOrfkYUW3-64_fh5Ddw", "cell_type": "markdown", "source": [ "# Utils" @@ -88,7 +83,6 @@ "outputs": [] }, { - "id": "JhD11IJpqEe5iKVccpEdOg", "cell_type": "code", "source": [ "public static bool HasErrors (this ActivityLog[] logs) {", @@ -103,7 +97,6 @@ "outputs": [] }, { - "id": "-nHLgnv6CkGmjrCtmn-FfQ", "cell_type": "code", "source": [ "public static ActivityLog Merge (this ActivityLog a, ActivityLog b) {", @@ -132,7 +125,6 @@ "outputs": [] }, { - "id": "sYT7OFkE8Eu3GY-TUwLWdQ", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Utils/EqualityComparers.ipynb b/ifrs17/Utils/EqualityComparers.ipynb index 39d798e8..c8cde44b 100644 --- a/ifrs17/Utils/EqualityComparers.ipynb +++ b/ifrs17/Utils/EqualityComparers.ipynb @@ -16,7 +16,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "ogmxH-FTpEGc4-ymE-mFYg", "cell_type": "markdown", "source": [ "

Equality Comparers

" @@ -26,7 +25,6 @@ "outputs": [] }, { - "id": "-Y69asl-c0OSbbvFliOOCg", "cell_type": "code", "source": [ "#!import \"../DataModel/DataStructure\"" @@ -36,7 +34,6 @@ "outputs": [] }, { - "id": "cewEsMJ9cUyBQhfByCbaAg", "cell_type": "code", "source": [ "class RawVariableComparer: IEqualityComparer", @@ -66,7 +63,6 @@ "outputs": [] }, { - "id": "sWecJZ9b5UWdmf2iaZSduA", "cell_type": "code", "source": [ "class IfrsVariableComparer: IEqualityComparer", @@ -96,7 +92,6 @@ "outputs": [] }, { - "id": "dxFBW3aXtEeO1ZVIRlC_XA", "cell_type": "code", "source": [ "using System;", @@ -115,7 +110,6 @@ "outputs": [] }, { - "id": "ejquQGmoSEK5L6HGwXrM9A", "cell_type": "code", "source": [ "class EqualityComparer : IEqualityComparer", @@ -154,7 +148,6 @@ "outputs": [] }, { - "id": "dQkdrzS8s0i1J4MQfOER6w", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Utils/Extensions.ipynb b/ifrs17/Utils/Extensions.ipynb index 898a83a4..a403aeff 100644 --- a/ifrs17/Utils/Extensions.ipynb +++ b/ifrs17/Utils/Extensions.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "37QLGftFt0GR52lqdw-HNQ", "cell_type": "markdown", "source": [ "

Extention Methods (this IList array, int index)\"? ", @@ -71,7 +67,6 @@ "outputs": [] }, { - "id": "A-JqTxL5pE21nMgEZ1JTAg", "cell_type": "code", "source": [ "public static Dictionary ToDictionaryGrouped(this IEnumerable source, Func keySelector, Func, TResult> elementSelector) => source.GroupBy(keySelector).ToDictionary(g => g.Key, elementSelector);" @@ -81,7 +76,6 @@ "outputs": [] }, { - "id": "MAeKIQ5QvECLkH8cmeI75w", "cell_type": "code", "source": [ "public static IDataCube SelectToDataCube(this IEnumerable source, Func whereClause, Func selector) => source.Where(whereClause).Select(selector).ToDataCube();" @@ -91,7 +85,6 @@ "outputs": [] }, { - "id": "izvvatd1rE21dda6NHFZPg", "cell_type": "code", "source": [ "public static IDataCube SelectToDataCube(this IEnumerable source, Func selector) => source.SelectToDataCube(x => true, selector);" @@ -101,7 +94,6 @@ "outputs": [] }, { - "id": "bNj5qyvo3kue3cwR_5Azsw", "cell_type": "code", "source": [ "public static double[] Prune (this IEnumerable source, double precision = Precision) => source.Reverse().SkipWhile(x => Math.Abs(x) < precision).Reverse().ToArray();" @@ -111,7 +103,6 @@ "outputs": [] }, { - "id": "DrWpMND_l0mojje8dHygRA", "cell_type": "markdown", "source": [ "# String Extensions" @@ -121,7 +112,6 @@ "outputs": [] }, { - "id": "s2mmvm2-A02lMpUVEQb-4A", "cell_type": "code", "source": [ "using System.Globalization;" @@ -131,7 +121,6 @@ "outputs": [] }, { - "id": "Bnfm2rWKHEme4-DjALszfQ", "cell_type": "code", "source": [ "public static double CheckStringForExponentialAndConvertToDouble (this string s)", @@ -146,7 +135,6 @@ "outputs": [] }, { - "id": "CMA8w5ro8UGCKdLzCLQZjg", "cell_type": "markdown", "source": [ "# Enum Extentions" @@ -156,7 +144,6 @@ "outputs": [] }, { - "id": "7PBYRiDYtUCiAzeiZoNS3Q", "cell_type": "code", "source": [ "public static bool Contains(this T value, T lookingForFlag) ", @@ -172,7 +159,6 @@ "outputs": [] }, { - "id": "kJ91UizKf0eoJht6A0xCgw", "cell_type": "markdown", "source": [ "# ToIdentityString" @@ -182,7 +168,6 @@ "outputs": [] }, { - "id": "v_U3DILjyUqmOf__msiQCw", "cell_type": "code", "source": [ "using System.Text;", @@ -202,7 +187,6 @@ "outputs": [] }, { - "id": "72YmbK18UEC9lOicYn7zRQ", "cell_type": "code", "source": [ "" diff --git a/ifrs17/Utils/ImportCalculationMethods.ipynb b/ifrs17/Utils/ImportCalculationMethods.ipynb index 81b9d57d..c5db1a05 100644 --- a/ifrs17/Utils/ImportCalculationMethods.ipynb +++ b/ifrs17/Utils/ImportCalculationMethods.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "dm2BpbZSZ0y3Rm2xKWMh0A", "cell_type": "markdown", "source": [ "

Import Calculation Methods > GetPreviousIdentities(IEnumerable identities)", @@ -68,7 +64,6 @@ "outputs": [] }, { - "id": "Q-zkjr-DsUye5AKQihTa6w", "cell_type": "markdown", "source": [ "# Get Reference AocStep for calculated steps" @@ -78,7 +73,6 @@ "outputs": [] }, { - "id": "oMMELTAwO02FIHDVa5WP8w", "cell_type": "code", "source": [ "public static AocStep GetReferenceAocStepForCalculated(this IEnumerable identities, Dictionary aocConfigurationByAocStep, AocStep identityAocStep)", @@ -95,7 +89,6 @@ "outputs": [] }, { - "id": "IyQ1h7IPzUqnUGBTT9vlWA", "cell_type": "markdown", "source": [ "# Discount and Cumulate" @@ -105,7 +98,6 @@ "outputs": [] }, { - "id": "COS5E2hpRka2paEchEV85A", "cell_type": "code", "source": [ "public static double[] ComputeDiscountAndCumulate(this double[] nominalValues, double[] monthlyDiscounting, PeriodType periodType) ", @@ -132,7 +124,6 @@ "outputs": [] }, { - "id": "1jcSQCWC-UOP2rpI3vcXhw", "cell_type": "code", "source": [ "public static double[] ComputeDiscountAndCumulateWithCreditDefaultRisk(this double[] nominalValues, double[] monthlyDiscounting, double nonPerformanceRiskRate) //Is it correct that NonPerformanceRiskRate is a double? Should it be an array that takes as input tau/t?", @@ -149,7 +140,6 @@ "outputs": [] }, { - "id": "peOs8OplG0Km9WLVYerNLg", "cell_type": "markdown", "source": [ "# Import Configuration " @@ -159,7 +149,6 @@ "outputs": [] }, { - "id": "C-ywsGdsCUqqw4-y32DtDA", "cell_type": "markdown", "source": [ "## Data Nodes" @@ -169,7 +158,6 @@ "outputs": [] }, { - "id": "FaimY7RfJU28U8LOflKePQ", "cell_type": "code", "source": [ "public GroupOfInsuranceContract ExtendGroupOfContract(GroupOfInsuranceContract gic, IDataRow datarow) => gic;" @@ -179,7 +167,6 @@ "outputs": [] }, { - "id": "D0amuqeOkkmg6Bgrns581A", "cell_type": "code", "source": [ "public GroupOfReinsuranceContract ExtendGroupOfContract(GroupOfReinsuranceContract gric, IDataRow datarow) => gric;" @@ -189,7 +176,6 @@ "outputs": [] }, { - "id": "w1toWOQWFEy8EQVu7pTCng", "cell_type": "markdown", "source": [ "## Change Sign Rules" @@ -199,7 +185,6 @@ "outputs": [] }, { - "id": "et9tX4p4UkuwJsMFOuKnHw", "cell_type": "code", "source": [ "public static int GetSign((string AocType, string AmountType, string EstimateType, bool IsReinsurance) variable, Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache) => 1;" @@ -209,7 +194,6 @@ "outputs": [] }, { - "id": "_FOFZ-JqNEC7R6nwFYMFUg", "cell_type": "markdown", "source": [ "## EstimateType And AmountType" @@ -219,7 +203,6 @@ "outputs": [] }, { - "id": "3DI_KVkmz0KSb_7hr6gpSQ", "cell_type": "code", "source": [ "public static Dictionary> GetAmountTypesByEstimateType(Systemorph.Vertex.Hierarchies.IHierarchicalDimensionCache hierarchyCache)", @@ -237,7 +220,6 @@ "outputs": [] }, { - "id": "K8et8EQkfk-iSDvi3aF6sw", "cell_type": "markdown", "source": [ "## Technical Margin EstimateType" @@ -247,7 +229,6 @@ "outputs": [] }, { - "id": "tqX2rC2hv0q0W8nRW9Ug0g", "cell_type": "code", "source": [ "public static HashSet GetTechnicalMarginEstimateType()", diff --git a/ifrs17/Utils/Queries.ipynb b/ifrs17/Utils/Queries.ipynb index 9f3dfef8..54efbb41 100644 --- a/ifrs17/Utils/Queries.ipynb +++ b/ifrs17/Utils/Queries.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "fbab8KjyQkyLiXKGJyfa2A", "cell_type": "markdown", "source": [ "

Queries >> GetExchangeRatesDictionaryAsync(this IQuerySource querySource, int year, int month)", @@ -80,7 +75,6 @@ "outputs": [] }, { - "id": "9oo-zuul8EKzrnCJFAzqQQ", "cell_type": "markdown", "source": [ "# Current and Previous Parameters" @@ -90,7 +84,6 @@ "outputs": [] }, { - "id": "HuKjnIgTUEaGC4yIEllZdg", "cell_type": "code", "source": [ "public static async Task LoadParameterAsync(", @@ -111,7 +104,6 @@ "outputs": [] }, { - "id": "em1hxyD6qEqWWc6s02QdKA", "cell_type": "code", "source": [ "public static async Task> LoadCurrentParameterAsync (", @@ -136,7 +128,6 @@ "outputs": [] }, { - "id": "7CWHPi_ERU-LT0Hkk1MSGQ", "cell_type": "code", "source": [ "public static async Task>> LoadCurrentAndPreviousParameterAsync (", @@ -171,7 +162,6 @@ "outputs": [] }, { - "id": "Ot_9jtjxvk6ShPq6_QndnA", "cell_type": "markdown", "source": [ "", @@ -182,7 +172,6 @@ "outputs": [] }, { - "id": "H6u21U5weU65vzmg7twmhw", "cell_type": "markdown", "source": [ "## Locked-in" @@ -192,7 +181,6 @@ "outputs": [] }, { - "id": "3u_OXnhOjkKNpNivnkOuYQ", "cell_type": "code", "source": [ "public static async Task> LoadLockedInYieldCurveAsync(this IQuerySource querySource, Args args, ", @@ -218,7 +206,6 @@ "outputs": [] }, { - "id": "ZQl3LDNHKUCgaIvyB6G62w", "cell_type": "markdown", "source": [ "## Current" @@ -228,7 +215,6 @@ "outputs": [] }, { - "id": "4uLD-gkkTU2DzKqGAi4WKg", "cell_type": "code", "source": [ "public static async Task>> LoadCurrentYieldCurveAsync(this IQuerySource querySource, Args args, ", @@ -246,7 +232,6 @@ "outputs": [] }, { - "id": "WVEn8m01vUW4RRliQ5T0-g", "cell_type": "markdown", "source": [ "# Data Node State" @@ -256,7 +241,6 @@ "outputs": [] }, { - "id": "9VQcw0Oh20G7E1m1XrBZcw", "cell_type": "code", "source": [ "public static async Task> LoadDataNodeStateAsync(this IQuerySource querySource, Args args)", @@ -271,7 +255,6 @@ "outputs": [] }, { - "id": "SxQLPtHgQ0ep3YzMpxVbUg", "cell_type": "markdown", "source": [ "# Data Nodes" @@ -281,7 +264,6 @@ "outputs": [] }, { - "id": "pfrZAbrPnUqrtPaJDeIUyg", "cell_type": "code", "source": [ "public static async Task> LoadDataNodesAsync(this IQuerySource querySource, Args args)", @@ -319,7 +301,6 @@ "outputs": [] }, { - "id": "Oew7zanlnUKPlmBc2trXBQ", "cell_type": "markdown", "source": [ "# Data Node Parameters" @@ -329,7 +310,6 @@ "outputs": [] }, { - "id": "Mj2iGP3LDkKeLA7Cd8W7BA", "cell_type": "markdown", "source": [ "## Single data Node" @@ -339,7 +319,6 @@ "outputs": [] }, { - "id": "YRhKcQ4Mzk2fcTyvycCDAw", "cell_type": "code", "source": [ "public static async Task>> LoadSingleDataNodeParametersAsync(this IQuerySource querySource, Args args)", @@ -352,7 +331,6 @@ "outputs": [] }, { - "id": "W-tpkmQTjkeAKd9P26BEKA", "cell_type": "markdown", "source": [ "## Inter data Node" @@ -362,7 +340,6 @@ "outputs": [] }, { - "id": "563xeprOJU2gJV_TNxa4GA", "cell_type": "code", "source": [ "public static async Task>>> LoadInterDataNodeParametersAsync(this IQuerySource querySource, Args args)", @@ -392,7 +369,6 @@ "outputs": [] }, { - "id": "pWmi0o2H60SDDht7Au0x-g", "cell_type": "markdown", "source": [ "# Aoc Step Configuration" @@ -402,7 +378,6 @@ "outputs": [] }, { - "id": "IbK-mlyTFEeWmk4cJZQNqw", "cell_type": "code", "source": [ "public static async Task> LoadAocStepConfigurationAsync(this IQuerySource querySource, int year, int month)", @@ -415,7 +390,6 @@ "outputs": [] }, { - "id": "p4-Lxx_SzkWaUMWcuregEQ", "cell_type": "code", "source": [ "public static async Task> LoadAocStepConfigurationAsDictionaryAsync(this IQuerySource querySource, int year, int month) ", diff --git a/ifrs17/Utils/TestHelper.ipynb b/ifrs17/Utils/TestHelper.ipynb index 756fe07e..6ae41a17 100644 --- a/ifrs17/Utils/TestHelper.ipynb +++ b/ifrs17/Utils/TestHelper.ipynb @@ -18,7 +18,6 @@ "nbformat_minor": 5, "cells": [ { - "id": "qY8DKa9dQUWTSl9qUoJHmA", "cell_type": "markdown", "source": [ "

Test Helper Methods WithGridOptionsForIfrsVariable", From 4ca49d08a8ac43cf3913c9532087f40b27db1e4a Mon Sep 17 00:00:00 2001 From: Daniel Trzesniak Date: Wed, 16 Nov 2022 13:47:46 +0100 Subject: [PATCH 32/43] Signs and actuals (#77) * Input Data * Inputs * remove all the AA OA stuff from CSM and PL * Adding WO in FP * Adding BOP N to the delta in LRC/LIC reports * signs * flipping WO sign in FP * Adding Over example * adjust examples * docu * last example * Last corrections * Update ref BM * Some changes to BM generation * Adding RI * OverviewCalculationEngine * Correct APA * More test data * signs of Ri * Bm sorting * RV bm * Text * BM * test update * Metadata * Fix merge * fix OverviewCalculationEngine * Fix --- .../DataNodeParameters_CH_2020_12.csv | 4 + .../DataNodes/DataNodeStates_CH_2020_12.csv | 4 + .../Files/DataNodes/DataNodes_CH.csv | 14 +- full-ifrs17-template/Files/Dimensions.csv | 14 +- .../TransactionalData/Actuals_CH_2020_12.csv | 22 + .../TransactionalData/Actuals_CH_2021_3.csv | 50 +- .../NominalCashflows_CH_2020_12.csv | 32 + .../NominalCashflows_CH_2021_3.csv | 62 + .../BM_CH_2020_12_AA.csv | 8 - .../BM_CH_2020_12_BE.csv | 181 -- .../BM_CH_2020_12_C.csv | 40 - .../BM_CH_2020_12_DA.csv | 20 - .../BM_CH_2020_12_F.csv | 16 - .../BM_CH_2020_12_MTUP10pct_BE.csv | 104 +- .../BM_CH_2020_12_MTUP10pct_C.csv | 34 +- .../BM_CH_2020_12_MTUP10pct_F.csv | 4 +- .../BM_CH_2020_12_MTUP10pct_L.csv | 18 +- .../BM_CH_2020_12_MTUP10pct_RA.csv | 48 +- .../BM_CH_2020_12_OA.csv | 8 - .../BM_CH_2020_12_RA.csv | 94 - ..._CH_2020_12_A.csv => BM_CH_2020_12__A.csv} | 25 +- .../BM_CH_2020_12__AA.csv | 15 + ...2020_12_APA.csv => BM_CH_2020_12__APA.csv} | 8 +- .../BM_CH_2020_12__BE.csv | 277 ++ ...20_12_BEPA.csv => BM_CH_2020_12__BEPA.csv} | 6 +- .../BM_CH_2020_12__C.csv | 63 + .../BM_CH_2020_12__DA.csv | 29 + .../BM_CH_2020_12__F.csv | 21 + .../BM_CH_2020_12__OA.csv | 19 + .../BM_CH_2020_12__RA.csv | 133 + .../BM_CH_2021_3_AA.csv | 26 - .../BM_CH_2021_3_AAPA.csv | 11 - .../BM_CH_2021_3_BE.csv | 471 --- .../IfrsVariableBenchmarks/BM_CH_2021_3_C.csv | 54 - .../BM_CH_2021_3_DA.csv | 24 - .../IfrsVariableBenchmarks/BM_CH_2021_3_F.csv | 16 - .../IfrsVariableBenchmarks/BM_CH_2021_3_L.csv | 23 - .../BM_CH_2021_3_LR.csv | 13 - .../BM_CH_2021_3_OA.csv | 26 - .../BM_CH_2021_3_OAPA.csv | 11 - .../BM_CH_2021_3_RA.csv | 215 -- ...BM_CH_2021_3_A.csv => BM_CH_2021_3__A.csv} | 61 +- .../BM_CH_2021_3__AA.csv | 17 + ...H_2021_3_APA.csv => BM_CH_2021_3__APA.csv} | 9 +- .../BM_CH_2021_3__BE.csv | 681 +++++ ...2021_3_BEPA.csv => BM_CH_2021_3__BEPA.csv} | 7 +- .../BM_CH_2021_3__C.csv | 82 + .../BM_CH_2021_3__DA.csv | 32 + .../BM_CH_2021_3__F.csv | 20 + .../BM_CH_2021_3__L.csv | 31 + .../BM_CH_2021_3__LR.csv | 21 + .../BM_CH_2021_3__OA.csv | 21 + .../BM_CH_2021_3__RA.csv | 290 ++ ...ableBenchmarks_2020_12_CH__Contractual.csv | 1448 +++++---- ...iableBenchmarks_2021_3_CH__Contractual.csv | 2670 ++++++++++------- .../Test/ExportReportVariables.ipynb | 11 +- .../Test/IfrsVariablesTest.ipynb | 48 +- .../Test/ReportVariablesTest.ipynb | 27 + .../Test/ReportVariablesTestBase.ipynb | 15 +- ifrs17/Constants/Consts.ipynb | 2 - ifrs17/Import/ImportScopeCalculation.ipynb | 30 +- ifrs17/Import/ImportStorage.ipynb | 2 +- ifrs17/OverviewCalculationEngine.ipynb | 63 +- ifrs17/Report/ReportScopes.ipynb | 29 +- 64 files changed, 4646 insertions(+), 3234 deletions(-) delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv rename full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/{BM_CH_2020_12_A.csv => BM_CH_2020_12__A.csv} (66%) create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__AA.csv rename full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/{BM_CH_2020_12_APA.csv => BM_CH_2020_12__APA.csv} (71%) create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BE.csv rename full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/{BM_CH_2020_12_BEPA.csv => BM_CH_2020_12__BEPA.csv} (70%) create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__C.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__DA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__F.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__OA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__RA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv rename full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/{BM_CH_2021_3_A.csv => BM_CH_2021_3__A.csv} (72%) create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__AA.csv rename full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/{BM_CH_2021_3_APA.csv => BM_CH_2021_3__APA.csv} (77%) create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BE.csv rename full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/{BM_CH_2021_3_BEPA.csv => BM_CH_2021_3__BEPA.csv} (74%) create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__C.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__DA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__F.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__L.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__LR.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__OA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__RA.csv diff --git a/full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv b/full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv index 19a655dc..0e17cb6d 100644 --- a/full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv +++ b/full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv @@ -8,6 +8,8 @@ GicComplex,0.8, DT1.1,0.8, DT1.2,0.8, DT1.3,1, +DT1.4,0.8, +DT1.5,0.8, DT2.1,0.8, DT2.2,0.8, DT3.1,0.8, @@ -17,6 +19,8 @@ DT4.1,0.8, DataNode,LinkedDataNode,ReinsuranceCoverage DT1.1,DTR1.1,1 DT1.2,DTR1.2,1 +DT1.4,DTR1.3,1 +DT1.5,DTR1.4,1 DT2.1,DTR2.1,1 DT2.2,DTR2.2,1 GricComplex,GicComplex,1 diff --git a/full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv b/full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv index 14a81d65..8aad64e9 100644 --- a/full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv +++ b/full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv @@ -9,6 +9,8 @@ GricComplex,Active, DT1.1,Active, DT1.2,Active, DT1.3,Active, +DT1.4,Active, +DT1.5,Active, DT2.1,Active, DT2.2,Active, DT3.1,Active, @@ -16,5 +18,7 @@ DT4.1,Active, DT5.1,Active, DTR1.1,Active, DTR1.2,Active, +DTR1.3,Active, +DTR1.4,Active, DTR2.1,Active, DTR2.2,Active, diff --git a/full-ifrs17-template/Files/DataNodes/DataNodes_CH.csv b/full-ifrs17-template/Files/DataNodes/DataNodes_CH.csv index 8862c011..c694756e 100644 --- a/full-ifrs17-template/Files/DataNodes/DataNodes_CH.csv +++ b/full-ifrs17-template/Files/DataNodes/DataNodes_CH.csv @@ -1,7 +1,7 @@ @@Main,,,,,, ReportingNode,,,,,, CH,,,,,, - +,,,,,, @@InsurancePortfolio,,,,,, SystemName,DisplayName,ContractualCurrency,LineOfBusiness,ValuationApproach,OciType, DT,DT Complex CF,USD,ANN,BBA,Default, @@ -9,30 +9,34 @@ DT1,DT1 OCI,USD,ANN,BBA,Default, DT2,DT2 NOCI,USD,ANN,BBA,, DT3,DT3 RunOff,USD,ANN,BBA,Default, DT4,DT4 OCI,USD,ANN,BBA,Default, -DT5,DT5 Simple Import,USD,ANN,BBA,Default - +DT5,DT5 Simple Import,USD,ANN,BBA,Default, +,,,,,, @@GroupOfInsuranceContract,,,,,, SystemName,DisplayName,InsurancePortfolio,AnnualCohort,LiabilityType,Profitability, GicComplex,Gic test discounting,DT,2020,LRC,P, DT1.1,DT1.1 OCI LRC PA 0.8,DT1,2020,LRC,P, DT1.2,DT1.2 OCI LIC,DT1,2020,LIC,P, DT1.3,DT1.3 OCI LRC PA 1,DT1,2020,LRC,P, +DT1.4,DT1.4 Adv and Ove Actuals on DT1.1,DT1,2020,LRC,P, +DT1.5,DT1.5 OA and WO Premium on DT1.1,DT1,2020,LRC,P, DT2.1,DT2.1 NOCI LRC PA 0.8,DT2,2020,LRC,P, DT2.2,DT2.2 NOCI LIC,DT2,2020,LIC,P, DT3.1,DT3.1 Runoff - PA 0.8,DT3,2020,LRC,P, DT4.1,DT4.1 CSM PA 0.8,DT4,2020,LRC,P, DT5.1,DT5.1 Simple Import on DT 4.1,DT5,2020,LRC,P, - +,,,,,, @@ReinsurancePortfolio,,,,,, SystemName,DisplayName,ContractualCurrency,LineOfBusiness,ValuationApproach,OciType, DTR,DTR complex CF,USD,ANN,BBA,, DTR1,DTR1 OCI,USD,ANN,BBA,Default, DTR2,DTR2 NOCI,USD,ANN,BBA,, - +,,,,,, @@GroupOfReinsuranceContract,,,,,, SystemName,DisplayName,ReinsurancePortfolio,AnnualCohort,LiabilityType,Profitability,Partner GricComplex,Gric test for discounting,DTR,2020,LRC,P,PT1 DTR1.1,DTR1.1 OCI LRC,DTR1,2020,LRC,P,PT1 DTR1.2,DTR1.2 OCI LIC,DTR1,2020,LIC,P,PT1 +DTR1.3,DTR1.3 Adv and Ove Actuals on DTR1.1,DTR1,2020,LRC,P,PT1 +DTR1.4,DTR1.4 OA and WO Claims on DTR1.1,DTR1,2020,LRC,P,PT1 DTR2.1,DTR2.1 NOCI LRC,DTR2,2020,LRC,P,PT1 DTR2.2,DTR2.2 NOCI LIC,DTR2,2020,LIC,P,PT1 diff --git a/full-ifrs17-template/Files/Dimensions.csv b/full-ifrs17-template/Files/Dimensions.csv index 6f61a39c..63f91bdb 100644 --- a/full-ifrs17-template/Files/Dimensions.csv +++ b/full-ifrs17-template/Files/Dimensions.csv @@ -1,8 +1,8 @@ @@AmountType,,,,,,,,,,, -SystemName,DisplayName,Parent,Order,PeriodType,ExternalId0,ExternalId1,,,,, -PR,Premiums,,10,BeginningOfPeriod,PayablePR,ReceivablePR,,,,, +SystemName,DisplayName,Parent,Order,PeriodType,ExternalId0,ExternalId1,ExternalId2,ExternalId3,,, +PR,Premiums,,10,BeginningOfPeriod,PayablePR,ReceivablePR,RiPayablePR,RiReceivablePR,,, CL,Claims,,20,EndOfPeriod,,,,,,, -NIC,Non Investment Component,CL,30,EndOfPeriod,PayableNIC,ReceivableNIC,,,,, +NIC,Non Investment Component,CL,30,EndOfPeriod,PayableNIC,ReceivableNIC,RiPayableNIC,RiReceivableNIC,,, ICO,Investment Component,CL,40,EndOfPeriod,PayableICO,ReceivableICO,,,,, CDR,Credit Default Risk,CL,50,EndOfPeriod,,,,,,, CE,Claim Expenses,CL,200,EndOfPeriod,,,,,,, @@ -109,7 +109,7 @@ L,Locked-in,10,,,,,,,,, C,Current,20,,,,,,,,, ,,,,,,,,,,, @@EstimateType,,,,,,,,,,, -SystemName,DisplayName,Order,StructureType,InputSource,PeriodType,ExternalId0,ExternalId1,ExternalId2,,, +SystemName,DisplayName,Order,StructureType,InputSource,PeriodType,ExternalId0,ExternalId1,ExternalId2,ExternalId3,ExternalId4, BE,Best Estimate of Present Value,1,AoC,4,EndOfPeriod,,,,,, RA,Risk Adjustment,10,AoC,4,EndOfPeriod,,,,,, CU,CoverageUnit,15,AoC,4,EndOfPeriod,,,,,, @@ -117,13 +117,11 @@ C,Contractual Service Margin,20,AoC,7,NotApplicable,,,,,, L,Loss Component,30,AoC,7,NotApplicable,,,,,, LR,Loss Recovery Component,40,AoC,7,NotApplicable,,,,,, PL,Profit and Loss,50,None,7,NotApplicable,,,,,, -AA,Advance Actuals,60,AoC,3,NotApplicable,PayablePR,ReceivableNIC,ReceivableICO,,, -OA,Overdue Actuals,70,AoC,3,NotApplicable,ReceivablePR,PayableNIC,PayableICO,,, +AA,Advance Actuals,60,AoC,3,NotApplicable,PayablePR,ReceivableNIC,ReceivableICO,RiReceivablePR,RiPayableNIC, +OA,Overdue Actuals,70,AoC,3,NotApplicable,ReceivablePR,PayableNIC,PayableICO,RiPayablePR,RiReceivableNIC, DA,Deferrable Actuals,80,AoC,3,NotApplicable,,,,,, A,Actuals,90,None,2,NotApplicable,,,,,, F,Factors,100,None,4,NotApplicable,,,,,, -AAPA,Advance Actuals,110,None,2,NotApplicable,,,,,, -OAPA,Overdue Actuals,120,None,2,NotApplicable,,,,,, APA,Actuals,130,None,2,NotApplicable,,,,,, BEPA,Best Estimate of Present Value,140,None,4,NotApplicable,,,,,, ,,,,,,,,,,, diff --git a/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv index 9a97158a..ae6b2620 100644 --- a/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv +++ b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv @@ -16,6 +16,14 @@ DT1.3,CF,PR,,400 DT1.3,CF,NIC,,-280 DT1.3,CF,ACA,,-10 DT1.3,CF,AEA,,-5 +DT1.4,CF,PR,,400 +DT1.4,CF,NIC,,-280 +DT1.4,CF,ACA,,-10 +DT1.4,CF,AEA,,-5 +DT1.4,CF,PayablePR,,15 +DT1.4,CF,ReceivablePR,,-10 +DT1.4,CF,ReceivableNIC,,-5 +DT1.4,CF,PayableNIC,,8 DT2.2,CF,NIC,2020,-280 DTR1.1,CF,PR,,-200 DTR1.1,CF,NIC,,140 @@ -31,3 +39,17 @@ DT4.1,CF,PR,,400 DT4.1,CF,NIC,,-280 DT4.1,CF,ACA,,-10 DT4.1,CF,AEA,,-5 +DT1.5,CF,PR,,400 +DT1.5,CF,NIC,,-280 +DT1.5,CF,ACA,,-10 +DT1.5,CF,AEA,,-5 +DT1.5,CF,ReceivablePR,,-10 +DTR1.3,CF,PR,,-200 +DTR1.3,CF,NIC,,140 +DTR1.3,CF,RiPayablePR,,7.5 +DTR1.3,CF,RiReceivablePR,,-5 +DTR1.3,CF,RiReceivableNIC,,-2.5 +DTR1.3,CF,RiPayableNIC,,4 +DTR1.4,CF,PR,,-200 +DTR1.4,CF,NIC,,140 +DTR1.4,CF,RiReceivableNIC,,-10 diff --git a/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv index e68c8a90..fb0bebcb 100644 --- a/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv +++ b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv @@ -3,60 +3,62 @@ ReportingNode,Year,Month,, CH,2021,3,, @@Actual,,,, DataNode,AocType,ValueType,AccidentYear,Value -DT1.1,WO,PayablePR,,4 -DT1.1,WO,ReceivablePR,,-2 -DT1.1,CF,PayablePR,,-5 -DT1.1,CF,ReceivablePR,,3 DT1.1,CF,PR,,90 DT1.1,CF,ICO,,-6 DT1.1,CF,NIC,,-70 DT1.1,CF,ACA,,-10 DT1.1,CF,AEA,,-5 DT1.2,CF,NIC,2020,-76 -DT1.3,WO,PayablePR,,4 -DT1.3,WO,ReceivablePR,,-2 -DT1.3,CF,PayablePR,,-5 -DT1.3,CF,ReceivablePR,,3 DT1.3,CF,PR,,90 DT1.3,CF,ICO,,-6 DT1.3,CF,NIC,,-70 DT1.3,CF,ACA,,-10 DT1.3,CF,AEA,,-5 -DT2.1,WO,PayablePR,,4 -DT2.1,WO,ReceivablePR,,-2 -DT2.1,CF,PayablePR,,-5 -DT2.1,CF,ReceivablePR,,3 DT2.1,CF,PR,,90 DT2.1,CF,ICO,,-6 DT2.1,CF,NIC,,-70 DT2.1,CF,ACA,,-10 DT2.1,CF,AEA,,-5 DT2.2,CF,NIC,2020,-76 -DTR1.1,CF,PayablePR,,2 -DTR1.1,CF,ReceivablePR,,-1.5 DTR1.1,CF,PR,,-45 DTR1.1,CF,NIC,,35 DTR1.2,CF,NIC,2020,35 -DTR2.1,CF,PayablePR,,2 -DTR2.1,CF,ReceivablePR,,-1.5 DTR2.1,CF,PR,,-45 DTR2.1,CF,NIC,,35 DTR2.2,CF,NIC,2020,35 -DT3.1,WO,PayablePR,,4 -DT3.1,WO,ReceivablePR,,-2 -DT3.1,CF,PayablePR,,-5 -DT3.1,CF,ReceivablePR,,3 DT3.1,CF,PR,,90 DT3.1,CF,ICO,,-6 DT3.1,CF,NIC,,-70 DT3.1,CF,ACA,,-10 DT3.1,CF,AEA,,-5 -DT4.1,WO,PayablePR,,4 -DT4.1,WO,ReceivablePR,,-2 -DT4.1,CF,PayablePR,,-5 -DT4.1,CF,ReceivablePR,,3 DT4.1,CF,PR,,90 DT4.1,CF,ICO,,-6 DT4.1,CF,NIC,,-70 DT4.1,CF,ACA,,-10 DT4.1,CF,AEA,,-5 +DT1.4,WO,ReceivablePR,,7 +DT1.4,WO,ReceivableNIC,,5 +DT1.4,CF,PayablePR,,5 +DT1.4,CF,ReceivablePR,,3 +DT1.4,CF,PayableNIC,,-8 +DT1.4,CF,PR,,90 +DT1.4,CF,ICO,,-6 +DT1.4,CF,NIC,,-70 +DT1.4,CF,ACA,,-10 +DT1.4,CF,AEA,,-5 +DT1.5,WO,ReceivablePR,,10 +DT1.5,CF,PR,,90 +DT1.5,CF,ICO,,-6 +DT1.5,CF,NIC,,-70 +DT1.5,CF,ACA,,-10 +DT1.5,CF,AEA,,-5 +DTR1.3,CF,PR,,-45 +DTR1.3,CF,NIC,,35 +DTR1.3,WO,RiReceivablePR,,3.5 +DTR1.3,WO,RiReceivableNIC,,2.5 +DTR1.3,CF,RiPayablePR,,2.5 +DTR1.3,CF,RiReceivablePR,,1.5 +DTR1.3,CF,RiPayableNIC,,-4 +DTR1.4,CF,PR,,-45 +DTR1.4,CF,NIC,,35 +DTR1.4,WO,RiReceivableNIC,,10 diff --git a/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv index 54bd5acd..1101d5d3 100644 --- a/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv +++ b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv @@ -83,3 +83,35 @@ DT4.1,PR,CL,C,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 DT4.1,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 DT4.1,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 DT4.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT1.4,PR,BOP,N,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT1.4,NIC,BOP,N,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.4,CU,BOP,N,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.4,RA,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT1.4,PR,CL,C,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT1.4,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.4,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.4,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT1.5,PR,BOP,N,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT1.5,NIC,BOP,N,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.5,CU,BOP,N,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.5,RA,BOP,N,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DT1.5,PR,CL,C,,100,0,0,100,0,0,100,0,0,100,0,0,0,100,0,0,100,0,0,100,0,0,100,0 +DT1.5,NIC,CL,C,,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25,-25 +DT1.5,CU,CL,C,,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3 +DT1.5,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5 +DTR1.3,PR,BOP,N,,-50,0,0,-50,0,0,-50,0,0,-50,0,0,0,-50,0,0,-50,0,0,-50,0,0,-50,0 +DTR1.3,NIC,BOP,N,,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR1.3,CU,BOP,N,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR1.3,RA,BOP,N,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR1.3,PR,CL,C,,-50,0,0,-50,0,0,-50,0,0,-50,0,0,0,-50,0,0,-50,0,0,-50,0,0,-50,0 +DTR1.3,NIC,CL,C,,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR1.3,CU,CL,C,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR1.3,RA,CL,C,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR1.4,PR,BOP,N,,-50,0,0,-50,0,0,-50,0,0,-50,0,0,0,-50,0,0,-50,0,0,-50,0,0,-50,0 +DTR1.4,NIC,BOP,N,,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR1.4,CU,BOP,N,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR1.4,RA,BOP,N,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 +DTR1.4,PR,CL,C,,-50,0,0,-50,0,0,-50,0,0,-50,0,0,0,-50,0,0,-50,0,0,-50,0,0,-50,0 +DTR1.4,NIC,CL,C,,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5 +DTR1.4,CU,CL,C,,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5 +DTR1.4,RA,CL,C,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25 diff --git a/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv index f8a3818c..6a256346 100644 --- a/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv +++ b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv @@ -156,3 +156,65 @@ DT4.1,ICO,CL,C,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 DT4.1,NIC,CL,C,,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,0,0,0,0,0,0,0,0,0 DT4.1,CU,CL,C,,-15,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-5,0,0,0,0,0,0,0,0,0 DT4.1,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DT1.4,PR,MC,I,,0,110,0,0,110,0,0,110,0,0,110,0,0,0,0,0,0,0,0,0,0 +DT1.4,NIC,MC,I,,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,0,0,0,0,0,0,0,0,0 +DT1.4,CU,MC,I,,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3,0,0,0,0,0,0,0,0,0 +DT1.4,RA,MC,I,,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,0 +DT1.4,PR,BOP,N,,0,10,0,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0 +DT1.4,ICO,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.4,NIC,BOP,N,,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,0,0,0,0,0,0,0,0,0 +DT1.4,RA,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.4,PR,EV,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 +DT1.4,ICO,EV,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.4,NIC,EV,N,,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,0,0,0,0,0,0,0,0,0 +DT1.4,RA,EV,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DT1.4,PR,CL,C,,0,115,0,0,115,0,0,115,0,0,115,0,0,0,0,0,0,0,0,0,0 +DT1.4,ICO,CL,C,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.4,NIC,CL,C,,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,0,0,0,0,0,0,0,0,0 +DT1.4,CU,CL,C,,-15,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-5,0,0,0,0,0,0,0,0,0 +DT1.4,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DT1.5,PR,MC,I,,0,110,0,0,110,0,0,110,0,0,110,0,0,0,0,0,0,0,0,0,0 +DT1.5,NIC,MC,I,,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,-20,0,0,0,0,0,0,0,0,0 +DT1.5,CU,MC,I,,-10,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-3,0,0,0,0,0,0,0,0,0 +DT1.5,RA,MC,I,,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,0 +DT1.5,PR,BOP,N,,0,10,0,0,10,0,0,10,0,0,10,0,0,0,0,0,0,0,0,0,0 +DT1.5,ICO,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.5,NIC,BOP,N,,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,0,0,0,0,0,0,0,0,0 +DT1.5,RA,BOP,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.5,PR,EV,N,,0,5,0,0,5,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0 +DT1.5,ICO,EV,N,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.5,NIC,EV,N,,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,0,0,0,0,0,0,0,0,0 +DT1.5,RA,EV,N,,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,0,0,0,0,0,0,0,0,0 +DT1.5,PR,CL,C,,0,115,0,0,115,0,0,115,0,0,115,0,0,0,0,0,0,0,0,0,0 +DT1.5,ICO,CL,C,,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0 +DT1.5,NIC,CL,C,,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,-29,0,0,0,0,0,0,0,0,0 +DT1.5,CU,CL,C,,-15,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-5,0,0,0,0,0,0,0,0,0 +DT1.5,RA,CL,C,,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR1.3,PR,MC,I,,0,-55,0,0,-55,0,0,-55,0,0,-55,0,0,0,0,0,0,0,0,0,0 +DTR1.3,NIC,MC,I,,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 +DTR1.3,CU,MC,I,,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5,0,0,0,0,0,0,0,0,0 +DTR1.3,RA,MC,I,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DTR1.3,PR,BOP,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 +DTR1.3,NIC,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DTR1.3,RA,BOP,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DTR1.3,PR,EV,N,,0,-2.5,0,0,-2.5,0,0,-2.5,0,0,-2.5,0,0,0,0,0,0,0,0,0,0 +DTR1.3,NIC,EV,N,,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 +DTR1.3,RA,EV,N,,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0,0,0,0,0,0,0,0,0 +DTR1.3,PR,CL,C,,0,-57.5,0,0,-57.5,0,0,-57.5,0,0,-57.5,0,0,0,0,0,0,0,0,0,0 +DTR1.3,NIC,CL,C,,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0 +DTR1.3,CU,CL,C,,-7.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR1.3,RA,CL,C,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,0,0,0,0,0,0,0,0,0 +DTR1.4,PR,MC,I,,0,-55,0,0,-55,0,0,-55,0,0,-55,0,0,0,0,0,0,0,0,0,0 +DTR1.4,NIC,MC,I,,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,0 +DTR1.4,CU,MC,I,,-5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-2.5,-1.5,0,0,0,0,0,0,0,0,0 +DTR1.4,RA,MC,I,,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 +DTR1.4,PR,BOP,N,,0,-5,0,0,-5,0,0,-5,0,0,-5,0,0,0,0,0,0,0,0,0,0 +DTR1.4,NIC,BOP,N,,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,0,0,0,0,0,0,0,0,0 +DTR1.4,RA,BOP,N,,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0,0,0,0,0,0,0,0,0 +DTR1.4,PR,EV,N,,0,-2.5,0,0,-2.5,0,0,-2.5,0,0,-2.5,0,0,0,0,0,0,0,0,0,0 +DTR1.4,NIC,EV,N,,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0 +DTR1.4,RA,EV,N,,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0,0,0,0,0,0,0,0,0 +DTR1.4,PR,CL,C,,0,-57.5,0,0,-57.5,0,0,-57.5,0,0,-57.5,0,0,0,0,0,0,0,0,0,0 +DTR1.4,NIC,CL,C,,15,15,15,15,15,15,15,15,15,15,15,15,0,0,0,0,0,0,0,0,0 +DTR1.4,CU,CL,C,,-7.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-3.5,-2.5,0,0,0,0,0,0,0,0,0 +DTR1.4,RA,CL,C,,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,1.25,0,0,0,0,0,0,0,0,0 diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv deleted file mode 100644 index d0c36f7e..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv +++ /dev/null @@ -1,8 +0,0 @@ -$$Default -@@Main -Month,ReportingNode,Scenario,Year -12,CH,,2020 -@@AA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,BOP,DT3.1,,AA,I,-1.5 -,PR,EOP,DT3.1,,AA,C,-1.5 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv deleted file mode 100644 index 8dbc1e48..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv +++ /dev/null @@ -1,181 +0,0 @@ -@@Main -Month,ReportingNode,Scenario,Year -12,CH,,2020 -@@BE -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,BOP,DT1.1,C,BE,N,-798.536731161375 -,NIC,BOP,DT1.1,L,BE,N,598.7529445986629 -,PR,BOP,DT1.1,L,BE,N,-798.536731161375 -,NIC,BOP,DT1.1,C,BE,N,598.7529445986629 -,PR,EOP,DT1.1,L,BE,C,-399.63392949885525 -,NIC,EOP,DT1.1,L,BE,C,299.67554969423594 -,PR,EOP,DT1.1,C,BE,C,-399.63392949885525 -,NIC,EOP,DT1.1,C,BE,C,299.67554969423594 -,PR,IA,DT1.1,L,BE,N,-1.0971983374806105 -,NIC,IA,DT1.1,L,BE,N,0.9226050955731167 -,PR,IA,DT1.1,C,BE,N,-1.0971983374806105 -,NIC,IA,DT1.1,C,BE,N,0.9226050955731167 -,PR,CF,DT1.1,L,BE,N,400 -,NIC,CF,DT1.1,L,BE,N,-300 -,PR,CF,DT1.1,C,BE,N,400 -,NIC,CF,DT1.1,C,BE,N,-300 -2020,NIC,BOP,DT1.2,L,BE,N,598.7529445986629 -2020,NIC,BOP,DT1.2,C,BE,N,598.7529445986629 -2020,NIC,EOP,DT1.2,L,BE,C,299.67554969423594 -2020,NIC,EOP,DT1.2,C,BE,C,299.67554969423594 -2020,NIC,IA,DT1.2,L,BE,N,0.9226050955731167 -2020,NIC,IA,DT1.2,C,BE,N,0.9226050955731167 -2020,NIC,CF,DT1.2,L,BE,N,-300 -2020,NIC,CF,DT1.2,C,BE,N,-300 -,PR,BOP,DT1.3,L,BE,N,-798.536731161375 -,NIC,BOP,DT1.3,L,BE,N,598.7529445986629 -,PR,BOP,DT1.3,C,BE,N,-798.536731161375 -,NIC,BOP,DT1.3,C,BE,N,598.7529445986629 -,PR,EOP,DT1.3,L,BE,C,-399.63392949885525 -,NIC,EOP,DT1.3,L,BE,C,299.67554969423594 -,PR,EOP,DT1.3,C,BE,C,-399.63392949885525 -,NIC,EOP,DT1.3,C,BE,C,299.67554969423594 -,PR,IA,DT1.3,L,BE,N,-1.0971983374806105 -,NIC,IA,DT1.3,L,BE,N,0.9226050955731167 -,PR,IA,DT1.3,C,BE,N,-1.0971983374806105 -,NIC,IA,DT1.3,C,BE,N,0.9226050955731167 -,PR,CF,DT1.3,L,BE,N,400 -,NIC,CF,DT1.3,L,BE,N,-300 -,PR,CF,DT1.3,C,BE,N,400 -,NIC,CF,DT1.3,C,BE,N,-300 -,PR,BOP,DT2.1,L,BE,N,-798.536731161375 -,NIC,BOP,DT2.1,L,BE,N,598.7529445986629 -,PR,BOP,DT2.1,C,BE,N,-798.536731161375 -,NIC,BOP,DT2.1,C,BE,N,598.7529445986629 -,PR,EOP,DT2.1,L,BE,C,-399.63392949885525 -,NIC,EOP,DT2.1,L,BE,C,299.67554969423594 -,PR,EOP,DT2.1,C,BE,C,-399.63392949885525 -,NIC,EOP,DT2.1,C,BE,C,299.67554969423594 -,PR,IA,DT2.1,L,BE,N,-1.0971983374806105 -,NIC,IA,DT2.1,L,BE,N,0.9226050955731167 -,PR,IA,DT2.1,C,BE,N,-1.0971983374806105 -,NIC,IA,DT2.1,C,BE,N,0.9226050955731167 -,PR,CF,DT2.1,L,BE,N,400 -,NIC,CF,DT2.1,L,BE,N,-300 -,PR,CF,DT2.1,C,BE,N,400 -,NIC,CF,DT2.1,C,BE,N,-300 -2020,NIC,BOP,DT2.2,L,BE,N,598.7529445986629 -2020,NIC,BOP,DT2.2,C,BE,N,598.7529445986629 -2020,NIC,EOP,DT2.2,L,BE,C,299.67554969423594 -2020,NIC,EOP,DT2.2,C,BE,C,299.67554969423594 -2020,NIC,IA,DT2.2,L,BE,N,0.9226050955731167 -2020,NIC,IA,DT2.2,C,BE,N,0.9226050955731167 -2020,NIC,CF,DT2.2,L,BE,N,-300 -2020,NIC,CF,DT2.2,C,BE,N,-300 -,PR,BOP,DTR1.1,L,BE,N,399.2683655806875 -,NIC,BOP,DTR1.1,L,BE,N,-299.37647229933145 -,CDR,BOP,DTR1.1,L,BE,N,0.4811341181992343 -,PR,BOP,DTR1.1,C,BE,N,399.2683655806875 -,NIC,BOP,DTR1.1,C,BE,N,-299.37647229933145 -,CDR,BOP,DTR1.1,C,BE,N,0.4811341181992343 -,PR,EOP,DTR1.1,L,BE,C,199.81696474942763 -,NIC,EOP,DTR1.1,L,BE,C,-149.83777484711797 -,CDR,EOP,DTR1.1,L,BE,C,0.11527160395198197 -,PR,EOP,DTR1.1,C,BE,C,199.81696474942763 -,NIC,EOP,DTR1.1,C,BE,C,-149.83777484711797 -,CDR,EOP,DTR1.1,C,BE,C,0.11527160395198197 -,PR,IA,DTR1.1,L,BE,N,0.5485991687403052 -,NIC,IA,DTR1.1,L,BE,N,-0.4613025477865583 -,CDR,IA,DTR1.1,L,BE,N,0.0011701910454977593 -,PR,IA,DTR1.1,C,BE,N,0.5485991687403052 -,NIC,IA,DTR1.1,C,BE,N,-0.4613025477865583 -,CDR,IA,DTR1.1,C,BE,N,0.0011701910454977593 -,PR,CF,DTR1.1,L,BE,N,-200 -,NIC,CF,DTR1.1,L,BE,N,150 -,CDR,CF,DTR1.1,L,BE,N,-0.36703270529272203 -,PR,CF,DTR1.1,C,BE,N,-200 -,NIC,CF,DTR1.1,C,BE,N,150 -,CDR,CF,DTR1.1,C,BE,N,-0.36703270529272203 -2020,NIC,BOP,DTR1.2,L,BE,N,-299.37647229933145 -2020,CDR,BOP,DTR1.2,L,BE,N,0.4811341181992343 -2020,NIC,BOP,DTR1.2,C,BE,N,-299.37647229933145 -2020,CDR,BOP,DTR1.2,C,BE,N,0.4811341181992343 -2020,NIC,EOP,DTR1.2,L,BE,C,-149.83777484711797 -2020,CDR,EOP,DTR1.2,L,BE,C,0.11527160395198197 -2020,NIC,EOP,DTR1.2,C,BE,C,-149.83777484711797 -2020,CDR,EOP,DTR1.2,C,BE,C,0.11527160395198197 -2020,NIC,IA,DTR1.2,L,BE,N,-0.4613025477865583 -2020,CDR,IA,DTR1.2,L,BE,N,0.0011701910454977593 -2020,NIC,IA,DTR1.2,C,BE,N,-0.4613025477865583 -2020,CDR,IA,DTR1.2,C,BE,N,0.0011701910454977593 -2020,NIC,CF,DTR1.2,L,BE,N,150 -2020,CDR,CF,DTR1.2,L,BE,N,-0.36703270529272203 -2020,NIC,CF,DTR1.2,C,BE,N,150 -2020,CDR,CF,DTR1.2,C,BE,N,-0.36703270529272203 -,PR,BOP,DTR2.1,L,BE,N,399.2683655806875 -,NIC,BOP,DTR2.1,L,BE,N,-299.37647229933145 -,CDR,BOP,DTR2.1,L,BE,N,0.4811341181992343 -,PR,BOP,DTR2.1,C,BE,N,399.2683655806875 -,NIC,BOP,DTR2.1,C,BE,N,-299.37647229933145 -,CDR,BOP,DTR2.1,C,BE,N,0.4811341181992343 -,PR,EOP,DTR2.1,L,BE,C,199.81696474942763 -,NIC,EOP,DTR2.1,L,BE,C,-149.83777484711797 -,CDR,EOP,DTR2.1,L,BE,C,0.11527160395198197 -,PR,EOP,DTR2.1,C,BE,C,199.81696474942763 -,NIC,EOP,DTR2.1,C,BE,C,-149.83777484711797 -,CDR,EOP,DTR2.1,C,BE,C,0.11527160395198197 -,PR,IA,DTR2.1,L,BE,N,0.5485991687403052 -,NIC,IA,DTR2.1,L,BE,N,-0.4613025477865583 -,CDR,IA,DTR2.1,L,BE,N,0.0011701910454977593 -,PR,IA,DTR2.1,C,BE,N,0.5485991687403052 -,NIC,IA,DTR2.1,C,BE,N,-0.4613025477865583 -,CDR,IA,DTR2.1,C,BE,N,0.0011701910454977593 -,PR,CF,DTR2.1,L,BE,N,-200 -,NIC,CF,DTR2.1,L,BE,N,150 -,CDR,CF,DTR2.1,L,BE,N,-0.36703270529272203 -,PR,CF,DTR2.1,C,BE,N,-200 -,NIC,CF,DTR2.1,C,BE,N,150 -,CDR,CF,DTR2.1,C,BE,N,-0.36703270529272203 -2020,NIC,BOP,DTR2.2,L,BE,N,-299.37647229933145 -2020,CDR,BOP,DTR2.2,L,BE,N,0.4811341181992343 -2020,NIC,BOP,DTR2.2,C,BE,N,-299.37647229933145 -2020,CDR,BOP,DTR2.2,C,BE,N,0.4811341181992343 -2020,NIC,EOP,DTR2.2,L,BE,C,-149.83777484711797 -2020,CDR,EOP,DTR2.2,L,BE,C,0.11527160395198197 -2020,NIC,EOP,DTR2.2,C,BE,C,-149.83777484711797 -2020,CDR,EOP,DTR2.2,C,BE,C,0.11527160395198197 -2020,NIC,IA,DTR2.2,L,BE,N,-0.4613025477865583 -2020,CDR,IA,DTR2.2,L,BE,N,0.0011701910454977593 -2020,NIC,IA,DTR2.2,C,BE,N,-0.4613025477865583 -2020,CDR,IA,DTR2.2,C,BE,N,0.0011701910454977593 -2020,NIC,CF,DTR2.2,L,BE,N,150 -2020,CDR,CF,DTR2.2,L,BE,N,-0.36703270529272203 -2020,NIC,CF,DTR2.2,C,BE,N,150 -2020,CDR,CF,DTR2.2,C,BE,N,-0.36703270529272203 -,PR,BOP,DT3.1,L,BE,N,-798.536731161375 -,NIC,BOP,DT3.1,L,BE,N,598.7529445986629 -,PR,BOP,DT3.1,C,BE,N,-798.536731161375 -,NIC,BOP,DT3.1,C,BE,N,598.7529445986629 -,PR,EOP,DT3.1,L,BE,C,-399.63392949885525 -,NIC,EOP,DT3.1,L,BE,C,299.67554969423594 -,PR,EOP,DT3.1,C,BE,C,-399.63392949885525 -,NIC,EOP,DT3.1,C,BE,C,299.67554969423594 -,PR,IA,DT3.1,L,BE,N,-1.0971983374806105 -,NIC,IA,DT3.1,L,BE,N,0.9226050955731167 -,PR,IA,DT3.1,C,BE,N,-1.0971983374806105 -,NIC,IA,DT3.1,C,BE,N,0.9226050955731167 -,PR,CF,DT3.1,L,BE,N,400 -,NIC,CF,DT3.1,L,BE,N,-300 -,PR,CF,DT3.1,C,BE,N,400 -,NIC,CF,DT3.1,C,BE,N,-300 -,PR,BOP,DT4.1,L,BE,N,-798.536731161375 -,NIC,BOP,DT4.1,L,BE,N,598.7529445986629 -,PR,BOP,DT4.1,C,BE,N,-798.536731161375 -,NIC,BOP,DT4.1,C,BE,N,598.7529445986629 -,PR,EOP,DT4.1,L,BE,C,-399.63392949885525 -,NIC,EOP,DT4.1,L,BE,C,299.67554969423594 -,PR,EOP,DT4.1,C,BE,C,-399.63392949885525 -,NIC,EOP,DT4.1,C,BE,C,299.67554969423594 -,PR,IA,DT4.1,L,BE,N,-1.0971983374806105 -,NIC,IA,DT4.1,L,BE,N,0.9226050955731167 -,PR,IA,DT4.1,C,BE,N,-1.0971983374806105 -,NIC,IA,DT4.1,C,BE,N,0.9226050955731167 -,PR,CF,DT4.1,L,BE,N,400 -,NIC,CF,DT4.1,L,BE,N,-300 -,PR,CF,DT4.1,C,BE,N,400 -,NIC,CF,DT4.1,C,BE,N,-300 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv deleted file mode 100644 index 061f2e7e..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv +++ /dev/null @@ -1,40 +0,0 @@ -@@Main -ReportingNode,Year,Month,Scenario -CH,2020,12, -@@C -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,AM,DTR1.1,,C,C,46.24958203305145 -,,IA,DT1.3,,C,N,0.08233273235018213 -,,BOP,DT1.3,,C,N,139.90849210284577 -,,EOP,DT1.3,,C,C,42.9681136142967 -,,AM,DT1.3,,C,C,-82.02271122089925 -,,EA,DT1.3,,C,C,-15 -,,EA,DT1.1,,C,C,-15 -,,AM,DT1.1,,C,C,-82.02271122089925 -,,EOP,DT1.1,,C,C,42.9681136142967 -,,BOP,DT1.1,,C,N,139.90849210284577 -,,IA,DT1.1,,C,N,0.08233273235018213 -,,EA,DT2.1,,C,C,-15 -,,AM,DT2.1,,C,C,-82.02271122089925 -,,EOP,DT2.1,,C,C,42.9681136142967 -,,BOP,DT2.1,,C,N,139.90849210284577 -,,IA,DT2.1,,C,N,0.08233273235018213 -,,EOP,DTR1.1,,C,C,-24.22813469379126 -,,BOP,DTR1.1,,C,N,-70.43538016962212 -,,IA,DTR1.1,,C,N,-0.04233655722058882 -,,AM,DTR2.1,,C,C,46.24958203305145 -,,EOP,DTR2.1,,C,C,-24.22813469379126 -,,BOP,DTR2.1,,C,N,-70.43538016962212 -,,IA,DTR2.1,,C,N,-0.04233655722058882 -,,BOP,DT3.1,,C,I,72.2 -,,EA,DT3.1,,C,C,-15 -,,AM,DT3.1,,C,C,-129.49726655304642 -,,EOP,DT3.1,,C,C,67.83795828214957 -,,IA,DT3.1,,C,I,0.14440000000001615 -,,BOP,DT3.1,,C,N,139.90849210284577 -,,IA,DT3.1,,C,N,0.08233273235018213 -,,EA,DT4.1,,C,C,-15 -,,AM,DT4.1,,C,C,-82.02271122089925 -,,EOP,DT4.1,,C,C,42.9681136142967 -,,BOP,DT4.1,,C,N,139.90849210284577 -,,IA,DT4.1,,C,N,0.08233273235018213 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv deleted file mode 100644 index 900aadb2..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv +++ /dev/null @@ -1,20 +0,0 @@ -@@Main -ReportingNode,Year,Month,Scenario -CH,2020,12, -@@DA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,EOP,DT1.3,,DA,C,-5.156552131440618 -,,AM,DT1.3,,DA,C,9.843447868559382 -,,CF,DT1.3,,DA,C,-15 -,,CF,DT1.1,,DA,C,-15 -,,AM,DT1.1,,DA,C,9.843447868559382 -,,EOP,DT1.1,,DA,C,-5.156552131440618 -,,CF,DT2.1,,DA,C,-15 -,,AM,DT2.1,,DA,C,9.843447868559382 -,,EOP,DT2.1,,DA,C,-5.156552131440618 -,,CF,DT3.1,,DA,C,-15 -,,AM,DT3.1,,DA,C,9.843447868559382 -,,EOP,DT3.1,,DA,C,-5.156552131440618 -,,CF,DT4.1,,DA,C,-15 -,,AM,DT4.1,,DA,C,9.843447868559382 -,,EOP,DT4.1,,DA,C,-5.156552131440618 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv deleted file mode 100644 index 8c0006b2..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv +++ /dev/null @@ -1,16 +0,0 @@ -@@Main -ReportingNode,Year,Month,Scenario -CH,2020,12, -@@F -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,AM,DT1.1,L,F,C,0.6562298579039588 -,,AM,DT1.2,L,F,C,1 -,,AM,DT1.3,L,F,C,0.6562298579039588 -,,AM,DT2.1,L,F,C,0.6562298579039588 -,,AM,DT2.2,L,F,C,1 -,,AM,DTR1.1,L,F,C,0.6562298579039588 -,,AM,DTR1.2,L,F,C,1 -,,AM,DTR2.1,L,F,C,0.6562298579039588 -,,AM,DTR2.2,L,F,C,1 -,,AM,DT3.1,L,F,C,0.6562298579039588 -,,AM,DT4.1,L,F,C,0.6562298579039588 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv index 9d548fcb..97f1efee 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv @@ -3,67 +3,67 @@ Month,ReportingNode,Scenario,Year 12,CH,MTUP10pct,2020 @@BE AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,NIC,BOP,DT1.1,L,BE,N,658.6282390585294 -,PR,BOP,DT1.1,L,BE,N,-798.536731161375 -,NIC,BOP,DT1.1,C,BE,N,658.6282390585294 -,PR,BOP,DT1.1,C,BE,N,-798.536731161375 -,NIC,EOP,DT1.1,L,BE,C,329.6431046636596 -,PR,EOP,DT1.1,L,BE,C,-399.63392949885525 -,NIC,EOP,DT1.1,C,BE,C,329.6431046636596 -,PR,EOP,DT1.1,C,BE,C,-399.63392949885525 -,NIC,IA,DT1.1,L,BE,N,1.0148656051304286 -,PR,IA,DT1.1,L,BE,N,-1.0971983374806105 -,NIC,IA,DT1.1,C,BE,N,1.0148656051304286 -,PR,IA,DT1.1,C,BE,N,-1.0971983374806105 +,NIC,BOP,DT1.1,L,BE,N,658.62824 +,PR,BOP,DT1.1,L,BE,N,-798.53673 +,NIC,BOP,DT1.1,C,BE,N,658.62824 +,PR,BOP,DT1.1,C,BE,N,-798.53673 +,NIC,EOP,DT1.1,L,BE,C,329.6431 +,PR,EOP,DT1.1,L,BE,C,-399.63393 +,NIC,EOP,DT1.1,C,BE,C,329.6431 +,PR,EOP,DT1.1,C,BE,C,-399.63393 +,NIC,IA,DT1.1,L,BE,N,1.01487 +,PR,IA,DT1.1,L,BE,N,-1.0972 +,NIC,IA,DT1.1,C,BE,N,1.01487 +,PR,IA,DT1.1,C,BE,N,-1.0972 ,NIC,CF,DT1.1,L,BE,N,-330 ,PR,CF,DT1.1,L,BE,N,400 ,NIC,CF,DT1.1,C,BE,N,-330 ,PR,CF,DT1.1,C,BE,N,400 -2020,NIC,BOP,DT1.2,L,BE,N,658.6282390585294 -2020,NIC,BOP,DT1.2,C,BE,N,658.6282390585294 -2020,NIC,EOP,DT1.2,L,BE,C,329.6431046636596 -2020,NIC,EOP,DT1.2,C,BE,C,329.6431046636596 -2020,NIC,IA,DT1.2,L,BE,N,1.0148656051304286 -2020,NIC,IA,DT1.2,C,BE,N,1.0148656051304286 +2020,NIC,BOP,DT1.2,L,BE,N,658.62824 +2020,NIC,BOP,DT1.2,C,BE,N,658.62824 +2020,NIC,EOP,DT1.2,L,BE,C,329.6431 +2020,NIC,EOP,DT1.2,C,BE,C,329.6431 +2020,NIC,IA,DT1.2,L,BE,N,1.01487 +2020,NIC,IA,DT1.2,C,BE,N,1.01487 2020,NIC,CF,DT1.2,L,BE,N,-330 2020,NIC,CF,DT1.2,C,BE,N,-330 -,NIC,BOP,DTR1.1,L,BE,N,-329.3141195292647 -,PR,BOP,DTR1.1,L,BE,N,399.2683655806875 -,CDR,BOP,DTR1.1,L,BE,N,0.5292475300191577 -,NIC,BOP,DTR1.1,C,BE,N,-329.3141195292647 -,PR,BOP,DTR1.1,C,BE,N,399.2683655806875 -,CDR,BOP,DTR1.1,C,BE,N,0.5292475300191577 -,NIC,EOP,DTR1.1,L,BE,C,-164.8215523318298 -,PR,EOP,DTR1.1,L,BE,C,199.81696474942763 -,CDR,EOP,DTR1.1,L,BE,C,0.12679876434718015 -,NIC,EOP,DTR1.1,C,BE,C,-164.8215523318298 -,PR,EOP,DTR1.1,C,BE,C,199.81696474942763 -,CDR,EOP,DTR1.1,C,BE,C,0.12679876434718015 -,NIC,IA,DTR1.1,L,BE,N,-0.5074328025652143 -,PR,IA,DTR1.1,L,BE,N,0.5485991687403052 -,CDR,IA,DTR1.1,L,BE,N,0.001287210150087148 -,NIC,IA,DTR1.1,C,BE,N,-0.5074328025652143 -,PR,IA,DTR1.1,C,BE,N,0.5485991687403052 -,CDR,IA,DTR1.1,C,BE,N,0.001287210150087148 +,NIC,BOP,DTR1.1,L,BE,N,-329.31412 +,PR,BOP,DTR1.1,L,BE,N,399.26837 +,CDR,BOP,DTR1.1,L,BE,N,0.52925 +,NIC,BOP,DTR1.1,C,BE,N,-329.31412 +,PR,BOP,DTR1.1,C,BE,N,399.26837 +,CDR,BOP,DTR1.1,C,BE,N,0.52925 +,NIC,EOP,DTR1.1,L,BE,C,-164.82155 +,PR,EOP,DTR1.1,L,BE,C,199.81696 +,CDR,EOP,DTR1.1,L,BE,C,0.1268 +,NIC,EOP,DTR1.1,C,BE,C,-164.82155 +,PR,EOP,DTR1.1,C,BE,C,199.81696 +,CDR,EOP,DTR1.1,C,BE,C,0.1268 +,NIC,IA,DTR1.1,L,BE,N,-0.50743 +,PR,IA,DTR1.1,L,BE,N,0.5486 +,CDR,IA,DTR1.1,L,BE,N,0.00129 +,NIC,IA,DTR1.1,C,BE,N,-0.50743 +,PR,IA,DTR1.1,C,BE,N,0.5486 +,CDR,IA,DTR1.1,C,BE,N,0.00129 ,NIC,CF,DTR1.1,L,BE,N,165 ,PR,CF,DTR1.1,L,BE,N,-200 -,CDR,CF,DTR1.1,L,BE,N,-0.40373597582193455 +,CDR,CF,DTR1.1,L,BE,N,-0.40374 ,NIC,CF,DTR1.1,C,BE,N,165 ,PR,CF,DTR1.1,C,BE,N,-200 -,CDR,CF,DTR1.1,C,BE,N,-0.40373597582193455 -2020,NIC,BOP,DTR1.2,L,BE,N,-329.3141195292647 -2020,CDR,BOP,DTR1.2,L,BE,N,0.5292475300191577 -2020,NIC,BOP,DTR1.2,C,BE,N,-329.3141195292647 -2020,CDR,BOP,DTR1.2,C,BE,N,0.5292475300191577 -2020,NIC,EOP,DTR1.2,L,BE,C,-164.8215523318298 -2020,CDR,EOP,DTR1.2,L,BE,C,0.12679876434718015 -2020,NIC,EOP,DTR1.2,C,BE,C,-164.8215523318298 -2020,CDR,EOP,DTR1.2,C,BE,C,0.12679876434718015 -2020,NIC,IA,DTR1.2,L,BE,N,-0.5074328025652143 -2020,CDR,IA,DTR1.2,L,BE,N,0.001287210150087148 -2020,NIC,IA,DTR1.2,C,BE,N,-0.5074328025652143 -2020,CDR,IA,DTR1.2,C,BE,N,0.001287210150087148 +,CDR,CF,DTR1.1,C,BE,N,-0.40374 +2020,NIC,BOP,DTR1.2,L,BE,N,-329.31412 +2020,CDR,BOP,DTR1.2,L,BE,N,0.52925 +2020,NIC,BOP,DTR1.2,C,BE,N,-329.31412 +2020,CDR,BOP,DTR1.2,C,BE,N,0.52925 +2020,NIC,EOP,DTR1.2,L,BE,C,-164.82155 +2020,CDR,EOP,DTR1.2,L,BE,C,0.1268 +2020,NIC,EOP,DTR1.2,C,BE,C,-164.82155 +2020,CDR,EOP,DTR1.2,C,BE,C,0.1268 +2020,NIC,IA,DTR1.2,L,BE,N,-0.50743 +2020,CDR,IA,DTR1.2,L,BE,N,0.00129 +2020,NIC,IA,DTR1.2,C,BE,N,-0.50743 +2020,CDR,IA,DTR1.2,C,BE,N,0.00129 2020,NIC,CF,DTR1.2,L,BE,N,165 -2020,CDR,CF,DTR1.2,L,BE,N,-0.40373597582193455 +2020,CDR,CF,DTR1.2,L,BE,N,-0.40374 2020,NIC,CF,DTR1.2,C,BE,N,165 -2020,CDR,CF,DTR1.2,C,BE,N,-0.40373597582193455 \ No newline at end of file +2020,CDR,CF,DTR1.2,C,BE,N,-0.40374 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv index 5b4b8afc..c57d6d4b 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv @@ -3,20 +3,20 @@ Month,ReportingNode,Scenario,Year 12,CH,MTUP10pct,2020 @@C AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,EA,DT2.1,,C,C,-139.99082483519595 -,,EA,DT1.1,,C,C,-80.02326986577215 -,,BOP,DT1.1,,C,N,80.03319764297927 -,,IA,DT1.1,,C,N,-0.009927777207129784 -,,BOP,DT2.1,,C,N,139.90849210284577 -,,IA,DT2.1,,C,N,0.08233273235018213 -,,EA,DT1.3,,C,C,-139.99082483519595 -,,BOP,DT1.3,,C,N,139.90849210284577 -,,IA,DT1.3,,C,N,0.08233273235018213 -,,AM,DTR1.1,,C,C,26.60498224366728 -,,EOP,DTR1.1,,C,C,-13.93718742938804 -,,BOP,DTR1.1,,C,N,-40.5458463515088 -,,IA,DTR1.1,,C,N,0.003676678453477744 -,,AM,DTR2.1,,C,C,46.24958203305145 -,,EOP,DTR2.1,,C,C,-24.22813469379126 -,,BOP,DTR2.1,,C,N,-70.43538016962212 -,,IA,DTR2.1,,C,N,-0.04233655722058882 \ No newline at end of file +,,EA,DT2.1,,C,C,-139.99082 +,,EA,DT1.1,,C,C,-80.02327 +,,BOP,DT1.1,,C,N,80.0332 +,,IA,DT1.1,,C,N,-0.00993 +,,BOP,DT2.1,,C,N,139.90849 +,,IA,DT2.1,,C,N,0.08233 +,,EA,DT1.3,,C,C,-139.99082 +,,BOP,DT1.3,,C,N,139.90849 +,,IA,DT1.3,,C,N,0.08233 +,,AM,DTR1.1,,C,C,26.60498 +,,EOP,DTR1.1,,C,C,-13.93719 +,,BOP,DTR1.1,,C,N,-40.54585 +,,IA,DTR1.1,,C,N,0.00368 +,,AM,DTR2.1,,C,C,46.24958 +,,EOP,DTR2.1,,C,C,-24.22813 +,,BOP,DTR2.1,,C,N,-70.43538 +,,IA,DTR2.1,,C,N,-0.04234 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv index a3a224c1..20a47c21 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv @@ -3,7 +3,7 @@ Month,ReportingNode,Scenario,Year 12,CH,MTUP10pct,2020 @@F AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,AM,DT1.1,L,F,C,0.6562298579039588 +,,AM,DT1.1,L,F,C,0.65623 ,,AM,DT1.2,L,F,C,1 -,,AM,DTR1.1,L,F,C,0.6562298579039588 +,,AM,DTR1.1,L,F,C,0.65623 ,,AM,DTR1.2,L,F,C,1 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv index 4f72f891..c38e0f99 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv @@ -3,12 +3,12 @@ Month,ReportingNode,Scenario,Year 12,CH,MTUP10pct,2020 @@L AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,AM,DT2.1,,L,C,-118.1273954398082 -,,EA,DT2.1,,L,C,180.00917516480405 -,,EA,DT1.1,,L,C,239.97673013422786 -,,AM,DT1.1,,L,C,-157.47989551624102 -,,EOP,DT1.1,,L,C,82.49683461798685 -,,EOP,DT2.1,,L,C,61.88177972499585 -,,EA,DT1.3,,L,C,260.00917516480405 -,,AM,DT1.3,,L,C,-170.6257840721249 -,,EOP,DT1.3,,L,C,89.38339109267915 \ No newline at end of file +,,AM,DT2.1,,L,C,-118.1274 +,,EA,DT2.1,,L,C,180.00918 +,,EA,DT1.1,,L,C,239.97673 +,,AM,DT1.1,,L,C,-157.4799 +,,EOP,DT1.1,,L,C,82.49683 +,,EOP,DT2.1,,L,C,61.88178 +,,EA,DT1.3,,L,C,260.00918 +,,AM,DT1.3,,L,C,-170.62578 +,,EOP,DT1.3,,L,C,89.38339 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.csv index fdff21b6..9b1cb78e 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.csv @@ -3,35 +3,35 @@ Month,ReportingNode,Scenario,Year 12,CH,MTUP10pct,2020 @@RA AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,BOP,DT1.1,C,RA,N,59.8752944598663 -,,BOP,DT1.1,L,RA,N,59.8752944598663 -,,EOP,DT1.1,C,RA,C,29.967554969423595 -,,EOP,DT1.1,L,RA,C,29.967554969423595 -,,IA,DT1.1,C,RA,N,0.09226050955731169 -,,IA,DT1.1,L,RA,N,0.09226050955731169 +,,BOP,DT1.1,C,RA,N,59.87529 +,,BOP,DT1.1,L,RA,N,59.87529 +,,EOP,DT1.1,C,RA,C,29.96755 +,,EOP,DT1.1,L,RA,C,29.96755 +,,IA,DT1.1,C,RA,N,0.09226 +,,IA,DT1.1,L,RA,N,0.09226 ,,CF,DT1.1,C,RA,N,-30 ,,CF,DT1.1,L,RA,N,-30 -2020,,BOP,DT1.2,C,RA,N,59.8752944598663 -2020,,BOP,DT1.2,L,RA,N,59.8752944598663 -2020,,EOP,DT1.2,C,RA,C,29.967554969423595 -2020,,EOP,DT1.2,L,RA,C,29.967554969423595 -2020,,IA,DT1.2,C,RA,N,0.09226050955731169 -2020,,IA,DT1.2,L,RA,N,0.09226050955731169 +2020,,BOP,DT1.2,C,RA,N,59.87529 +2020,,BOP,DT1.2,L,RA,N,59.87529 +2020,,EOP,DT1.2,C,RA,C,29.96755 +2020,,EOP,DT1.2,L,RA,C,29.96755 +2020,,IA,DT1.2,C,RA,N,0.09226 +2020,,IA,DT1.2,L,RA,N,0.09226 2020,,CF,DT1.2,C,RA,N,-30 2020,,CF,DT1.2,L,RA,N,-30 -,,BOP,DTR1.1,C,RA,N,-29.93764722993315 -,,BOP,DTR1.1,L,RA,N,-29.93764722993315 -,,EOP,DTR1.1,C,RA,C,-14.983777484711798 -,,EOP,DTR1.1,L,RA,C,-14.983777484711798 -,,IA,DTR1.1,C,RA,N,-0.046130254778655844 -,,IA,DTR1.1,L,RA,N,-0.046130254778655844 +,,BOP,DTR1.1,C,RA,N,-29.93765 +,,BOP,DTR1.1,L,RA,N,-29.93765 +,,EOP,DTR1.1,C,RA,C,-14.98378 +,,EOP,DTR1.1,L,RA,C,-14.98378 +,,IA,DTR1.1,C,RA,N,-0.04613 +,,IA,DTR1.1,L,RA,N,-0.04613 ,,CF,DTR1.1,C,RA,N,15 ,,CF,DTR1.1,L,RA,N,15 -2020,,BOP,DTR1.2,C,RA,N,-29.93764722993315 -2020,,BOP,DTR1.2,L,RA,N,-29.93764722993315 -2020,,EOP,DTR1.2,C,RA,C,-14.983777484711798 -2020,,EOP,DTR1.2,L,RA,C,-14.983777484711798 -2020,,IA,DTR1.2,C,RA,N,-0.046130254778655844 -2020,,IA,DTR1.2,L,RA,N,-0.046130254778655844 +2020,,BOP,DTR1.2,C,RA,N,-29.93765 +2020,,BOP,DTR1.2,L,RA,N,-29.93765 +2020,,EOP,DTR1.2,C,RA,C,-14.98378 +2020,,EOP,DTR1.2,L,RA,C,-14.98378 +2020,,IA,DTR1.2,C,RA,N,-0.04613 +2020,,IA,DTR1.2,L,RA,N,-0.04613 2020,,CF,DTR1.2,C,RA,N,15 2020,,CF,DTR1.2,L,RA,N,15 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv deleted file mode 100644 index 08356dd2..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv +++ /dev/null @@ -1,8 +0,0 @@ -$$Default -@@Main -Month,ReportingNode,Scenario,Year -12,CH,,2020 -@@OA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,BOP,DT3.1,,OA,I,1.5 -,PR,EOP,DT3.1,,OA,C,1.5 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv deleted file mode 100644 index d61cc7d7..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_RA.csv +++ /dev/null @@ -1,94 +0,0 @@ -$$Default -@@Main -Month,ReportingNode,Scenario,Year -12,CH,,2020 -@@RA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,BOP,DT1.1,C,RA,N,59.8752944598663 -,,BOP,DT1.1,L,RA,N,59.8752944598663 -,,EOP,DT1.1,C,RA,C,29.967554969423595 -,,EOP,DT1.1,L,RA,C,29.967554969423595 -,,IA,DT1.1,C,RA,N,0.09226050955731169 -,,IA,DT1.1,L,RA,N,0.09226050955731169 -,,CF,DT1.1,C,RA,N,-30 -,,CF,DT1.1,L,RA,N,-30 -2020,,BOP,DT1.2,C,RA,N,59.8752944598663 -2020,,BOP,DT1.2,L,RA,N,59.8752944598663 -2020,,EOP,DT1.2,C,RA,C,29.967554969423595 -2020,,EOP,DT1.2,L,RA,C,29.967554969423595 -2020,,IA,DT1.2,C,RA,N,0.09226050955731169 -2020,,IA,DT1.2,L,RA,N,0.09226050955731169 -2020,,CF,DT1.2,C,RA,N,-30 -2020,,CF,DT1.2,L,RA,N,-30 -,,BOP,DT1.3,C,RA,N,59.8752944598663 -,,BOP,DT1.3,L,RA,N,59.8752944598663 -,,EOP,DT1.3,C,RA,C,29.967554969423595 -,,EOP,DT1.3,L,RA,C,29.967554969423595 -,,IA,DT1.3,C,RA,N,0.09226050955731169 -,,IA,DT1.3,L,RA,N,0.09226050955731169 -,,CF,DT1.3,C,RA,N,-30 -,,CF,DT1.3,L,RA,N,-30 -,,BOP,DT2.1,C,RA,N,59.8752944598663 -,,BOP,DT2.1,L,RA,N,59.8752944598663 -,,EOP,DT2.1,C,RA,C,29.967554969423595 -,,EOP,DT2.1,L,RA,C,29.967554969423595 -,,IA,DT2.1,C,RA,N,0.09226050955731169 -,,IA,DT2.1,L,RA,N,0.09226050955731169 -,,CF,DT2.1,C,RA,N,-30 -,,CF,DT2.1,L,RA,N,-30 -2020,,BOP,DT2.2,C,RA,N,59.8752944598663 -2020,,BOP,DT2.2,L,RA,N,59.8752944598663 -2020,,EOP,DT2.2,C,RA,C,29.967554969423595 -2020,,EOP,DT2.2,L,RA,C,29.967554969423595 -2020,,IA,DT2.2,C,RA,N,0.09226050955731169 -2020,,IA,DT2.2,L,RA,N,0.09226050955731169 -2020,,CF,DT2.2,C,RA,N,-30 -2020,,CF,DT2.2,L,RA,N,-30 -,,BOP,DTR1.1,C,RA,N,-29.93764722993315 -,,BOP,DTR1.1,L,RA,N,-29.93764722993315 -,,EOP,DTR1.1,C,RA,C,-14.983777484711798 -,,EOP,DTR1.1,L,RA,C,-14.983777484711798 -,,IA,DTR1.1,C,RA,N,-0.046130254778655844 -,,IA,DTR1.1,L,RA,N,-0.046130254778655844 -,,CF,DTR1.1,C,RA,N,15 -,,CF,DTR1.1,L,RA,N,15 -2020,,BOP,DTR1.2,C,RA,N,-29.93764722993315 -2020,,BOP,DTR1.2,L,RA,N,-29.93764722993315 -2020,,EOP,DTR1.2,C,RA,C,-14.983777484711798 -2020,,EOP,DTR1.2,L,RA,C,-14.983777484711798 -2020,,IA,DTR1.2,C,RA,N,-0.046130254778655844 -2020,,IA,DTR1.2,L,RA,N,-0.046130254778655844 -2020,,CF,DTR1.2,C,RA,N,15 -2020,,CF,DTR1.2,L,RA,N,15 -,,BOP,DTR2.1,C,RA,N,-29.93764722993315 -,,BOP,DTR2.1,L,RA,N,-29.93764722993315 -,,EOP,DTR2.1,C,RA,C,-14.983777484711798 -,,EOP,DTR2.1,L,RA,C,-14.983777484711798 -,,IA,DTR2.1,C,RA,N,-0.046130254778655844 -,,IA,DTR2.1,L,RA,N,-0.046130254778655844 -,,CF,DTR2.1,C,RA,N,15 -,,CF,DTR2.1,L,RA,N,15 -2020,,BOP,DTR2.2,C,RA,N,-29.93764722993315 -2020,,BOP,DTR2.2,L,RA,N,-29.93764722993315 -2020,,EOP,DTR2.2,C,RA,C,-14.983777484711798 -2020,,EOP,DTR2.2,L,RA,C,-14.983777484711798 -2020,,IA,DTR2.2,C,RA,N,-0.046130254778655844 -2020,,IA,DTR2.2,L,RA,N,-0.046130254778655844 -2020,,CF,DTR2.2,C,RA,N,15 -2020,,CF,DTR2.2,L,RA,N,15 -,,BOP,DT3.1,C,RA,N,59.8752944598663 -,,BOP,DT3.1,L,RA,N,59.8752944598663 -,,EOP,DT3.1,C,RA,C,29.967554969423595 -,,EOP,DT3.1,L,RA,C,29.967554969423595 -,,IA,DT3.1,C,RA,N,0.09226050955731169 -,,IA,DT3.1,L,RA,N,0.09226050955731169 -,,CF,DT3.1,C,RA,N,-30 -,,CF,DT3.1,L,RA,N,-30 -,,BOP,DT4.1,C,RA,N,59.8752944598663 -,,BOP,DT4.1,L,RA,N,59.8752944598663 -,,EOP,DT4.1,C,RA,C,29.967554969423595 -,,EOP,DT4.1,L,RA,C,29.967554969423595 -,,IA,DT4.1,C,RA,N,0.09226050955731169 -,,IA,DT4.1,L,RA,N,0.09226050955731169 -,,CF,DT4.1,C,RA,N,-30 -,,CF,DT4.1,L,RA,N,-30 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__A.csv similarity index 66% rename from full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__A.csv index 1a81ddf9..68e384da 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__A.csv @@ -1,4 +1,3 @@ -$$Default @@Main Month,ReportingNode,Scenario,Year 12,CH,,2020 @@ -7,9 +6,6 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,NIC,CF,DTR1.1,,A,C,140 ,PR,CF,DTR1.1,,A,C,-200 2020,NIC,CF,DT2.2,,A,C,-280 -,AEA,CF,DT1.3,,A,C,-5 -,ACA,CF,DT1.3,,A,C,-10 -,NIC,CF,DT1.3,,A,C,-280 ,PR,CF,DT1.1,,A,C,400 ,NIC,CF,DT1.1,,A,C,-280 ,ACA,CF,DT1.1,,A,C,-10 @@ -20,6 +16,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,ACA,CF,DT2.1,,A,C,-10 ,AEA,CF,DT2.1,,A,C,-5 ,PR,CF,DT1.3,,A,C,400 +,NIC,CF,DT1.3,,A,C,-280 +,ACA,CF,DT1.3,,A,C,-10 +,AEA,CF,DT1.3,,A,C,-5 +,PR,CF,DT1.4,,A,C,400 +,NIC,CF,DT1.4,,A,C,-280 +,ACA,CF,DT1.4,,A,C,-10 +,AEA,CF,DT1.4,,A,C,-5 2020,NIC,CF,DTR1.2,,A,C,140 ,PR,CF,DTR2.1,,A,C,-200 ,NIC,CF,DTR2.1,,A,C,140 @@ -31,4 +34,16 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,PR,CF,DT4.1,,A,C,400 ,NIC,CF,DT4.1,,A,C,-280 ,ACA,CF,DT4.1,,A,C,-10 -,AEA,CF,DT4.1,,A,C,-5 \ No newline at end of file +,AEA,CF,DT4.1,,A,C,-5 +,PR,CF,DT1.5,,A,C,400 +,NIC,CF,DT1.5,,A,C,-280 +,ACA,CF,DT1.5,,A,C,-10 +,AEA,CF,DT1.5,,A,C,-5 +,PR,CF,DTR1.3,,A,C,-200 +,NIC,CF,DTR1.3,,A,C,140 +,PR,CF,DTR1.4,,A,C,-200 +,NIC,CF,DTR1.4,,A,C,140 +,PR,CF,DT5.1,,A,C,400 +,NIC,CF,DT5.1,,A,C,-280 +,ACA,CF,DT5.1,,A,C,-10 +,AEA,CF,DT5.1,,A,C,-5 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__AA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__AA.csv new file mode 100644 index 00000000..553cc04c --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__AA.csv @@ -0,0 +1,15 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@AA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,NIC,EOP,DT1.4,,AA,C,-5 +,PR,EOP,DT1.4,,AA,C,15 +,PR,CF,DT1.4,,AA,C,15 +,NIC,CF,DT1.4,,AA,C,-5 +,PR,BOP,DT3.1,,AA,I,-1.5 +,PR,EOP,DT3.1,,AA,C,-1.5 +,PR,CF,DTR1.3,,AA,C,-5 +,NIC,CF,DTR1.3,,AA,C,4 +,PR,EOP,DTR1.3,,AA,C,-5 +,NIC,EOP,DTR1.3,,AA,C,4 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__APA.csv similarity index 71% rename from full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__APA.csv index 28224af3..65ed3279 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__APA.csv @@ -1,11 +1,13 @@ -$$Default @@Main Month,ReportingNode,Scenario,Year 12,CH,,2020 @@APA AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,CF,DT1.3,,APA,C,400 ,PR,CF,DT1.1,,APA,C,320 ,PR,CF,DT2.1,,APA,C,320 +,PR,CF,DT1.3,,APA,C,400 +,PR,CF,DT1.4,,APA,C,320 ,PR,CF,DT3.1,,APA,C,320 -,PR,CF,DT4.1,,APA,C,320 \ No newline at end of file +,PR,CF,DT4.1,,APA,C,320 +,PR,CF,DT1.5,,APA,C,320 +,PR,CF,DT5.1,,APA,C,320 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BE.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BE.csv new file mode 100644 index 00000000..117c1368 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BE.csv @@ -0,0 +1,277 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@BE +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,BOP,DT1.1,C,BE,N,-798.53673 +,NIC,BOP,DT1.1,L,BE,N,598.75294 +,PR,BOP,DT1.1,L,BE,N,-798.53673 +,NIC,BOP,DT1.1,C,BE,N,598.75294 +,PR,EOP,DT1.1,L,BE,C,-399.63393 +,NIC,EOP,DT1.1,L,BE,C,299.67555 +,PR,EOP,DT1.1,C,BE,C,-399.63393 +,NIC,EOP,DT1.1,C,BE,C,299.67555 +,PR,IA,DT1.1,L,BE,N,-1.0972 +,NIC,IA,DT1.1,L,BE,N,0.92261 +,PR,IA,DT1.1,C,BE,N,-1.0972 +,NIC,IA,DT1.1,C,BE,N,0.92261 +,PR,CF,DT1.1,L,BE,N,400 +,NIC,CF,DT1.1,L,BE,N,-300 +,PR,CF,DT1.1,C,BE,N,400 +,NIC,CF,DT1.1,C,BE,N,-300 +2020,NIC,BOP,DT1.2,L,BE,N,598.75294 +2020,NIC,BOP,DT1.2,C,BE,N,598.75294 +2020,NIC,EOP,DT1.2,L,BE,C,299.67555 +2020,NIC,EOP,DT1.2,C,BE,C,299.67555 +2020,NIC,IA,DT1.2,L,BE,N,0.92261 +2020,NIC,IA,DT1.2,C,BE,N,0.92261 +2020,NIC,CF,DT1.2,L,BE,N,-300 +2020,NIC,CF,DT1.2,C,BE,N,-300 +,PR,BOP,DT1.3,L,BE,N,-798.53673 +,NIC,BOP,DT1.3,L,BE,N,598.75294 +,PR,BOP,DT1.3,C,BE,N,-798.53673 +,NIC,BOP,DT1.3,C,BE,N,598.75294 +,PR,EOP,DT1.3,L,BE,C,-399.63393 +,NIC,EOP,DT1.3,L,BE,C,299.67555 +,PR,EOP,DT1.3,C,BE,C,-399.63393 +,NIC,EOP,DT1.3,C,BE,C,299.67555 +,PR,IA,DT1.3,L,BE,N,-1.0972 +,NIC,IA,DT1.3,L,BE,N,0.92261 +,PR,IA,DT1.3,C,BE,N,-1.0972 +,NIC,IA,DT1.3,C,BE,N,0.92261 +,PR,CF,DT1.3,L,BE,N,400 +,NIC,CF,DT1.3,L,BE,N,-300 +,PR,CF,DT1.3,C,BE,N,400 +,NIC,CF,DT1.3,C,BE,N,-300 +,PR,BOP,DT2.1,L,BE,N,-798.53673 +,NIC,BOP,DT2.1,L,BE,N,598.75294 +,PR,BOP,DT2.1,C,BE,N,-798.53673 +,NIC,BOP,DT2.1,C,BE,N,598.75294 +,PR,EOP,DT2.1,L,BE,C,-399.63393 +,NIC,EOP,DT2.1,L,BE,C,299.67555 +,PR,EOP,DT2.1,C,BE,C,-399.63393 +,NIC,EOP,DT2.1,C,BE,C,299.67555 +,PR,IA,DT2.1,L,BE,N,-1.0972 +,NIC,IA,DT2.1,L,BE,N,0.92261 +,PR,IA,DT2.1,C,BE,N,-1.0972 +,NIC,IA,DT2.1,C,BE,N,0.92261 +,PR,CF,DT2.1,L,BE,N,400 +,NIC,CF,DT2.1,L,BE,N,-300 +,PR,CF,DT2.1,C,BE,N,400 +,NIC,CF,DT2.1,C,BE,N,-300 +2020,NIC,BOP,DT2.2,L,BE,N,598.75294 +2020,NIC,BOP,DT2.2,C,BE,N,598.75294 +2020,NIC,EOP,DT2.2,L,BE,C,299.67555 +2020,NIC,EOP,DT2.2,C,BE,C,299.67555 +2020,NIC,IA,DT2.2,L,BE,N,0.92261 +2020,NIC,IA,DT2.2,C,BE,N,0.92261 +2020,NIC,CF,DT2.2,L,BE,N,-300 +2020,NIC,CF,DT2.2,C,BE,N,-300 +,PR,BOP,DTR1.1,L,BE,N,399.26837 +,NIC,BOP,DTR1.1,L,BE,N,-299.37647 +,CDR,BOP,DTR1.1,L,BE,N,0.48113 +,PR,BOP,DTR1.1,C,BE,N,399.26837 +,NIC,BOP,DTR1.1,C,BE,N,-299.37647 +,CDR,BOP,DTR1.1,C,BE,N,0.48113 +,PR,EOP,DTR1.1,L,BE,C,199.81696 +,NIC,EOP,DTR1.1,L,BE,C,-149.83777 +,CDR,EOP,DTR1.1,L,BE,C,0.11527 +,PR,EOP,DTR1.1,C,BE,C,199.81696 +,NIC,EOP,DTR1.1,C,BE,C,-149.83777 +,CDR,EOP,DTR1.1,C,BE,C,0.11527 +,PR,IA,DTR1.1,L,BE,N,0.5486 +,NIC,IA,DTR1.1,L,BE,N,-0.4613 +,CDR,IA,DTR1.1,L,BE,N,0.00117 +,PR,IA,DTR1.1,C,BE,N,0.5486 +,NIC,IA,DTR1.1,C,BE,N,-0.4613 +,CDR,IA,DTR1.1,C,BE,N,0.00117 +,PR,CF,DTR1.1,L,BE,N,-200 +,NIC,CF,DTR1.1,L,BE,N,150 +,CDR,CF,DTR1.1,L,BE,N,-0.36703 +,PR,CF,DTR1.1,C,BE,N,-200 +,NIC,CF,DTR1.1,C,BE,N,150 +,CDR,CF,DTR1.1,C,BE,N,-0.36703 +2020,NIC,BOP,DTR1.2,L,BE,N,-299.37647 +2020,CDR,BOP,DTR1.2,L,BE,N,0.48113 +2020,NIC,BOP,DTR1.2,C,BE,N,-299.37647 +2020,CDR,BOP,DTR1.2,C,BE,N,0.48113 +2020,NIC,EOP,DTR1.2,L,BE,C,-149.83777 +2020,CDR,EOP,DTR1.2,L,BE,C,0.11527 +2020,NIC,EOP,DTR1.2,C,BE,C,-149.83777 +2020,CDR,EOP,DTR1.2,C,BE,C,0.11527 +2020,NIC,IA,DTR1.2,L,BE,N,-0.4613 +2020,CDR,IA,DTR1.2,L,BE,N,0.00117 +2020,NIC,IA,DTR1.2,C,BE,N,-0.4613 +2020,CDR,IA,DTR1.2,C,BE,N,0.00117 +2020,NIC,CF,DTR1.2,L,BE,N,150 +2020,CDR,CF,DTR1.2,L,BE,N,-0.36703 +2020,NIC,CF,DTR1.2,C,BE,N,150 +2020,CDR,CF,DTR1.2,C,BE,N,-0.36703 +,PR,BOP,DTR2.1,L,BE,N,399.26837 +,NIC,BOP,DTR2.1,L,BE,N,-299.37647 +,CDR,BOP,DTR2.1,L,BE,N,0.48113 +,PR,BOP,DTR2.1,C,BE,N,399.26837 +,NIC,BOP,DTR2.1,C,BE,N,-299.37647 +,CDR,BOP,DTR2.1,C,BE,N,0.48113 +,PR,EOP,DTR2.1,L,BE,C,199.81696 +,NIC,EOP,DTR2.1,L,BE,C,-149.83777 +,CDR,EOP,DTR2.1,L,BE,C,0.11527 +,PR,EOP,DTR2.1,C,BE,C,199.81696 +,NIC,EOP,DTR2.1,C,BE,C,-149.83777 +,CDR,EOP,DTR2.1,C,BE,C,0.11527 +,PR,IA,DTR2.1,L,BE,N,0.5486 +,NIC,IA,DTR2.1,L,BE,N,-0.4613 +,CDR,IA,DTR2.1,L,BE,N,0.00117 +,PR,IA,DTR2.1,C,BE,N,0.5486 +,NIC,IA,DTR2.1,C,BE,N,-0.4613 +,CDR,IA,DTR2.1,C,BE,N,0.00117 +,PR,CF,DTR2.1,L,BE,N,-200 +,NIC,CF,DTR2.1,L,BE,N,150 +,CDR,CF,DTR2.1,L,BE,N,-0.36703 +,PR,CF,DTR2.1,C,BE,N,-200 +,NIC,CF,DTR2.1,C,BE,N,150 +,CDR,CF,DTR2.1,C,BE,N,-0.36703 +2020,NIC,BOP,DTR2.2,L,BE,N,-299.37647 +2020,CDR,BOP,DTR2.2,L,BE,N,0.48113 +2020,NIC,BOP,DTR2.2,C,BE,N,-299.37647 +2020,CDR,BOP,DTR2.2,C,BE,N,0.48113 +2020,NIC,EOP,DTR2.2,L,BE,C,-149.83777 +2020,CDR,EOP,DTR2.2,L,BE,C,0.11527 +2020,NIC,EOP,DTR2.2,C,BE,C,-149.83777 +2020,CDR,EOP,DTR2.2,C,BE,C,0.11527 +2020,NIC,IA,DTR2.2,L,BE,N,-0.4613 +2020,CDR,IA,DTR2.2,L,BE,N,0.00117 +2020,NIC,IA,DTR2.2,C,BE,N,-0.4613 +2020,CDR,IA,DTR2.2,C,BE,N,0.00117 +2020,NIC,CF,DTR2.2,L,BE,N,150 +2020,CDR,CF,DTR2.2,L,BE,N,-0.36703 +2020,NIC,CF,DTR2.2,C,BE,N,150 +2020,CDR,CF,DTR2.2,C,BE,N,-0.36703 +,PR,BOP,DT3.1,L,BE,N,-798.53673 +,NIC,BOP,DT3.1,L,BE,N,598.75294 +,PR,BOP,DT3.1,C,BE,N,-798.53673 +,NIC,BOP,DT3.1,C,BE,N,598.75294 +,PR,EOP,DT3.1,L,BE,C,-399.63393 +,NIC,EOP,DT3.1,L,BE,C,299.67555 +,PR,EOP,DT3.1,C,BE,C,-399.63393 +,NIC,EOP,DT3.1,C,BE,C,299.67555 +,PR,IA,DT3.1,L,BE,N,-1.0972 +,NIC,IA,DT3.1,L,BE,N,0.92261 +,PR,IA,DT3.1,C,BE,N,-1.0972 +,NIC,IA,DT3.1,C,BE,N,0.92261 +,PR,CF,DT3.1,L,BE,N,400 +,NIC,CF,DT3.1,L,BE,N,-300 +,PR,CF,DT3.1,C,BE,N,400 +,NIC,CF,DT3.1,C,BE,N,-300 +,PR,BOP,DT4.1,L,BE,N,-798.53673 +,NIC,BOP,DT4.1,L,BE,N,598.75294 +,PR,BOP,DT4.1,C,BE,N,-798.53673 +,NIC,BOP,DT4.1,C,BE,N,598.75294 +,PR,EOP,DT4.1,L,BE,C,-399.63393 +,NIC,EOP,DT4.1,L,BE,C,299.67555 +,PR,EOP,DT4.1,C,BE,C,-399.63393 +,NIC,EOP,DT4.1,C,BE,C,299.67555 +,PR,IA,DT4.1,L,BE,N,-1.0972 +,NIC,IA,DT4.1,L,BE,N,0.92261 +,PR,IA,DT4.1,C,BE,N,-1.0972 +,NIC,IA,DT4.1,C,BE,N,0.92261 +,PR,CF,DT4.1,L,BE,N,400 +,NIC,CF,DT4.1,L,BE,N,-300 +,PR,CF,DT4.1,C,BE,N,400 +,NIC,CF,DT4.1,C,BE,N,-300 +,PR,BOP,DT1.4,L,BE,N,-798.53673 +,NIC,BOP,DT1.4,L,BE,N,598.75294 +,PR,BOP,DT1.4,C,BE,N,-798.53673 +,NIC,BOP,DT1.4,C,BE,N,598.75294 +,PR,EOP,DT1.4,L,BE,C,-399.63393 +,NIC,EOP,DT1.4,L,BE,C,299.67555 +,PR,EOP,DT1.4,C,BE,C,-399.63393 +,NIC,EOP,DT1.4,C,BE,C,299.67555 +,PR,IA,DT1.4,L,BE,N,-1.0972 +,NIC,IA,DT1.4,L,BE,N,0.92261 +,PR,IA,DT1.4,C,BE,N,-1.0972 +,NIC,IA,DT1.4,C,BE,N,0.92261 +,PR,CF,DT1.4,L,BE,N,400 +,NIC,CF,DT1.4,L,BE,N,-300 +,PR,CF,DT1.4,C,BE,N,400 +,NIC,CF,DT1.4,C,BE,N,-300 +,PR,BOP,DT1.5,L,BE,N,-798.53673 +,NIC,BOP,DT1.5,L,BE,N,598.75294 +,PR,BOP,DT1.5,C,BE,N,-798.53673 +,NIC,BOP,DT1.5,C,BE,N,598.75294 +,PR,EOP,DT1.5,L,BE,C,-399.63393 +,NIC,EOP,DT1.5,L,BE,C,299.67555 +,PR,EOP,DT1.5,C,BE,C,-399.63393 +,NIC,EOP,DT1.5,C,BE,C,299.67555 +,PR,IA,DT1.5,L,BE,N,-1.0972 +,NIC,IA,DT1.5,L,BE,N,0.92261 +,PR,IA,DT1.5,C,BE,N,-1.0972 +,NIC,IA,DT1.5,C,BE,N,0.92261 +,PR,CF,DT1.5,L,BE,N,400 +,NIC,CF,DT1.5,L,BE,N,-300 +,PR,CF,DT1.5,C,BE,N,400 +,NIC,CF,DT1.5,C,BE,N,-300 +,PR,BOP,DTR1.3,L,BE,N,399.26837 +,NIC,BOP,DTR1.3,L,BE,N,-299.37647 +,CDR,BOP,DTR1.3,L,BE,N,0.48113 +,PR,BOP,DTR1.3,C,BE,N,399.26837 +,NIC,BOP,DTR1.3,C,BE,N,-299.37647 +,CDR,BOP,DTR1.3,C,BE,N,0.48113 +,PR,EOP,DTR1.3,L,BE,C,199.81696 +,NIC,EOP,DTR1.3,L,BE,C,-149.83777 +,CDR,EOP,DTR1.3,L,BE,C,0.11527 +,PR,EOP,DTR1.3,C,BE,C,199.81696 +,NIC,EOP,DTR1.3,C,BE,C,-149.83777 +,CDR,EOP,DTR1.3,C,BE,C,0.11527 +,PR,IA,DTR1.3,L,BE,N,0.5486 +,NIC,IA,DTR1.3,L,BE,N,-0.4613 +,CDR,IA,DTR1.3,L,BE,N,0.00117 +,PR,IA,DTR1.3,C,BE,N,0.5486 +,NIC,IA,DTR1.3,C,BE,N,-0.4613 +,CDR,IA,DTR1.3,C,BE,N,0.00117 +,PR,CF,DTR1.3,L,BE,N,-200 +,NIC,CF,DTR1.3,L,BE,N,150 +,CDR,CF,DTR1.3,L,BE,N,-0.36703 +,PR,CF,DTR1.3,C,BE,N,-200 +,NIC,CF,DTR1.3,C,BE,N,150 +,CDR,CF,DTR1.3,C,BE,N,-0.36703 +,PR,BOP,DTR1.4,L,BE,N,399.26837 +,NIC,BOP,DTR1.4,L,BE,N,-299.37647 +,CDR,BOP,DTR1.4,L,BE,N,0.48113 +,PR,BOP,DTR1.4,C,BE,N,399.26837 +,NIC,BOP,DTR1.4,C,BE,N,-299.37647 +,CDR,BOP,DTR1.4,C,BE,N,0.48113 +,PR,EOP,DTR1.4,L,BE,C,199.81696 +,NIC,EOP,DTR1.4,L,BE,C,-149.83777 +,CDR,EOP,DTR1.4,L,BE,C,0.11527 +,PR,EOP,DTR1.4,C,BE,C,199.81696 +,NIC,EOP,DTR1.4,C,BE,C,-149.83777 +,CDR,EOP,DTR1.4,C,BE,C,0.11527 +,PR,IA,DTR1.4,L,BE,N,0.5486 +,NIC,IA,DTR1.4,L,BE,N,-0.4613 +,CDR,IA,DTR1.4,L,BE,N,0.00117 +,PR,IA,DTR1.4,C,BE,N,0.5486 +,NIC,IA,DTR1.4,C,BE,N,-0.4613 +,CDR,IA,DTR1.4,C,BE,N,0.00117 +,PR,CF,DTR1.4,L,BE,N,-200 +,NIC,CF,DTR1.4,L,BE,N,150 +,CDR,CF,DTR1.4,L,BE,N,-0.36703 +,PR,CF,DTR1.4,C,BE,N,-200 +,NIC,CF,DTR1.4,C,BE,N,150 +,CDR,CF,DTR1.4,C,BE,N,-0.36703 +,PR,BOP,DT5.1,L,BE,N,-798.53673 +,NIC,BOP,DT5.1,L,BE,N,598.75294 +,PR,BOP,DT5.1,C,BE,N,-798.53673 +,NIC,BOP,DT5.1,C,BE,N,598.75294 +,PR,EOP,DT5.1,L,BE,C,-399.63393 +,NIC,EOP,DT5.1,L,BE,C,299.67555 +,PR,EOP,DT5.1,C,BE,C,-399.63393 +,NIC,EOP,DT5.1,C,BE,C,299.67555 +,PR,IA,DT5.1,L,BE,N,-1.0972 +,NIC,IA,DT5.1,L,BE,N,0.92261 +,PR,IA,DT5.1,C,BE,N,-1.0972 +,NIC,IA,DT5.1,C,BE,N,0.92261 +,PR,CF,DT5.1,L,BE,N,400 +,NIC,CF,DT5.1,L,BE,N,-300 +,PR,CF,DT5.1,C,BE,N,400 +,NIC,CF,DT5.1,C,BE,N,-300 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BEPA.csv similarity index 70% rename from full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BEPA.csv index 66ec38ea..6b328ce8 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BEPA.csv @@ -1,4 +1,3 @@ -$$Default @@Main Month,ReportingNode,Scenario,Year 12,CH,,2020 @@ -8,4 +7,7 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,PR,CF,DT1.3,L,BEPA,N,400 ,PR,CF,DT2.1,L,BEPA,N,320 ,PR,CF,DT3.1,L,BEPA,N,320 -,PR,CF,DT4.1,L,BEPA,N,320 \ No newline at end of file +,PR,CF,DT4.1,L,BEPA,N,320 +,PR,CF,DT1.4,L,BEPA,N,320 +,PR,CF,DT1.5,L,BEPA,N,320 +,PR,CF,DT5.1,L,BEPA,N,320 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__C.csv new file mode 100644 index 00000000..d0077750 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__C.csv @@ -0,0 +1,63 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@C +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,IA,DT1.4,,C,N,0.08233 +,,BOP,DT1.4,,C,N,139.90849 +,,EOP,DT1.4,,C,C,42.96811 +,,AM,DT1.4,,C,C,-82.02271 +,,EA,DT1.4,,C,C,-15 +,,EA,DT1.1,,C,C,-15 +,,AM,DT1.1,,C,C,-82.02271 +,,EOP,DT1.1,,C,C,42.96811 +,,BOP,DT1.1,,C,N,139.90849 +,,IA,DT1.1,,C,N,0.08233 +,,EA,DT2.1,,C,C,-15 +,,AM,DT2.1,,C,C,-82.02271 +,,EOP,DT2.1,,C,C,42.96811 +,,BOP,DT2.1,,C,N,139.90849 +,,IA,DT2.1,,C,N,0.08233 +,,EA,DT1.3,,C,C,-15 +,,AM,DT1.3,,C,C,-82.02271 +,,EOP,DT1.3,,C,C,42.96811 +,,BOP,DT1.3,,C,N,139.90849 +,,IA,DT1.3,,C,N,0.08233 +,,AM,DTR1.1,,C,C,46.24958 +,,EOP,DTR1.1,,C,C,-24.22813 +,,BOP,DTR1.1,,C,N,-70.43538 +,,IA,DTR1.1,,C,N,-0.04234 +,,AM,DTR2.1,,C,C,46.24958 +,,EOP,DTR2.1,,C,C,-24.22813 +,,BOP,DTR2.1,,C,N,-70.43538 +,,IA,DTR2.1,,C,N,-0.04234 +,,BOP,DT3.1,,C,I,72.2 +,,EA,DT3.1,,C,C,-15 +,,AM,DT3.1,,C,C,-129.49727 +,,EOP,DT3.1,,C,C,67.83796 +,,IA,DT3.1,,C,I,0.1444 +,,BOP,DT3.1,,C,N,139.90849 +,,IA,DT3.1,,C,N,0.08233 +,,EA,DT4.1,,C,C,-15 +,,AM,DT4.1,,C,C,-82.02271 +,,EOP,DT4.1,,C,C,42.96811 +,,BOP,DT4.1,,C,N,139.90849 +,,IA,DT4.1,,C,N,0.08233 +,,EA,DT1.5,,C,C,-15 +,,AM,DT1.5,,C,C,-82.02271 +,,EOP,DT1.5,,C,C,42.96811 +,,BOP,DT1.5,,C,N,139.90849 +,,IA,DT1.5,,C,N,0.08233 +,,AM,DTR1.3,,C,C,46.24958 +,,EOP,DTR1.3,,C,C,-24.22813 +,,BOP,DTR1.3,,C,N,-70.43538 +,,IA,DTR1.3,,C,N,-0.04234 +,,AM,DTR1.4,,C,C,46.24958 +,,EOP,DTR1.4,,C,C,-24.22813 +,,BOP,DTR1.4,,C,N,-70.43538 +,,IA,DTR1.4,,C,N,-0.04234 +,,EA,DT5.1,,C,C,-15 +,,AM,DT5.1,,C,C,-82.02271 +,,EOP,DT5.1,,C,C,42.96811 +,,BOP,DT5.1,,C,N,139.90849 +,,IA,DT5.1,,C,N,0.08233 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__DA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__DA.csv new file mode 100644 index 00000000..c6a86ef0 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__DA.csv @@ -0,0 +1,29 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@DA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,EOP,DT1.4,,DA,C,-5.15655 +,,AM,DT1.4,,DA,C,9.84345 +,,CF,DT1.1,,DA,C,-15 +,,AM,DT1.1,,DA,C,9.84345 +,,EOP,DT1.1,,DA,C,-5.15655 +,,CF,DT2.1,,DA,C,-15 +,,AM,DT2.1,,DA,C,9.84345 +,,EOP,DT2.1,,DA,C,-5.15655 +,,CF,DT1.3,,DA,C,-15 +,,AM,DT1.3,,DA,C,9.84345 +,,EOP,DT1.3,,DA,C,-5.15655 +,,CF,DT1.4,,DA,C,-15 +,,CF,DT3.1,,DA,C,-15 +,,AM,DT3.1,,DA,C,9.84345 +,,EOP,DT3.1,,DA,C,-5.15655 +,,CF,DT4.1,,DA,C,-15 +,,AM,DT4.1,,DA,C,9.84345 +,,EOP,DT4.1,,DA,C,-5.15655 +,,CF,DT1.5,,DA,C,-15 +,,AM,DT1.5,,DA,C,9.84345 +,,EOP,DT1.5,,DA,C,-5.15655 +,,CF,DT5.1,,DA,C,-15 +,,AM,DT5.1,,DA,C,9.84345 +,,EOP,DT5.1,,DA,C,-5.15655 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__F.csv new file mode 100644 index 00000000..16f07d59 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__F.csv @@ -0,0 +1,21 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@F +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,AM,DT1.1,L,F,C,0.65623 +,,AM,DT1.2,L,F,C,1 +,,AM,DT1.3,L,F,C,0.65623 +,,AM,DT2.1,L,F,C,0.65623 +,,AM,DT2.2,L,F,C,1 +,,AM,DTR1.1,L,F,C,0.65623 +,,AM,DTR1.2,L,F,C,1 +,,AM,DTR2.1,L,F,C,0.65623 +,,AM,DTR2.2,L,F,C,1 +,,AM,DT3.1,L,F,C,0.65623 +,,AM,DT4.1,L,F,C,0.65623 +,,AM,DT1.4,L,F,C,0.65623 +,,AM,DT1.5,L,F,C,0.65623 +,,AM,DTR1.3,L,F,C,0.65623 +,,AM,DTR1.4,L,F,C,0.65623 +,,AM,DT5.1,L,F,C,0.65623 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__OA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__OA.csv new file mode 100644 index 00000000..572f247b --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__OA.csv @@ -0,0 +1,19 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@OA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,NIC,EOP,DT1.4,,OA,C,8 +,PR,EOP,DT1.4,,OA,C,-10 +,PR,CF,DT1.4,,OA,C,-10 +,NIC,CF,DT1.4,,OA,C,8 +,PR,BOP,DT3.1,,OA,I,1.5 +,PR,EOP,DT3.1,,OA,C,1.5 +,PR,CF,DT1.5,,OA,C,-10 +,PR,EOP,DT1.5,,OA,C,-10 +,PR,CF,DTR1.3,,OA,C,7.5 +,NIC,CF,DTR1.3,,OA,C,-2.5 +,PR,EOP,DTR1.3,,OA,C,7.5 +,NIC,EOP,DTR1.3,,OA,C,-2.5 +,NIC,CF,DTR1.4,,OA,C,-10 +,NIC,EOP,DTR1.4,,OA,C,-10 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__RA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__RA.csv new file mode 100644 index 00000000..567800e1 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__RA.csv @@ -0,0 +1,133 @@ +@@Main +Month,ReportingNode,Scenario,Year +12,CH,,2020 +@@RA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,BOP,DT1.1,C,RA,N,59.87529 +,,BOP,DT1.1,L,RA,N,59.87529 +,,EOP,DT1.1,C,RA,C,29.96755 +,,EOP,DT1.1,L,RA,C,29.96755 +,,IA,DT1.1,C,RA,N,0.09226 +,,IA,DT1.1,L,RA,N,0.09226 +,,CF,DT1.1,C,RA,N,-30 +,,CF,DT1.1,L,RA,N,-30 +2020,,BOP,DT1.2,C,RA,N,59.87529 +2020,,BOP,DT1.2,L,RA,N,59.87529 +2020,,EOP,DT1.2,C,RA,C,29.96755 +2020,,EOP,DT1.2,L,RA,C,29.96755 +2020,,IA,DT1.2,C,RA,N,0.09226 +2020,,IA,DT1.2,L,RA,N,0.09226 +2020,,CF,DT1.2,C,RA,N,-30 +2020,,CF,DT1.2,L,RA,N,-30 +,,BOP,DT1.3,C,RA,N,59.87529 +,,BOP,DT1.3,L,RA,N,59.87529 +,,EOP,DT1.3,C,RA,C,29.96755 +,,EOP,DT1.3,L,RA,C,29.96755 +,,IA,DT1.3,C,RA,N,0.09226 +,,IA,DT1.3,L,RA,N,0.09226 +,,CF,DT1.3,C,RA,N,-30 +,,CF,DT1.3,L,RA,N,-30 +,,BOP,DT2.1,C,RA,N,59.87529 +,,BOP,DT2.1,L,RA,N,59.87529 +,,EOP,DT2.1,C,RA,C,29.96755 +,,EOP,DT2.1,L,RA,C,29.96755 +,,IA,DT2.1,C,RA,N,0.09226 +,,IA,DT2.1,L,RA,N,0.09226 +,,CF,DT2.1,C,RA,N,-30 +,,CF,DT2.1,L,RA,N,-30 +2020,,BOP,DT2.2,C,RA,N,59.87529 +2020,,BOP,DT2.2,L,RA,N,59.87529 +2020,,EOP,DT2.2,C,RA,C,29.96755 +2020,,EOP,DT2.2,L,RA,C,29.96755 +2020,,IA,DT2.2,C,RA,N,0.09226 +2020,,IA,DT2.2,L,RA,N,0.09226 +2020,,CF,DT2.2,C,RA,N,-30 +2020,,CF,DT2.2,L,RA,N,-30 +,,BOP,DTR1.1,C,RA,N,-29.93765 +,,BOP,DTR1.1,L,RA,N,-29.93765 +,,EOP,DTR1.1,C,RA,C,-14.98378 +,,EOP,DTR1.1,L,RA,C,-14.98378 +,,IA,DTR1.1,C,RA,N,-0.04613 +,,IA,DTR1.1,L,RA,N,-0.04613 +,,CF,DTR1.1,C,RA,N,15 +,,CF,DTR1.1,L,RA,N,15 +2020,,BOP,DTR1.2,C,RA,N,-29.93765 +2020,,BOP,DTR1.2,L,RA,N,-29.93765 +2020,,EOP,DTR1.2,C,RA,C,-14.98378 +2020,,EOP,DTR1.2,L,RA,C,-14.98378 +2020,,IA,DTR1.2,C,RA,N,-0.04613 +2020,,IA,DTR1.2,L,RA,N,-0.04613 +2020,,CF,DTR1.2,C,RA,N,15 +2020,,CF,DTR1.2,L,RA,N,15 +,,BOP,DTR2.1,C,RA,N,-29.93765 +,,BOP,DTR2.1,L,RA,N,-29.93765 +,,EOP,DTR2.1,C,RA,C,-14.98378 +,,EOP,DTR2.1,L,RA,C,-14.98378 +,,IA,DTR2.1,C,RA,N,-0.04613 +,,IA,DTR2.1,L,RA,N,-0.04613 +,,CF,DTR2.1,C,RA,N,15 +,,CF,DTR2.1,L,RA,N,15 +2020,,BOP,DTR2.2,C,RA,N,-29.93765 +2020,,BOP,DTR2.2,L,RA,N,-29.93765 +2020,,EOP,DTR2.2,C,RA,C,-14.98378 +2020,,EOP,DTR2.2,L,RA,C,-14.98378 +2020,,IA,DTR2.2,C,RA,N,-0.04613 +2020,,IA,DTR2.2,L,RA,N,-0.04613 +2020,,CF,DTR2.2,C,RA,N,15 +2020,,CF,DTR2.2,L,RA,N,15 +,,BOP,DT3.1,C,RA,N,59.87529 +,,BOP,DT3.1,L,RA,N,59.87529 +,,EOP,DT3.1,C,RA,C,29.96755 +,,EOP,DT3.1,L,RA,C,29.96755 +,,IA,DT3.1,C,RA,N,0.09226 +,,IA,DT3.1,L,RA,N,0.09226 +,,CF,DT3.1,C,RA,N,-30 +,,CF,DT3.1,L,RA,N,-30 +,,BOP,DT4.1,C,RA,N,59.87529 +,,BOP,DT4.1,L,RA,N,59.87529 +,,EOP,DT4.1,C,RA,C,29.96755 +,,EOP,DT4.1,L,RA,C,29.96755 +,,IA,DT4.1,C,RA,N,0.09226 +,,IA,DT4.1,L,RA,N,0.09226 +,,CF,DT4.1,C,RA,N,-30 +,,CF,DT4.1,L,RA,N,-30 +,,BOP,DT1.4,C,RA,N,59.87529 +,,BOP,DT1.4,L,RA,N,59.87529 +,,EOP,DT1.4,C,RA,C,29.96755 +,,EOP,DT1.4,L,RA,C,29.96755 +,,IA,DT1.4,C,RA,N,0.09226 +,,IA,DT1.4,L,RA,N,0.09226 +,,CF,DT1.4,C,RA,N,-30 +,,CF,DT1.4,L,RA,N,-30 +,,BOP,DT1.5,C,RA,N,59.87529 +,,BOP,DT1.5,L,RA,N,59.87529 +,,EOP,DT1.5,C,RA,C,29.96755 +,,EOP,DT1.5,L,RA,C,29.96755 +,,IA,DT1.5,C,RA,N,0.09226 +,,IA,DT1.5,L,RA,N,0.09226 +,,CF,DT1.5,C,RA,N,-30 +,,CF,DT1.5,L,RA,N,-30 +,,BOP,DTR1.3,C,RA,N,-29.93765 +,,BOP,DTR1.3,L,RA,N,-29.93765 +,,EOP,DTR1.3,C,RA,C,-14.98378 +,,EOP,DTR1.3,L,RA,C,-14.98378 +,,IA,DTR1.3,C,RA,N,-0.04613 +,,IA,DTR1.3,L,RA,N,-0.04613 +,,CF,DTR1.3,C,RA,N,15 +,,CF,DTR1.3,L,RA,N,15 +,,BOP,DTR1.4,C,RA,N,-29.93765 +,,BOP,DTR1.4,L,RA,N,-29.93765 +,,EOP,DTR1.4,C,RA,C,-14.98378 +,,EOP,DTR1.4,L,RA,C,-14.98378 +,,IA,DTR1.4,C,RA,N,-0.04613 +,,IA,DTR1.4,L,RA,N,-0.04613 +,,CF,DTR1.4,C,RA,N,15 +,,CF,DTR1.4,L,RA,N,15 +,,BOP,DT5.1,C,RA,N,59.87529 +,,BOP,DT5.1,L,RA,N,59.87529 +,,EOP,DT5.1,C,RA,C,29.96755 +,,EOP,DT5.1,L,RA,C,29.96755 +,,IA,DT5.1,C,RA,N,0.09226 +,,IA,DT5.1,L,RA,N,0.09226 +,,CF,DT5.1,C,RA,N,-30 +,,CF,DT5.1,L,RA,N,-30 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv deleted file mode 100644 index 4364bf3b..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv +++ /dev/null @@ -1,26 +0,0 @@ -$$Default -@@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 -@@AA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,EOP,DT2.1,,AA,C,-1 -,PR,CF,DT2.1,,AA,C,-5 -,PR,WO,DT2.1,,AA,C,4 -,PR,WO,DT1.1,,AA,C,4 -,PR,CF,DT1.1,,AA,C,-5 -,PR,EOP,DT1.1,,AA,C,-1 -,PR,WO,DT1.3,,AA,C,4 -,PR,CF,DT1.3,,AA,C,-5 -,PR,EOP,DT1.3,,AA,C,-1 -,PR,CF,DTR1.1,,AA,C,2 -,PR,EOP,DTR1.1,,AA,C,2 -,PR,CF,DTR2.1,,AA,C,2 -,PR,EOP,DTR2.1,,AA,C,2 -,PR,WO,DT3.1,,AA,C,4 -,PR,CF,DT3.1,,AA,C,-5 -,PR,BOP,DT3.1,,AA,I,-1.5 -,PR,EOP,DT3.1,,AA,C,-2.5 -,PR,WO,DT4.1,,AA,C,4 -,PR,CF,DT4.1,,AA,C,-5 -,PR,EOP,DT4.1,,AA,C,-1 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv deleted file mode 100644 index f489cba8..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv +++ /dev/null @@ -1,11 +0,0 @@ -$$Default -@@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 -@@AAPA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,CF,DT2.1,,AAPA,C,-4 -,PR,CF,DT1.1,,AAPA,C,-4 -,PR,CF,DT1.3,,AAPA,C,-5 -,PR,CF,DT3.1,,AAPA,C,-4 -,PR,CF,DT4.1,,AAPA,C,-4 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv deleted file mode 100644 index e367c61e..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv +++ /dev/null @@ -1,471 +0,0 @@ -@@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 -@@BE -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,MC,DT1.1,L,BE,I,-39.963392949885474 -,NIC,MC,DT1.1,L,BE,I,-59.93510993884718 -,PR,MC,DT1.1,C,BE,I,-39.963392949885474 -,NIC,MC,DT1.1,C,BE,I,-59.93510993884718 -,PR,BOP,DT1.1,L,BE,N,-39.963392949885524 -,NIC,BOP,DT1.1,L,BE,N,47.94808795107775 -,ICO,BOP,DT1.1,L,BE,N,11.987021987769438 -,PR,BOP,DT1.1,C,BE,N,-39.908704950657615 -,NIC,BOP,DT1.1,C,BE,N,47.87054820092061 -,ICO,BOP,DT1.1,C,BE,N,11.967637050230152 -,PR,EV,DT1.1,L,BE,N,14.990014559301141 -,NIC,EV,DT1.1,L,BE,N,44.96255719444398 -,PR,EV,DT1.1,C,BE,N,14.975090771307462 -,NIC,EV,DT1.1,C,BE,N,44.906606557852164 -,PR,BOP,DT1.1,L,BE,I,-399.63392949885525 -,NIC,BOP,DT1.1,L,BE,I,299.67554969423594 -,PR,BOP,DT1.1,C,BE,I,-399.63392949885525 -,NIC,BOP,DT1.1,C,BE,I,299.67554969423594 -,PR,EOP,DT1.1,L,BE,C,-344.7703348639262 -,NIC,EOP,DT1.1,L,BE,C,260.78283172777515 -,ICO,EOP,DT1.1,L,BE,C,8.992511438888796 -,PR,EOP,DT1.1,C,BE,C,-344.42708774007167 -,NIC,EOP,DT1.1,C,BE,C,260.4583180355426 -,ICO,EOP,DT1.1,C,BE,C,8.981321311570435 -,PR,IA,DT1.1,L,BE,I,-0.18299785588431194 -,NIC,IA,DT1.1,L,BE,I,0.10978902238720895 -,PR,IA,DT1.1,C,BE,I,-0.18299785588431194 -,NIC,IA,DT1.1,C,BE,I,0.10978902238720895 -,PR,CF,DT1.1,L,BE,I,110 -,NIC,CF,DT1.1,L,BE,I,-60 -,PR,CF,DT1.1,C,BE,I,110 -,NIC,CF,DT1.1,C,BE,I,-60 -,PR,YCU,DT1.1,C,BE,I,0.3283233358608868 -,NIC,YCU,DT1.1,C,BE,I,-0.22380254636726704 -,PR,IA,DT1.1,L,BE,N,-0.016636168716755634 -,NIC,IA,DT1.1,L,BE,N,0.021957804477441785 -,ICO,IA,DT1.1,L,BE,N,0.005489451119360446 -,PR,IA,DT1.1,C,BE,N,-0.04147659195731423 -,NIC,IA,DT1.1,C,BE,N,0.05473704536112062 -,ICO,IA,DT1.1,C,BE,N,0.013684261340280154 -,PR,CF,DT1.1,L,BE,N,10 -,NIC,CF,DT1.1,L,BE,N,-12 -,ICO,CF,DT1.1,L,BE,N,-3 -,PR,CF,DT1.1,C,BE,N,10 -,NIC,CF,DT1.1,C,BE,N,-12 -,ICO,CF,DT1.1,C,BE,N,-3 -2020,NIC,MC,DT1.2,L,BE,I,-59.93510993884718 -2020,NIC,MC,DT1.2,C,BE,I,-59.93510993884718 -2020,NIC,BOP,DT1.2,L,BE,N,59.93510993884719 -2020,NIC,BOP,DT1.2,C,BE,N,59.83818525115076 -2020,NIC,EV,DT1.2,L,BE,N,44.96255719444399 -2020,NIC,EV,DT1.2,C,BE,N,44.90660655785217 -2020,NIC,BOP,DT1.2,L,BE,I,299.67554969423594 -2020,NIC,BOP,DT1.2,C,BE,I,299.67554969423594 -2020,NIC,EOP,DT1.2,L,BE,C,269.7753431666639 -2020,NIC,EOP,DT1.2,C,BE,C,269.43963934711303 -2020,NIC,IA,DT1.2,L,BE,I,0.10978902238720895 -2020,NIC,IA,DT1.2,C,BE,I,0.10978902238720895 -2020,NIC,CF,DT1.2,L,BE,I,-60 -2020,NIC,CF,DT1.2,C,BE,I,-60 -2020,NIC,YCU,DT1.2,C,BE,I,-0.22380254636726704 -2020,NIC,IA,DT1.2,L,BE,N,0.027447255596802236 -2020,NIC,IA,DT1.2,C,BE,N,0.06842130670140079 -2020,NIC,CF,DT1.2,L,BE,N,-15 -2020,NIC,CF,DT1.2,C,BE,N,-15 -,PR,MC,DT1.3,L,BE,I,-39.963392949885474 -,NIC,MC,DT1.3,L,BE,I,-59.93510993884718 -,PR,MC,DT1.3,C,BE,I,-39.963392949885474 -,NIC,MC,DT1.3,C,BE,I,-59.93510993884718 -,PR,BOP,DT1.3,L,BE,N,-39.963392949885524 -,NIC,BOP,DT1.3,L,BE,N,47.94808795107775 -,ICO,BOP,DT1.3,L,BE,N,11.987021987769438 -,PR,BOP,DT1.3,C,BE,N,-39.908704950657615 -,NIC,BOP,DT1.3,C,BE,N,47.87054820092061 -,ICO,BOP,DT1.3,C,BE,N,11.967637050230152 -,PR,EV,DT1.3,L,BE,N,14.990014559301141 -,NIC,EV,DT1.3,L,BE,N,44.96255719444398 -,PR,EV,DT1.3,C,BE,N,14.975090771307462 -,NIC,EV,DT1.3,C,BE,N,44.906606557852164 -,PR,BOP,DT1.3,L,BE,I,-399.63392949885525 -,NIC,BOP,DT1.3,L,BE,I,299.67554969423594 -,PR,BOP,DT1.3,C,BE,I,-399.63392949885525 -,NIC,BOP,DT1.3,C,BE,I,299.67554969423594 -,PR,EOP,DT1.3,L,BE,C,-344.7703348639262 -,NIC,EOP,DT1.3,L,BE,C,260.78283172777515 -,ICO,EOP,DT1.3,L,BE,C,8.992511438888796 -,PR,EOP,DT1.3,C,BE,C,-344.42708774007167 -,NIC,EOP,DT1.3,C,BE,C,260.4583180355426 -,ICO,EOP,DT1.3,C,BE,C,8.981321311570435 -,PR,IA,DT1.3,L,BE,I,-0.18299785588431194 -,NIC,IA,DT1.3,L,BE,I,0.10978902238720895 -,PR,IA,DT1.3,C,BE,I,-0.18299785588431194 -,NIC,IA,DT1.3,C,BE,I,0.10978902238720895 -,PR,CF,DT1.3,L,BE,I,110 -,NIC,CF,DT1.3,L,BE,I,-60 -,PR,CF,DT1.3,C,BE,I,110 -,NIC,CF,DT1.3,C,BE,I,-60 -,PR,YCU,DT1.3,C,BE,I,0.3283233358608868 -,NIC,YCU,DT1.3,C,BE,I,-0.22380254636726704 -,PR,IA,DT1.3,L,BE,N,-0.016636168716755634 -,NIC,IA,DT1.3,L,BE,N,0.021957804477441785 -,ICO,IA,DT1.3,L,BE,N,0.005489451119360446 -,PR,IA,DT1.3,C,BE,N,-0.04147659195731423 -,NIC,IA,DT1.3,C,BE,N,0.05473704536112062 -,ICO,IA,DT1.3,C,BE,N,0.013684261340280154 -,PR,CF,DT1.3,L,BE,N,10 -,NIC,CF,DT1.3,L,BE,N,-12 -,ICO,CF,DT1.3,L,BE,N,-3 -,PR,CF,DT1.3,C,BE,N,10 -,NIC,CF,DT1.3,C,BE,N,-12 -,ICO,CF,DT1.3,C,BE,N,-3 -,PR,MC,DT2.1,L,BE,I,-39.963392949885474 -,NIC,MC,DT2.1,L,BE,I,-59.93510993884718 -,PR,MC,DT2.1,C,BE,I,-39.963392949885474 -,NIC,MC,DT2.1,C,BE,I,-59.93510993884718 -,PR,BOP,DT2.1,L,BE,N,-39.963392949885524 -,NIC,BOP,DT2.1,L,BE,N,47.94808795107775 -,ICO,BOP,DT2.1,L,BE,N,11.987021987769438 -,PR,BOP,DT2.1,C,BE,N,-39.908704950657615 -,NIC,BOP,DT2.1,C,BE,N,47.87054820092061 -,ICO,BOP,DT2.1,C,BE,N,11.967637050230152 -,PR,EV,DT2.1,L,BE,N,14.990014559301141 -,NIC,EV,DT2.1,L,BE,N,44.96255719444398 -,PR,EV,DT2.1,C,BE,N,14.975090771307462 -,NIC,EV,DT2.1,C,BE,N,44.906606557852164 -,PR,BOP,DT2.1,L,BE,I,-399.63392949885525 -,NIC,BOP,DT2.1,L,BE,I,299.67554969423594 -,PR,BOP,DT2.1,C,BE,I,-399.63392949885525 -,NIC,BOP,DT2.1,C,BE,I,299.67554969423594 -,PR,EOP,DT2.1,L,BE,C,-344.7703348639262 -,NIC,EOP,DT2.1,L,BE,C,260.78283172777515 -,ICO,EOP,DT2.1,L,BE,C,8.992511438888796 -,PR,EOP,DT2.1,C,BE,C,-344.42708774007167 -,NIC,EOP,DT2.1,C,BE,C,260.4583180355426 -,ICO,EOP,DT2.1,C,BE,C,8.981321311570435 -,PR,IA,DT2.1,L,BE,I,-0.18299785588431194 -,NIC,IA,DT2.1,L,BE,I,0.10978902238720895 -,PR,IA,DT2.1,C,BE,I,-0.18299785588431194 -,NIC,IA,DT2.1,C,BE,I,0.10978902238720895 -,PR,CF,DT2.1,L,BE,I,110 -,NIC,CF,DT2.1,L,BE,I,-60 -,PR,CF,DT2.1,C,BE,I,110 -,NIC,CF,DT2.1,C,BE,I,-60 -,PR,YCU,DT2.1,C,BE,I,0.3283233358608868 -,NIC,YCU,DT2.1,C,BE,I,-0.22380254636726704 -,PR,IA,DT2.1,L,BE,N,-0.016636168716755634 -,NIC,IA,DT2.1,L,BE,N,0.021957804477441785 -,ICO,IA,DT2.1,L,BE,N,0.005489451119360446 -,PR,IA,DT2.1,C,BE,N,-0.04147659195731423 -,NIC,IA,DT2.1,C,BE,N,0.05473704536112062 -,ICO,IA,DT2.1,C,BE,N,0.013684261340280154 -,PR,CF,DT2.1,L,BE,N,10 -,NIC,CF,DT2.1,L,BE,N,-12 -,ICO,CF,DT2.1,L,BE,N,-3 -,PR,CF,DT2.1,C,BE,N,10 -,NIC,CF,DT2.1,C,BE,N,-12 -,ICO,CF,DT2.1,C,BE,N,-3 -2020,NIC,MC,DT2.2,L,BE,I,-59.93510993884718 -2020,NIC,MC,DT2.2,C,BE,I,-59.93510993884718 -2020,NIC,BOP,DT2.2,L,BE,N,59.93510993884719 -2020,NIC,BOP,DT2.2,C,BE,N,59.83818525115076 -2020,NIC,EV,DT2.2,L,BE,N,44.96255719444399 -2020,NIC,EV,DT2.2,C,BE,N,44.90660655785217 -2020,NIC,BOP,DT2.2,L,BE,I,299.67554969423594 -2020,NIC,BOP,DT2.2,C,BE,I,299.67554969423594 -2020,NIC,EOP,DT2.2,L,BE,C,269.7753431666639 -2020,NIC,EOP,DT2.2,C,BE,C,269.43963934711303 -2020,NIC,IA,DT2.2,L,BE,I,0.10978902238720895 -2020,NIC,IA,DT2.2,C,BE,I,0.10978902238720895 -2020,NIC,CF,DT2.2,L,BE,I,-60 -2020,NIC,CF,DT2.2,C,BE,I,-60 -2020,NIC,YCU,DT2.2,C,BE,I,-0.22380254636726704 -2020,NIC,IA,DT2.2,L,BE,N,0.027447255596802236 -2020,NIC,IA,DT2.2,C,BE,N,0.06842130670140079 -2020,NIC,CF,DT2.2,L,BE,N,-15 -2020,NIC,CF,DT2.2,C,BE,N,-15 -,PR,MC,DTR1.1,L,BE,I,19.981696474942737 -,NIC,MC,DTR1.1,L,BE,I,29.96755496942359 -,CDR,MC,DTR1.1,L,BE,I,-0.023054320790396418 -,PR,MC,DTR1.1,C,BE,I,19.981696474942737 -,NIC,MC,DTR1.1,C,BE,I,29.96755496942359 -,CDR,MC,DTR1.1,C,BE,I,-0.023054320790396418 -,PR,BOP,DTR1.1,L,BE,N,19.981696474942762 -,NIC,BOP,DTR1.1,L,BE,N,-29.967554969423595 -,CDR,BOP,DTR1.1,L,BE,N,0.29437375980433944 -,PR,BOP,DTR1.1,C,BE,N,19.954352475328808 -,NIC,BOP,DTR1.1,C,BE,N,-29.91909262557538 -,CDR,BOP,DTR1.1,C,BE,N,0.29373948854293713 -,PR,EV,DTR1.1,L,BE,N,-7.4950072796505705 -,NIC,EV,DTR1.1,L,BE,N,-22.481278597221994 -,CDR,EV,DTR1.1,L,BE,N,0.16090924598518777 -,PR,EV,DTR1.1,C,BE,N,-7.487545385653731 -,NIC,EV,DTR1.1,C,BE,N,-22.453303278926086 -,CDR,EV,DTR1.1,C,BE,N,0.16064240608443553 -,PR,BOP,DTR1.1,L,BE,I,199.81696474942763 -,NIC,BOP,DTR1.1,L,BE,I,-149.83777484711797 -,CDR,BOP,DTR1.1,L,BE,I,0.11527160395198197 -,PR,BOP,DTR1.1,C,BE,I,199.81696474942763 -,NIC,BOP,DTR1.1,C,BE,I,-149.83777484711797 -,CDR,BOP,DTR1.1,C,BE,I,0.11527160395198197 -,PR,EOP,DTR1.1,L,BE,C,172.3851674319631 -,NIC,EOP,DTR1.1,L,BE,C,-134.88767158333195 -,CDR,EOP,DTR1.1,L,BE,C,0.9654554759111266 -,PR,EOP,DTR1.1,C,BE,C,172.21354387003583 -,NIC,EOP,DTR1.1,C,BE,C,-134.71981967355651 -,CDR,EOP,DTR1.1,C,BE,C,0.9638544365066131 -,PR,IA,DTR1.1,L,BE,I,0.09149892794215597 -,NIC,IA,DTR1.1,L,BE,I,-0.05489451119360447 -,CDR,IA,DTR1.1,L,BE,I,7.726288250786695E-05 -,PR,IA,DTR1.1,C,BE,I,0.09149892794215597 -,NIC,IA,DTR1.1,C,BE,I,-0.05489451119360447 -,CDR,IA,DTR1.1,C,BE,I,7.726288250786695E-05 -,PR,CF,DTR1.1,L,BE,I,-55 -,NIC,CF,DTR1.1,L,BE,I,30 -,CDR,CF,DTR1.1,L,BE,I,-0.041970417989396935 -,PR,CF,DTR1.1,C,BE,I,-55 -,NIC,CF,DTR1.1,C,BE,I,30 -,CDR,CF,DTR1.1,C,BE,I,-0.041970417989396935 -,PR,YCU,DTR1.1,C,BE,I,-0.1641616679304434 -,NIC,YCU,DTR1.1,C,BE,I,0.11190127318363352 -,CDR,YCU,DTR1.1,C,BE,I,-8.349412781047394E-05 -,CDR,CRU,DTR1.1,L,BE,I,0.5933128558860402 -,CDR,CRU,DTR1.1,C,BE,I,0.5923289904108416 -,PR,IA,DTR1.1,L,BE,N,0.008318084358377817 -,NIC,IA,DTR1.1,L,BE,N,-0.013723627798401118 -,CDR,IA,DTR1.1,L,BE,N,0.0002461342988846482 -,PR,IA,DTR1.1,C,BE,N,0.020738295978657114 -,NIC,IA,DTR1.1,C,BE,N,-0.03421065335070039 -,CDR,IA,DTR1.1,C,BE,N,0.0006135656595298578 -,PR,CF,DTR1.1,L,BE,N,-5 -,NIC,CF,DTR1.1,L,BE,N,7.5 -,CDR,CF,DTR1.1,L,BE,N,-0.1337106481180328 -,PR,CF,DTR1.1,C,BE,N,-5 -,NIC,CF,DTR1.1,C,BE,N,7.5 -,CDR,CF,DTR1.1,C,BE,N,-0.1337106481180328 -2020,NIC,MC,DTR1.2,L,BE,I,29.96755496942359 -2020,CDR,MC,DTR1.2,L,BE,I,-0.023054320790396418 -2020,NIC,MC,DTR1.2,C,BE,I,29.96755496942359 -2020,CDR,MC,DTR1.2,C,BE,I,-0.023054320790396418 -2020,NIC,BOP,DTR1.2,L,BE,N,-29.967554969423595 -2020,CDR,BOP,DTR1.2,L,BE,N,0.29437375980433944 -2020,NIC,BOP,DTR1.2,C,BE,N,-29.91909262557538 -2020,CDR,BOP,DTR1.2,C,BE,N,0.29373948854293713 -2020,NIC,EV,DTR1.2,L,BE,N,-22.481278597221994 -2020,CDR,EV,DTR1.2,L,BE,N,0.16090924598518777 -2020,NIC,EV,DTR1.2,C,BE,N,-22.453303278926086 -2020,CDR,EV,DTR1.2,C,BE,N,0.16064240608443553 -2020,NIC,BOP,DTR1.2,L,BE,I,-149.83777484711797 -2020,CDR,BOP,DTR1.2,L,BE,I,0.11527160395198197 -2020,NIC,BOP,DTR1.2,C,BE,I,-149.83777484711797 -2020,CDR,BOP,DTR1.2,C,BE,I,0.11527160395198197 -2020,NIC,EOP,DTR1.2,L,BE,C,-134.88767158333195 -2020,CDR,EOP,DTR1.2,L,BE,C,0.9654554759111266 -2020,NIC,EOP,DTR1.2,C,BE,C,-134.71981967355651 -2020,CDR,EOP,DTR1.2,C,BE,C,0.9638544365066131 -2020,NIC,IA,DTR1.2,L,BE,I,-0.05489451119360447 -2020,CDR,IA,DTR1.2,L,BE,I,7.726288250786695E-05 -2020,NIC,IA,DTR1.2,C,BE,I,-0.05489451119360447 -2020,CDR,IA,DTR1.2,C,BE,I,7.726288250786695E-05 -2020,NIC,CF,DTR1.2,L,BE,I,30 -2020,CDR,CF,DTR1.2,L,BE,I,-0.041970417989396935 -2020,NIC,CF,DTR1.2,C,BE,I,30 -2020,CDR,CF,DTR1.2,C,BE,I,-0.041970417989396935 -2020,NIC,YCU,DTR1.2,C,BE,I,0.11190127318363352 -2020,CDR,YCU,DTR1.2,C,BE,I,-8.349412781047394E-05 -2020,CDR,CRU,DTR1.2,L,BE,I,0.5933128558860402 -2020,CDR,CRU,DTR1.2,C,BE,I,0.5923289904108416 -2020,NIC,IA,DTR1.2,L,BE,N,-0.013723627798401118 -2020,CDR,IA,DTR1.2,L,BE,N,0.0002461342988846482 -2020,NIC,IA,DTR1.2,C,BE,N,-0.03421065335070039 -2020,CDR,IA,DTR1.2,C,BE,N,0.0006135656595298578 -2020,NIC,CF,DTR1.2,L,BE,N,7.5 -2020,CDR,CF,DTR1.2,L,BE,N,-0.1337106481180328 -2020,NIC,CF,DTR1.2,C,BE,N,7.5 -2020,CDR,CF,DTR1.2,C,BE,N,-0.1337106481180328 -,PR,MC,DTR2.1,L,BE,I,19.981696474942737 -,NIC,MC,DTR2.1,L,BE,I,29.96755496942359 -,CDR,MC,DTR2.1,L,BE,I,-0.023054320790396418 -,PR,MC,DTR2.1,C,BE,I,19.981696474942737 -,NIC,MC,DTR2.1,C,BE,I,29.96755496942359 -,CDR,MC,DTR2.1,C,BE,I,-0.023054320790396418 -,PR,BOP,DTR2.1,L,BE,N,19.981696474942762 -,NIC,BOP,DTR2.1,L,BE,N,-29.967554969423595 -,CDR,BOP,DTR2.1,L,BE,N,0.29437375980433944 -,PR,BOP,DTR2.1,C,BE,N,19.954352475328808 -,NIC,BOP,DTR2.1,C,BE,N,-29.91909262557538 -,CDR,BOP,DTR2.1,C,BE,N,0.29373948854293713 -,PR,EV,DTR2.1,L,BE,N,-7.4950072796505705 -,NIC,EV,DTR2.1,L,BE,N,-22.481278597221994 -,CDR,EV,DTR2.1,L,BE,N,0.16090924598518777 -,PR,EV,DTR2.1,C,BE,N,-7.487545385653731 -,NIC,EV,DTR2.1,C,BE,N,-22.453303278926086 -,CDR,EV,DTR2.1,C,BE,N,0.16064240608443553 -,PR,BOP,DTR2.1,L,BE,I,199.81696474942763 -,NIC,BOP,DTR2.1,L,BE,I,-149.83777484711797 -,CDR,BOP,DTR2.1,L,BE,I,0.11527160395198197 -,PR,BOP,DTR2.1,C,BE,I,199.81696474942763 -,NIC,BOP,DTR2.1,C,BE,I,-149.83777484711797 -,CDR,BOP,DTR2.1,C,BE,I,0.11527160395198197 -,PR,EOP,DTR2.1,L,BE,C,172.3851674319631 -,NIC,EOP,DTR2.1,L,BE,C,-134.88767158333195 -,CDR,EOP,DTR2.1,L,BE,C,0.9654554759111266 -,PR,EOP,DTR2.1,C,BE,C,172.21354387003583 -,NIC,EOP,DTR2.1,C,BE,C,-134.71981967355651 -,CDR,EOP,DTR2.1,C,BE,C,0.9638544365066131 -,PR,IA,DTR2.1,L,BE,I,0.09149892794215597 -,NIC,IA,DTR2.1,L,BE,I,-0.05489451119360447 -,CDR,IA,DTR2.1,L,BE,I,7.726288250786695E-05 -,PR,IA,DTR2.1,C,BE,I,0.09149892794215597 -,NIC,IA,DTR2.1,C,BE,I,-0.05489451119360447 -,CDR,IA,DTR2.1,C,BE,I,7.726288250786695E-05 -,PR,CF,DTR2.1,L,BE,I,-55 -,NIC,CF,DTR2.1,L,BE,I,30 -,CDR,CF,DTR2.1,L,BE,I,-0.041970417989396935 -,PR,CF,DTR2.1,C,BE,I,-55 -,NIC,CF,DTR2.1,C,BE,I,30 -,CDR,CF,DTR2.1,C,BE,I,-0.041970417989396935 -,PR,YCU,DTR2.1,C,BE,I,-0.1641616679304434 -,NIC,YCU,DTR2.1,C,BE,I,0.11190127318363352 -,CDR,YCU,DTR2.1,C,BE,I,-8.349412781047394E-05 -,CDR,CRU,DTR2.1,L,BE,I,0.5933128558860402 -,CDR,CRU,DTR2.1,C,BE,I,0.5923289904108416 -,PR,IA,DTR2.1,L,BE,N,0.008318084358377817 -,NIC,IA,DTR2.1,L,BE,N,-0.013723627798401118 -,CDR,IA,DTR2.1,L,BE,N,0.0002461342988846482 -,PR,IA,DTR2.1,C,BE,N,0.020738295978657114 -,NIC,IA,DTR2.1,C,BE,N,-0.03421065335070039 -,CDR,IA,DTR2.1,C,BE,N,0.0006135656595298578 -,PR,CF,DTR2.1,L,BE,N,-5 -,NIC,CF,DTR2.1,L,BE,N,7.5 -,CDR,CF,DTR2.1,L,BE,N,-0.1337106481180328 -,PR,CF,DTR2.1,C,BE,N,-5 -,NIC,CF,DTR2.1,C,BE,N,7.5 -,CDR,CF,DTR2.1,C,BE,N,-0.1337106481180328 -2020,NIC,MC,DTR2.2,L,BE,I,29.96755496942359 -2020,CDR,MC,DTR2.2,L,BE,I,-0.023054320790396418 -2020,NIC,MC,DTR2.2,C,BE,I,29.96755496942359 -2020,CDR,MC,DTR2.2,C,BE,I,-0.023054320790396418 -2020,NIC,BOP,DTR2.2,L,BE,N,-29.967554969423595 -2020,CDR,BOP,DTR2.2,L,BE,N,0.29437375980433944 -2020,NIC,BOP,DTR2.2,C,BE,N,-29.91909262557538 -2020,CDR,BOP,DTR2.2,C,BE,N,0.29373948854293713 -2020,NIC,EV,DTR2.2,L,BE,N,-22.481278597221994 -2020,CDR,EV,DTR2.2,L,BE,N,0.16090924598518777 -2020,NIC,EV,DTR2.2,C,BE,N,-22.453303278926086 -2020,CDR,EV,DTR2.2,C,BE,N,0.16064240608443553 -2020,NIC,BOP,DTR2.2,L,BE,I,-149.83777484711797 -2020,CDR,BOP,DTR2.2,L,BE,I,0.11527160395198197 -2020,NIC,BOP,DTR2.2,C,BE,I,-149.83777484711797 -2020,CDR,BOP,DTR2.2,C,BE,I,0.11527160395198197 -2020,NIC,EOP,DTR2.2,L,BE,C,-134.88767158333195 -2020,CDR,EOP,DTR2.2,L,BE,C,0.9654554759111266 -2020,NIC,EOP,DTR2.2,C,BE,C,-134.71981967355651 -2020,CDR,EOP,DTR2.2,C,BE,C,0.9638544365066131 -2020,NIC,IA,DTR2.2,L,BE,I,-0.05489451119360447 -2020,CDR,IA,DTR2.2,L,BE,I,7.726288250786695E-05 -2020,NIC,IA,DTR2.2,C,BE,I,-0.05489451119360447 -2020,CDR,IA,DTR2.2,C,BE,I,7.726288250786695E-05 -2020,NIC,CF,DTR2.2,L,BE,I,30 -2020,CDR,CF,DTR2.2,L,BE,I,-0.041970417989396935 -2020,NIC,CF,DTR2.2,C,BE,I,30 -2020,CDR,CF,DTR2.2,C,BE,I,-0.041970417989396935 -2020,NIC,YCU,DTR2.2,C,BE,I,0.11190127318363352 -2020,CDR,YCU,DTR2.2,C,BE,I,-8.349412781047394E-05 -2020,CDR,CRU,DTR2.2,L,BE,I,0.5933128558860402 -2020,CDR,CRU,DTR2.2,C,BE,I,0.5923289904108416 -2020,NIC,IA,DTR2.2,L,BE,N,-0.013723627798401118 -2020,CDR,IA,DTR2.2,L,BE,N,0.0002461342988846482 -2020,NIC,IA,DTR2.2,C,BE,N,-0.03421065335070039 -2020,CDR,IA,DTR2.2,C,BE,N,0.0006135656595298578 -2020,NIC,CF,DTR2.2,L,BE,N,7.5 -2020,CDR,CF,DTR2.2,L,BE,N,-0.1337106481180328 -2020,NIC,CF,DTR2.2,C,BE,N,7.5 -2020,CDR,CF,DTR2.2,C,BE,N,-0.1337106481180328 -,PR,MC,DT3.1,L,BE,I,-39.963392949885474 -,NIC,MC,DT3.1,L,BE,I,-59.93510993884718 -,PR,MC,DT3.1,C,BE,I,-39.963392949885474 -,NIC,MC,DT3.1,C,BE,I,-59.93510993884718 -,PR,BOP,DT3.1,L,BE,N,-39.963392949885524 -,NIC,BOP,DT3.1,L,BE,N,47.94808795107775 -,ICO,BOP,DT3.1,L,BE,N,11.987021987769438 -,PR,BOP,DT3.1,C,BE,N,-39.908704950657615 -,NIC,BOP,DT3.1,C,BE,N,47.87054820092061 -,ICO,BOP,DT3.1,C,BE,N,11.967637050230152 -,PR,EV,DT3.1,L,BE,N,14.990014559301141 -,NIC,EV,DT3.1,L,BE,N,44.96255719444398 -,PR,EV,DT3.1,C,BE,N,14.975090771307462 -,NIC,EV,DT3.1,C,BE,N,44.906606557852164 -,PR,CL,DT3.1,L,BE,C,344.77033486392617 -,NIC,CL,DT3.1,L,BE,C,-260.78283172777515 -,ICO,CL,DT3.1,L,BE,C,-8.992511438888796 -,PR,CL,DT3.1,C,BE,C,344.4270877400716 -,NIC,CL,DT3.1,C,BE,C,-260.45831803554256 -,ICO,CL,DT3.1,C,BE,C,-8.981321311570435 -,PR,BOP,DT3.1,L,BE,I,-399.63392949885525 -,NIC,BOP,DT3.1,L,BE,I,299.67554969423594 -,PR,BOP,DT3.1,C,BE,I,-399.63392949885525 -,NIC,BOP,DT3.1,C,BE,I,299.67554969423594 -,PR,IA,DT3.1,L,BE,I,-0.18299785588431194 -,NIC,IA,DT3.1,L,BE,I,0.10978902238720895 -,PR,IA,DT3.1,C,BE,I,-0.18299785588431194 -,NIC,IA,DT3.1,C,BE,I,0.10978902238720895 -,PR,CF,DT3.1,L,BE,I,110 -,NIC,CF,DT3.1,L,BE,I,-60 -,PR,CF,DT3.1,C,BE,I,110 -,NIC,CF,DT3.1,C,BE,I,-60 -,PR,YCU,DT3.1,C,BE,I,0.3283233358608868 -,NIC,YCU,DT3.1,C,BE,I,-0.22380254636726704 -,PR,IA,DT3.1,L,BE,N,-0.016636168716755634 -,NIC,IA,DT3.1,L,BE,N,0.021957804477441785 -,ICO,IA,DT3.1,L,BE,N,0.005489451119360446 -,PR,IA,DT3.1,C,BE,N,-0.04147659195731423 -,NIC,IA,DT3.1,C,BE,N,0.05473704536112062 -,ICO,IA,DT3.1,C,BE,N,0.013684261340280154 -,PR,CF,DT3.1,L,BE,N,10 -,NIC,CF,DT3.1,L,BE,N,-12 -,ICO,CF,DT3.1,L,BE,N,-3 -,PR,CF,DT3.1,C,BE,N,10 -,NIC,CF,DT3.1,C,BE,N,-12 -,ICO,CF,DT3.1,C,BE,N,-3 -,PR,MC,DT4.1,L,BE,I,-39.963392949885474 -,NIC,MC,DT4.1,L,BE,I,-59.93510993884718 -,PR,MC,DT4.1,C,BE,I,-39.963392949885474 -,NIC,MC,DT4.1,C,BE,I,-59.93510993884718 -,PR,BOP,DT4.1,L,BE,N,-79.92678589977105 -,NIC,BOP,DT4.1,L,BE,N,47.94808795107775 -,ICO,BOP,DT4.1,L,BE,N,11.987021987769438 -,PR,BOP,DT4.1,C,BE,N,-79.81740990131523 -,NIC,BOP,DT4.1,C,BE,N,47.87054820092061 -,ICO,BOP,DT4.1,C,BE,N,11.967637050230152 -,PR,EV,DT4.1,L,BE,N,-38.97403785418295 -,NIC,EV,DT4.1,L,BE,N,44.96255719444398 -,PR,EV,DT4.1,C,BE,N,-38.93523600539941 -,NIC,EV,DT4.1,C,BE,N,44.906606557852164 -,PR,BOP,DT4.1,L,BE,I,-399.63392949885525 -,NIC,BOP,DT4.1,L,BE,I,299.67554969423594 -,PR,BOP,DT4.1,C,BE,I,-399.63392949885525 -,NIC,BOP,DT4.1,C,BE,I,299.67554969423594 -,PR,EOP,DT4.1,L,BE,C,-428.7144163960126 -,NIC,EOP,DT4.1,L,BE,C,260.78283172777515 -,ICO,EOP,DT4.1,L,BE,C,8.992511438888796 -,PR,EOP,DT4.1,C,BE,C,-428.2875960593934 -,NIC,EOP,DT4.1,C,BE,C,260.4583180355426 -,ICO,EOP,DT4.1,C,BE,C,8.981321311570435 -,PR,IA,DT4.1,L,BE,I,-0.18299785588431194 -,NIC,IA,DT4.1,L,BE,I,0.10978902238720895 -,PR,IA,DT4.1,C,BE,I,-0.18299785588431194 -,NIC,IA,DT4.1,C,BE,I,0.10978902238720895 -,PR,CF,DT4.1,L,BE,I,110 -,NIC,CF,DT4.1,L,BE,I,-60 -,PR,CF,DT4.1,C,BE,I,110 -,NIC,CF,DT4.1,C,BE,I,-60 -,PR,YCU,DT4.1,C,BE,I,0.3283233358608868 -,NIC,YCU,DT4.1,C,BE,I,-0.22380254636726704 -,PR,IA,DT4.1,L,BE,N,-0.03327233743351127 -,NIC,IA,DT4.1,L,BE,N,0.021957804477441785 -,ICO,IA,DT4.1,L,BE,N,0.005489451119360446 -,PR,IA,DT4.1,C,BE,N,-0.08295318391462846 -,NIC,IA,DT4.1,C,BE,N,0.05473704536112062 -,ICO,IA,DT4.1,C,BE,N,0.013684261340280154 -,PR,CF,DT4.1,L,BE,N,20 -,NIC,CF,DT4.1,L,BE,N,-12 -,ICO,CF,DT4.1,L,BE,N,-3 -,PR,CF,DT4.1,C,BE,N,20 -,NIC,CF,DT4.1,C,BE,N,-12 -,ICO,CF,DT4.1,C,BE,N,-3 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv deleted file mode 100644 index fdf3a318..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv +++ /dev/null @@ -1,54 +0,0 @@ -@@Main -ReportingNode,Year,Month,Scenario -CH,2021,3, -@@C -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,CL,DT2.1,,C,C,-87.43135554903122 -,,IA,DT2.1,,C,I,0.07437430623754743 -,,MC,DT2.1,,C,I,105.89201388261736 -,,EOP,DT2.1,,C,C,12.129509556366447 -,,AM,DT2.1,,C,C,-5.773636697753954 -,,EA,DT2.1,,C,C,-43.599999999999994 -,,BOP,DT2.1,,C,I,42.9681136142967 -,,CL,DT1.3,,C,C,-87.43135554903122 -,,BOP,DT1.1,,C,I,42.9681136142967 -,,EA,DT1.1,,C,C,-43.599999999999994 -,,AM,DT1.1,,C,C,-5.773636697753954 -,,EOP,DT1.1,,C,C,12.129509556366447 -,,MC,DT1.1,,C,I,105.89201388261736 -,,IA,DT1.1,,C,I,0.07437430623754743 -,,CL,DT1.1,,C,C,-87.43135554903122 -,,BOP,DT1.3,,C,I,42.9681136142967 -,,EA,DT1.3,,C,C,-50 -,,AM,DT1.3,,C,C,-3.7096824440639895 -,,EOP,DT1.3,,C,C,7.793463810056405 -,,MC,DT1.3,,C,I,105.89201388261736 -,,IA,DT1.3,,C,I,0.07437430623754743 -,,BOP,DTR1.1,,C,I,-24.22813469379126 -,,AM,DTR1.1,,C,C,11.133355649364928 -,,EOP,DTR1.1,,C,C,-23.389442532110124 -,,MC,DTR1.1,,C,I,-52.92295262051829 -,,IA,DTR1.1,,C,I,-0.03854664570667637 -,,CRU,DTR1.1,,C,I,-0.5933128558860402 -,,CL,DTR1.1,,C,C,43.26014863442721 -,,BOP,DTR2.1,,C,I,-24.22813469379126 -,,AM,DTR2.1,,C,C,11.133355649364928 -,,EOP,DTR2.1,,C,C,-23.389442532110124 -,,MC,DTR2.1,,C,I,-52.92295262051829 -,,IA,DTR2.1,,C,I,-0.03854664570667637 -,,CRU,DTR2.1,,C,I,-0.5933128558860402 -,,CL,DTR2.1,,C,C,43.26014863442721 -,,BOP,DT3.1,,C,I,67.83795828214957 -,,EA,DT3.1,,C,C,-33.87170342894083 -,,MC,DT3.1,,C,I,105.89201388261736 -,,IA,DT3.1,,C,I,0.08679991324534386 -,,CL,DT3.1,,C,C,-139.94506864907146 -,,BOP,DT4.1,,C,I,42.9681136142967 -,,EA,DT4.1,,C,C,-51.599999999999994 -,,AM,DT4.1,,C,C,-33.48998867550812 -,,EOP,DT4.1,,C,C,70.35723911069866 -,,MC,DT4.1,,C,I,105.89201388261736 -,,IA,DT4.1,,C,I,0.07437430623754743 -,,BOP,DT4.1,,C,N,8.004653973154419 -,,IA,DT4.1,,C,N,0.0003356307173485902 -,,EV,DT4.1,,C,N,-1.4922636208166304 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv deleted file mode 100644 index be7fcf90..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv +++ /dev/null @@ -1,24 +0,0 @@ -@@Main -ReportingNode,Year,Month,Scenario -CH,2021,3, -@@DA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,EOP,DT2.1,,DA,C,-13.656208145282752 -,,AM,DT2.1,,DA,C,6.500343986157867 -,,BOP,DT2.1,,DA,I,-5.156552131440618 -,,CF,DT2.1,,DA,C,-15 -,,CF,DT1.1,,DA,C,-15 -,,BOP,DT1.1,,DA,I,-5.156552131440618 -,,AM,DT1.1,,DA,C,6.500343986157867 -,,EOP,DT1.1,,DA,C,-13.656208145282752 -,,CF,DT1.3,,DA,C,-15 -,,BOP,DT1.3,,DA,I,-5.156552131440618 -,,AM,DT1.3,,DA,C,6.500343986157867 -,,EOP,DT1.3,,DA,C,-13.656208145282752 -,,CF,DT3.1,,DA,C,-15 -,,BOP,DT3.1,,DA,I,-5.156552131440618 -,,AM,DT3.1,,DA,C,20.15655213144062 -,,CF,DT4.1,,DA,C,-15 -,,BOP,DT4.1,,DA,I,-5.156552131440618 -,,AM,DT4.1,,DA,C,6.500343986157867 -,,EOP,DT4.1,,DA,C,-13.656208145282752 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv deleted file mode 100644 index f7419efa..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv +++ /dev/null @@ -1,16 +0,0 @@ -@@Main -ReportingNode,Year,Month,Scenario -CH,2021,3, -@@F -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,AM,DT1.1,L,F,C,0.32249285213905665 -,,AM,DT1.2,L,F,C,1 -,,AM,DT1.3,L,F,C,0.32249285213905665 -,,AM,DT2.1,L,F,C,0.32249285213905665 -,,AM,DT2.2,L,F,C,1 -,,AM,DTR1.1,L,F,C,0.32249285213905665 -,,AM,DTR1.2,L,F,C,1 -,,AM,DTR2.1,L,F,C,0.32249285213905665 -,,AM,DTR2.2,L,F,C,1 -,,AM,DT3.1,L,F,C,1 -,,AM,DT4.1,L,F,C,0.32249285213905665 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv deleted file mode 100644 index 9a6831e3..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv +++ /dev/null @@ -1,23 +0,0 @@ -@@Main -ReportingNode,Year,Month,Scenario -CH,2021,3, -@@L -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,CL,DT2.1,,L,C,-87.43135554903122 -,,EV,DT2.1,,L,N,55.45631603430072 -,,IA,DT2.1,,L,N,0.016300537999407044 -,,BOP,DT2.1,,L,N,31.958738976731105 -,,CL,DT1.3,,L,C,-87.43135554903122 -,,EV,DT1.1,,L,N,55.45631603430072 -,,BOP,DT1.1,,L,N,31.958738976731105 -,,IA,DT1.1,,L,N,0.016300537999407044 -,,CL,DT1.1,,L,C,-87.43135554903122 -,,BOP,DT1.3,,L,N,31.958738976731105 -,,IA,DT1.3,,L,N,0.016300537999407044 -,,EV,DT1.3,,L,N,55.45631603430072 -,,EA,DT3.1,,L,C,9.728296571059161 -,,AM,DT3.1,,L,C,-9.728296571059161 -,,BOP,DT3.1,,L,N,31.958738976731105 -,,IA,DT3.1,,L,N,0.016300537999407044 -,,EV,DT3.1,,L,N,55.45631603430072 -,,CL,DT3.1,,L,C,-87.43135554903122 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv deleted file mode 100644 index 0596dea4..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv +++ /dev/null @@ -1,13 +0,0 @@ -@@Main -ReportingNode,Year,Month,Scenario -CH,2021,3, -@@LR -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,BOP,DTR1.1,,LR,N,-15.684995728561214 -,,IA,DTR1.1,,LR,N,-0.007904134700818875 -,,EV,DTR1.1,,LR,N,-27.56724877116518 -,,CL,DTR1.1,,LR,C,43.26014863442721 -,,BOP,DTR2.1,,LR,N,-15.684995728561214 -,,IA,DTR2.1,,LR,N,-0.007904134700818875 -,,EV,DTR2.1,,LR,N,-27.56724877116518 -,,CL,DTR2.1,,LR,C,43.26014863442721 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv deleted file mode 100644 index 0b556852..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OA.csv +++ /dev/null @@ -1,26 +0,0 @@ -$$Default -@@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 -@@OA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,EOP,DT2.1,,OA,C,1 -,PR,CF,DT2.1,,OA,C,3 -,PR,WO,DT2.1,,OA,C,-2 -,PR,WO,DT1.1,,OA,C,-2 -,PR,CF,DT1.1,,OA,C,3 -,PR,EOP,DT1.1,,OA,C,1 -,PR,WO,DT1.3,,OA,C,-2 -,PR,CF,DT1.3,,OA,C,3 -,PR,EOP,DT1.3,,OA,C,1 -,PR,CF,DTR1.1,,OA,C,-1.5 -,PR,EOP,DTR1.1,,OA,C,-1.5 -,PR,CF,DTR2.1,,OA,C,-1.5 -,PR,EOP,DTR2.1,,OA,C,-1.5 -,PR,WO,DT3.1,,OA,C,-2 -,PR,CF,DT3.1,,OA,C,3 -,PR,BOP,DT3.1,,OA,I,1.5 -,PR,EOP,DT3.1,,OA,C,2.5 -,PR,WO,DT4.1,,OA,C,-2 -,PR,CF,DT4.1,,OA,C,3 -,PR,EOP,DT4.1,,OA,C,1 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv deleted file mode 100644 index 8e8b0328..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_OAPA.csv +++ /dev/null @@ -1,11 +0,0 @@ -$$Default -@@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 -@@OAPA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,CF,DT2.1,,OAPA,C,2.4000000000000004 -,PR,CF,DT1.1,,OAPA,C,2.4000000000000004 -,PR,CF,DT1.3,,OAPA,C,3 -,PR,CF,DT3.1,,OAPA,C,2.4000000000000004 -,PR,CF,DT4.1,,OAPA,C,2.4000000000000004 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv deleted file mode 100644 index 8009c335..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv +++ /dev/null @@ -1,215 +0,0 @@ -$$Default -@@Main -Month,ReportingNode,Scenario,Year -3,CH,,2021 -@@RA -AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,,MC,DT1.1,C,RA,I,-5.993510993884719 -,,MC,DT1.1,L,RA,I,-5.993510993884719 -,,BOP,DT1.1,C,RA,N,11.967637050230152 -,,BOP,DT1.1,L,RA,N,11.987021987769438 -,,EV,DT1.1,C,RA,N,-4.490660655785217 -,,EV,DT1.1,L,RA,N,-4.496255719444398 -,,BOP,DT1.1,C,RA,I,29.967554969423595 -,,BOP,DT1.1,L,RA,I,29.967554969423595 -,,EOP,DT1.1,C,RA,C,22.453303278926086 -,,EOP,DT1.1,L,RA,C,22.481278597221994 -,,IA,DT1.1,C,RA,I,0.010978902238720892 -,,IA,DT1.1,L,RA,I,0.010978902238720892 -,,CF,DT1.1,C,RA,I,-6 -,,CF,DT1.1,L,RA,I,-6 -,,YCU,DT1.1,C,RA,I,-0.02238025463672244 -,,IA,DT1.1,C,RA,N,0.013684261340280154 -,,IA,DT1.1,L,RA,N,0.005489451119360446 -,,CF,DT1.1,C,RA,N,-3 -,,CF,DT1.1,L,RA,N,-3 -2020,,MC,DT1.2,C,RA,I,-5.993510993884719 -2020,,MC,DT1.2,L,RA,I,-5.993510993884719 -2020,,BOP,DT1.2,C,RA,N,11.967637050230152 -2020,,BOP,DT1.2,L,RA,N,11.987021987769438 -2020,,EV,DT1.2,C,RA,N,-4.490660655785217 -2020,,EV,DT1.2,L,RA,N,-4.496255719444398 -2020,,BOP,DT1.2,C,RA,I,29.967554969423595 -2020,,BOP,DT1.2,L,RA,I,29.967554969423595 -2020,,EOP,DT1.2,C,RA,C,22.453303278926086 -2020,,EOP,DT1.2,L,RA,C,22.481278597221994 -2020,,IA,DT1.2,C,RA,I,0.010978902238720892 -2020,,IA,DT1.2,L,RA,I,0.010978902238720892 -2020,,CF,DT1.2,C,RA,I,-6 -2020,,CF,DT1.2,L,RA,I,-6 -2020,,YCU,DT1.2,C,RA,I,-0.02238025463672244 -2020,,IA,DT1.2,C,RA,N,0.013684261340280154 -2020,,IA,DT1.2,L,RA,N,0.005489451119360446 -2020,,CF,DT1.2,C,RA,N,-3 -2020,,CF,DT1.2,L,RA,N,-3 -,,MC,DT1.3,C,RA,I,-5.993510993884719 -,,MC,DT1.3,L,RA,I,-5.993510993884719 -,,BOP,DT1.3,C,RA,N,11.967637050230152 -,,BOP,DT1.3,L,RA,N,11.987021987769438 -,,EV,DT1.3,C,RA,N,-4.490660655785217 -,,EV,DT1.3,L,RA,N,-4.496255719444398 -,,BOP,DT1.3,C,RA,I,29.967554969423595 -,,BOP,DT1.3,L,RA,I,29.967554969423595 -,,EOP,DT1.3,C,RA,C,22.453303278926086 -,,EOP,DT1.3,L,RA,C,22.481278597221994 -,,IA,DT1.3,C,RA,I,0.010978902238720892 -,,IA,DT1.3,L,RA,I,0.010978902238720892 -,,CF,DT1.3,C,RA,I,-6 -,,CF,DT1.3,L,RA,I,-6 -,,YCU,DT1.3,C,RA,I,-0.02238025463672244 -,,IA,DT1.3,C,RA,N,0.013684261340280154 -,,IA,DT1.3,L,RA,N,0.005489451119360446 -,,CF,DT1.3,C,RA,N,-3 -,,CF,DT1.3,L,RA,N,-3 -,,MC,DT2.1,C,RA,I,-5.993510993884719 -,,MC,DT2.1,L,RA,I,-5.993510993884719 -,,BOP,DT2.1,C,RA,N,11.967637050230152 -,,BOP,DT2.1,L,RA,N,11.987021987769438 -,,EV,DT2.1,C,RA,N,-4.490660655785217 -,,EV,DT2.1,L,RA,N,-4.496255719444398 -,,BOP,DT2.1,C,RA,I,29.967554969423595 -,,BOP,DT2.1,L,RA,I,29.967554969423595 -,,EOP,DT2.1,C,RA,C,22.453303278926086 -,,EOP,DT2.1,L,RA,C,22.481278597221994 -,,IA,DT2.1,C,RA,I,0.010978902238720892 -,,IA,DT2.1,L,RA,I,0.010978902238720892 -,,CF,DT2.1,C,RA,I,-6 -,,CF,DT2.1,L,RA,I,-6 -,,YCU,DT2.1,C,RA,I,-0.02238025463672244 -,,IA,DT2.1,C,RA,N,0.013684261340280154 -,,IA,DT2.1,L,RA,N,0.005489451119360446 -,,CF,DT2.1,C,RA,N,-3 -,,CF,DT2.1,L,RA,N,-3 -2020,,MC,DT2.2,C,RA,I,-5.993510993884719 -2020,,MC,DT2.2,L,RA,I,-5.993510993884719 -2020,,BOP,DT2.2,C,RA,N,11.967637050230152 -2020,,BOP,DT2.2,L,RA,N,11.987021987769438 -2020,,EV,DT2.2,C,RA,N,-4.490660655785217 -2020,,EV,DT2.2,L,RA,N,-4.496255719444398 -2020,,BOP,DT2.2,C,RA,I,29.967554969423595 -2020,,BOP,DT2.2,L,RA,I,29.967554969423595 -2020,,EOP,DT2.2,C,RA,C,22.453303278926086 -2020,,EOP,DT2.2,L,RA,C,22.481278597221994 -2020,,IA,DT2.2,C,RA,I,0.010978902238720892 -2020,,IA,DT2.2,L,RA,I,0.010978902238720892 -2020,,CF,DT2.2,C,RA,I,-6 -2020,,CF,DT2.2,L,RA,I,-6 -2020,,YCU,DT2.2,C,RA,I,-0.02238025463672244 -2020,,IA,DT2.2,C,RA,N,0.013684261340280154 -2020,,IA,DT2.2,L,RA,N,0.005489451119360446 -2020,,CF,DT2.2,C,RA,N,-3 -2020,,CF,DT2.2,L,RA,N,-3 -,,MC,DTR1.1,C,RA,I,2.9967554969423595 -,,MC,DTR1.1,L,RA,I,2.9967554969423595 -,,BOP,DTR1.1,C,RA,N,-5.983818525115076 -,,BOP,DTR1.1,L,RA,N,-5.993510993884719 -,,EV,DTR1.1,C,RA,N,2.2453303278926087 -,,EV,DTR1.1,L,RA,N,2.248127859722199 -,,BOP,DTR1.1,C,RA,I,-14.983777484711798 -,,BOP,DTR1.1,L,RA,I,-14.983777484711798 -,,EOP,DTR1.1,C,RA,C,-11.226651639463043 -,,EOP,DTR1.1,L,RA,C,-11.240639298610997 -,,IA,DTR1.1,C,RA,I,-0.005489451119360446 -,,IA,DTR1.1,L,RA,I,-0.005489451119360446 -,,CF,DTR1.1,C,RA,I,3 -,,CF,DTR1.1,L,RA,I,3 -,,YCU,DTR1.1,C,RA,I,0.01119012731836122 -,,IA,DTR1.1,C,RA,N,-0.006842130670140077 -,,IA,DTR1.1,L,RA,N,-0.002744725559680223 -,,CF,DTR1.1,C,RA,N,1.5 -,,CF,DTR1.1,L,RA,N,1.5 -2020,,MC,DTR1.2,C,RA,I,2.9967554969423595 -2020,,MC,DTR1.2,L,RA,I,2.9967554969423595 -2020,,BOP,DTR1.2,C,RA,N,-5.983818525115076 -2020,,BOP,DTR1.2,L,RA,N,-5.993510993884719 -2020,,EV,DTR1.2,C,RA,N,2.2453303278926087 -2020,,EV,DTR1.2,L,RA,N,2.248127859722199 -2020,,BOP,DTR1.2,C,RA,I,-14.983777484711798 -2020,,BOP,DTR1.2,L,RA,I,-14.983777484711798 -2020,,EOP,DTR1.2,C,RA,C,-11.226651639463043 -2020,,EOP,DTR1.2,L,RA,C,-11.240639298610997 -2020,,IA,DTR1.2,C,RA,I,-0.005489451119360446 -2020,,IA,DTR1.2,L,RA,I,-0.005489451119360446 -2020,,CF,DTR1.2,C,RA,I,3 -2020,,CF,DTR1.2,L,RA,I,3 -2020,,YCU,DTR1.2,C,RA,I,0.01119012731836122 -2020,,IA,DTR1.2,C,RA,N,-0.006842130670140077 -2020,,IA,DTR1.2,L,RA,N,-0.002744725559680223 -2020,,CF,DTR1.2,C,RA,N,1.5 -2020,,CF,DTR1.2,L,RA,N,1.5 -,,MC,DTR2.1,C,RA,I,2.9967554969423595 -,,MC,DTR2.1,L,RA,I,2.9967554969423595 -,,BOP,DTR2.1,C,RA,N,-5.983818525115076 -,,BOP,DTR2.1,L,RA,N,-5.993510993884719 -,,EV,DTR2.1,C,RA,N,2.2453303278926087 -,,EV,DTR2.1,L,RA,N,2.248127859722199 -,,BOP,DTR2.1,C,RA,I,-14.983777484711798 -,,BOP,DTR2.1,L,RA,I,-14.983777484711798 -,,EOP,DTR2.1,C,RA,C,-11.226651639463043 -,,EOP,DTR2.1,L,RA,C,-11.240639298610997 -,,IA,DTR2.1,C,RA,I,-0.005489451119360446 -,,IA,DTR2.1,L,RA,I,-0.005489451119360446 -,,CF,DTR2.1,C,RA,I,3 -,,CF,DTR2.1,L,RA,I,3 -,,YCU,DTR2.1,C,RA,I,0.01119012731836122 -,,IA,DTR2.1,C,RA,N,-0.006842130670140077 -,,IA,DTR2.1,L,RA,N,-0.002744725559680223 -,,CF,DTR2.1,C,RA,N,1.5 -,,CF,DTR2.1,L,RA,N,1.5 -2020,,MC,DTR2.2,C,RA,I,2.9967554969423595 -2020,,MC,DTR2.2,L,RA,I,2.9967554969423595 -2020,,BOP,DTR2.2,C,RA,N,-5.983818525115076 -2020,,BOP,DTR2.2,L,RA,N,-5.993510993884719 -2020,,EV,DTR2.2,C,RA,N,2.2453303278926087 -2020,,EV,DTR2.2,L,RA,N,2.248127859722199 -2020,,BOP,DTR2.2,C,RA,I,-14.983777484711798 -2020,,BOP,DTR2.2,L,RA,I,-14.983777484711798 -2020,,EOP,DTR2.2,C,RA,C,-11.226651639463043 -2020,,EOP,DTR2.2,L,RA,C,-11.240639298610997 -2020,,IA,DTR2.2,C,RA,I,-0.005489451119360446 -2020,,IA,DTR2.2,L,RA,I,-0.005489451119360446 -2020,,CF,DTR2.2,C,RA,I,3 -2020,,CF,DTR2.2,L,RA,I,3 -2020,,YCU,DTR2.2,C,RA,I,0.01119012731836122 -2020,,IA,DTR2.2,C,RA,N,-0.006842130670140077 -2020,,IA,DTR2.2,L,RA,N,-0.002744725559680223 -2020,,CF,DTR2.2,C,RA,N,1.5 -2020,,CF,DTR2.2,L,RA,N,1.5 -,,MC,DT3.1,C,RA,I,-5.993510993884719 -,,MC,DT3.1,L,RA,I,-5.993510993884719 -,,BOP,DT3.1,C,RA,N,11.967637050230152 -,,BOP,DT3.1,L,RA,N,11.987021987769438 -,,EV,DT3.1,C,RA,N,-4.490660655785217 -,,EV,DT3.1,L,RA,N,-4.496255719444398 -,,CL,DT3.1,C,RA,C,-22.453303278926086 -,,CL,DT3.1,L,RA,C,-22.48127859722199 -,,BOP,DT3.1,C,RA,I,29.967554969423595 -,,BOP,DT3.1,L,RA,I,29.967554969423595 -,,IA,DT3.1,C,RA,I,0.010978902238720892 -,,IA,DT3.1,L,RA,I,0.010978902238720892 -,,CF,DT3.1,C,RA,I,-6 -,,CF,DT3.1,L,RA,I,-6 -,,YCU,DT3.1,C,RA,I,-0.02238025463672244 -,,IA,DT3.1,C,RA,N,0.013684261340280154 -,,IA,DT3.1,L,RA,N,0.005489451119360446 -,,CF,DT3.1,C,RA,N,-3 -,,CF,DT3.1,L,RA,N,-3 -,,MC,DT4.1,C,RA,I,-5.993510993884719 -,,MC,DT4.1,L,RA,I,-5.993510993884719 -,,BOP,DT4.1,C,RA,N,11.967637050230152 -,,BOP,DT4.1,L,RA,N,11.987021987769438 -,,EV,DT4.1,C,RA,N,-4.490660655785217 -,,EV,DT4.1,L,RA,N,-4.496255719444398 -,,BOP,DT4.1,C,RA,I,29.967554969423595 -,,BOP,DT4.1,L,RA,I,29.967554969423595 -,,EOP,DT4.1,C,RA,C,22.453303278926086 -,,EOP,DT4.1,L,RA,C,22.481278597221994 -,,IA,DT4.1,C,RA,I,0.010978902238720892 -,,IA,DT4.1,L,RA,I,0.010978902238720892 -,,CF,DT4.1,C,RA,I,-6 -,,CF,DT4.1,L,RA,I,-6 -,,YCU,DT4.1,C,RA,I,-0.02238025463672244 -,,IA,DT4.1,C,RA,N,0.013684261340280154 -,,IA,DT4.1,L,RA,N,0.005489451119360446 -,,CF,DT4.1,C,RA,N,-3 -,,CF,DT4.1,L,RA,N,-3 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__A.csv similarity index 72% rename from full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__A.csv index 4411cdfd..b45c2c4e 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__A.csv @@ -1,39 +1,52 @@ -$$Default @@Main Month,ReportingNode,Scenario,Year 3,CH,,2021 @@A AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,AEA,CF,DT1.4,,A,C,-5 +,ACA,CF,DT1.4,,A,C,-10 +,ICO,CF,DT1.4,,A,C,-6 +,NIC,CF,DT1.4,,A,C,-70 +,PR,CF,DT1.4,,A,C,90 +,AEA,CF,DT4.1,,A,C,-5 +,ACA,CF,DT4.1,,A,C,-10 +,NIC,CF,DT4.1,,A,C,-70 +,ICO,CF,DT4.1,,A,C,-6 +,PR,CF,DT4.1,,A,C,90 +,AEA,CF,DT3.1,,A,C,-5 +,ACA,CF,DT3.1,,A,C,-10 +,NIC,CF,DT3.1,,A,C,-70 +,ICO,CF,DT3.1,,A,C,-6 +,PR,CF,DT3.1,,A,C,90 +2020,NIC,CF,DTR2.2,,A,C,35 +,NIC,CF,DTR2.1,,A,C,35 +,PR,CF,DTR2.1,,A,C,-45 +2020,NIC,CF,DTR1.2,,A,C,35 +,NIC,CF,DTR1.1,,A,C,35 +,PR,CF,DTR1.1,,A,C,-45 2020,NIC,CF,DT2.2,,A,C,-76 -,AEA,CF,DT2.1,,A,C,-5 -,ACA,CF,DT2.1,,A,C,-10 -,NIC,CF,DT2.1,,A,C,-70 -,ICO,CF,DT2.1,,A,C,-6 -,PR,CF,DT2.1,,A,C,90 ,PR,CF,DT1.1,,A,C,90 ,ICO,CF,DT1.1,,A,C,-6 ,NIC,CF,DT1.1,,A,C,-70 ,ACA,CF,DT1.1,,A,C,-10 ,AEA,CF,DT1.1,,A,C,-5 ,PR,CF,DT1.3,,A,C,90 +2020,NIC,CF,DT1.2,,A,C,-76 ,ICO,CF,DT1.3,,A,C,-6 -,NIC,CF,DT1.3,,A,C,-70 ,ACA,CF,DT1.3,,A,C,-10 -2020,NIC,CF,DT1.2,,A,C,-76 +,NIC,CF,DT1.3,,A,C,-70 ,AEA,CF,DT1.3,,A,C,-5 -,PR,CF,DTR1.1,,A,C,-45 -,NIC,CF,DTR1.1,,A,C,35 -2020,NIC,CF,DTR1.2,,A,C,35 -,PR,CF,DTR2.1,,A,C,-45 -,NIC,CF,DTR2.1,,A,C,35 -2020,NIC,CF,DTR2.2,,A,C,35 -,PR,CF,DT3.1,,A,C,90 -,ICO,CF,DT3.1,,A,C,-6 -,NIC,CF,DT3.1,,A,C,-70 -,ACA,CF,DT3.1,,A,C,-10 -,AEA,CF,DT3.1,,A,C,-5 -,PR,CF,DT4.1,,A,C,90 -,ICO,CF,DT4.1,,A,C,-6 -,NIC,CF,DT4.1,,A,C,-70 -,ACA,CF,DT4.1,,A,C,-10 -,AEA,CF,DT4.1,,A,C,-5 \ No newline at end of file +,PR,CF,DT2.1,,A,C,90 +,ICO,CF,DT2.1,,A,C,-6 +,NIC,CF,DT2.1,,A,C,-70 +,ACA,CF,DT2.1,,A,C,-10 +,AEA,CF,DT2.1,,A,C,-5 +,PR,CF,DT1.5,,A,C,90 +,ICO,CF,DT1.5,,A,C,-6 +,NIC,CF,DT1.5,,A,C,-70 +,ACA,CF,DT1.5,,A,C,-10 +,AEA,CF,DT1.5,,A,C,-5 +,PR,CF,DTR1.3,,A,C,-45 +,NIC,CF,DTR1.3,,A,C,35 +,PR,CF,DTR1.4,,A,C,-45 +,NIC,CF,DTR1.4,,A,C,35 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__AA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__AA.csv new file mode 100644 index 00000000..80b67464 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__AA.csv @@ -0,0 +1,17 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@AA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,CF,DT1.4,,AA,C,5 +,NIC,WO,DT1.4,,AA,C,5 +,PR,EOP,DT3.1,,AA,C,-1.5 +,PR,BOP,DT3.1,,AA,I,-1.5 +,PR,BOP,DT1.4,,AA,I,15 +,NIC,BOP,DT1.4,,AA,I,-5 +,PR,EOP,DT1.4,,AA,C,20 +,PR,CF,DTR1.3,,AA,C,1.5 +,NIC,CF,DTR1.3,,AA,C,-4 +,PR,WO,DTR1.3,,AA,C,3.5 +,PR,BOP,DTR1.3,,AA,I,-5 +,NIC,BOP,DTR1.3,,AA,I,4 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__APA.csv similarity index 77% rename from full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__APA.csv index e25da1c5..bb8c178d 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__APA.csv @@ -1,11 +1,12 @@ -$$Default @@Main Month,ReportingNode,Scenario,Year 3,CH,,2021 @@APA AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value -,PR,CF,DT2.1,,APA,C,72 +,PR,CF,DT4.1,,APA,C,72 +,PR,CF,DT3.1,,APA,C,72 ,PR,CF,DT1.1,,APA,C,72 ,PR,CF,DT1.3,,APA,C,90 -,PR,CF,DT3.1,,APA,C,72 -,PR,CF,DT4.1,,APA,C,72 \ No newline at end of file +,PR,CF,DT2.1,,APA,C,72 +,PR,CF,DT1.4,,APA,C,72 +,PR,CF,DT1.5,,APA,C,72 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BE.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BE.csv new file mode 100644 index 00000000..4716f49c --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BE.csv @@ -0,0 +1,681 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@BE +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,MC,DT1.1,L,BE,I,-39.96339 +,NIC,MC,DT1.1,L,BE,I,-59.93511 +,PR,MC,DT1.1,C,BE,I,-39.96339 +,NIC,MC,DT1.1,C,BE,I,-59.93511 +,PR,BOP,DT1.1,L,BE,N,-39.96339 +,NIC,BOP,DT1.1,L,BE,N,47.94809 +,ICO,BOP,DT1.1,L,BE,N,11.98702 +,PR,BOP,DT1.1,C,BE,N,-39.9087 +,NIC,BOP,DT1.1,C,BE,N,47.87055 +,ICO,BOP,DT1.1,C,BE,N,11.96764 +,PR,EV,DT1.1,L,BE,N,14.99001 +,NIC,EV,DT1.1,L,BE,N,44.96256 +,PR,EV,DT1.1,C,BE,N,14.97509 +,NIC,EV,DT1.1,C,BE,N,44.90661 +,PR,BOP,DT1.1,L,BE,I,-399.63393 +,NIC,BOP,DT1.1,L,BE,I,299.67555 +,PR,BOP,DT1.1,C,BE,I,-399.63393 +,NIC,BOP,DT1.1,C,BE,I,299.67555 +,PR,EOP,DT1.1,L,BE,C,-344.77033 +,NIC,EOP,DT1.1,L,BE,C,260.78283 +,ICO,EOP,DT1.1,L,BE,C,8.99251 +,PR,EOP,DT1.1,C,BE,C,-344.42709 +,NIC,EOP,DT1.1,C,BE,C,260.45832 +,ICO,EOP,DT1.1,C,BE,C,8.98132 +,PR,IA,DT1.1,L,BE,I,-0.183 +,NIC,IA,DT1.1,L,BE,I,0.10979 +,PR,IA,DT1.1,C,BE,I,-0.183 +,NIC,IA,DT1.1,C,BE,I,0.10979 +,PR,CF,DT1.1,L,BE,I,110 +,NIC,CF,DT1.1,L,BE,I,-60 +,PR,CF,DT1.1,C,BE,I,110 +,NIC,CF,DT1.1,C,BE,I,-60 +,PR,YCU,DT1.1,C,BE,I,0.32832 +,NIC,YCU,DT1.1,C,BE,I,-0.2238 +,PR,IA,DT1.1,L,BE,N,-0.01664 +,NIC,IA,DT1.1,L,BE,N,0.02196 +,ICO,IA,DT1.1,L,BE,N,0.00549 +,PR,IA,DT1.1,C,BE,N,-0.04148 +,NIC,IA,DT1.1,C,BE,N,0.05474 +,ICO,IA,DT1.1,C,BE,N,0.01368 +,PR,CF,DT1.1,L,BE,N,10 +,NIC,CF,DT1.1,L,BE,N,-12 +,ICO,CF,DT1.1,L,BE,N,-3 +,PR,CF,DT1.1,C,BE,N,10 +,NIC,CF,DT1.1,C,BE,N,-12 +,ICO,CF,DT1.1,C,BE,N,-3 +2020,NIC,MC,DT1.2,L,BE,I,-59.93511 +2020,NIC,MC,DT1.2,C,BE,I,-59.93511 +2020,NIC,BOP,DT1.2,L,BE,N,59.93511 +2020,NIC,BOP,DT1.2,C,BE,N,59.83819 +2020,NIC,EV,DT1.2,L,BE,N,44.96256 +2020,NIC,EV,DT1.2,C,BE,N,44.90661 +2020,NIC,BOP,DT1.2,L,BE,I,299.67555 +2020,NIC,BOP,DT1.2,C,BE,I,299.67555 +2020,NIC,EOP,DT1.2,L,BE,C,269.77534 +2020,NIC,EOP,DT1.2,C,BE,C,269.43964 +2020,NIC,IA,DT1.2,L,BE,I,0.10979 +2020,NIC,IA,DT1.2,C,BE,I,0.10979 +2020,NIC,CF,DT1.2,L,BE,I,-60 +2020,NIC,CF,DT1.2,C,BE,I,-60 +2020,NIC,YCU,DT1.2,C,BE,I,-0.2238 +2020,NIC,IA,DT1.2,L,BE,N,0.02745 +2020,NIC,IA,DT1.2,C,BE,N,0.06842 +2020,NIC,CF,DT1.2,L,BE,N,-15 +2020,NIC,CF,DT1.2,C,BE,N,-15 +,PR,MC,DT1.3,L,BE,I,-39.96339 +,NIC,MC,DT1.3,L,BE,I,-59.93511 +,PR,MC,DT1.3,C,BE,I,-39.96339 +,NIC,MC,DT1.3,C,BE,I,-59.93511 +,PR,BOP,DT1.3,L,BE,N,-39.96339 +,NIC,BOP,DT1.3,L,BE,N,47.94809 +,ICO,BOP,DT1.3,L,BE,N,11.98702 +,PR,BOP,DT1.3,C,BE,N,-39.9087 +,NIC,BOP,DT1.3,C,BE,N,47.87055 +,ICO,BOP,DT1.3,C,BE,N,11.96764 +,PR,EV,DT1.3,L,BE,N,14.99001 +,NIC,EV,DT1.3,L,BE,N,44.96256 +,PR,EV,DT1.3,C,BE,N,14.97509 +,NIC,EV,DT1.3,C,BE,N,44.90661 +,PR,BOP,DT1.3,L,BE,I,-399.63393 +,NIC,BOP,DT1.3,L,BE,I,299.67555 +,PR,BOP,DT1.3,C,BE,I,-399.63393 +,NIC,BOP,DT1.3,C,BE,I,299.67555 +,PR,EOP,DT1.3,L,BE,C,-344.77033 +,NIC,EOP,DT1.3,L,BE,C,260.78283 +,ICO,EOP,DT1.3,L,BE,C,8.99251 +,PR,EOP,DT1.3,C,BE,C,-344.42709 +,NIC,EOP,DT1.3,C,BE,C,260.45832 +,ICO,EOP,DT1.3,C,BE,C,8.98132 +,PR,IA,DT1.3,L,BE,I,-0.183 +,NIC,IA,DT1.3,L,BE,I,0.10979 +,PR,IA,DT1.3,C,BE,I,-0.183 +,NIC,IA,DT1.3,C,BE,I,0.10979 +,PR,CF,DT1.3,L,BE,I,110 +,NIC,CF,DT1.3,L,BE,I,-60 +,PR,CF,DT1.3,C,BE,I,110 +,NIC,CF,DT1.3,C,BE,I,-60 +,PR,YCU,DT1.3,C,BE,I,0.32832 +,NIC,YCU,DT1.3,C,BE,I,-0.2238 +,PR,IA,DT1.3,L,BE,N,-0.01664 +,NIC,IA,DT1.3,L,BE,N,0.02196 +,ICO,IA,DT1.3,L,BE,N,0.00549 +,PR,IA,DT1.3,C,BE,N,-0.04148 +,NIC,IA,DT1.3,C,BE,N,0.05474 +,ICO,IA,DT1.3,C,BE,N,0.01368 +,PR,CF,DT1.3,L,BE,N,10 +,NIC,CF,DT1.3,L,BE,N,-12 +,ICO,CF,DT1.3,L,BE,N,-3 +,PR,CF,DT1.3,C,BE,N,10 +,NIC,CF,DT1.3,C,BE,N,-12 +,ICO,CF,DT1.3,C,BE,N,-3 +,PR,MC,DT2.1,L,BE,I,-39.96339 +,NIC,MC,DT2.1,L,BE,I,-59.93511 +,PR,MC,DT2.1,C,BE,I,-39.96339 +,NIC,MC,DT2.1,C,BE,I,-59.93511 +,PR,BOP,DT2.1,L,BE,N,-39.96339 +,NIC,BOP,DT2.1,L,BE,N,47.94809 +,ICO,BOP,DT2.1,L,BE,N,11.98702 +,PR,BOP,DT2.1,C,BE,N,-39.9087 +,NIC,BOP,DT2.1,C,BE,N,47.87055 +,ICO,BOP,DT2.1,C,BE,N,11.96764 +,PR,EV,DT2.1,L,BE,N,14.99001 +,NIC,EV,DT2.1,L,BE,N,44.96256 +,PR,EV,DT2.1,C,BE,N,14.97509 +,NIC,EV,DT2.1,C,BE,N,44.90661 +,PR,BOP,DT2.1,L,BE,I,-399.63393 +,NIC,BOP,DT2.1,L,BE,I,299.67555 +,PR,BOP,DT2.1,C,BE,I,-399.63393 +,NIC,BOP,DT2.1,C,BE,I,299.67555 +,PR,EOP,DT2.1,L,BE,C,-344.77033 +,NIC,EOP,DT2.1,L,BE,C,260.78283 +,ICO,EOP,DT2.1,L,BE,C,8.99251 +,PR,EOP,DT2.1,C,BE,C,-344.42709 +,NIC,EOP,DT2.1,C,BE,C,260.45832 +,ICO,EOP,DT2.1,C,BE,C,8.98132 +,PR,IA,DT2.1,L,BE,I,-0.183 +,NIC,IA,DT2.1,L,BE,I,0.10979 +,PR,IA,DT2.1,C,BE,I,-0.183 +,NIC,IA,DT2.1,C,BE,I,0.10979 +,PR,CF,DT2.1,L,BE,I,110 +,NIC,CF,DT2.1,L,BE,I,-60 +,PR,CF,DT2.1,C,BE,I,110 +,NIC,CF,DT2.1,C,BE,I,-60 +,PR,YCU,DT2.1,C,BE,I,0.32832 +,NIC,YCU,DT2.1,C,BE,I,-0.2238 +,PR,IA,DT2.1,L,BE,N,-0.01664 +,NIC,IA,DT2.1,L,BE,N,0.02196 +,ICO,IA,DT2.1,L,BE,N,0.00549 +,PR,IA,DT2.1,C,BE,N,-0.04148 +,NIC,IA,DT2.1,C,BE,N,0.05474 +,ICO,IA,DT2.1,C,BE,N,0.01368 +,PR,CF,DT2.1,L,BE,N,10 +,NIC,CF,DT2.1,L,BE,N,-12 +,ICO,CF,DT2.1,L,BE,N,-3 +,PR,CF,DT2.1,C,BE,N,10 +,NIC,CF,DT2.1,C,BE,N,-12 +,ICO,CF,DT2.1,C,BE,N,-3 +2020,NIC,MC,DT2.2,L,BE,I,-59.93511 +2020,NIC,MC,DT2.2,C,BE,I,-59.93511 +2020,NIC,BOP,DT2.2,L,BE,N,59.93511 +2020,NIC,BOP,DT2.2,C,BE,N,59.83819 +2020,NIC,EV,DT2.2,L,BE,N,44.96256 +2020,NIC,EV,DT2.2,C,BE,N,44.90661 +2020,NIC,BOP,DT2.2,L,BE,I,299.67555 +2020,NIC,BOP,DT2.2,C,BE,I,299.67555 +2020,NIC,EOP,DT2.2,L,BE,C,269.77534 +2020,NIC,EOP,DT2.2,C,BE,C,269.43964 +2020,NIC,IA,DT2.2,L,BE,I,0.10979 +2020,NIC,IA,DT2.2,C,BE,I,0.10979 +2020,NIC,CF,DT2.2,L,BE,I,-60 +2020,NIC,CF,DT2.2,C,BE,I,-60 +2020,NIC,YCU,DT2.2,C,BE,I,-0.2238 +2020,NIC,IA,DT2.2,L,BE,N,0.02745 +2020,NIC,IA,DT2.2,C,BE,N,0.06842 +2020,NIC,CF,DT2.2,L,BE,N,-15 +2020,NIC,CF,DT2.2,C,BE,N,-15 +,PR,MC,DTR1.1,L,BE,I,19.9817 +,NIC,MC,DTR1.1,L,BE,I,29.96755 +,CDR,MC,DTR1.1,L,BE,I,-0.02305 +,PR,MC,DTR1.1,C,BE,I,19.9817 +,NIC,MC,DTR1.1,C,BE,I,29.96755 +,CDR,MC,DTR1.1,C,BE,I,-0.02305 +,PR,BOP,DTR1.1,L,BE,N,19.9817 +,NIC,BOP,DTR1.1,L,BE,N,-29.96755 +,CDR,BOP,DTR1.1,L,BE,N,0.29437 +,PR,BOP,DTR1.1,C,BE,N,19.95435 +,NIC,BOP,DTR1.1,C,BE,N,-29.91909 +,CDR,BOP,DTR1.1,C,BE,N,0.29374 +,PR,EV,DTR1.1,L,BE,N,-7.49501 +,NIC,EV,DTR1.1,L,BE,N,-22.48128 +,CDR,EV,DTR1.1,L,BE,N,0.16091 +,PR,EV,DTR1.1,C,BE,N,-7.48755 +,NIC,EV,DTR1.1,C,BE,N,-22.4533 +,CDR,EV,DTR1.1,C,BE,N,0.16064 +,PR,BOP,DTR1.1,L,BE,I,199.81696 +,NIC,BOP,DTR1.1,L,BE,I,-149.83777 +,CDR,BOP,DTR1.1,L,BE,I,0.11527 +,PR,BOP,DTR1.1,C,BE,I,199.81696 +,NIC,BOP,DTR1.1,C,BE,I,-149.83777 +,CDR,BOP,DTR1.1,C,BE,I,0.11527 +,PR,EOP,DTR1.1,L,BE,C,172.38517 +,NIC,EOP,DTR1.1,L,BE,C,-134.88767 +,CDR,EOP,DTR1.1,L,BE,C,0.96546 +,PR,EOP,DTR1.1,C,BE,C,172.21354 +,NIC,EOP,DTR1.1,C,BE,C,-134.71982 +,CDR,EOP,DTR1.1,C,BE,C,0.96385 +,PR,IA,DTR1.1,L,BE,I,0.0915 +,NIC,IA,DTR1.1,L,BE,I,-0.05489 +,CDR,IA,DTR1.1,L,BE,I,8E-05 +,PR,IA,DTR1.1,C,BE,I,0.0915 +,NIC,IA,DTR1.1,C,BE,I,-0.05489 +,CDR,IA,DTR1.1,C,BE,I,8E-05 +,PR,CF,DTR1.1,L,BE,I,-55 +,NIC,CF,DTR1.1,L,BE,I,30 +,CDR,CF,DTR1.1,L,BE,I,-0.04197 +,PR,CF,DTR1.1,C,BE,I,-55 +,NIC,CF,DTR1.1,C,BE,I,30 +,CDR,CF,DTR1.1,C,BE,I,-0.04197 +,PR,YCU,DTR1.1,C,BE,I,-0.16416 +,NIC,YCU,DTR1.1,C,BE,I,0.1119 +,CDR,YCU,DTR1.1,C,BE,I,-8E-05 +,CDR,CRU,DTR1.1,L,BE,I,0.59331 +,CDR,CRU,DTR1.1,C,BE,I,0.59233 +,PR,IA,DTR1.1,L,BE,N,0.00832 +,NIC,IA,DTR1.1,L,BE,N,-0.01372 +,CDR,IA,DTR1.1,L,BE,N,0.00025 +,PR,IA,DTR1.1,C,BE,N,0.02074 +,NIC,IA,DTR1.1,C,BE,N,-0.03421 +,CDR,IA,DTR1.1,C,BE,N,0.00061 +,PR,CF,DTR1.1,L,BE,N,-5 +,NIC,CF,DTR1.1,L,BE,N,7.5 +,CDR,CF,DTR1.1,L,BE,N,-0.13371 +,PR,CF,DTR1.1,C,BE,N,-5 +,NIC,CF,DTR1.1,C,BE,N,7.5 +,CDR,CF,DTR1.1,C,BE,N,-0.13371 +2020,NIC,MC,DTR1.2,L,BE,I,29.96755 +2020,CDR,MC,DTR1.2,L,BE,I,-0.02305 +2020,NIC,MC,DTR1.2,C,BE,I,29.96755 +2020,CDR,MC,DTR1.2,C,BE,I,-0.02305 +2020,NIC,BOP,DTR1.2,L,BE,N,-29.96755 +2020,CDR,BOP,DTR1.2,L,BE,N,0.29437 +2020,NIC,BOP,DTR1.2,C,BE,N,-29.91909 +2020,CDR,BOP,DTR1.2,C,BE,N,0.29374 +2020,NIC,EV,DTR1.2,L,BE,N,-22.48128 +2020,CDR,EV,DTR1.2,L,BE,N,0.16091 +2020,NIC,EV,DTR1.2,C,BE,N,-22.4533 +2020,CDR,EV,DTR1.2,C,BE,N,0.16064 +2020,NIC,BOP,DTR1.2,L,BE,I,-149.83777 +2020,CDR,BOP,DTR1.2,L,BE,I,0.11527 +2020,NIC,BOP,DTR1.2,C,BE,I,-149.83777 +2020,CDR,BOP,DTR1.2,C,BE,I,0.11527 +2020,NIC,EOP,DTR1.2,L,BE,C,-134.88767 +2020,CDR,EOP,DTR1.2,L,BE,C,0.96546 +2020,NIC,EOP,DTR1.2,C,BE,C,-134.71982 +2020,CDR,EOP,DTR1.2,C,BE,C,0.96385 +2020,NIC,IA,DTR1.2,L,BE,I,-0.05489 +2020,CDR,IA,DTR1.2,L,BE,I,8E-05 +2020,NIC,IA,DTR1.2,C,BE,I,-0.05489 +2020,CDR,IA,DTR1.2,C,BE,I,8E-05 +2020,NIC,CF,DTR1.2,L,BE,I,30 +2020,CDR,CF,DTR1.2,L,BE,I,-0.04197 +2020,NIC,CF,DTR1.2,C,BE,I,30 +2020,CDR,CF,DTR1.2,C,BE,I,-0.04197 +2020,NIC,YCU,DTR1.2,C,BE,I,0.1119 +2020,CDR,YCU,DTR1.2,C,BE,I,-8E-05 +2020,CDR,CRU,DTR1.2,L,BE,I,0.59331 +2020,CDR,CRU,DTR1.2,C,BE,I,0.59233 +2020,NIC,IA,DTR1.2,L,BE,N,-0.01372 +2020,CDR,IA,DTR1.2,L,BE,N,0.00025 +2020,NIC,IA,DTR1.2,C,BE,N,-0.03421 +2020,CDR,IA,DTR1.2,C,BE,N,0.00061 +2020,NIC,CF,DTR1.2,L,BE,N,7.5 +2020,CDR,CF,DTR1.2,L,BE,N,-0.13371 +2020,NIC,CF,DTR1.2,C,BE,N,7.5 +2020,CDR,CF,DTR1.2,C,BE,N,-0.13371 +,PR,MC,DTR2.1,L,BE,I,19.9817 +,NIC,MC,DTR2.1,L,BE,I,29.96755 +,CDR,MC,DTR2.1,L,BE,I,-0.02305 +,PR,MC,DTR2.1,C,BE,I,19.9817 +,NIC,MC,DTR2.1,C,BE,I,29.96755 +,CDR,MC,DTR2.1,C,BE,I,-0.02305 +,PR,BOP,DTR2.1,L,BE,N,19.9817 +,NIC,BOP,DTR2.1,L,BE,N,-29.96755 +,CDR,BOP,DTR2.1,L,BE,N,0.29437 +,PR,BOP,DTR2.1,C,BE,N,19.95435 +,NIC,BOP,DTR2.1,C,BE,N,-29.91909 +,CDR,BOP,DTR2.1,C,BE,N,0.29374 +,PR,EV,DTR2.1,L,BE,N,-7.49501 +,NIC,EV,DTR2.1,L,BE,N,-22.48128 +,CDR,EV,DTR2.1,L,BE,N,0.16091 +,PR,EV,DTR2.1,C,BE,N,-7.48755 +,NIC,EV,DTR2.1,C,BE,N,-22.4533 +,CDR,EV,DTR2.1,C,BE,N,0.16064 +,PR,BOP,DTR2.1,L,BE,I,199.81696 +,NIC,BOP,DTR2.1,L,BE,I,-149.83777 +,CDR,BOP,DTR2.1,L,BE,I,0.11527 +,PR,BOP,DTR2.1,C,BE,I,199.81696 +,NIC,BOP,DTR2.1,C,BE,I,-149.83777 +,CDR,BOP,DTR2.1,C,BE,I,0.11527 +,PR,EOP,DTR2.1,L,BE,C,172.38517 +,NIC,EOP,DTR2.1,L,BE,C,-134.88767 +,CDR,EOP,DTR2.1,L,BE,C,0.96546 +,PR,EOP,DTR2.1,C,BE,C,172.21354 +,NIC,EOP,DTR2.1,C,BE,C,-134.71982 +,CDR,EOP,DTR2.1,C,BE,C,0.96385 +,PR,IA,DTR2.1,L,BE,I,0.0915 +,NIC,IA,DTR2.1,L,BE,I,-0.05489 +,CDR,IA,DTR2.1,L,BE,I,8E-05 +,PR,IA,DTR2.1,C,BE,I,0.0915 +,NIC,IA,DTR2.1,C,BE,I,-0.05489 +,CDR,IA,DTR2.1,C,BE,I,8E-05 +,PR,CF,DTR2.1,L,BE,I,-55 +,NIC,CF,DTR2.1,L,BE,I,30 +,CDR,CF,DTR2.1,L,BE,I,-0.04197 +,PR,CF,DTR2.1,C,BE,I,-55 +,NIC,CF,DTR2.1,C,BE,I,30 +,CDR,CF,DTR2.1,C,BE,I,-0.04197 +,PR,YCU,DTR2.1,C,BE,I,-0.16416 +,NIC,YCU,DTR2.1,C,BE,I,0.1119 +,CDR,YCU,DTR2.1,C,BE,I,-8E-05 +,CDR,CRU,DTR2.1,L,BE,I,0.59331 +,CDR,CRU,DTR2.1,C,BE,I,0.59233 +,PR,IA,DTR2.1,L,BE,N,0.00832 +,NIC,IA,DTR2.1,L,BE,N,-0.01372 +,CDR,IA,DTR2.1,L,BE,N,0.00025 +,PR,IA,DTR2.1,C,BE,N,0.02074 +,NIC,IA,DTR2.1,C,BE,N,-0.03421 +,CDR,IA,DTR2.1,C,BE,N,0.00061 +,PR,CF,DTR2.1,L,BE,N,-5 +,NIC,CF,DTR2.1,L,BE,N,7.5 +,CDR,CF,DTR2.1,L,BE,N,-0.13371 +,PR,CF,DTR2.1,C,BE,N,-5 +,NIC,CF,DTR2.1,C,BE,N,7.5 +,CDR,CF,DTR2.1,C,BE,N,-0.13371 +2020,NIC,MC,DTR2.2,L,BE,I,29.96755 +2020,CDR,MC,DTR2.2,L,BE,I,-0.02305 +2020,NIC,MC,DTR2.2,C,BE,I,29.96755 +2020,CDR,MC,DTR2.2,C,BE,I,-0.02305 +2020,NIC,BOP,DTR2.2,L,BE,N,-29.96755 +2020,CDR,BOP,DTR2.2,L,BE,N,0.29437 +2020,NIC,BOP,DTR2.2,C,BE,N,-29.91909 +2020,CDR,BOP,DTR2.2,C,BE,N,0.29374 +2020,NIC,EV,DTR2.2,L,BE,N,-22.48128 +2020,CDR,EV,DTR2.2,L,BE,N,0.16091 +2020,NIC,EV,DTR2.2,C,BE,N,-22.4533 +2020,CDR,EV,DTR2.2,C,BE,N,0.16064 +2020,NIC,BOP,DTR2.2,L,BE,I,-149.83777 +2020,CDR,BOP,DTR2.2,L,BE,I,0.11527 +2020,NIC,BOP,DTR2.2,C,BE,I,-149.83777 +2020,CDR,BOP,DTR2.2,C,BE,I,0.11527 +2020,NIC,EOP,DTR2.2,L,BE,C,-134.88767 +2020,CDR,EOP,DTR2.2,L,BE,C,0.96546 +2020,NIC,EOP,DTR2.2,C,BE,C,-134.71982 +2020,CDR,EOP,DTR2.2,C,BE,C,0.96385 +2020,NIC,IA,DTR2.2,L,BE,I,-0.05489 +2020,CDR,IA,DTR2.2,L,BE,I,8E-05 +2020,NIC,IA,DTR2.2,C,BE,I,-0.05489 +2020,CDR,IA,DTR2.2,C,BE,I,8E-05 +2020,NIC,CF,DTR2.2,L,BE,I,30 +2020,CDR,CF,DTR2.2,L,BE,I,-0.04197 +2020,NIC,CF,DTR2.2,C,BE,I,30 +2020,CDR,CF,DTR2.2,C,BE,I,-0.04197 +2020,NIC,YCU,DTR2.2,C,BE,I,0.1119 +2020,CDR,YCU,DTR2.2,C,BE,I,-8E-05 +2020,CDR,CRU,DTR2.2,L,BE,I,0.59331 +2020,CDR,CRU,DTR2.2,C,BE,I,0.59233 +2020,NIC,IA,DTR2.2,L,BE,N,-0.01372 +2020,CDR,IA,DTR2.2,L,BE,N,0.00025 +2020,NIC,IA,DTR2.2,C,BE,N,-0.03421 +2020,CDR,IA,DTR2.2,C,BE,N,0.00061 +2020,NIC,CF,DTR2.2,L,BE,N,7.5 +2020,CDR,CF,DTR2.2,L,BE,N,-0.13371 +2020,NIC,CF,DTR2.2,C,BE,N,7.5 +2020,CDR,CF,DTR2.2,C,BE,N,-0.13371 +,PR,MC,DT3.1,L,BE,I,-39.96339 +,NIC,MC,DT3.1,L,BE,I,-59.93511 +,PR,MC,DT3.1,C,BE,I,-39.96339 +,NIC,MC,DT3.1,C,BE,I,-59.93511 +,PR,BOP,DT3.1,L,BE,N,-39.96339 +,NIC,BOP,DT3.1,L,BE,N,47.94809 +,ICO,BOP,DT3.1,L,BE,N,11.98702 +,PR,BOP,DT3.1,C,BE,N,-39.9087 +,NIC,BOP,DT3.1,C,BE,N,47.87055 +,ICO,BOP,DT3.1,C,BE,N,11.96764 +,PR,EV,DT3.1,L,BE,N,14.99001 +,NIC,EV,DT3.1,L,BE,N,44.96256 +,PR,EV,DT3.1,C,BE,N,14.97509 +,NIC,EV,DT3.1,C,BE,N,44.90661 +,PR,CL,DT3.1,L,BE,C,344.77033 +,NIC,CL,DT3.1,L,BE,C,-260.78283 +,ICO,CL,DT3.1,L,BE,C,-8.99251 +,PR,CL,DT3.1,C,BE,C,344.42709 +,NIC,CL,DT3.1,C,BE,C,-260.45832 +,ICO,CL,DT3.1,C,BE,C,-8.98132 +,PR,BOP,DT3.1,L,BE,I,-399.63393 +,NIC,BOP,DT3.1,L,BE,I,299.67555 +,PR,BOP,DT3.1,C,BE,I,-399.63393 +,NIC,BOP,DT3.1,C,BE,I,299.67555 +,PR,IA,DT3.1,L,BE,I,-0.183 +,NIC,IA,DT3.1,L,BE,I,0.10979 +,PR,IA,DT3.1,C,BE,I,-0.183 +,NIC,IA,DT3.1,C,BE,I,0.10979 +,PR,CF,DT3.1,L,BE,I,110 +,NIC,CF,DT3.1,L,BE,I,-60 +,PR,CF,DT3.1,C,BE,I,110 +,NIC,CF,DT3.1,C,BE,I,-60 +,PR,YCU,DT3.1,C,BE,I,0.32832 +,NIC,YCU,DT3.1,C,BE,I,-0.2238 +,PR,IA,DT3.1,L,BE,N,-0.01664 +,NIC,IA,DT3.1,L,BE,N,0.02196 +,ICO,IA,DT3.1,L,BE,N,0.00549 +,PR,IA,DT3.1,C,BE,N,-0.04148 +,NIC,IA,DT3.1,C,BE,N,0.05474 +,ICO,IA,DT3.1,C,BE,N,0.01368 +,PR,CF,DT3.1,L,BE,N,10 +,NIC,CF,DT3.1,L,BE,N,-12 +,ICO,CF,DT3.1,L,BE,N,-3 +,PR,CF,DT3.1,C,BE,N,10 +,NIC,CF,DT3.1,C,BE,N,-12 +,ICO,CF,DT3.1,C,BE,N,-3 +,PR,MC,DT4.1,L,BE,I,-39.96339 +,NIC,MC,DT4.1,L,BE,I,-59.93511 +,PR,MC,DT4.1,C,BE,I,-39.96339 +,NIC,MC,DT4.1,C,BE,I,-59.93511 +,PR,BOP,DT4.1,L,BE,N,-79.92679 +,NIC,BOP,DT4.1,L,BE,N,47.94809 +,ICO,BOP,DT4.1,L,BE,N,11.98702 +,PR,BOP,DT4.1,C,BE,N,-79.81741 +,NIC,BOP,DT4.1,C,BE,N,47.87055 +,ICO,BOP,DT4.1,C,BE,N,11.96764 +,PR,EV,DT4.1,L,BE,N,-38.97404 +,NIC,EV,DT4.1,L,BE,N,44.96256 +,PR,EV,DT4.1,C,BE,N,-38.93524 +,NIC,EV,DT4.1,C,BE,N,44.90661 +,PR,BOP,DT4.1,L,BE,I,-399.63393 +,NIC,BOP,DT4.1,L,BE,I,299.67555 +,PR,BOP,DT4.1,C,BE,I,-399.63393 +,NIC,BOP,DT4.1,C,BE,I,299.67555 +,PR,EOP,DT4.1,L,BE,C,-428.71442 +,NIC,EOP,DT4.1,L,BE,C,260.78283 +,ICO,EOP,DT4.1,L,BE,C,8.99251 +,PR,EOP,DT4.1,C,BE,C,-428.2876 +,NIC,EOP,DT4.1,C,BE,C,260.45832 +,ICO,EOP,DT4.1,C,BE,C,8.98132 +,PR,IA,DT4.1,L,BE,I,-0.183 +,NIC,IA,DT4.1,L,BE,I,0.10979 +,PR,IA,DT4.1,C,BE,I,-0.183 +,NIC,IA,DT4.1,C,BE,I,0.10979 +,PR,CF,DT4.1,L,BE,I,110 +,NIC,CF,DT4.1,L,BE,I,-60 +,PR,CF,DT4.1,C,BE,I,110 +,NIC,CF,DT4.1,C,BE,I,-60 +,PR,YCU,DT4.1,C,BE,I,0.32832 +,NIC,YCU,DT4.1,C,BE,I,-0.2238 +,PR,IA,DT4.1,L,BE,N,-0.03327 +,NIC,IA,DT4.1,L,BE,N,0.02196 +,ICO,IA,DT4.1,L,BE,N,0.00549 +,PR,IA,DT4.1,C,BE,N,-0.08295 +,NIC,IA,DT4.1,C,BE,N,0.05474 +,ICO,IA,DT4.1,C,BE,N,0.01368 +,PR,CF,DT4.1,L,BE,N,20 +,NIC,CF,DT4.1,L,BE,N,-12 +,ICO,CF,DT4.1,L,BE,N,-3 +,PR,CF,DT4.1,C,BE,N,20 +,NIC,CF,DT4.1,C,BE,N,-12 +,ICO,CF,DT4.1,C,BE,N,-3 +,PR,MC,DT1.4,L,BE,I,-39.96339 +,NIC,MC,DT1.4,L,BE,I,-59.93511 +,PR,MC,DT1.4,C,BE,I,-39.96339 +,NIC,MC,DT1.4,C,BE,I,-59.93511 +,PR,BOP,DT1.4,L,BE,N,-39.96339 +,NIC,BOP,DT1.4,L,BE,N,47.94809 +,ICO,BOP,DT1.4,L,BE,N,11.98702 +,PR,BOP,DT1.4,C,BE,N,-39.9087 +,NIC,BOP,DT1.4,C,BE,N,47.87055 +,ICO,BOP,DT1.4,C,BE,N,11.96764 +,PR,EV,DT1.4,L,BE,N,14.99001 +,NIC,EV,DT1.4,L,BE,N,44.96256 +,PR,EV,DT1.4,C,BE,N,14.97509 +,NIC,EV,DT1.4,C,BE,N,44.90661 +,PR,BOP,DT1.4,L,BE,I,-399.63393 +,NIC,BOP,DT1.4,L,BE,I,299.67555 +,PR,BOP,DT1.4,C,BE,I,-399.63393 +,NIC,BOP,DT1.4,C,BE,I,299.67555 +,PR,EOP,DT1.4,L,BE,C,-344.77033 +,NIC,EOP,DT1.4,L,BE,C,260.78283 +,ICO,EOP,DT1.4,L,BE,C,8.99251 +,PR,EOP,DT1.4,C,BE,C,-344.42709 +,NIC,EOP,DT1.4,C,BE,C,260.45832 +,ICO,EOP,DT1.4,C,BE,C,8.98132 +,PR,IA,DT1.4,L,BE,I,-0.183 +,NIC,IA,DT1.4,L,BE,I,0.10979 +,PR,IA,DT1.4,C,BE,I,-0.183 +,NIC,IA,DT1.4,C,BE,I,0.10979 +,PR,CF,DT1.4,L,BE,I,110 +,NIC,CF,DT1.4,L,BE,I,-60 +,PR,CF,DT1.4,C,BE,I,110 +,NIC,CF,DT1.4,C,BE,I,-60 +,PR,YCU,DT1.4,C,BE,I,0.32832 +,NIC,YCU,DT1.4,C,BE,I,-0.2238 +,PR,IA,DT1.4,L,BE,N,-0.01664 +,NIC,IA,DT1.4,L,BE,N,0.02196 +,ICO,IA,DT1.4,L,BE,N,0.00549 +,PR,IA,DT1.4,C,BE,N,-0.04148 +,NIC,IA,DT1.4,C,BE,N,0.05474 +,ICO,IA,DT1.4,C,BE,N,0.01368 +,PR,CF,DT1.4,L,BE,N,10 +,NIC,CF,DT1.4,L,BE,N,-12 +,ICO,CF,DT1.4,L,BE,N,-3 +,PR,CF,DT1.4,C,BE,N,10 +,NIC,CF,DT1.4,C,BE,N,-12 +,ICO,CF,DT1.4,C,BE,N,-3 +,PR,MC,DT1.5,L,BE,I,-39.96339 +,NIC,MC,DT1.5,L,BE,I,-59.93511 +,PR,MC,DT1.5,C,BE,I,-39.96339 +,NIC,MC,DT1.5,C,BE,I,-59.93511 +,PR,BOP,DT1.5,L,BE,N,-39.96339 +,NIC,BOP,DT1.5,L,BE,N,47.94809 +,ICO,BOP,DT1.5,L,BE,N,11.98702 +,PR,BOP,DT1.5,C,BE,N,-39.9087 +,NIC,BOP,DT1.5,C,BE,N,47.87055 +,ICO,BOP,DT1.5,C,BE,N,11.96764 +,PR,EV,DT1.5,L,BE,N,14.99001 +,NIC,EV,DT1.5,L,BE,N,44.96256 +,PR,EV,DT1.5,C,BE,N,14.97509 +,NIC,EV,DT1.5,C,BE,N,44.90661 +,PR,BOP,DT1.5,L,BE,I,-399.63393 +,NIC,BOP,DT1.5,L,BE,I,299.67555 +,PR,BOP,DT1.5,C,BE,I,-399.63393 +,NIC,BOP,DT1.5,C,BE,I,299.67555 +,PR,EOP,DT1.5,L,BE,C,-344.77033 +,NIC,EOP,DT1.5,L,BE,C,260.78283 +,ICO,EOP,DT1.5,L,BE,C,8.99251 +,PR,EOP,DT1.5,C,BE,C,-344.42709 +,NIC,EOP,DT1.5,C,BE,C,260.45832 +,ICO,EOP,DT1.5,C,BE,C,8.98132 +,PR,IA,DT1.5,L,BE,I,-0.183 +,NIC,IA,DT1.5,L,BE,I,0.10979 +,PR,IA,DT1.5,C,BE,I,-0.183 +,NIC,IA,DT1.5,C,BE,I,0.10979 +,PR,CF,DT1.5,L,BE,I,110 +,NIC,CF,DT1.5,L,BE,I,-60 +,PR,CF,DT1.5,C,BE,I,110 +,NIC,CF,DT1.5,C,BE,I,-60 +,PR,YCU,DT1.5,C,BE,I,0.32832 +,NIC,YCU,DT1.5,C,BE,I,-0.2238 +,PR,IA,DT1.5,L,BE,N,-0.01664 +,NIC,IA,DT1.5,L,BE,N,0.02196 +,ICO,IA,DT1.5,L,BE,N,0.00549 +,PR,IA,DT1.5,C,BE,N,-0.04148 +,NIC,IA,DT1.5,C,BE,N,0.05474 +,ICO,IA,DT1.5,C,BE,N,0.01368 +,PR,CF,DT1.5,L,BE,N,10 +,NIC,CF,DT1.5,L,BE,N,-12 +,ICO,CF,DT1.5,L,BE,N,-3 +,PR,CF,DT1.5,C,BE,N,10 +,NIC,CF,DT1.5,C,BE,N,-12 +,ICO,CF,DT1.5,C,BE,N,-3 +,PR,MC,DTR1.3,L,BE,I,19.9817 +,NIC,MC,DTR1.3,L,BE,I,29.96755 +,CDR,MC,DTR1.3,L,BE,I,-0.02305 +,PR,MC,DTR1.3,C,BE,I,19.9817 +,NIC,MC,DTR1.3,C,BE,I,29.96755 +,CDR,MC,DTR1.3,C,BE,I,-0.02305 +,PR,BOP,DTR1.3,L,BE,N,19.9817 +,NIC,BOP,DTR1.3,L,BE,N,-29.96755 +,CDR,BOP,DTR1.3,L,BE,N,0.29437 +,PR,BOP,DTR1.3,C,BE,N,19.95435 +,NIC,BOP,DTR1.3,C,BE,N,-29.91909 +,CDR,BOP,DTR1.3,C,BE,N,0.29374 +,PR,EV,DTR1.3,L,BE,N,-7.49501 +,NIC,EV,DTR1.3,L,BE,N,-22.48128 +,CDR,EV,DTR1.3,L,BE,N,0.16091 +,PR,EV,DTR1.3,C,BE,N,-7.48755 +,NIC,EV,DTR1.3,C,BE,N,-22.4533 +,CDR,EV,DTR1.3,C,BE,N,0.16064 +,PR,BOP,DTR1.3,L,BE,I,199.81696 +,NIC,BOP,DTR1.3,L,BE,I,-149.83777 +,CDR,BOP,DTR1.3,L,BE,I,0.11527 +,PR,BOP,DTR1.3,C,BE,I,199.81696 +,NIC,BOP,DTR1.3,C,BE,I,-149.83777 +,CDR,BOP,DTR1.3,C,BE,I,0.11527 +,PR,EOP,DTR1.3,L,BE,C,172.38517 +,NIC,EOP,DTR1.3,L,BE,C,-134.88767 +,CDR,EOP,DTR1.3,L,BE,C,0.96546 +,PR,EOP,DTR1.3,C,BE,C,172.21354 +,NIC,EOP,DTR1.3,C,BE,C,-134.71982 +,CDR,EOP,DTR1.3,C,BE,C,0.96385 +,PR,IA,DTR1.3,L,BE,I,0.0915 +,NIC,IA,DTR1.3,L,BE,I,-0.05489 +,CDR,IA,DTR1.3,L,BE,I,8E-05 +,PR,IA,DTR1.3,C,BE,I,0.0915 +,NIC,IA,DTR1.3,C,BE,I,-0.05489 +,CDR,IA,DTR1.3,C,BE,I,8E-05 +,PR,CF,DTR1.3,L,BE,I,-55 +,NIC,CF,DTR1.3,L,BE,I,30 +,CDR,CF,DTR1.3,L,BE,I,-0.04197 +,PR,CF,DTR1.3,C,BE,I,-55 +,NIC,CF,DTR1.3,C,BE,I,30 +,CDR,CF,DTR1.3,C,BE,I,-0.04197 +,PR,YCU,DTR1.3,C,BE,I,-0.16416 +,NIC,YCU,DTR1.3,C,BE,I,0.1119 +,CDR,YCU,DTR1.3,C,BE,I,-8E-05 +,CDR,CRU,DTR1.3,L,BE,I,0.59331 +,CDR,CRU,DTR1.3,C,BE,I,0.59233 +,PR,IA,DTR1.3,L,BE,N,0.00832 +,NIC,IA,DTR1.3,L,BE,N,-0.01372 +,CDR,IA,DTR1.3,L,BE,N,0.00025 +,PR,IA,DTR1.3,C,BE,N,0.02074 +,NIC,IA,DTR1.3,C,BE,N,-0.03421 +,CDR,IA,DTR1.3,C,BE,N,0.00061 +,PR,CF,DTR1.3,L,BE,N,-5 +,NIC,CF,DTR1.3,L,BE,N,7.5 +,CDR,CF,DTR1.3,L,BE,N,-0.13371 +,PR,CF,DTR1.3,C,BE,N,-5 +,NIC,CF,DTR1.3,C,BE,N,7.5 +,CDR,CF,DTR1.3,C,BE,N,-0.13371 +,PR,MC,DTR1.4,L,BE,I,19.9817 +,NIC,MC,DTR1.4,L,BE,I,29.96755 +,CDR,MC,DTR1.4,L,BE,I,-0.02305 +,PR,MC,DTR1.4,C,BE,I,19.9817 +,NIC,MC,DTR1.4,C,BE,I,29.96755 +,CDR,MC,DTR1.4,C,BE,I,-0.02305 +,PR,BOP,DTR1.4,L,BE,N,19.9817 +,NIC,BOP,DTR1.4,L,BE,N,-29.96755 +,CDR,BOP,DTR1.4,L,BE,N,0.29437 +,PR,BOP,DTR1.4,C,BE,N,19.95435 +,NIC,BOP,DTR1.4,C,BE,N,-29.91909 +,CDR,BOP,DTR1.4,C,BE,N,0.29374 +,PR,EV,DTR1.4,L,BE,N,-7.49501 +,NIC,EV,DTR1.4,L,BE,N,-22.48128 +,CDR,EV,DTR1.4,L,BE,N,0.16091 +,PR,EV,DTR1.4,C,BE,N,-7.48755 +,NIC,EV,DTR1.4,C,BE,N,-22.4533 +,CDR,EV,DTR1.4,C,BE,N,0.16064 +,PR,BOP,DTR1.4,L,BE,I,199.81696 +,NIC,BOP,DTR1.4,L,BE,I,-149.83777 +,CDR,BOP,DTR1.4,L,BE,I,0.11527 +,PR,BOP,DTR1.4,C,BE,I,199.81696 +,NIC,BOP,DTR1.4,C,BE,I,-149.83777 +,CDR,BOP,DTR1.4,C,BE,I,0.11527 +,PR,EOP,DTR1.4,L,BE,C,172.38517 +,NIC,EOP,DTR1.4,L,BE,C,-134.88767 +,CDR,EOP,DTR1.4,L,BE,C,0.96546 +,PR,EOP,DTR1.4,C,BE,C,172.21354 +,NIC,EOP,DTR1.4,C,BE,C,-134.71982 +,CDR,EOP,DTR1.4,C,BE,C,0.96385 +,PR,IA,DTR1.4,L,BE,I,0.0915 +,NIC,IA,DTR1.4,L,BE,I,-0.05489 +,CDR,IA,DTR1.4,L,BE,I,8E-05 +,PR,IA,DTR1.4,C,BE,I,0.0915 +,NIC,IA,DTR1.4,C,BE,I,-0.05489 +,CDR,IA,DTR1.4,C,BE,I,8E-05 +,PR,CF,DTR1.4,L,BE,I,-55 +,NIC,CF,DTR1.4,L,BE,I,30 +,CDR,CF,DTR1.4,L,BE,I,-0.04197 +,PR,CF,DTR1.4,C,BE,I,-55 +,NIC,CF,DTR1.4,C,BE,I,30 +,CDR,CF,DTR1.4,C,BE,I,-0.04197 +,PR,YCU,DTR1.4,C,BE,I,-0.16416 +,NIC,YCU,DTR1.4,C,BE,I,0.1119 +,CDR,YCU,DTR1.4,C,BE,I,-8E-05 +,CDR,CRU,DTR1.4,L,BE,I,0.59331 +,CDR,CRU,DTR1.4,C,BE,I,0.59233 +,PR,IA,DTR1.4,L,BE,N,0.00832 +,NIC,IA,DTR1.4,L,BE,N,-0.01372 +,CDR,IA,DTR1.4,L,BE,N,0.00025 +,PR,IA,DTR1.4,C,BE,N,0.02074 +,NIC,IA,DTR1.4,C,BE,N,-0.03421 +,CDR,IA,DTR1.4,C,BE,N,0.00061 +,PR,CF,DTR1.4,L,BE,N,-5 +,NIC,CF,DTR1.4,L,BE,N,7.5 +,CDR,CF,DTR1.4,L,BE,N,-0.13371 +,PR,CF,DTR1.4,C,BE,N,-5 +,NIC,CF,DTR1.4,C,BE,N,7.5 +,CDR,CF,DTR1.4,C,BE,N,-0.13371 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BEPA.csv similarity index 74% rename from full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv rename to full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BEPA.csv index 61c6344a..cb87744c 100644 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BEPA.csv @@ -1,4 +1,3 @@ -$$Default @@Main Month,ReportingNode,Scenario,Year 3,CH,,2021 @@ -13,4 +12,8 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,PR,CF,DT3.1,L,BEPA,I,88 ,PR,CF,DT3.1,L,BEPA,N,8 ,PR,CF,DT4.1,L,BEPA,I,88 -,PR,CF,DT4.1,L,BEPA,N,16 \ No newline at end of file +,PR,CF,DT4.1,L,BEPA,N,16 +,PR,CF,DT1.4,L,BEPA,I,88 +,PR,CF,DT1.4,L,BEPA,N,8 +,PR,CF,DT1.5,L,BEPA,I,88 +,PR,CF,DT1.5,L,BEPA,N,8 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__C.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__C.csv new file mode 100644 index 00000000..20f516be --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__C.csv @@ -0,0 +1,82 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@C +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,EV,DT4.1,,C,N,-1.49226 +,,IA,DT4.1,,C,N,0.00034 +,,BOP,DT4.1,,C,N,8.00465 +,,IA,DT4.1,,C,I,0.07437 +,,MC,DT4.1,,C,I,105.89201 +,,EOP,DT4.1,,C,C,71.44125 +,,AM,DT4.1,,C,C,-34.00598 +,,EA,DT4.1,,C,C,-50 +,,BOP,DT4.1,,C,I,42.96811 +,,CL,DT3.1,,C,C,-139.94507 +,,IA,DT3.1,,C,I,0.0868 +,,MC,DT3.1,,C,I,105.89201 +,,EA,DT3.1,,C,C,-33.8717 +,,BOP,DT3.1,,C,I,67.83796 +,,CL,DTR2.1,,C,C,43.26015 +,,CRU,DTR2.1,,C,I,-0.59331 +,,IA,DTR2.1,,C,I,-0.03855 +,,MC,DTR2.1,,C,I,-52.92295 +,,EOP,DTR2.1,,C,C,-23.38944 +,,AM,DTR2.1,,C,C,11.13336 +,,BOP,DTR2.1,,C,I,-24.22813 +,,CL,DTR1.1,,C,C,43.26015 +,,CRU,DTR1.1,,C,I,-0.59331 +,,IA,DTR1.1,,C,I,-0.03855 +,,MC,DTR1.1,,C,I,-52.92295 +,,EOP,DTR1.1,,C,C,-23.38944 +,,AM,DTR1.1,,C,C,11.13336 +,,BOP,DTR1.1,,C,I,-24.22813 +,,CL,DT2.1,,C,C,-87.43136 +,,BOP,DT1.1,,C,I,42.96811 +,,EA,DT1.1,,C,C,-42 +,,AM,DT1.1,,C,C,-6.28963 +,,EOP,DT1.1,,C,C,13.21352 +,,MC,DT1.1,,C,I,105.89201 +,,IA,DT1.1,,C,I,0.07437 +,,CL,DT1.1,,C,C,-87.43136 +,,BOP,DT1.3,,C,I,42.96811 +,,EA,DT1.3,,C,C,-48 +,,AM,DT1.3,,C,C,-4.35467 +,,EOP,DT1.3,,C,C,9.14848 +,,MC,DT1.3,,C,I,105.89201 +,,IA,DT1.3,,C,I,0.07437 +,,CL,DT1.3,,C,C,-87.43136 +,,BOP,DT2.1,,C,I,42.96811 +,,EA,DT2.1,,C,C,-42 +,,AM,DT2.1,,C,C,-6.28963 +,,EOP,DT2.1,,C,C,13.21352 +,,MC,DT2.1,,C,I,105.89201 +,,IA,DT2.1,,C,I,0.07437 +,,BOP,DT1.4,,C,I,42.96811 +,,EA,DT1.4,,C,C,-42 +,,AM,DT1.4,,C,C,-6.28963 +,,EOP,DT1.4,,C,C,13.21352 +,,MC,DT1.4,,C,I,105.89201 +,,IA,DT1.4,,C,I,0.07437 +,,CL,DT1.4,,C,C,-87.43136 +,,BOP,DT1.5,,C,I,42.96811 +,,EA,DT1.5,,C,C,-42 +,,AM,DT1.5,,C,C,-6.28963 +,,EOP,DT1.5,,C,C,13.21352 +,,MC,DT1.5,,C,I,105.89201 +,,IA,DT1.5,,C,I,0.07437 +,,CL,DT1.5,,C,C,-87.43136 +,,BOP,DTR1.3,,C,I,-24.22813 +,,AM,DTR1.3,,C,C,11.13336 +,,EOP,DTR1.3,,C,C,-23.38944 +,,MC,DTR1.3,,C,I,-52.92295 +,,IA,DTR1.3,,C,I,-0.03855 +,,CRU,DTR1.3,,C,I,-0.59331 +,,CL,DTR1.3,,C,C,43.26015 +,,BOP,DTR1.4,,C,I,-24.22813 +,,AM,DTR1.4,,C,C,11.13336 +,,EOP,DTR1.4,,C,C,-23.38944 +,,MC,DTR1.4,,C,I,-52.92295 +,,IA,DTR1.4,,C,I,-0.03855 +,,CRU,DTR1.4,,C,I,-0.59331 +,,CL,DTR1.4,,C,C,43.26015 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__DA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__DA.csv new file mode 100644 index 00000000..e73a202c --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__DA.csv @@ -0,0 +1,32 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@DA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,EOP,DT4.1,,DA,C,-13.65621 +,,AM,DT4.1,,DA,C,6.50034 +,,BOP,DT4.1,,DA,I,-5.15655 +,,CF,DT4.1,,DA,C,-15 +,,AM,DT3.1,,DA,C,20.15655 +,,BOP,DT3.1,,DA,I,-5.15655 +,,CF,DT3.1,,DA,C,-15 +,,CF,DT1.1,,DA,C,-15 +,,BOP,DT1.1,,DA,I,-5.15655 +,,AM,DT1.1,,DA,C,6.50034 +,,EOP,DT1.1,,DA,C,-13.65621 +,,CF,DT1.3,,DA,C,-15 +,,BOP,DT1.3,,DA,I,-5.15655 +,,AM,DT1.3,,DA,C,6.50034 +,,EOP,DT1.3,,DA,C,-13.65621 +,,CF,DT2.1,,DA,C,-15 +,,BOP,DT2.1,,DA,I,-5.15655 +,,AM,DT2.1,,DA,C,6.50034 +,,EOP,DT2.1,,DA,C,-13.65621 +,,CF,DT1.4,,DA,C,-15 +,,BOP,DT1.4,,DA,I,-5.15655 +,,AM,DT1.4,,DA,C,6.50034 +,,EOP,DT1.4,,DA,C,-13.65621 +,,CF,DT1.5,,DA,C,-15 +,,BOP,DT1.5,,DA,I,-5.15655 +,,AM,DT1.5,,DA,C,6.50034 +,,EOP,DT1.5,,DA,C,-13.65621 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__F.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__F.csv new file mode 100644 index 00000000..0796bbf8 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__F.csv @@ -0,0 +1,20 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@F +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,AM,DT1.1,L,F,C,0.32249 +,,AM,DT1.2,L,F,C,1 +,,AM,DT1.3,L,F,C,0.32249 +,,AM,DT2.1,L,F,C,0.32249 +,,AM,DT2.2,L,F,C,1 +,,AM,DTR1.1,L,F,C,0.32249 +,,AM,DTR1.2,L,F,C,1 +,,AM,DTR2.1,L,F,C,0.32249 +,,AM,DTR2.2,L,F,C,1 +,,AM,DT3.1,L,F,C,1 +,,AM,DT4.1,L,F,C,0.32249 +,,AM,DT1.4,L,F,C,0.32249 +,,AM,DT1.5,L,F,C,0.32249 +,,AM,DTR1.3,L,F,C,0.32249 +,,AM,DTR1.4,L,F,C,0.32249 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__L.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__L.csv new file mode 100644 index 00000000..e110a101 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__L.csv @@ -0,0 +1,31 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@L +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,CL,DT3.1,,L,C,-87.43136 +,,EV,DT3.1,,L,N,55.45632 +,,IA,DT3.1,,L,N,0.0163 +,,BOP,DT3.1,,L,N,31.95874 +,,AM,DT3.1,,L,C,-8.1283 +,,EA,DT3.1,,L,C,8.1283 +,,CL,DT2.1,,L,C,-87.43136 +,,EV,DT2.1,,L,N,55.45632 +,,IA,DT2.1,,L,N,0.0163 +,,BOP,DT2.1,,L,N,31.95874 +,,CL,DT1.1,,L,C,-87.43136 +,,BOP,DT1.1,,L,N,31.95874 +,,IA,DT1.1,,L,N,0.0163 +,,EV,DT1.1,,L,N,55.45632 +,,BOP,DT1.3,,L,N,31.95874 +,,IA,DT1.3,,L,N,0.0163 +,,EV,DT1.3,,L,N,55.45632 +,,CL,DT1.3,,L,C,-87.43136 +,,BOP,DT1.4,,L,N,31.95874 +,,IA,DT1.4,,L,N,0.0163 +,,EV,DT1.4,,L,N,55.45632 +,,CL,DT1.4,,L,C,-87.43136 +,,BOP,DT1.5,,L,N,31.95874 +,,IA,DT1.5,,L,N,0.0163 +,,EV,DT1.5,,L,N,55.45632 +,,CL,DT1.5,,L,C,-87.43136 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__LR.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__LR.csv new file mode 100644 index 00000000..d0638965 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__LR.csv @@ -0,0 +1,21 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@LR +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,CL,DTR2.1,,LR,C,43.26015 +,,EV,DTR2.1,,LR,N,-27.56725 +,,IA,DTR2.1,,LR,N,-0.0079 +,,BOP,DTR2.1,,LR,N,-15.685 +,,CL,DTR1.1,,LR,C,43.26015 +,,EV,DTR1.1,,LR,N,-27.56725 +,,IA,DTR1.1,,LR,N,-0.0079 +,,BOP,DTR1.1,,LR,N,-15.685 +,,BOP,DTR1.3,,LR,N,-15.685 +,,IA,DTR1.3,,LR,N,-0.0079 +,,EV,DTR1.3,,LR,N,-27.56725 +,,CL,DTR1.3,,LR,C,43.26015 +,,BOP,DTR1.4,,LR,N,-15.685 +,,IA,DTR1.4,,LR,N,-0.0079 +,,EV,DTR1.4,,LR,N,-27.56725 +,,CL,DTR1.4,,LR,C,43.26015 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__OA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__OA.csv new file mode 100644 index 00000000..bec2cb49 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__OA.csv @@ -0,0 +1,21 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@OA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,PR,WO,DT1.4,,OA,C,7 +,PR,EOP,DT3.1,,OA,C,1.5 +,PR,BOP,DT3.1,,OA,I,1.5 +,PR,CF,DT1.4,,OA,C,3 +,NIC,CF,DT1.4,,OA,C,-8 +,PR,BOP,DT1.4,,OA,I,-10 +,NIC,BOP,DT1.4,,OA,I,8 +,PR,WO,DT1.5,,OA,C,10 +,PR,BOP,DT1.5,,OA,I,-10 +,PR,CF,DTR1.3,,OA,C,2.5 +,NIC,WO,DTR1.3,,OA,C,2.5 +,PR,BOP,DTR1.3,,OA,I,7.5 +,NIC,BOP,DTR1.3,,OA,I,-2.5 +,PR,EOP,DTR1.3,,OA,C,10 +,NIC,WO,DTR1.4,,OA,C,10 +,NIC,BOP,DTR1.4,,OA,I,-10 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__RA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__RA.csv new file mode 100644 index 00000000..d0ea1ce7 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__RA.csv @@ -0,0 +1,290 @@ +@@Main +Month,ReportingNode,Scenario,Year +3,CH,,2021 +@@RA +AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Value +,,MC,DT1.1,C,RA,I,-5.99351 +,,MC,DT1.1,L,RA,I,-5.99351 +,,BOP,DT1.1,C,RA,N,11.96764 +,,BOP,DT1.1,L,RA,N,11.98702 +,,EV,DT1.1,C,RA,N,-4.49066 +,,EV,DT1.1,L,RA,N,-4.49626 +,,BOP,DT1.1,C,RA,I,29.96755 +,,BOP,DT1.1,L,RA,I,29.96755 +,,EOP,DT1.1,C,RA,C,22.4533 +,,EOP,DT1.1,L,RA,C,22.48128 +,,IA,DT1.1,C,RA,I,0.01098 +,,IA,DT1.1,L,RA,I,0.01098 +,,CF,DT1.1,C,RA,I,-6 +,,CF,DT1.1,L,RA,I,-6 +,,YCU,DT1.1,C,RA,I,-0.02238 +,,IA,DT1.1,C,RA,N,0.01368 +,,IA,DT1.1,L,RA,N,0.00549 +,,CF,DT1.1,C,RA,N,-3 +,,CF,DT1.1,L,RA,N,-3 +2020,,MC,DT1.2,C,RA,I,-5.99351 +2020,,MC,DT1.2,L,RA,I,-5.99351 +2020,,BOP,DT1.2,C,RA,N,11.96764 +2020,,BOP,DT1.2,L,RA,N,11.98702 +2020,,EV,DT1.2,C,RA,N,-4.49066 +2020,,EV,DT1.2,L,RA,N,-4.49626 +2020,,BOP,DT1.2,C,RA,I,29.96755 +2020,,BOP,DT1.2,L,RA,I,29.96755 +2020,,EOP,DT1.2,C,RA,C,22.4533 +2020,,EOP,DT1.2,L,RA,C,22.48128 +2020,,IA,DT1.2,C,RA,I,0.01098 +2020,,IA,DT1.2,L,RA,I,0.01098 +2020,,CF,DT1.2,C,RA,I,-6 +2020,,CF,DT1.2,L,RA,I,-6 +2020,,YCU,DT1.2,C,RA,I,-0.02238 +2020,,IA,DT1.2,C,RA,N,0.01368 +2020,,IA,DT1.2,L,RA,N,0.00549 +2020,,CF,DT1.2,C,RA,N,-3 +2020,,CF,DT1.2,L,RA,N,-3 +,,MC,DT1.3,C,RA,I,-5.99351 +,,MC,DT1.3,L,RA,I,-5.99351 +,,BOP,DT1.3,C,RA,N,11.96764 +,,BOP,DT1.3,L,RA,N,11.98702 +,,EV,DT1.3,C,RA,N,-4.49066 +,,EV,DT1.3,L,RA,N,-4.49626 +,,BOP,DT1.3,C,RA,I,29.96755 +,,BOP,DT1.3,L,RA,I,29.96755 +,,EOP,DT1.3,C,RA,C,22.4533 +,,EOP,DT1.3,L,RA,C,22.48128 +,,IA,DT1.3,C,RA,I,0.01098 +,,IA,DT1.3,L,RA,I,0.01098 +,,CF,DT1.3,C,RA,I,-6 +,,CF,DT1.3,L,RA,I,-6 +,,YCU,DT1.3,C,RA,I,-0.02238 +,,IA,DT1.3,C,RA,N,0.01368 +,,IA,DT1.3,L,RA,N,0.00549 +,,CF,DT1.3,C,RA,N,-3 +,,CF,DT1.3,L,RA,N,-3 +,,MC,DT2.1,C,RA,I,-5.99351 +,,MC,DT2.1,L,RA,I,-5.99351 +,,BOP,DT2.1,C,RA,N,11.96764 +,,BOP,DT2.1,L,RA,N,11.98702 +,,EV,DT2.1,C,RA,N,-4.49066 +,,EV,DT2.1,L,RA,N,-4.49626 +,,BOP,DT2.1,C,RA,I,29.96755 +,,BOP,DT2.1,L,RA,I,29.96755 +,,EOP,DT2.1,C,RA,C,22.4533 +,,EOP,DT2.1,L,RA,C,22.48128 +,,IA,DT2.1,C,RA,I,0.01098 +,,IA,DT2.1,L,RA,I,0.01098 +,,CF,DT2.1,C,RA,I,-6 +,,CF,DT2.1,L,RA,I,-6 +,,YCU,DT2.1,C,RA,I,-0.02238 +,,IA,DT2.1,C,RA,N,0.01368 +,,IA,DT2.1,L,RA,N,0.00549 +,,CF,DT2.1,C,RA,N,-3 +,,CF,DT2.1,L,RA,N,-3 +2020,,MC,DT2.2,C,RA,I,-5.99351 +2020,,MC,DT2.2,L,RA,I,-5.99351 +2020,,BOP,DT2.2,C,RA,N,11.96764 +2020,,BOP,DT2.2,L,RA,N,11.98702 +2020,,EV,DT2.2,C,RA,N,-4.49066 +2020,,EV,DT2.2,L,RA,N,-4.49626 +2020,,BOP,DT2.2,C,RA,I,29.96755 +2020,,BOP,DT2.2,L,RA,I,29.96755 +2020,,EOP,DT2.2,C,RA,C,22.4533 +2020,,EOP,DT2.2,L,RA,C,22.48128 +2020,,IA,DT2.2,C,RA,I,0.01098 +2020,,IA,DT2.2,L,RA,I,0.01098 +2020,,CF,DT2.2,C,RA,I,-6 +2020,,CF,DT2.2,L,RA,I,-6 +2020,,YCU,DT2.2,C,RA,I,-0.02238 +2020,,IA,DT2.2,C,RA,N,0.01368 +2020,,IA,DT2.2,L,RA,N,0.00549 +2020,,CF,DT2.2,C,RA,N,-3 +2020,,CF,DT2.2,L,RA,N,-3 +,,MC,DTR1.1,C,RA,I,2.99676 +,,MC,DTR1.1,L,RA,I,2.99676 +,,BOP,DTR1.1,C,RA,N,-5.98382 +,,BOP,DTR1.1,L,RA,N,-5.99351 +,,EV,DTR1.1,C,RA,N,2.24533 +,,EV,DTR1.1,L,RA,N,2.24813 +,,BOP,DTR1.1,C,RA,I,-14.98378 +,,BOP,DTR1.1,L,RA,I,-14.98378 +,,EOP,DTR1.1,C,RA,C,-11.22665 +,,EOP,DTR1.1,L,RA,C,-11.24064 +,,IA,DTR1.1,C,RA,I,-0.00549 +,,IA,DTR1.1,L,RA,I,-0.00549 +,,CF,DTR1.1,C,RA,I,3 +,,CF,DTR1.1,L,RA,I,3 +,,YCU,DTR1.1,C,RA,I,0.01119 +,,IA,DTR1.1,C,RA,N,-0.00684 +,,IA,DTR1.1,L,RA,N,-0.00274 +,,CF,DTR1.1,C,RA,N,1.5 +,,CF,DTR1.1,L,RA,N,1.5 +2020,,MC,DTR1.2,C,RA,I,2.99676 +2020,,MC,DTR1.2,L,RA,I,2.99676 +2020,,BOP,DTR1.2,C,RA,N,-5.98382 +2020,,BOP,DTR1.2,L,RA,N,-5.99351 +2020,,EV,DTR1.2,C,RA,N,2.24533 +2020,,EV,DTR1.2,L,RA,N,2.24813 +2020,,BOP,DTR1.2,C,RA,I,-14.98378 +2020,,BOP,DTR1.2,L,RA,I,-14.98378 +2020,,EOP,DTR1.2,C,RA,C,-11.22665 +2020,,EOP,DTR1.2,L,RA,C,-11.24064 +2020,,IA,DTR1.2,C,RA,I,-0.00549 +2020,,IA,DTR1.2,L,RA,I,-0.00549 +2020,,CF,DTR1.2,C,RA,I,3 +2020,,CF,DTR1.2,L,RA,I,3 +2020,,YCU,DTR1.2,C,RA,I,0.01119 +2020,,IA,DTR1.2,C,RA,N,-0.00684 +2020,,IA,DTR1.2,L,RA,N,-0.00274 +2020,,CF,DTR1.2,C,RA,N,1.5 +2020,,CF,DTR1.2,L,RA,N,1.5 +,,MC,DTR2.1,C,RA,I,2.99676 +,,MC,DTR2.1,L,RA,I,2.99676 +,,BOP,DTR2.1,C,RA,N,-5.98382 +,,BOP,DTR2.1,L,RA,N,-5.99351 +,,EV,DTR2.1,C,RA,N,2.24533 +,,EV,DTR2.1,L,RA,N,2.24813 +,,BOP,DTR2.1,C,RA,I,-14.98378 +,,BOP,DTR2.1,L,RA,I,-14.98378 +,,EOP,DTR2.1,C,RA,C,-11.22665 +,,EOP,DTR2.1,L,RA,C,-11.24064 +,,IA,DTR2.1,C,RA,I,-0.00549 +,,IA,DTR2.1,L,RA,I,-0.00549 +,,CF,DTR2.1,C,RA,I,3 +,,CF,DTR2.1,L,RA,I,3 +,,YCU,DTR2.1,C,RA,I,0.01119 +,,IA,DTR2.1,C,RA,N,-0.00684 +,,IA,DTR2.1,L,RA,N,-0.00274 +,,CF,DTR2.1,C,RA,N,1.5 +,,CF,DTR2.1,L,RA,N,1.5 +2020,,MC,DTR2.2,C,RA,I,2.99676 +2020,,MC,DTR2.2,L,RA,I,2.99676 +2020,,BOP,DTR2.2,C,RA,N,-5.98382 +2020,,BOP,DTR2.2,L,RA,N,-5.99351 +2020,,EV,DTR2.2,C,RA,N,2.24533 +2020,,EV,DTR2.2,L,RA,N,2.24813 +2020,,BOP,DTR2.2,C,RA,I,-14.98378 +2020,,BOP,DTR2.2,L,RA,I,-14.98378 +2020,,EOP,DTR2.2,C,RA,C,-11.22665 +2020,,EOP,DTR2.2,L,RA,C,-11.24064 +2020,,IA,DTR2.2,C,RA,I,-0.00549 +2020,,IA,DTR2.2,L,RA,I,-0.00549 +2020,,CF,DTR2.2,C,RA,I,3 +2020,,CF,DTR2.2,L,RA,I,3 +2020,,YCU,DTR2.2,C,RA,I,0.01119 +2020,,IA,DTR2.2,C,RA,N,-0.00684 +2020,,IA,DTR2.2,L,RA,N,-0.00274 +2020,,CF,DTR2.2,C,RA,N,1.5 +2020,,CF,DTR2.2,L,RA,N,1.5 +,,MC,DT3.1,C,RA,I,-5.99351 +,,MC,DT3.1,L,RA,I,-5.99351 +,,BOP,DT3.1,C,RA,N,11.96764 +,,BOP,DT3.1,L,RA,N,11.98702 +,,EV,DT3.1,C,RA,N,-4.49066 +,,EV,DT3.1,L,RA,N,-4.49626 +,,CL,DT3.1,C,RA,C,-22.4533 +,,CL,DT3.1,L,RA,C,-22.48128 +,,BOP,DT3.1,C,RA,I,29.96755 +,,BOP,DT3.1,L,RA,I,29.96755 +,,IA,DT3.1,C,RA,I,0.01098 +,,IA,DT3.1,L,RA,I,0.01098 +,,CF,DT3.1,C,RA,I,-6 +,,CF,DT3.1,L,RA,I,-6 +,,YCU,DT3.1,C,RA,I,-0.02238 +,,IA,DT3.1,C,RA,N,0.01368 +,,IA,DT3.1,L,RA,N,0.00549 +,,CF,DT3.1,C,RA,N,-3 +,,CF,DT3.1,L,RA,N,-3 +,,MC,DT4.1,C,RA,I,-5.99351 +,,MC,DT4.1,L,RA,I,-5.99351 +,,BOP,DT4.1,C,RA,N,11.96764 +,,BOP,DT4.1,L,RA,N,11.98702 +,,EV,DT4.1,C,RA,N,-4.49066 +,,EV,DT4.1,L,RA,N,-4.49626 +,,BOP,DT4.1,C,RA,I,29.96755 +,,BOP,DT4.1,L,RA,I,29.96755 +,,EOP,DT4.1,C,RA,C,22.4533 +,,EOP,DT4.1,L,RA,C,22.48128 +,,IA,DT4.1,C,RA,I,0.01098 +,,IA,DT4.1,L,RA,I,0.01098 +,,CF,DT4.1,C,RA,I,-6 +,,CF,DT4.1,L,RA,I,-6 +,,YCU,DT4.1,C,RA,I,-0.02238 +,,IA,DT4.1,C,RA,N,0.01368 +,,IA,DT4.1,L,RA,N,0.00549 +,,CF,DT4.1,C,RA,N,-3 +,,CF,DT4.1,L,RA,N,-3 +,,MC,DT1.4,C,RA,I,-5.99351 +,,MC,DT1.4,L,RA,I,-5.99351 +,,BOP,DT1.4,C,RA,N,11.96764 +,,BOP,DT1.4,L,RA,N,11.98702 +,,EV,DT1.4,C,RA,N,-4.49066 +,,EV,DT1.4,L,RA,N,-4.49626 +,,BOP,DT1.4,C,RA,I,29.96755 +,,BOP,DT1.4,L,RA,I,29.96755 +,,EOP,DT1.4,C,RA,C,22.4533 +,,EOP,DT1.4,L,RA,C,22.48128 +,,IA,DT1.4,C,RA,I,0.01098 +,,IA,DT1.4,L,RA,I,0.01098 +,,CF,DT1.4,C,RA,I,-6 +,,CF,DT1.4,L,RA,I,-6 +,,YCU,DT1.4,C,RA,I,-0.02238 +,,IA,DT1.4,C,RA,N,0.01368 +,,IA,DT1.4,L,RA,N,0.00549 +,,CF,DT1.4,C,RA,N,-3 +,,CF,DT1.4,L,RA,N,-3 +,,MC,DT1.5,C,RA,I,-5.99351 +,,MC,DT1.5,L,RA,I,-5.99351 +,,BOP,DT1.5,C,RA,N,11.96764 +,,BOP,DT1.5,L,RA,N,11.98702 +,,EV,DT1.5,C,RA,N,-4.49066 +,,EV,DT1.5,L,RA,N,-4.49626 +,,BOP,DT1.5,C,RA,I,29.96755 +,,BOP,DT1.5,L,RA,I,29.96755 +,,EOP,DT1.5,C,RA,C,22.4533 +,,EOP,DT1.5,L,RA,C,22.48128 +,,IA,DT1.5,C,RA,I,0.01098 +,,IA,DT1.5,L,RA,I,0.01098 +,,CF,DT1.5,C,RA,I,-6 +,,CF,DT1.5,L,RA,I,-6 +,,YCU,DT1.5,C,RA,I,-0.02238 +,,IA,DT1.5,C,RA,N,0.01368 +,,IA,DT1.5,L,RA,N,0.00549 +,,CF,DT1.5,C,RA,N,-3 +,,CF,DT1.5,L,RA,N,-3 +,,MC,DTR1.3,C,RA,I,2.99676 +,,MC,DTR1.3,L,RA,I,2.99676 +,,BOP,DTR1.3,C,RA,N,-5.98382 +,,BOP,DTR1.3,L,RA,N,-5.99351 +,,EV,DTR1.3,C,RA,N,2.24533 +,,EV,DTR1.3,L,RA,N,2.24813 +,,BOP,DTR1.3,C,RA,I,-14.98378 +,,BOP,DTR1.3,L,RA,I,-14.98378 +,,EOP,DTR1.3,C,RA,C,-11.22665 +,,EOP,DTR1.3,L,RA,C,-11.24064 +,,IA,DTR1.3,C,RA,I,-0.00549 +,,IA,DTR1.3,L,RA,I,-0.00549 +,,CF,DTR1.3,C,RA,I,3 +,,CF,DTR1.3,L,RA,I,3 +,,YCU,DTR1.3,C,RA,I,0.01119 +,,IA,DTR1.3,C,RA,N,-0.00684 +,,IA,DTR1.3,L,RA,N,-0.00274 +,,CF,DTR1.3,C,RA,N,1.5 +,,CF,DTR1.3,L,RA,N,1.5 +,,MC,DTR1.4,C,RA,I,2.99676 +,,MC,DTR1.4,L,RA,I,2.99676 +,,BOP,DTR1.4,C,RA,N,-5.98382 +,,BOP,DTR1.4,L,RA,N,-5.99351 +,,EV,DTR1.4,C,RA,N,2.24533 +,,EV,DTR1.4,L,RA,N,2.24813 +,,BOP,DTR1.4,C,RA,I,-14.98378 +,,BOP,DTR1.4,L,RA,I,-14.98378 +,,EOP,DTR1.4,C,RA,C,-11.22665 +,,EOP,DTR1.4,L,RA,C,-11.24064 +,,IA,DTR1.4,C,RA,I,-0.00549 +,,IA,DTR1.4,L,RA,I,-0.00549 +,,CF,DTR1.4,C,RA,I,3 +,,CF,DTR1.4,L,RA,I,3 +,,YCU,DTR1.4,C,RA,I,0.01119 +,,IA,DTR1.4,C,RA,N,-0.00684 +,,IA,DTR1.4,L,RA,N,-0.00274 +,,CF,DTR1.4,C,RA,N,1.5 +,,CF,DTR1.4,L,RA,N,1.5 \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv index 27ef2063..10afb0e9 100644 --- a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv +++ b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv @@ -1,596 +1,852 @@ -@@ReportVariable,,,,,,,,,,,,,,,,,,,,,, -AccidentYear,AmountType,AnnualCohort,Currency,ContractualCurrency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType -0,PR,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF -0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF -0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,USD,,APA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-320,IR6 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.5367312,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.097198337,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.922605096,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.5367312,IR5 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529446,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339295,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.6755497,OCI1 -0,PR,2020,USD,USD,L,BEPA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,320,IR6 -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271122,AM -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.9084921,BOP -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.96811361,EOP -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.082332732,IA -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.082332732,IFIE1 -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122,IR3 -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.9084921,IR5 -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447869,AM -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131,EOP -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447869,IR4 -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447869,ISE6 -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226051,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529446,IR5 -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755497,OCI1 -2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF -2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.922605096,IFIE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529446,ISE12 -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,OCI2 -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-299.6755497,OCI2 -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226051,IFIE2 -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529446,ISE12 -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,OCI2 -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755497,OCI2 -0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF -0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF -0,PR,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF -0,PR,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,USD,,APA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-400,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.097198337,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.922605096,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.5367312,IR5 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.7529446,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.6339295,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.6755497,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.6339295,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.6755497,OCI1 -0,PR,2020,USD,USD,L,BEPA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR6 -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271122,AM -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.9084921,BOP -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.96811361,EOP -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.082332732,IA -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.082332732,IFIE1 -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271122,IR3 -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.9084921,IR5 -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447869,AM -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.156552131,EOP -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.843447869,IR4 -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.843447869,ISE6 -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226051,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529446,IR5 -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755497,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755497,OCI1 -0,PR,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,CF -0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF -0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,USD,,APA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-320,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,1.097198337,IFIE1 -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.922605096,IFIE1 -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,398.5367312,IR5 -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-298.7529446,IR5 -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,PR,2020,USD,USD,L,BEPA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,320,IR6 -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-82.02271122,AM -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,139.9084921,BOP -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,EA -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,42.96811361,EOP -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.082332732,IA -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.082332732,IFIE1 -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,82.02271122,IR3 -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-124.9084921,IR5 -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,9.843447869,AM -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.156552131,EOP -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,9.843447869,IR4 -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-9.843447869,ISE6 -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.09226051,IFIE1 -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-29.87529446,IR5 -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,CF -2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,598.7529446,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,598.7529446,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,299.6755497,EOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,299.6755497,EOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.922605096,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.922605096,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.922605096,IFIE2 -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-298.7529446,ISE12 -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,59.87529446,BOP -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,59.87529446,BOP -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,29.96755497,EOP -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,29.96755497,EOP -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226051,IA -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226051,IA -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.09226051,IFIE2 -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-29.87529446,ISE12 -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 -0,PR,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,CF -0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF -0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP -0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-1.5,EOP -0,PR,2020,USD,USD,,APA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-320,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.097198337,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.922605096,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,398.5367312,IR5 -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-298.7529446,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339295,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755497,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.6339295,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.6755497,OCI1 -0,PR,2020,USD,USD,L,BEPA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,320,IR6 -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-129.4972666,AM -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,72.2,BOP -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,139.9084921,BOP -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,EA -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.83795828,EOP -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.1444,IA -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.082332732,IA -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.226732732,IFIE1 -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,129.4972666,IR3 -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-124.9084921,IR5 -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.843447869,AM -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5.156552131,EOP -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.843447869,IR4 -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.843447869,ISE6 -0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP -0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.5,EOP -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.09226051,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.87529446,IR5 -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755497,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.96755497,OCI1 -0,PR,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,CF -0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF -0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,USD,,APA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-320,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1.097198337,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.922605096,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,398.5367312,IR5 -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-298.7529446,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.6339295,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.6755497,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,399.6339295,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-299.6755497,OCI1 -0,PR,2020,USD,USD,L,BEPA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,320,IR6 -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-82.02271122,AM -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,139.9084921,BOP -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,EA -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,42.96811361,EOP -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.082332732,IA -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.082332732,IFIE1 -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,82.02271122,IR3 -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-124.9084921,IR5 -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.843447869,AM -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5.156552131,EOP -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.843447869,IR4 -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-9.843447869,ISE6 -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.09226051,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.87529446,IR5 -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.96755497,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.96755497,OCI1 -0,PR,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,CF -0,ACA,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,CF -0,AEA,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,IR1 -0,NIC,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,ISE4 -0,PR,2020,USD,USD,,APA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-320,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.5367312,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.7529446,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF -0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.6339295,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.6755497,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.097198337,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.922605096,IA -0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,1.097198337,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.922605096,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,398.5367312,IR5 -0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-298.7529446,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.6339295,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.6755497,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,399.6339295,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-299.6755497,OCI1 -0,PR,2020,USD,USD,L,BEPA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,320,IR6 -0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-82.02271122,AM -0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,139.9084921,BOP -0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,EA -0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,42.96811361,EOP -0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.082332732,IA -0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.082332732,IFIE1 -0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,82.02271122,IR3 -0,,2020,USD,USD,,C,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-124.9084921,IR5 -0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.843447869,AM -0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5.156552131,EOP -0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.843447869,IR4 -0,,2020,USD,USD,,DA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-9.843447869,ISE6 -0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.87529446,BOP -0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF -0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF -0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.96755497,EOP -0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226051,IA -0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.09226051,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.87529446,IR5 -0,,2020,USD,USD,L,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.96755497,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT5.1,P,FALSE,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.96755497,OCI1 -0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF -0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,CF -0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,ISE1 -0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.2683656,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.3764723,BOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.481134118,BOP -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.2683656,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.3764723,BOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.481134118,BOP -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.367032705,CF -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.367032705,CF -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.8169647,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,EOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,EOP -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.8169647,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,EOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,EOP -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.548599169,IA -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.461302548,IA -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.001170191,IA -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.548599169,IA -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.461302548,IA -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.001170191,IA -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.548599169,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.461302548,IFIE1 -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.001170191,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.2683656,ISE10 -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.3764723,ISE10 -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.114101413,ISE10 -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.8169647,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,OCI1 -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.8169647,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.8377748,OCI1 -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.115271604,OCI1 -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,46.24958203,AM -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-70.43538017,BOP -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-24.22813469,EOP -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.042336557,IA -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.042336557,IFIE1 -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,70.43538017,ISE10 -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-46.24958203,ISE7 -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764723,BOP -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764723,BOP -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,EOP -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,EOP -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130255,IA -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130255,IA -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.046130255,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.93764723,ISE10 -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,OCI1 -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.98377748,OCI1 -2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF -2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.3764723,BOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.481134118,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.3764723,BOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.481134118,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.367032705,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.367032705,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,EOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,EOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,EOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,EOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.461302548,IA -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.001170191,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.461302548,IA -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.001170191,IA -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.461302548,IFIE2 -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.001170191,IFIE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.3764723,ISE12 -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.114101413,ISE12 -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,OCI2 -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.115271604,OCI2 -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.8377748,OCI2 -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.115271604,OCI2 -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764723,BOP -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93764723,BOP -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,EOP -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,EOP -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130255,IA -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.046130255,IA -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.046130255,IFIE2 -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.93764723,ISE12 -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,OCI2 -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.98377748,OCI2 -0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,CF -0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF -0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,ISE1 -0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.2683656,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.3764723,BOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.481134118,BOP -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.2683656,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.3764723,BOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.481134118,BOP -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.367032705,CF -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.367032705,CF -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.8169647,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.8377748,EOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.115271604,EOP -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.8169647,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.8377748,EOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.115271604,EOP -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.548599169,IA -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.461302548,IA -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.001170191,IA -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.548599169,IA -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.461302548,IA -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.001170191,IA -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.548599169,IFIE1 -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.461302548,IFIE1 -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.001170191,IFIE1 -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-199.2683656,ISE10 -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.3764723,ISE10 -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.114101413,ISE10 -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,46.24958203,AM -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-70.43538017,BOP -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-24.22813469,EOP -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.042336557,IA -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.042336557,IFIE1 -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,70.43538017,ISE10 -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-46.24958203,ISE7 -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764723,BOP -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764723,BOP -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98377748,EOP -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98377748,EOP -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130255,IA -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130255,IA -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.046130255,IFIE1 -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.93764723,ISE10 -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF -2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.3764723,BOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.481134118,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.3764723,BOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.481134118,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.367032705,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.367032705,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.8377748,EOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.115271604,EOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.8377748,EOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.115271604,EOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.461302548,IA -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.001170191,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.461302548,IA -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.001170191,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.461302548,IFIE2 -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.001170191,IFIE2 -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.3764723,ISE12 -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.114101413,ISE12 -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764723,BOP -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93764723,BOP -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98377748,EOP -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98377748,EOP -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130255,IA -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.046130255,IA -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.046130255,IFIE2 -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.93764723,ISE12 -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 +@@ReportVariable +AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType +2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-299.67555,OCI2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.92261,IFIE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-298.75294,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755,OCI2 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226,IFIE2 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,OCI2 +2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,CF +2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,598.75294,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,299.67555,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.92261,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.92261,IFIE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-298.75294,ISE12 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,598.75294,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,299.67555,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.92261,IA +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.87529,BOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,29.96755,EOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226,IA +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.09226,IFIE2 +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-29.87529,ISE12 +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.87529,BOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,29.96755,EOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.09226,IA +2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF +2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.48113,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,EOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00117,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11527,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.83777,OCI2 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.48113,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,EOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00117,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.00117,IFIE2 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.1141,ISE12 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,OCI2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.4613,IFIE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.37647,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93765,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,EOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04613,IA +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.98378,OCI2 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93765,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,EOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04613,IA +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04613,IFIE2 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.93765,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,OCI2 +2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF +2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.48113,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527,EOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.00117,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.00117,IFIE2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.1141,ISE12 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.83777,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.4613,IFIE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.37647,ISE12 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.48113,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527,EOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.00117,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.83777,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613,IA +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93765,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98378,EOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.04613,IA +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.04613,IFIE2 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.93765,ISE12 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93765,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98378,EOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.04613,IA +0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-320,IR6 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.67555,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.63393,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.92261,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.75294,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.0972,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.53673,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271,AM +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849,BOP +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.96811,EOP +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233,IA +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271,IR3 +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849,IR5 +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.84345,AM +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.15655,EOP +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.84345,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.84345,ISE6 +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755,OCI1 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-400,IR6 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.67555,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.63393,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.92261,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.75294,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.0972,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.53673,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR6 +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271,AM +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849,BOP +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.96811,EOP +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233,IA +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271,IR3 +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849,IR5 +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.84345,AM +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.15655,EOP +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.84345,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.84345,ISE6 +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755,OCI1 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,NIC,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 +0,NIC,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,NIC,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,EOP +0,PR,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,15,CF +0,PR,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,15,EOP +0,PR,2020,USD,USD,,APA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-320,IR6 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.67555,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.63393,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.92261,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.75294,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.0972,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.53673,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271,AM +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849,BOP +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.96811,EOP +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233,IA +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271,IR3 +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849,IR5 +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.84345,AM +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.15655,EOP +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.84345,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.84345,ISE6 +0,NIC,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8,CF +0,NIC,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8,EOP +0,PR,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,PR,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755,OCI1 +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,NIC,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-280,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,400,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-320,IR6 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-299.67555,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,399.63393,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.92261,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-298.75294,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,299.67555,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1.0972,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,398.53673,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-399.63393,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-82.02271,AM +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,139.90849,BOP +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,42.96811,EOP +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.08233,IA +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.08233,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,82.02271,IR3 +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-124.90849,IR5 +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.84345,AM +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.15655,EOP +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.84345,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-9.84345,ISE6 +0,PR,2020,USD,USD,,OA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,PR,2020,USD,USD,,OA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.96755,OCI1 +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.09226,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-29.87529,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.96755,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 +0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,CF +0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-280,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,400,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-320,IR6 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.92261,IFIE1 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-298.75294,IR5 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,1.0972,IFIE1 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,398.53673,IR5 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.92261,IA +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,L,BEPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-82.02271,AM +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,139.90849,BOP +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,42.96811,EOP +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.08233,IA +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.08233,IFIE1 +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,82.02271,IR3 +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-124.90849,IR5 +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,9.84345,AM +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.15655,EOP +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,9.84345,IR4 +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-9.84345,ISE6 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.09226,IFIE1 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-29.87529,IR5 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.09226,IA +0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 +0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,CF +0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-280,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,400,IR1 +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-1.5,EOP +0,PR,2020,USD,USD,,APA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-320,IR6 +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.67555,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.63393,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.92261,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-298.75294,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.67555,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.0972,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,398.53673,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63393,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-129.49727,AM +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,72.2,BOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,139.90849,BOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.83796,EOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.1444,IA +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.08233,IA +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.22673,IFIE1 +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,129.49727,IR3 +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-124.90849,IR5 +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.84345,AM +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5.15655,EOP +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.84345,IR4 +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.84345,ISE6 +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.5,EOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.96755,OCI1 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.09226,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.87529,IR5 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 +0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,CF +0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-280,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,400,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-320,IR6 +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-299.67555,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,399.63393,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.92261,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-298.75294,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,299.67555,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1.0972,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,398.53673,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-399.63393,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-82.02271,AM +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,139.90849,BOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,42.96811,EOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.08233,IA +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.08233,IFIE1 +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,82.02271,IR3 +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-124.90849,IR5 +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.84345,AM +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5.15655,EOP +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,9.84345,IR4 +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-9.84345,ISE6 +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.96755,OCI1 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.09226,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.87529,IR5 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,29.96755,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5,ISE3 +0,NIC,2020,USD,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,CF +0,NIC,2020,USD,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-280,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,,A,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,400,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-320,IR6 +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-299.67555,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,C,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,399.63393,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,598.75294,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-300,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.67555,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.92261,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.92261,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-298.75294,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,299.67555,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-798.53673,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,400,CF +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.63393,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-1.0972,IA +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,1.0972,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,398.53673,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-399.63393,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,320,IR6 +0,,2020,USD,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-82.02271,AM +0,,2020,USD,USD,,C,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,139.90849,BOP +0,,2020,USD,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,EA +0,,2020,USD,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,42.96811,EOP +0,,2020,USD,USD,,C,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.08233,IA +0,,2020,USD,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.08233,IFIE1 +0,,2020,USD,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,82.02271,IR3 +0,,2020,USD,USD,,C,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-124.90849,IR5 +0,,2020,USD,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.84345,AM +0,,2020,USD,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-5.15655,EOP +0,,2020,USD,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,9.84345,IR4 +0,,2020,USD,USD,,DA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-9.84345,ISE6 +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,C,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.96755,OCI1 +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,59.87529,BOP +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,-30,CF +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.96755,EOP +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,N,Default,,DT5,0,CH,,BBA,0.09226,IA +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-0.09226,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,-29.87529,IR5 +0,,2020,USD,USD,L,RA,CHF,DT5.1,P,False,LRC,ANN,C,Default,,DT5,0,CH,,BBA,29.96755,OCI1 +0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF +0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 +0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,ISE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.48113,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00117,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11527,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.83777,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.26837,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5486,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.81696,OCI1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.48113,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00117,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.00117,IFIE1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.1141,ISE10 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.4613,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.37647,ISE10 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.26837,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5486,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.5486,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.26837,ISE10 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696,OCI1 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,46.24958,AM +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-70.43538,BOP +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-24.22813,EOP +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04234,IA +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04234,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,70.43538,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-46.24958,ISE7 +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93765,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04613,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.98378,OCI1 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93765,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,EOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04613,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04613,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.93765,ISE10 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,OCI1 +0,NIC,2020,USD,USD,,A,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF +0,NIC,2020,USD,USD,,A,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 +0,PR,2020,USD,USD,,A,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,ISE1 +0,NIC,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,4,CF +0,NIC,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,4,EOP +0,PR,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-5,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.48113,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00117,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11527,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.83777,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.26837,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5486,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.81696,OCI1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.48113,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00117,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.00117,IFIE1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.1141,ISE10 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.4613,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.37647,ISE10 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.26837,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5486,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.5486,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.26837,ISE10 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696,OCI1 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,46.24958,AM +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-70.43538,BOP +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-24.22813,EOP +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04234,IA +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04234,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,70.43538,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-46.24958,ISE7 +0,NIC,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-2.5,CF +0,NIC,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-2.5,EOP +0,PR,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,PR,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,7.5,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93765,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04613,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.98378,OCI1 +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93765,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,EOP +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04613,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04613,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.93765,ISE10 +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,OCI1 +0,NIC,2020,USD,USD,,A,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,CF +0,NIC,2020,USD,USD,,A,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,140,ISE2 +0,PR,2020,USD,USD,,A,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-200,ISE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.48113,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00117,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.11527,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.83777,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.26837,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5486,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.81696,OCI1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.48113,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.36703,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00117,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.00117,IFIE1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.1141,ISE10 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.11527,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-299.37647,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,150,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.4613,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.4613,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,149.37647,ISE10 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-149.83777,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,399.26837,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.5486,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.5486,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-199.26837,ISE10 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,199.81696,OCI1 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,46.24958,AM +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-70.43538,BOP +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-24.22813,EOP +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04234,IA +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04234,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,70.43538,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-46.24958,ISE7 +0,NIC,2020,USD,USD,,OA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-10,CF +0,NIC,2020,USD,USD,,OA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-10,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93765,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04613,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.98378,OCI1 +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.93765,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,15,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,EOP +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.04613,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.04613,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.93765,ISE10 +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-14.98378,OCI1 +0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,CF +0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,140,ISE2 +0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-200,ISE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.48113,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.00117,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.00117,IFIE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.1141,ISE10 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.83777,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.4613,IFIE1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,149.37647,ISE10 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.26837,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.81696,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.5486,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.5486,IFIE1 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-199.26837,ISE10 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.48113,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.36703,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.11527,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.00117,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-299.37647,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,150,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-149.83777,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.4613,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,399.26837,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-200,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,199.81696,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.5486,IA +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,46.24958,AM +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-70.43538,BOP +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-24.22813,EOP +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.04234,IA +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.04234,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,70.43538,ISE10 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-46.24958,ISE7 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93765,BOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98378,EOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.04613,IA +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.04613,IFIE1 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,14.93765,ISE10 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.93765,BOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,15,CF +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-14.98378,EOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.04613,IA \ No newline at end of file diff --git a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv index 6de7cc3a..466c64b6 100644 --- a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv +++ b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv @@ -1,1114 +1,1556 @@ -@@ReportVariable,,,,,,,,,,,,,,,,,,,,,, -AccidentYear,AmountType,AnnualCohort,Currency,ContractualCurrency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType -0,PR,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF -0,ICO,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF -0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF -0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF -0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,USD,,A,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,USD,,AA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,AA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-1,EOP -0,PR,2020,USD,USD,,AA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,USD,,AA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,WO -0,PR,2020,USD,USD,,AAPA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,IR6 -0,PR,2020,USD,USD,,APA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-72,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.96339295,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94808795,BOP -0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.90870495,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.8705482,BOP -0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.7703349,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.7828317,EOP -0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511439,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.4270877,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.458318,EOP -0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.981321312,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.99001456,EV -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719,EV -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.97509077,EV -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.90660656,EV -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.016636169,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.021957804,IA -0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.041476592,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.054737045,IA -0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.199634025,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.131746827,IFIE1 -0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.005489451,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06322866,IR5 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446479,IR5 -0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.987021988,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.86359463,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89271797,OCI1 -0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511439,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684176,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.21723166,OCI1 -0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.981321312,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.328323336,YCU -0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.223802546,YCU -0,PR,2020,USD,USD,L,BEPA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,96,IR6 -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5.773636698,AM -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.96811361,BOP -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135555,CL -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-43.6,EA -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,12.12950956,EOP -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.074374306,IA -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.074374306,IFIE1 -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5.773636698,IR3 -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,25.13934167,IR5 -0,,2020,USD,USD,,C,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.8920139,MC -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986,AM -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.156552131,BOP -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.65620815,EOP -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986,IR4 -0,,2020,USD,USD,,DA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.500343986,ISE6 -0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.95873898,BOP -0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135555,CL -0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP -0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45631603,EV -0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.016300538,IA -0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016300538,IFIE1 -0,,2020,USD,USD,,L,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.016300538,ISE11 -0,PR,2020,USD,USD,,OA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,CF -0,PR,2020,USD,USD,,OA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1,EOP -0,PR,2020,USD,USD,,OA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,IR1 -0,PR,2020,USD,USD,,OA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2,WO -0,PR,2020,USD,USD,,OAPA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2.4,IR6 -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.4812786,EOP -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.45330328,EOP -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719,EV -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660656,EV -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016468353,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.502744726,IR5 -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,L,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425169,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT1.1,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.022380255,YCU -2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,CF -2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,ISE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.93510994,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.83818525,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.7753432,EOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.4396393,EOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719,EV -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.90660656,EV -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.027447256,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.068421307,IA -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.137236278,IFIE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.03744281,ISE12 -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC -2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.90020653,OCI2 -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.23591035,OCI2 -2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.223802546,YCU -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.4812786,EOP -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.45330328,EOP -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719,EV -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660656,EV -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016468353,IFIE2 -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.502744726,ISE12 -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC -2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372,OCI2 -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425169,OCI2 -2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,FALSE,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.022380255,YCU -0,PR,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF -0,ICO,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF -0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF -0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF -0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,USD,,A,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,USD,,AA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,AA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-1,EOP -0,PR,2020,USD,USD,,AA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,USD,,AA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4,WO -0,PR,2020,USD,USD,,AAPA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5,IR6 -0,PR,2020,USD,USD,,APA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-90,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.96339295,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94808795,BOP -0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.90870495,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.8705482,BOP -0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.7703349,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.7828317,EOP -0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511439,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.4270877,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.458318,EOP -0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.981321312,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.99001456,EV -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96255719,EV -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.97509077,EV -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.90660656,EV -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.016636169,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.021957804,IA -0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.041476592,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.054737045,IA -0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.199634025,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.131746827,IFIE1 -0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.005489451,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06322866,IR5 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446479,IR5 -0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.987021988,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.86359463,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89271797,OCI1 -0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.992511439,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684176,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.21723166,OCI1 -0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.981321312,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.328323336,YCU -0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.223802546,YCU -0,PR,2020,USD,USD,L,BEPA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,120,IR6 -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-3.709682444,AM -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.96811361,BOP -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135555,CL -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-50,EA -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.79346381,EOP -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.074374306,IA -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.074374306,IFIE1 -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3.709682444,IR3 -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,31.53934167,IR5 -0,,2020,USD,USD,,C,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.8920139,MC -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986,AM -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.156552131,BOP -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.65620815,EOP -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.500343986,IR4 -0,,2020,USD,USD,,DA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.500343986,ISE6 -0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.95873898,BOP -0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43135555,CL -0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP -0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45631603,EV -0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.016300538,IA -0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016300538,IFIE1 -0,,2020,USD,USD,,L,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.016300538,ISE11 -0,PR,2020,USD,USD,,OA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,CF -0,PR,2020,USD,USD,,OA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,1,EOP -0,PR,2020,USD,USD,,OA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,IR1 -0,PR,2020,USD,USD,,OA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-2,WO -0,PR,2020,USD,USD,,OAPA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-3,IR6 -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702199,BOP -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96763705,BOP -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.4812786,EOP -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.45330328,EOP -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.496255719,EV -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.490660656,EV -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.005489451,IA -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.013684261,IA -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.016468353,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.502744726,IR5 -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,L,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.486276372,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425169,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT1.3,P,FALSE,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.022380255,YCU -0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF -0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF -0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,CF -0,ICO,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,CF -0,PR,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,90,CF -0,PR,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,USD,,A,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,USD,,AA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,AA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-1,EOP -0,PR,2020,USD,USD,,AA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,USD,,AA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,4,WO -0,PR,2020,USD,USD,,AAPA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,4,IR6 -0,PR,2020,USD,USD,,APA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-72,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.96339295,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,47.94808795,BOP -0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,11.98702199,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.90870495,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,47.8705482,BOP -0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,11.96763705,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.7703349,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,260.7828317,EOP -0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,8.992511439,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.4270877,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,260.458318,EOP -0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,8.981321312,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,14.99001456,EV -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,44.96255719,EV -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,14.97509077,EV -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,44.90660656,EV -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.016636169,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.021957804,IA -0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.005489451,IA -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.041476592,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.054737045,IA -0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.013684261,IA -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.103848888,IFIE1 -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0.059276479,IFIE1 -0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.013684261,IFIE1 -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-55.10299287,IR5 -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,39.15795518,IR5 -0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-8.96763705,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.328323336,YCU -0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.223802546,YCU -0,PR,2020,USD,USD,L,BEPA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,96,IR6 -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-5.773636698,AM -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,42.96811361,BOP -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135555,CL -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-43.6,EA -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,12.12950956,EOP -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.074374306,IA -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.074374306,IFIE1 -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,5.773636698,IR3 -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,25.13934167,IR5 -0,,2020,USD,USD,,C,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,105.8920139,MC -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,6.500343986,AM -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.156552131,BOP -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-13.65620815,EOP -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,6.500343986,IR4 -0,,2020,USD,USD,,DA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-6.500343986,ISE6 -0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,31.95873898,BOP -0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43135555,CL -0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0,EOP -0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,55.45631603,EV -0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.016300538,IA -0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.016300538,IFIE1 -0,,2020,USD,USD,,L,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,0.016300538,ISE11 -0,PR,2020,USD,USD,,OA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,3,CF -0,PR,2020,USD,USD,,OA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,1,EOP -0,PR,2020,USD,USD,,OA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,3,IR1 -0,PR,2020,USD,USD,,OA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-2,WO -0,PR,2020,USD,USD,,OAPA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-2.4,IR6 -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,11.98702199,BOP -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,11.96763705,BOP -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,22.4812786,EOP -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,22.45330328,EOP -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.496255719,EV -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.490660656,EV -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.005489451,IA -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,N,,,DT2,0,CH,,BBA,0.013684261,IA -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.002282909,IFIE1 -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,7.516534599,IR5 -0,,2020,USD,USD,L,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,C,,,DT2,0,CH,,BBA,3.55E-15,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT2.1,P,FALSE,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.022380255,YCU -2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,CF -2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,ISE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,299.6755497,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,299.6755497,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,59.93510994,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,59.83818525,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,269.7753432,EOP -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,269.4396393,EOP -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,44.96255719,EV -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,44.90660656,EV -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,0.109789022,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,0.109789022,IA -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.027447256,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.068421307,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,0.045592217,IFIE2 -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,30.19031813,ISE12 -2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93510994,MC -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93510994,MC -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-1.42E-14,OCI2 -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.223802546,YCU -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,29.96755497,BOP -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,29.96755497,BOP -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,11.98702199,BOP -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,11.96763705,BOP -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,22.4812786,EOP -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,22.45330328,EOP -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.496255719,EV -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.490660656,EV -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,0.010978902,IA -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,0.010978902,IA -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.005489451,IA -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,0,CH,,BBA,0.013684261,IA -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.002282909,IFIE2 -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,7.516534599,ISE12 -2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.993510994,MC -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.993510994,MC -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,0,CH,,BBA,3.55E-15,OCI2 -2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.022380255,YCU -0,PR,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,CF -0,ICO,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,CF -0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,CF -0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF -0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,USD,,A,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP -0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2.5,EOP -0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,4,WO -0,PR,2020,USD,USD,,AAPA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,4,IR6 -0,PR,2020,USD,USD,,APA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-72,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.96339295,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.94808795,BOP -0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.98702199,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.90870495,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.8705482,BOP -0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.96763705,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.7703349,CL -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.7828317,CL -0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.992511439,CL -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.4270877,CL -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.458318,CL -0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.981321312,CL -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.99001456,EV -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.96255719,EV -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.97509077,EV -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.90660656,EV -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.016636169,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.021957804,IA -0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.005489451,IA -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.041476592,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.054737045,IA -0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.013684261,IA -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.199634025,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.131746827,IFIE1 -0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.005489451,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.8335635,IR5 -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.8072965,IR5 -0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.005489451,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.6339295,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.6755497,OCI1 -0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.6339295,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.6755497,OCI1 -0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.328323336,YCU -0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.223802546,YCU -0,PR,2020,USD,USD,L,BEPA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,96,IR6 -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,67.83795828,BOP -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-139.9450686,CL -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-33.87170343,EA -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.086799913,IA -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.086799913,IFIE1 -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.9247582,IR5 -0,,2020,USD,USD,,C,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,105.8920139,MC -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655213,AM -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.156552131,BOP -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655213,IR4 -0,,2020,USD,USD,,DA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-20.15655213,ISE6 -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.728296571,AM -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,31.95873898,BOP -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-87.43135555,CL -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.728296571,EA -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,55.45631603,EV -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.016300538,IA -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.016300538,IFIE1 -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-9.711996033,ISE11 -0,,2020,USD,USD,,L,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,9.728296571,ISE9 -0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP -0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,3,CF -0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,2.5,EOP -0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,3,IR1 -0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2,WO -0,PR,2020,USD,USD,,OAPA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-2.4,IR6 -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.98702199,BOP -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.96763705,BOP -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.4812786,CL -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.45330328,CL -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.496255719,EV -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.490660656,EV -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.005489451,IA -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.013684261,IA -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.016468353,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.98402332,IR5 -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,L,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.96755497,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755497,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT3.1,P,FALSE,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.022380255,YCU -0,PR,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,CF -0,ICO,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,CF -0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,CF -0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF -0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,IR1 -0,ICO,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,IR2 -0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,ISE2 -0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 -0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 -0,ICO,2020,USD,USD,,A,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6,ISE5 -0,PR,2020,USD,USD,,AA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF -0,PR,2020,USD,USD,,AA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-1,EOP -0,PR,2020,USD,USD,,AA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,IR1 -0,PR,2020,USD,USD,,AA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,4,WO -0,PR,2020,USD,USD,,AAPA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,4,IR6 -0,PR,2020,USD,USD,,APA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-72,IR6 -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.6339295,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.6755497,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.9267859,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.94808795,BOP -0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.98702199,BOP -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.8174099,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.8705482,BOP -0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.96763705,BOP -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF -0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.7144164,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.7828317,EOP -0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.992511439,EOP -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.2875961,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.458318,EOP -0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.981321312,EOP -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.97403785,EV -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.96255719,EV -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.93523601,EV -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.90660656,EV -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.182997856,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.109789022,IA -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.033272337,IA -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.021957804,IA -0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.005489451,IA -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.082953184,IA -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.054737045,IA -0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.013684261,IA -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,0.216270193,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.131746827,IFIE1 -0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.005489451,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.8642167,IR5 -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.02446479,IR5 -0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.987021988,IR5 -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.96339295,MC -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93510994,MC -0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.0804869,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-38.89271797,OCI1 -0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.992511439,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.65366656,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.21723166,OCI1 -0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.981321312,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.328323336,YCU -0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.223802546,YCU -0,PR,2020,USD,USD,L,BEPA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,104,IR6 -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-33.48998868,AM -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,42.96811361,BOP -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,8.004653973,BOP -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-51.6,EA -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,70.35723911,EOP -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.492263621,EV -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.074374306,IA -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.000335631,IA -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.074709937,IFIE1 -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,33.48998868,IR3 -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-60.80440423,IR5 -0,,2020,USD,USD,,C,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,105.8920139,MC -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.500343986,AM -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.156552131,BOP -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-13.65620815,EOP -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.500343986,IR4 -0,,2020,USD,USD,,DA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6.500343986,ISE6 -0,PR,2020,USD,USD,,OA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,CF -0,PR,2020,USD,USD,,OA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,1,EOP -0,PR,2020,USD,USD,,OA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,3,IR1 -0,PR,2020,USD,USD,,OA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-2,WO -0,PR,2020,USD,USD,,OAPA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-2.4,IR6 -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.96755497,BOP -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.98702199,BOP -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.96763705,BOP -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.4812786,EOP -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.45330328,EOP -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.496255719,EV -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.490660656,EV -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.010978902,IA -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.005489451,IA -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.013684261,IA -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.016468353,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.502744726,IR5 -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.993510994,MC -0,,2020,USD,USD,L,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-7.486276372,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.51425169,OCI1 -0,,2020,USD,USD,C,RA,CHF,DT4.1,P,FALSE,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.022380255,YCU -0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF -0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,CF -0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,ISE1 -0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 -0,PR,2020,USD,USD,,AA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,CF -0,PR,2020,USD,USD,,AA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,EOP -0,PR,2020,USD,USD,,AA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2,ISE1 -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.8169647,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,BOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.115271604,BOP -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.8169647,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,BOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.115271604,BOP -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.98169647,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.96755497,BOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437376,BOP -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.95435248,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909263,BOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.293739489,BOP -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970418,CF -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970418,CF -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.133710648,CF -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.133710648,CF -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.593312856,CRU -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59232899,CRU -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.3851674,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.8876716,EOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.965455476,EOP -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.2135439,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.7198197,EOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.963854437,EOP -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.49500728,EV -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.4812786,EV -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.160909246,EV -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.487545386,EV -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.45330328,EV -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.160642406,EV -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.091498928,IA -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.054894511,IA -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.73E-05,IA -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.091498928,IA -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.054894511,IA -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.73E-05,IA -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.008318084,IA -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.013723628,IA -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.000246134,IA -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.020738296,IA -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.034210653,IA -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.000613566,IA -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.099817012,IFIE1 -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.068618139,IFIE1 -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.593636253,IFIE1 -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.53161433,ISE10 -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.0187214,ISE10 -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.256547619,ISE10 -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.98169647,MC -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755497,MC -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054321,MC -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.98169647,MC -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755497,MC -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054321,MC -0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-27.43179732,OCI1 -0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.95010326,OCI1 -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.850183872,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.60342088,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.11795517,OCI1 -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.848582833,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.164161668,YCU -0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.111901273,YCU -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8.35E-05,YCU -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,11.13335565,AM -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-24.22813469,BOP -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863,CL -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.593312856,CRU -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-23.38944253,EOP -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.038546646,IA -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.631859502,IFIE1 -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,9.662803986,ISE10 -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.13335565,ISE7 -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-52.92295262,MC -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-15.68499573,BOP -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26014863,CL -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-27.56724877,EV -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.007904135,IA -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.007904135,IFIE1 -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.007904135,ISE11 -0,PR,2020,USD,USD,,OA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,CF -0,PR,2020,USD,USD,,OA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,EOP -0,PR,2020,USD,USD,,OA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-1.5,ISE1 -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,BOP -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,BOP -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.993510994,BOP -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.983818525,BOP -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.2406393,EOP -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.22665164,EOP -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24812786,EV -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.245330328,EV -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451,IA -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451,IA -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.002744726,IA -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.006842131,IA -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.008234177,IFIE1 -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.751372363,ISE10 -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.996755497,MC -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.996755497,MC -0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.743138186,OCI1 -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.757125845,OCI1 -0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.011190127,YCU -2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF -2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,BOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.115271604,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.8377748,BOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.115271604,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.96755497,BOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437376,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909263,BOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.293739489,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970418,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.041970418,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.133710648,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.133710648,CF -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.593312856,CRU -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59232899,CRU -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.8876716,EOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.965455476,EOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.7198197,EOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.963854437,EOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.4812786,EV -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.160909246,EV -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.45330328,EV -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.160642406,EV -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.054894511,IA -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.73E-05,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.054894511,IA -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.73E-05,IA -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.013723628,IA -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.000246134,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.034210653,IA -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.000613566,IA -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.068618139,IFIE2 -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.593636253,IFIE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.0187214,ISE12 -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.256547619,ISE12 -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755497,MC -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054321,MC -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755497,MC -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.023054321,MC -2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.95010326,OCI2 -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.850183872,OCI2 -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.11795517,OCI2 -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.848582833,OCI2 -2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.111901273,YCU -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8.35E-05,YCU -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,BOP -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98377748,BOP -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.993510994,BOP -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.983818525,BOP -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.2406393,EOP -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.22665164,EOP -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24812786,EV -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.245330328,EV -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451,IA -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.005489451,IA -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.002744726,IA -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.006842131,IA -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.008234177,IFIE2 -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.751372363,ISE12 -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.996755497,MC -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.996755497,MC -2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.743138186,OCI2 -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.757125845,OCI2 -2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.011190127,YCU -0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,CF -0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF -0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,ISE1 -0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 -0,PR,2020,USD,USD,,AA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,CF -0,PR,2020,USD,USD,,AA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,EOP -0,PR,2020,USD,USD,,AA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,2,ISE1 -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.8169647,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.8377748,BOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.115271604,BOP -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.8169647,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.8377748,BOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.115271604,BOP -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.98169647,BOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.96755497,BOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437376,BOP -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.95435248,BOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909263,BOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.293739489,BOP -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970418,CF -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970418,CF -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.133710648,CF -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.133710648,CF -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.593312856,CRU -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.59232899,CRU -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.3851674,EOP -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.8876716,EOP -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.965455476,EOP -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.2135439,EOP -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.7198197,EOP -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.963854437,EOP -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.49500728,EV -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.4812786,EV -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.160909246,EV -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.487545386,EV -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.45330328,EV -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.160642406,EV -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.091498928,IA -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.054894511,IA -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.73E-05,IA -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.091498928,IA -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.054894511,IA -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.73E-05,IA -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.008318084,IA -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.013723628,IA -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.000246134,IA -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.020738296,IA -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.034210653,IA -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.000613566,IA -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.051924444,IFIE1 -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.022796109,IFIE1 -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.592936325,IFIE1 -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,27.55149644,ISE10 -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.09515906,ISE10 -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.255646508,ISE10 -0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.98169647,MC -0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755497,MC -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054321,MC -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.98169647,MC -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755497,MC -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054321,MC -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,7.11E-15,OCI1 -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-5.55E-17,OCI1 -0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.164161668,YCU -0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.111901273,YCU -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8.35E-05,YCU -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,11.13335565,AM -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-24.22813469,BOP -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863,CL -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.593312856,CRU -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-23.38944253,EOP -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.038546646,IA -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.631859502,IFIE1 -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,9.662803986,ISE10 -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.13335565,ISE7 -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-52.92295262,MC -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-15.68499573,BOP -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26014863,CL -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,EOP -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-27.56724877,EV -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.007904135,IA -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.007904135,IFIE1 -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.007904135,ISE11 -0,PR,2020,USD,USD,,OA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,CF -0,PR,2020,USD,USD,,OA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,EOP -0,PR,2020,USD,USD,,OA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.5,ISE1 -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98377748,BOP -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98377748,BOP -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.993510994,BOP -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.983818525,BOP -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.2406393,EOP -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.22665164,EOP -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.24812786,EV -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.245330328,EV -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451,IA -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451,IA -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.002744726,IA -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.006842131,IA -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.001141454,IFIE1 -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.7582673,ISE10 -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.996755497,MC -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.996755497,MC -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.78E-15,OCI1 -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.011190127,YCU -2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF -2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.8377748,BOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.115271604,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.8377748,BOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.115271604,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.96755497,BOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437376,BOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909263,BOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.293739489,BOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970418,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.041970418,CF -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.133710648,CF -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.133710648,CF -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.593312856,CRU -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.59232899,CRU -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.8876716,EOP -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.965455476,EOP -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.7198197,EOP -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.963854437,EOP -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.4812786,EV -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.160909246,EV -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.45330328,EV -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.160642406,EV -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.054894511,IA -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.73E-05,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.054894511,IA -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,7.73E-05,IA -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.013723628,IA -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.000246134,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.034210653,IA -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.000613566,IA -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.022796109,IFIE2 -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.592936325,IFIE2 -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.09515906,ISE12 -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.255646508,ISE12 -2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755497,MC -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054321,MC -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755497,MC -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.023054321,MC -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,7.11E-15,OCI2 -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-5.55E-17,OCI2 -2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.111901273,YCU -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8.35E-05,YCU -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98377748,BOP -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98377748,BOP -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.993510994,BOP -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.983818525,BOP -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.2406393,EOP -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.22665164,EOP -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.24812786,EV -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.245330328,EV -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451,IA -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.005489451,IA -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.002744726,IA -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.006842131,IA -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.001141454,IFIE2 -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.7582673,ISE12 -2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.996755497,MC -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.996755497,MC -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-1.78E-15,OCI2 -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.011190127,YCU +@@ReportVariable +AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis,EstimateType,FunctionalCurrency,GroupOfContract,InitialProfitability,IsReinsurance,LiabilityType,LineOfBusiness,Novelty,OciType,Partner,Portfolio,Projection,ReportingNode,Scenario,ValuationApproach,Value,VariableType +2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,CF +2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-76,ISE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.83819,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.43964,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.90661,EV +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.06842,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.23591,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.2238,YCU +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,59.93511,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,269.77534,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,44.96256,EV +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.02745,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13724,IFIE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,30.03744,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +2020,NIC,2020,USD,USD,L,BE,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-29.90021,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.96764,BOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.4533,EOP +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49066,EV +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.01368,IA +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238,YCU +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702,BOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,22.48128,EOP +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49626,EV +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,N,Default,,DT1,0,CH,,BBA,0.00549,IA +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01647,IFIE2 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +2020,,2020,USD,USD,L,RA,CHF,DT1.2,P,False,LIC,ANN,C,Default,,DT1,0,CH,,BBA,-7.48628,OCI2 +2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,CF +2020,NIC,2020,USD,USD,,A,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-76,ISE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,299.67555,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.83819,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,269.43964,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,44.90661,EV +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.10979,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.06842,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0.04559,IFIE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,30.19032,ISE12 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93511,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.2238,YCU +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,299.67555,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,59.93511,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-15,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,269.77534,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,44.96256,EV +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.10979,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.02745,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-59.93511,MC +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,29.96755,BOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,11.96764,BOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,22.4533,EOP +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.49066,EV +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.01098,IA +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.01368,IA +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,-0.00228,IFIE2 +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,7.51653,ISE12 +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.99351,MC +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,0,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-0.02238,YCU +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,29.96755,BOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,11.98702,BOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,C,,,DT2,0,CH,,BBA,22.48128,EOP +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,-4.49626,EV +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,0.01098,IA +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,N,,,DT2,0,CH,,BBA,0.00549,IA +2020,,2020,USD,USD,L,RA,CHF,DT2.2,P,False,LIC,ANN,I,,,DT2,0,CH,,BBA,-5.99351,MC +2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF +2020,NIC,2020,USD,USD,,A,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29374,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04197,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.13371,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59233,CRU +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.96385,EOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16064,EV +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,8E-05,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00061,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.02305,MC +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.84858,OCI2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8E-05,YCU +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.71982,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.4533,EV +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.03421,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.11796,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.1119,YCU +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04197,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.13371,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59331,CRU +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.96546,EOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16091,EV +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,8E-05,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00025,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.59364,IFIE2 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.25655,ISE12 +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.02305,MC +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.85018,OCI2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.96755,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.88767,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.48128,EV +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.01372,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.06862,IFIE2 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.01872,ISE12 +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755,MC +2020,NIC,2020,USD,USD,L,BE,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.9501,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98378,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.98382,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.22665,EOP +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24533,EV +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.00549,IA +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.00684,IA +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.99676,MC +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75713,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.01119,YCU +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98378,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.99351,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.24064,EOP +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24813,EV +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.00549,IA +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.00274,IA +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.00823,IFIE2 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75137,ISE12 +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.99676,MC +2020,,2020,USD,USD,L,RA,CHF,DTR1.2,P,True,LIC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.74314,OCI2 +2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF +2020,NIC,2020,USD,USD,,A,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29374,BOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.04197,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.13371,CF +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.59233,CRU +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.96385,EOP +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16064,EV +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,8E-05,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.00061,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.59294,IFIE2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.25565,ISE12 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.02305,MC +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0,OCI2 +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8E-05,YCU +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909,BOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.71982,EOP +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.4533,EV +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.03421,IA +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.0228,IFIE2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.09516,ISE12 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755,MC +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.1119,YCU +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437,BOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.04197,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.13371,CF +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.59331,CRU +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.96546,EOP +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16091,EV +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,8E-05,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.00025,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.02305,MC +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.96755,BOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.88767,EOP +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.48128,EV +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.01372,IA +2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755,MC +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98378,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.98382,BOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.22665,EOP +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.24533,EV +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.00549,IA +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.00684,IA +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.00114,IFIE2 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.75827,ISE12 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.99676,MC +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.01119,YCU +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98378,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.99351,BOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.24064,EOP +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.24813,EV +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.00549,IA +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.00274,IA +2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,True,LIC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.99676,MC +0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ICO,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF +0,ICO,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 +0,ICO,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 +0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF +0,PR,2020,USD,USD,,A,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-72,IR6 +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96764,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.98132,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.01368,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.98132,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.87055,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.45832,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.90661,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.05474,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.21723,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.2238,YCU +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.9087,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.42709,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.97509,EV +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.04148,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.32832,YCU +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.99251,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.00549,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.00549,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.98702,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.99251,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94809,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.78283,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96256,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.02196,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13175,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89272,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.96339,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.77033,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.99001,EV +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.01664,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.19963,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06323,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,L,BE,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.86359,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,96,IR6 +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.28963,AM +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.96811,BOP +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-42,EA +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,13.21352,EOP +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.07437,IA +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.07437,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.28963,IR3 +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,23.53934,IR5 +0,,2020,USD,USD,,C,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201,MC +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.50034,AM +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.15655,BOP +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.65621,EOP +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.50034,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.50034,ISE6 +0,,2020,USD,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.95874,BOP +0,,2020,USD,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45632,EV +0,,2020,USD,USD,,L,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.0163,IA +0,,2020,USD,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.0163,IFIE1 +0,,2020,USD,USD,,L,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.0163,ISE11 +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96764,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.4533,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49066,EV +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.01368,IA +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238,YCU +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.48128,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49626,EV +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01647,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,L,RA,CHF,DT1.1,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.48628,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ICO,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF +0,ICO,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 +0,ICO,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 +0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF +0,PR,2020,USD,USD,,A,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-90,IR6 +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96764,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.98132,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.01368,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.98132,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.87055,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.45832,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.90661,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.05474,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.21723,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.2238,YCU +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.9087,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.42709,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.97509,EV +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.04148,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.32832,YCU +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.99251,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.00549,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.00549,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.98702,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.99251,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94809,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.78283,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96256,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.02196,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13175,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89272,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.96339,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.77033,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.99001,EV +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.01664,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.19963,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06323,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,L,BE,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.86359,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,120,IR6 +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-4.35467,AM +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.96811,BOP +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-48,EA +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,9.14848,EOP +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.07437,IA +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.07437,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,4.35467,IR3 +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,29.53934,IR5 +0,,2020,USD,USD,,C,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201,MC +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.50034,AM +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.15655,BOP +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.65621,EOP +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.50034,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.50034,ISE6 +0,,2020,USD,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.95874,BOP +0,,2020,USD,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45632,EV +0,,2020,USD,USD,,L,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.0163,IA +0,,2020,USD,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.0163,IFIE1 +0,,2020,USD,USD,,L,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.0163,ISE11 +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96764,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.4533,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49066,EV +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.01368,IA +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238,YCU +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.48128,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49626,EV +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01647,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,L,RA,CHF,DT1.3,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.48628,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ICO,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF +0,ICO,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 +0,ICO,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 +0,NIC,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF +0,PR,2020,USD,USD,,A,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 +0,NIC,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5,BOP +0,NIC,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,NIC,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE2 +0,NIC,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5,WO +0,PR,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,15,BOP +0,PR,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,5,CF +0,PR,2020,USD,USD,,AA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,20,EOP +0,PR,2020,USD,USD,,APA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-72,IR6 +0,ICO,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96764,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.98132,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.01368,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.98132,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.87055,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.45832,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.90661,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.05474,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.21723,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.2238,YCU +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.9087,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.42709,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.97509,EV +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.04148,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.32832,YCU +0,ICO,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.99251,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.00549,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.00549,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.98702,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.99251,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94809,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.78283,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96256,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.02196,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13175,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89272,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.96339,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.77033,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.99001,EV +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.01664,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.19963,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06323,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,L,BE,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.86359,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,96,IR6 +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.28963,AM +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.96811,BOP +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-42,EA +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,13.21352,EOP +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.07437,IA +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.07437,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.28963,IR3 +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,23.53934,IR5 +0,,2020,USD,USD,,C,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201,MC +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.50034,AM +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.15655,BOP +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.65621,EOP +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.50034,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.50034,ISE6 +0,,2020,USD,USD,,L,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.95874,BOP +0,,2020,USD,USD,,L,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,L,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45632,EV +0,,2020,USD,USD,,L,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.0163,IA +0,,2020,USD,USD,,L,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.0163,IFIE1 +0,,2020,USD,USD,,L,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.0163,ISE11 +0,NIC,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,8,BOP +0,NIC,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8,CF +0,NIC,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,PR,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-10,BOP +0,PR,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,3,CF +0,PR,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,PR,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7,IR1 +0,PR,2020,USD,USD,,OA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7,WO +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96764,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.4533,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49066,EV +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.01368,IA +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238,YCU +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.48128,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49626,EV +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01647,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,L,RA,CHF,DT1.4,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.48628,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-5,ISE3 +0,ICO,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,CF +0,ICO,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6,IR2 +0,ICO,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6,ISE5 +0,NIC,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,CF +0,NIC,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-70,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,CF +0,PR,2020,USD,USD,,A,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,90,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-72,IR6 +0,ICO,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96764,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.98132,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.01368,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.98132,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.87055,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.45832,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.90661,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.05474,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.21723,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.2238,YCU +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.9087,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.42709,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.97509,EV +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.04148,IA +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.20684,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.32832,YCU +0,ICO,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.99251,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.00549,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.00549,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-8.98702,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,8.99251,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,47.94809,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,260.78283,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,44.96256,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.02196,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.13175,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,39.02446,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-38.89272,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-39.96339,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-344.77033,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,14.99001,EV +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-0.01664,IA +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.19963,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-55.06323,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,L,BE,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,54.86359,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,96,IR6 +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.28963,AM +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,42.96811,BOP +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-42,EA +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,13.21352,EOP +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.07437,IA +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.07437,IFIE1 +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.28963,IR3 +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,23.53934,IR5 +0,,2020,USD,USD,,C,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,105.89201,MC +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.50034,AM +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.15655,BOP +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-13.65621,EOP +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,6.50034,IR4 +0,,2020,USD,USD,,DA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-6.50034,ISE6 +0,,2020,USD,USD,,L,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,31.95874,BOP +0,,2020,USD,USD,,L,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,L,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,55.45632,EV +0,,2020,USD,USD,,L,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.0163,IA +0,,2020,USD,USD,,L,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.0163,IFIE1 +0,,2020,USD,USD,,L,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0.0163,ISE11 +0,PR,2020,USD,USD,,OA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-10,BOP +0,PR,2020,USD,USD,,OA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,0,EOP +0,PR,2020,USD,USD,,OA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-10,IR1 +0,PR,2020,USD,USD,,OA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,10,WO +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.96764,BOP +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.4533,EOP +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49066,EV +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.01368,IA +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.51425,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-0.02238,YCU +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,11.98702,BOP +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,22.48128,EOP +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,-4.49626,EV +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,N,Default,,DT1,0,CH,,BBA,0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-0.01647,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,7.50274,IR5 +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,I,Default,,DT1,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,L,RA,CHF,DT1.5,P,False,LRC,ANN,C,Default,,DT1,0,CH,,BBA,-7.48628,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-5,ISE3 +0,ICO,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,CF +0,ICO,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6,IR2 +0,ICO,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6,ISE5 +0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,CF +0,NIC,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-70,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,90,CF +0,PR,2020,USD,USD,,A,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,90,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-72,IR6 +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.96764,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,8.98132,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.01368,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.01368,IFIE1 +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-8.96764,IR5 +0,ICO,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,47.87055,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,260.45832,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,44.90661,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.05474,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0.05928,IFIE1 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,39.15796,IR5 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.2238,YCU +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.9087,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.42709,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,14.97509,EV +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.04148,IA +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.10385,IFIE1 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-55.10299,IR5 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.32832,YCU +0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.98702,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,8.99251,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.00549,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,47.94809,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,260.78283,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,44.96256,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.02196,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-59.93511,MC +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-39.96339,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-344.77033,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,14.99001,EV +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-0.01664,IA +0,PR,2020,USD,USD,L,BE,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,L,BEPA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,96,IR6 +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6.28963,AM +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,42.96811,BOP +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-42,EA +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,13.21352,EOP +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.07437,IA +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.07437,IFIE1 +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6.28963,IR3 +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,23.53934,IR5 +0,,2020,USD,USD,,C,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,105.89201,MC +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6.50034,AM +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.15655,BOP +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-13.65621,EOP +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,6.50034,IR4 +0,,2020,USD,USD,,DA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-6.50034,ISE6 +0,,2020,USD,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,31.95874,BOP +0,,2020,USD,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,55.45632,EV +0,,2020,USD,USD,,L,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.0163,IA +0,,2020,USD,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.0163,IFIE1 +0,,2020,USD,USD,,L,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0.0163,ISE11 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.96764,BOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,22.4533,EOP +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.49066,EV +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.01368,IA +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,-0.00228,IFIE1 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,7.51653,IR5 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,0,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-0.02238,YCU +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,11.98702,BOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,C,,,DT2,0,CH,,BBA,22.48128,EOP +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,-4.49626,EV +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,N,,,DT2,0,CH,,BBA,0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DT2.1,P,False,LRC,ANN,I,,,DT2,0,CH,,BBA,-5.99351,MC +0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-5,ISE3 +0,ICO,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,CF +0,ICO,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-6,IR2 +0,ICO,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,6,ISE5 +0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,CF +0,NIC,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-70,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,CF +0,PR,2020,USD,USD,,A,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,90,IR1 +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-1.5,BOP +0,PR,2020,USD,USD,,AA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-1.5,EOP +0,PR,2020,USD,USD,,APA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-72,IR6 +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.96764,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.98132,CL +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.01368,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.87055,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.45832,CL +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.90661,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.05474,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.67555,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.2238,YCU +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.9087,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.42709,CL +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.97509,EV +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.04148,IA +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.63393,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.32832,YCU +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.98702,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.99251,CL +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.00549,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.00549,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.00549,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,47.94809,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-260.78283,CL +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,44.96256,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.02196,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.13175,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,299.8073,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-299.67555,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-39.96339,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,10,CF +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,344.77033,CL +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,14.99001,EV +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-0.01664,IA +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0.19963,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-399.83356,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,L,BE,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,399.63393,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,96,IR6 +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,67.83796,BOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-139.94507,CL +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-33.8717,EA +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.0868,IA +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.0868,IFIE1 +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,67.92476,IR5 +0,,2020,USD,USD,,C,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,105.89201,MC +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655,AM +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.15655,BOP +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,20.15655,IR4 +0,,2020,USD,USD,,DA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-20.15655,ISE6 +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.1283,AM +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,31.95874,BOP +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-87.43136,CL +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,8.1283,EA +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,55.45632,EV +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.0163,IA +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.0163,IFIE1 +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-8.112,ISE11 +0,,2020,USD,USD,,L,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,8.1283,ISE9 +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,1.5,BOP +0,PR,2020,USD,USD,,OA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,1.5,EOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.96764,BOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.4533,CL +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.49066,EV +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.01368,IA +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.96755,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-0.02238,YCU +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,11.98702,BOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-22.48128,CL +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,0,EOP +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,-4.49626,EV +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,N,Default,,DT3,0,CH,,BBA,0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-0.01647,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,29.98402,IR5 +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,I,Default,,DT3,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,L,RA,CHF,DT3.1,P,False,LRC,ANN,C,Default,,DT3,0,CH,,BBA,-29.96755,OCI1 +0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,CF +0,ACA,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-10,ISE4 +0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,CF +0,AEA,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-5,ISE3 +0,ICO,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,CF +0,ICO,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6,IR2 +0,ICO,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6,ISE5 +0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,CF +0,NIC,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-70,ISE2 +0,PR,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,CF +0,PR,2020,USD,USD,,A,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,90,IR1 +0,PR,2020,USD,USD,,APA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-72,IR6 +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.96764,BOP +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.98132,EOP +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.01368,IA +0,ICO,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.98132,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.87055,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.45832,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.90661,EV +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.05474,IA +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.21723,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.2238,YCU +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.81741,BOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.2876,EOP +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.93524,EV +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.08295,IA +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.65367,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.32832,YCU +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.98702,BOP +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.99251,EOP +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.00549,IA +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.00549,IFIE1 +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-8.98702,IR5 +0,ICO,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,8.99251,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,299.67555,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,47.94809,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-60,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-12,CF +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,260.78283,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,44.96256,EV +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.10979,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.02196,IA +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.13175,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,39.02446,IR5 +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-59.93511,MC +0,NIC,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-38.89272,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-399.63393,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-79.92679,BOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,110,CF +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,20,CF +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-428.71442,EOP +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-38.97404,EV +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.183,IA +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-0.03327,IA +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,0.21627,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,28.86422,IR5 +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-39.96339,MC +0,PR,2020,USD,USD,L,BE,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-29.08049,OCI1 +0,PR,2020,USD,USD,L,BEPA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,104,IR6 +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-34.00598,AM +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,42.96811,BOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,8.00465,BOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-50,EA +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,71.44125,EOP +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-1.49226,EV +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.07437,IA +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.00034,IA +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.07471,IFIE1 +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,34.00598,IR3 +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-62.4044,IR5 +0,,2020,USD,USD,,C,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,105.89201,MC +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.50034,AM +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.15655,BOP +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-15,CF +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-13.65621,EOP +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,6.50034,IR4 +0,,2020,USD,USD,,DA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-6.50034,ISE6 +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.96764,BOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.4533,EOP +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.49066,EV +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.01368,IA +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.51425,OCI1 +0,,2020,USD,USD,C,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-0.02238,YCU +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,29.96755,BOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,11.98702,BOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-6,CF +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-3,CF +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,22.48128,EOP +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,-4.49626,EV +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,0.01098,IA +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,N,Default,,DT4,0,CH,,BBA,0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-0.01647,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,7.50274,IR5 +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,I,Default,,DT4,0,CH,,BBA,-5.99351,MC +0,,2020,USD,USD,L,RA,CHF,DT4.1,P,False,LRC,ANN,C,Default,,DT4,0,CH,,BBA,-7.48628,OCI1 +0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF +0,NIC,2020,USD,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 +0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,ISE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29374,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04197,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.13371,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59233,CRU +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.96385,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16064,EV +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,8E-05,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00061,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.02305,MC +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.84858,OCI1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8E-05,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.71982,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.4533,EV +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.03421,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755,MC +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.11796,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.1119,YCU +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.95435,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.21354,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.48755,EV +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.0915,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.02074,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.9817,MC +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.60342,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.16416,YCU +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04197,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.13371,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59331,CRU +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.96546,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16091,EV +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,8E-05,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00025,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.59364,IFIE1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.25655,ISE10 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.02305,MC +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.85018,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.96755,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.88767,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.48128,EV +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.01372,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.06862,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.01872,ISE10 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755,MC +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.9501,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.9817,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.38517,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.49501,EV +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.0915,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00832,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.09982,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.53161,ISE10 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.9817,MC +0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-27.4318,OCI1 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,11.13336,AM +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-24.22813,BOP +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26015,CL +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.59331,CRU +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-23.38944,EOP +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.03855,IA +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.63186,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,9.6628,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.13336,ISE7 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-52.92295,MC +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-15.685,BOP +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26015,CL +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-27.56725,EV +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.0079,IA +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.0079,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.0079,ISE11 +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98378,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.98382,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.22665,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24533,EV +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.00549,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.00684,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.99676,MC +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75713,OCI1 +0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.01119,YCU +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98378,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.99351,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.24064,EOP +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24813,EV +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.00274,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.00823,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75137,ISE10 +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.99676,MC +0,,2020,USD,USD,L,RA,CHF,DTR1.1,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.74314,OCI1 +0,NIC,2020,USD,USD,,A,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF +0,NIC,2020,USD,USD,,A,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 +0,PR,2020,USD,USD,,A,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,ISE1 +0,NIC,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,4,BOP +0,NIC,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-4,CF +0,NIC,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP +0,PR,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-5,BOP +0,PR,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,PR,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP +0,PR,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.5,ISE1 +0,PR,2020,USD,USD,,AA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.5,WO +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29374,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04197,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.13371,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59233,CRU +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.96385,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16064,EV +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,8E-05,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00061,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.02305,MC +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.84858,OCI1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8E-05,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.71982,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.4533,EV +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.03421,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755,MC +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.11796,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.1119,YCU +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.95435,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.21354,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.48755,EV +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.0915,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.02074,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.9817,MC +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.60342,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.16416,YCU +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04197,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.13371,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59331,CRU +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.96546,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16091,EV +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,8E-05,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00025,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.59364,IFIE1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.25655,ISE10 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.02305,MC +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.85018,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.96755,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.88767,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.48128,EV +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.01372,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.06862,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.01872,ISE10 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755,MC +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.9501,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.9817,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.38517,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.49501,EV +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.0915,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00832,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.09982,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.53161,ISE10 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.9817,MC +0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-27.4318,OCI1 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,11.13336,AM +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-24.22813,BOP +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26015,CL +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.59331,CRU +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-23.38944,EOP +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.03855,IA +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.63186,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,9.6628,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.13336,ISE7 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-52.92295,MC +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-15.685,BOP +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26015,CL +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-27.56725,EV +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.0079,IA +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.0079,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.0079,ISE11 +0,NIC,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-2.5,BOP +0,NIC,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP +0,NIC,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-2.5,ISE2 +0,NIC,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2.5,WO +0,PR,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,7.5,BOP +0,PR,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,2.5,CF +0,PR,2020,USD,USD,,OA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,10,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98378,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.98382,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.22665,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24533,EV +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.00549,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.00684,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.99676,MC +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75713,OCI1 +0,,2020,USD,USD,C,RA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.01119,YCU +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98378,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.99351,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.24064,EOP +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24813,EV +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.00274,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.00823,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75137,ISE10 +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.99676,MC +0,,2020,USD,USD,L,RA,CHF,DTR1.3,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.74314,OCI1 +0,NIC,2020,USD,USD,,A,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,CF +0,NIC,2020,USD,USD,,A,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,35,ISE2 +0,PR,2020,USD,USD,,A,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,CF +0,PR,2020,USD,USD,,A,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-45,ISE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29374,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04197,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.13371,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59233,CRU +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.96385,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16064,EV +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,8E-05,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00061,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.02305,MC +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.84858,OCI1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-8E-05,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.91909,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.71982,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.4533,EV +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.03421,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755,MC +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.11796,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.1119,YCU +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.95435,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.21354,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.48755,EV +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.0915,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.02074,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.9817,MC +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.60342,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.16416,YCU +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.11527,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.29437,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.04197,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.13371,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.59331,CRU +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.96546,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.16091,EV +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,8E-05,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00025,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.59364,IFIE1 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.25655,ISE10 +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.02305,MC +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.85018,OCI1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-149.83777,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-29.96755,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,30,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,7.5,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-134.88767,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-22.48128,EV +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.05489,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.01372,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.06862,IFIE1 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-15.01872,ISE10 +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,29.96755,MC +0,NIC,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,14.9501,OCI1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,199.81696,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,19.9817,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-55,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,172.38517,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-7.49501,EV +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.0915,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,0.00832,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.09982,IFIE1 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,27.53161,ISE10 +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,19.9817,MC +0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-27.4318,OCI1 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,11.13336,AM +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-24.22813,BOP +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26015,CL +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.59331,CRU +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-23.38944,EOP +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.03855,IA +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.63186,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,9.6628,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.13336,ISE7 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-52.92295,MC +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-15.685,BOP +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,43.26015,CL +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-27.56725,EV +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.0079,IA +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.0079,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-0.0079,ISE11 +0,NIC,2020,USD,USD,,OA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-10,BOP +0,NIC,2020,USD,USD,,OA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0,EOP +0,NIC,2020,USD,USD,,OA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-10,ISE2 +0,NIC,2020,USD,USD,,OA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,10,WO +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98378,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.98382,BOP +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.22665,EOP +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24533,EV +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.00549,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.00684,IA +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.99676,MC +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75713,OCI1 +0,,2020,USD,USD,C,RA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,0.01119,YCU +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-14.98378,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-5.99351,BOP +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,3,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-11.24064,EOP +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,2.24813,EV +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,-0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,N,Default,PT1,DTR1,0,CH,,BBA,-0.00274,IA +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,0.00823,IFIE1 +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,-3.75137,ISE10 +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,I,Default,PT1,DTR1,0,CH,,BBA,2.99676,MC +0,,2020,USD,USD,L,RA,CHF,DTR1.4,P,True,LRC,ANN,C,Default,PT1,DTR1,0,CH,,BBA,3.74314,OCI1 +0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,CF +0,NIC,2020,USD,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,35,ISE2 +0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,CF +0,PR,2020,USD,USD,,A,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-45,ISE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29374,BOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.04197,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.13371,CF +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.59233,CRU +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.96385,EOP +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16064,EV +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,8E-05,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.00061,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.59294,IFIE1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.25565,ISE10 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.02305,MC +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0,OCI1 +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-8E-05,YCU +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.91909,BOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.71982,EOP +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.4533,EV +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.03421,IA +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.0228,IFIE1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-15.09516,ISE10 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755,MC +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,NIC,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.1119,YCU +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.81696,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.95435,BOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.21354,EOP +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.48755,EV +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.0915,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.02074,IA +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.05192,IFIE1 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,27.5515,ISE10 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.9817,MC +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,OCI1 +0,PR,2020,USD,USD,C,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.16416,YCU +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.11527,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.29437,BOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.04197,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.13371,CF +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.59331,CRU +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.96546,EOP +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.16091,EV +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,8E-05,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.00025,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.02305,MC +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-149.83777,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-29.96755,BOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,30,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,7.5,CF +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-134.88767,EOP +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-22.48128,EV +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.05489,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.01372,IA +0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,29.96755,MC +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,199.81696,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,19.9817,BOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-55,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5,CF +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,172.38517,EOP +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-7.49501,EV +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.0915,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,0.00832,IA +0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,19.9817,MC +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,11.13336,AM +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-24.22813,BOP +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26015,CL +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.59331,CRU +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-23.38944,EOP +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.03855,IA +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.63186,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,9.6628,ISE10 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.13336,ISE7 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-52.92295,MC +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-15.685,BOP +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,43.26015,CL +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0,EOP +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-27.56725,EV +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.0079,IA +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.0079,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0.0079,ISE11 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98378,BOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.98382,BOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.22665,EOP +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.24533,EV +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.00549,IA +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.00684,IA +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,0.00114,IFIE1 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-3.75827,ISE10 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.99676,MC +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-0,OCI1 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,0.01119,YCU +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-14.98378,BOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-5.99351,BOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,3,CF +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,1.5,CF +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,C,,PT1,DTR2,0,CH,,BBA,-11.24064,EOP +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,2.24813,EV +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,-0.00549,IA +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,N,,PT1,DTR2,0,CH,,BBA,-0.00274,IA +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,True,LRC,ANN,I,,PT1,DTR2,0,CH,,BBA,2.99676,MC \ No newline at end of file diff --git a/full-ifrs17-template/Test/ExportReportVariables.ipynb b/full-ifrs17-template/Test/ExportReportVariables.ipynb index 74b2f841..276986ed 100644 --- a/full-ifrs17-template/Test/ExportReportVariables.ipynb +++ b/full-ifrs17-template/Test/ExportReportVariables.ipynb @@ -117,6 +117,15 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "code", + "source": [ + "int roundingDigits = - (int)Math.Log10(BenchmarkPrecision) + 1;" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, { "cell_type": "markdown", "source": [ @@ -186,7 +195,7 @@ { "cell_type": "code", "source": [ - "var scopesData = await GetScopesDataAsync(args, reportStorage, Scopes);", + "var scopesData = (await GetScopesDataAsync(args, reportStorage, Scopes)).Select(rv => rv with { Value = Math.Round(rv.Value, roundingDigits)});", "\nvar bmFileName = benchmarkFileNamePrefix + GetBenchmarkFileName(args) + \".csv\";" ], "metadata": {}, diff --git a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb index 159124cd..bd275113 100644 --- a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb +++ b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb @@ -67,31 +67,29 @@ "source": [ "var bmFiles = new BenchmarkMetadata[]{", "\n // 2020 Q4", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_A.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_AA.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_APA.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_BE.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_BEPA.csv\", \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_C.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_DA.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_F.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_OA.csv\" , \"CH\", 2020, 12),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_RA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__A.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__AA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__APA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__BE.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__BEPA.csv\", \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__C.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__DA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__F.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__OA.csv\" , \"CH\", 2020, 12),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12__RA.csv\" , \"CH\", 2020, 12),", "\n // 2021 Q1", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_A.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_AAPA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_APA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_BE.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_BEPA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_C.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_DA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_F.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_L.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_LR.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_OAPA.csv\" , \"CH\", 2021, 3),", - "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3_RA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__A.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__AA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__APA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__BE.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__BEPA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__C.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__DA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__F.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__L.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__LR.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__OA.csv\" , \"CH\", 2021, 3),", + "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2021_3__RA.csv\" , \"CH\", 2021, 3),", "\n // 2020 Q4", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_BE.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", "\n new BenchmarkMetadata(pathToBm+\"BM_CH_2020_12_MTUP10pct_BEPA.csv\" , \"CH\", 2020, 12, \"MTUP10pct\"),", @@ -109,7 +107,7 @@ { "cell_type": "code", "source": [ - "var excludedDataNodes = new[] {\"DT5.1\"}; // DT5.1 is simple importer and tested at report variable level" + "var excludedDataNodes = new string[]{};" ], "metadata": {}, "execution_count": 0, diff --git a/full-ifrs17-template/Test/ReportVariablesTest.ipynb b/full-ifrs17-template/Test/ReportVariablesTest.ipynb index 30a7ab8b..fe9146c2 100644 --- a/full-ifrs17-template/Test/ReportVariablesTest.ipynb +++ b/full-ifrs17-template/Test/ReportVariablesTest.ipynb @@ -62,6 +62,33 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "markdown", + "source": [ + "## Initialize Workspace" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, { "cell_type": "markdown", "source": [ diff --git a/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb index d4bf9f98..f94c1b30 100644 --- a/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb +++ b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb @@ -29,16 +29,8 @@ { "cell_type": "code", "source": [ - "#!import \"../Initialization/InitSystemorphToMemory\"" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" + "#!import \"../Constants/CalculationEngine\"", + "\n#!eval calculationEngine" ], "metadata": {}, "execution_count": 0, @@ -116,7 +108,8 @@ "\n .Concat(lc)", "\n .Concat(loreco)", "\n .Concat(fp)", - "\n .OrderBy(v => v.GroupOfContract).ThenBy(v => v.Scenario).ThenBy(v => v.Projection).ThenBy(v => v.AccidentYear).ThenBy(v => v.EstimateType).ThenBy(v => (v.VariableType, v.Novelty))", + "\n .OrderBy(v => v.ReportingNode).ThenBy(v => v.Scenario).ThenBy(v => v.Projection).ThenBy(v => v.LiabilityType).ThenBy(v => v.GroupOfContract)", + "\n .ThenBy(v => v.AccidentYear).ThenBy(v => v.EstimateType).ThenBy(v => v.EconomicBasis).ThenBy(v => v.AmountType).ThenBy(v => (v.VariableType, v.Novelty))", "\n .ToArray();", "\n}" ], diff --git a/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb index 41649364..8c8f7658 100644 --- a/ifrs17/Constants/Consts.ipynb +++ b/ifrs17/Constants/Consts.ipynb @@ -261,8 +261,6 @@ "\n public const string FCF = nameof(FCF); //Fulfilment Cash flows", "\n public const string BEPA = nameof(BEPA); //Experience Adjusted BE Premium to Csm", "\n public const string APA = nameof(APA); //Experience Adjusted Written Actual Premium to Csm", - "\n public const string AAPA = nameof(AAPA); //Experience Adjusted Advance Actual Premium to Csm", - "\n public const string OAPA = nameof(OAPA); //Experience Adjusted Overdue Actual Premium to Csm", "\n}" ], "metadata": {}, diff --git a/ifrs17/Import/ImportScopeCalculation.ipynb b/ifrs17/Import/ImportScopeCalculation.ipynb index 6c12cedb..d5d002d6 100644 --- a/ifrs17/Import/ImportScopeCalculation.ipynb +++ b/ifrs17/Import/ImportScopeCalculation.ipynb @@ -1509,7 +1509,7 @@ "\nEA (\\rm{PV}) = \\text{Premium Allocation Factor} \\cdot \\big( PV (\\text{AocType = CF}) \\big)~, \\\\", "\n$$", "\n$$", - "\nEA (\\text{Actual}) = \\text{Premium Allocation Factor} \\cdot \\big( \\text{Actual}(\\text{AocType = CF}) + \\text{Advance Actual}(\\text{AocType = CF})+ \\text{Overdue Actual}(\\text{AocType = CF}) \\big) ~,", + "\nEA (\\text{Actual}) = \\text{Premium Allocation Factor} \\cdot \\big( \\text{Actual}(\\text{AocType = CF}) \\big) ~,", "\n$$", "\nwhere amount type premium and its children are considered, novelties in-force and new business are considered for $PV$ whereas novelty combined is considered for Actual. The allocation is always done in the finest granularity (novelty, line of business, ..) possible." ], @@ -1546,20 +1546,20 @@ { "cell_type": "code", "source": [ - "public interface ActualExperienceAdjustmentForPremium : IScope", + "public interface ActualExperienceAdjustmentOnPremium : IScope", "\n{", "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s", - "\n .WithApplicability(x => x.Identity.AocType != AocTypes.CF));", + "\n builder.ForScope(s => s", + "\n .WithApplicability(x => x.Identity.AocType != AocTypes.CF));", "\n ", - "\n public ActualBase[] ByAmountTypeAndEstimateType => GetStorage().GetPremiums().SelectMany(pr => ", - "\n GetStorage().ExperienceAdjustEstimateTypeMapping.Keys.Select(et => ", - "\n Multiply(GetStorage().GetPremiumAllocationFactor(Identity), GetScope((Identity, pr, et, (int?)null))) ) ).ToArray();", + "\n public ActualBase[] ByAmountTypeAndEstimateType => GetStorage().GetPremiums().Select(pr =>", + "\n Multiply( GetStorage().GetPremiumAllocationFactor(Identity),", + "\n GetScope((Identity, pr, EstimateTypes.A, (int?)null))) ).ToArray();", "\n}", "\n", - "\npublic interface DefaultValueActualExperienceAdjustmentForPremium : ActualExperienceAdjustmentForPremium", + "\npublic interface DefaultValueActualExperienceAdjustmentOnPremium : ActualExperienceAdjustmentOnPremium", "\n{", - "\n ActualBase[] ActualExperienceAdjustmentForPremium.ByAmountTypeAndEstimateType => Enumerable.Empty().ToArray();", + "\n ActualBase[] ActualExperienceAdjustmentOnPremium.ByAmountTypeAndEstimateType => Enumerable.Empty().ToArray();", "\n}" ], "metadata": {}, @@ -1624,10 +1624,10 @@ "\n", "\n$$", "\n\\text{Investment Claims } = \\sum_{\\text{Amount Type}\\in\\{\\text{ICO and its children}\\}}", - "\n\\big(PV_{\\text{Novelty = I}} + PV_{\\text{Novelty = N}} \\big) - \\big( \\text{Actual}_{\\text{Novelty=C}} + \\text{Advance Actual}_{\\text{Novelty=C}}+ \\text{Overdue Actual}_{\\text{Novelty=C}} \\big) ~,", + "\n\\big(PV_{\\text{Novelty = I}} + PV_{\\text{Novelty = N}} \\big) - \\text{Actual}_{\\text{Novelty=C}} ~,", "\n$$", "\n", - "\nwhere the AoC Step **CF** is implicit for all formulas, $PV$ is the [present value](#present-value) with Estimate Type **BE**, and Actuals have Estimate Types **A**, **AA**, and **OA** (see details [here](#actual-values))." + "\nwhere the AoC Step **CF** is implicit for all formulas, $PV$ is the [present value](#present-value) with Estimate Type **BE**, and Actuals have Estimate Types **A** (see details [here](#actual-values))." ], "metadata": {}, "execution_count": 0, @@ -1700,7 +1700,7 @@ "\n ", "\n private double premiums => GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", "\n .Sum(n => GetScope(Identity with {AocType = referenceAocType, Novelty = n}).ByAmountType.Sum(sc => sc.Value)) -", - "\n GetScope(Identity with {AocType = referenceAocType, Novelty = Novelties.C}).ByAmountTypeAndEstimateType.Sum(sc => sc.Value);", + "\n GetScope(Identity with {AocType = referenceAocType, Novelty = Novelties.C}).ByAmountTypeAndEstimateType.Sum(sc => sc.Value);", "\n ", "\n private double attributableExpenseAndCommissions => GetStorage().GetAttributableExpenseAndCommissionAmountType().Sum(d =>", "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", @@ -1710,9 +1710,7 @@ "\n private double investmentClaims => GetStorage().GetInvestmentClaims().Sum(ic =>", "\n GetStorage().GetNovelties(referenceAocType, InputSource.Cashflow)", "\n .Sum(n => GetScope((Identity with {AocType = referenceAocType, Novelty = n}, ic, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) -", - "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.A, (int?)null)).Value - ", - "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.AA, (int?)null)).Value -", - "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.OA, (int?)null)).Value);", + "\n GetScope((Identity with {AocType = referenceAocType, Novelty = Novelties.C}, ic, EstimateTypes.A, (int?)null)).Value);", "\n ", "\n double TechnicalMargin.Value => premiums + attributableExpenseAndCommissions + investmentClaims;", "\n}", @@ -2164,7 +2162,7 @@ "\n IEnumerable ActEAForPremium => GetStorage().DataNodeDataBySystemName[Identity.DataNode].LiabilityType == LiabilityTypes.LIC", "\n || Identity.IsReinsurance", "\n ? Enumerable.Empty()", - "\n : GetScope(Identity)", + "\n : GetScope(Identity)", "\n .ByAmountTypeAndEstimateType", "\n .Where(x => Math.Abs(x.Value) >= Precision)", "\n .Select(sc => new IfrsVariable{ EstimateType = GetStorage().ExperienceAdjustEstimateTypeMapping[sc.Identity.EstimateType], ", diff --git a/ifrs17/Import/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb index cbf5ca60..5071597b 100644 --- a/ifrs17/Import/ImportStorage.ipynb +++ b/ifrs17/Import/ImportStorage.ipynb @@ -138,7 +138,7 @@ "\n AmountTypeDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", "\n NoveltyDimension = (await workspace.Query().ToArrayAsync()).ToDictionary(x => x.SystemName);", "\n ", - "\n ExperienceAdjustEstimateTypeMapping = new Dictionary{{EstimateTypes.A, EstimateTypes.APA}, {EstimateTypes.AA, EstimateTypes.AAPA}, {EstimateTypes.OA, EstimateTypes.OAPA}}; //TODO move this logic", + "\n ExperienceAdjustEstimateTypeMapping = new Dictionary{{EstimateTypes.A, EstimateTypes.APA}}; //TODO move this logic", "\n ", "\n //Hierarchy Cache", "\n await hierarchyCache.InitializeAsync();", diff --git a/ifrs17/OverviewCalculationEngine.ipynb b/ifrs17/OverviewCalculationEngine.ipynb index 9b6a8c65..5b7a1ba1 100644 --- a/ifrs17/OverviewCalculationEngine.ipynb +++ b/ifrs17/OverviewCalculationEngine.ipynb @@ -31,9 +31,9 @@ "source": [ "# Introduction", "\n", - "\nSystemorph's IFRS 17 Calculation Engine is a tool and a solution to conduct all the essential IFRS 17 calculations based on some key input: modeled future **cashflows** and actual amounts for **groups of insurance contracts** and other relevant parameters (Yield Curve, FX rates, etc...). The output is a set of calculated results (Contractual Service Margin, Loss Component, Financial Performance, etc...) that are needed for IFRS 17 reporting, analysis, accounting, steering and other management information.", + "\nThe Systemorph IFRS 17 Calculation Engine is an essential toolkit to conduct the data imports, data transformations, calculations and reports for an IFRS 17 solution. The basic inputs are: modeled future **cashflows**, actual amounts for **groups of insurance contracts** and other relevant parameters (Yield Curve, FX rates, etc...). Alternatively, pre-computed figures can also be imported in the solution. The output is a set of calculated results (Contractual Service Margin, Loss Component, Financial Performance, etc...) displayed in interactive and intuitive reports. These results can further be used for IFRS 17 reporting, analysis, accounting, steering and other management information.", "\n", - "\nThis notebook provides an **overview** of Systemorph's IFRS 17 Calculation Engine with brief introductions to all the main steps.", + "\nThis notebook provides an **overview** of Systemorph IFRS 17 Calculation Engine with brief introductions to all the main steps.", "\n", "\nThere are numerous **links** to several notebooks of the Calculation Engine. These notebooks contain specifications, code and also some detailed explanations with formulas in markdown blocks. The most important ones in this respect are [DataStructure](./DataModel/DataStructure#data-structure), [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) and [ReportScopes](./Report/ReportScopes#report-scopes)." ], @@ -47,27 +47,28 @@ "", "\n# IFRS 17", "\n", - "\nIFRS 17 is a new accounting standard for insurance contracts. The previous standard IFRS 4, which is based on nominal accounting, is replaced by the economic accounting standard IFRS 17.", + "\nIFRS 17 is an accounting standard for insurance contracts that will be effective from 1 January 2023. The previous standard IFRS 4, which is based on nominal accounting, is replaced by the economic accounting standard IFRS 17.", "\n", "\nSome key points are repeated here briefly.", "\n", "\nIFRS 17 deals with insurance contracts which are on the liability side of the balance sheet. Other accounting standards deal with other parts of the business, primarily IFRS 9 for invested assets.", "\n", - "\nInsurance policies need to be allocated to homogeneous groups of insurance contracts (GICs) according to high-level principles established by the IFRS 17 standard, such as contract type, line of business, annual cohort etc. Insurers have some degree of freedom to optmize those GICs, as long as they respect the high-level principles.", + "\nInsurance policies need to be allocated to homogeneous groups of insurance contracts (GICs for gross, GRICs for reinsurance) according to high-level principles established by the IFRS 17 standard, such as contract type, line of business, annual cohort etc. Insurers have some degree of freedom to optmize those GICs, as long as they respect the high-level principles.", "\n", - "\nInsurance contracts generate different types of cashflows. For example, **Amount Type** is a dimension refering to premiums, claims, expenses of different kinds, etc. for these cashflows. The Calculation Engine presented here expects input files of all the projected cashflows for each GIC, for different regular time points (quarterly or monthly, ...) and corresponding actual amounts observed for a given period. ", + "\nInsurance contracts generate different types of cashflows. For example, **Amount Type** is a dimension refering to premiums, claims, expenses of different kinds, etc. for these cashflows. The Calculation Engine presented here expects input files of all the projected cashflows for each GIC for the different accounting periods, and corresponding actual amounts observed for the corresponding accounting period. ", "\n", - "\nEach cashflow is characterized by all the necessary attributes: business unit, start time, amount type, novelty of business etc. and projected cashflow amounts in a regular time grid until the final run-off of all contracts.", + "\nEach cashflow is characterized by all the necessary attributes: reporting node (typically the company or legal entity), start time, amount type, novelty of business etc. and projected cashflow amounts in a regular time grid (monthly granularity) until the final run-off of all contracts.", "\n", "\nIf the entered cashflows are nominal (the usual case), the the present value (PV) of each cashflow is computed using proper yield curves for discounting.", "\n", - "\nA central element of IFRS 17 is the Analysis of Change (AoC). The present value of the business (future cashflows) changes from the beginning to the end of the accounting period due to different effects, each of them constituting a modeled AoC step.", + "\nA central element of IFRS 17 is the Analysis of Change (AoC). The present value of the business (future cashflows) changes from the beginning to the end of the accounting period due to different effects, each of them constituting a modeled AoC step.", "\n", - "\nIn IFRS 17, the value of future profitable business has a component called the Contractual Service Margin (CSM), defined at GIC level. The profit measured as CSM is recognized slowly over time rather than immediately in financial performance statements. On the other hand, a GIC can be onerous and produce a Loss Component (LC) instead, which needs to be recognized immediately.", + "\nIn IFRS 17, the value of future profitable business has a component called the Contractual Service Margin (CSM), defined at GIC level. The profit measured as CSM is recognized slowly over time rather than immediately in financial performance statements. On the other hand, a GIC can be onerous and produce a Loss Component (LC) instead, which needs to be recognized immediately in the financial performance statements.", "\n", "\nSeveral reports on the valuation of cashflows, balance sheet and financial performance can be produced, each dealing with different aspects, such as", "\n - Present Value of Future Cash Flows (PVFCF)", "\n - Contractual Service Margin (CSM) and Loss Component (LC)", + "\n - Actuals, Deferrals and Accruals", "\n - Liability for Remaining Coverage (LRC)", "\n - Liability for Incurred Claims (LIC)", "\n - Financial Performance", @@ -83,9 +84,13 @@ "", "\n# Data Model, Data Import", "\n", - "\nThe IFRS 17 calculations are based on a well-defined [DataModel](./DataModel/DataStructure#data-structure). The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model.", + "\nThe IFRS 17 calculations are based on a well-defined [DataModel](./DataModel/DataStructure#data-structure). The data input files are set up according to the data model, and the data import and all the ensuing calculations up to the final report generation respect the data model conventions.", "\n", - "\nThe IFRS 17 calculations start by importing data input files, and the more complex IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook. This basis will later be used to calculate and generate different reports." + "\nThe IFRS 17 calculations occur on the fly, meaning that reports are generated based on the data available to the system at the time the report was requested. For performance reasons, some of these calculations need to be performed at data import time due to the data granularity required (e.g. CSM Amortization). Therefore, the more complex calculations are pre-computed. The more complex IFRS 17 Business Logic is defined in the [ImportScopes](./Import/ImportScopeCalculation#import-scope-calculation) notebook.", + "\n", + "\nOther simpler calculations occur at report generation (e.g FX conversion), as they do not require a very high data granularity and therefore do not impact the reports significantly. This IFRS 17 Business Logic is defined in the [ReportScopes](./Report/ReportScopes#report-scopes) notebook. ", + "\n", + "\nTherefore, we normally start by importing the data input files (parameters, cashflows, actuals, ...) for the pre-computation of complex quantities. This basis will later be used to calculate and generate different reports." ], "metadata": {}, "execution_count": 0, @@ -103,7 +108,7 @@ "\n", "\nThe [input files](#data-input-dim-nodes) for ReportingNodes and especially Dimensions provide an overview of data structures actually used. Some dimensions are hierarchical, so some entries have parent entries.", "\n", - "\nMany abbreviations and acronyms used later in the documentation and the code are the **system names**, where the corresponding display names can be found in the corresponding input files together with the attributes." + "\nMany abbreviations and acronyms used later in the documentation and the code are the **System Names**, where the corresponding **Display Names** can be found in the corresponding input files together with the attributes. The System Name can be seen as a speaking ID for the given dimension. It is immutable by design and used for reference. On the other hand, the Display Name is the full name of the dimension and normally displayed to end users in the reports (it should not be used for reference, as it can be changed). " ], "metadata": {}, "execution_count": 0, @@ -133,7 +138,7 @@ "", "\n# IFRS 17 Model Calculations", "\n", - "\nThe notebook **[ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation)** has all the calculations to be executed upon data import. The methods used are explained there with formulas. The centerpiece is the Analysis of Change (AoC) of the insurance business over one period (here: quarter). The formulas often use acronyms (system names) as listed in the input file *DimensionsAndPartitions*.", + "\nThe notebook **[ImportScopeCalculation](./Import/ImportScopeCalculation#import-scope-calculation)** has all the calculations to be executed upon data import. The methods used are explained there with formulas. The centerpiece is the Analysis of Change (AoC) of the insurance business over one period (here: quarter). The formulas often use acronyms (System Names) as listed in the input file *DimensionsAndPartitions*.", "\n", "\nThe main concepts and parts of ImportScopeCalculation are listed here, with links.", "\n- Structure and sequence of the **[Analysis of Change (AoC)](./Import/ImportScopeCalculation#aoc-step-structure)** steps for the given period", @@ -147,7 +152,7 @@ "\n$$", "\n- **[Present Values (PV)](./Import/ImportScopeCalculation#present-values)** of cash flow amounts for all AoC steps:", "\n - [Cumulated discounted](./Import/ImportScopeCalculation#cumulated-discounted-cashflows) cash flow amounts for all AoC steps", - "\n - [Telescoping difference](./Import/ImportScopeCalculation#telescopic-difference) calculation of cumulated discounted cashflows per AoC step, where the total PV change over the period is the telescoping sum of all these differences", + "\n - [Telescoping difference](./Import/ImportScopeCalculation#telescopic-difference) calculation of cumulated discounted cash flows per AoC step, where the total PV change over the period is the telescoping sum of all these differences", "\n - [Present Value calculation](./Import/ImportScopeCalculation#present-value) at the beginning and end of the period, with its underlying [Present value base](./Import/ImportScopeCalculation#present-value-base) calculations for different AoC types and for [current and locked-in](./Import/ImportScopeCalculation#current-and-locked) yield curves", "\n - [Interest accretion](./Import/ImportScopeCalculation#interest-accretion) cash flow calculation (one of the AoC steps)", "\n- **[Risk Adjustment (RA)](./Import/ImportScopeCalculation#risk-adjustment)** calculation, a requirement of the IFRS 17 standard", @@ -160,7 +165,7 @@ "\n$$", "\n- **[Actuals](./Import/ImportScopeCalculation#actual-values)**, treatment of actual values per GIC or GRIC, distinguished according to by their Estimate Type: Ordinary Actuals, Advance Actuals, Overdue Actuals and Deferrable Actuals", "\n - Calculation of [Actuals Base](./Import/ImportScopeCalculation#actual-base) values for a given GIC and per Estimate Type and Amount Type", - "\n - Different Estimate Types of Actuals and their calculations: Ordinary [Actuals](./Import/ImportScopeCalculation#actuals), [Advance Actuals](./Import/ImportScopeCalculation#advance-actuals) paid before the due date which is inside the AoC period, [Overdue Actuals](./Import/ImportScopeCalculation#overdue-actuals) paid after the AoC period, [Deferrable Actuals](./Import/ImportScopeCalculation#overdue-actuals) whose recognition is deferred (typically used for expenses of different kinds)", + "\n - Different Estimate Types of Actuals and their calculations: Written [Actuals](./Import/ImportScopeCalculation#actuals), [Advance Actuals](./Import/ImportScopeCalculation#advance-actuals) paid before the due date which is inside the AoC period, [Overdue Actuals](./Import/ImportScopeCalculation#overdue-actuals) paid after the AoC period, [Deferrable Actuals](./Import/ImportScopeCalculation#overdue-actuals) whose recognition is deferred (typically used for expenses of different kinds)", "\n", "\n$$", "\n$$", @@ -181,11 +186,37 @@ "\n", "\nSeveral types of reports can be generated from the same model basis. The notebook **[ReportScopes](./Report/ReportScopes#report-scopes)** has many methods to produce different reports to be executed after the end of all data imports.", "\n", - "\nThe reports are generated with the help of **DataCube**, a Systemorph tool that allows for the targeted retrieval of information from a large multi-dimensional (in-memory) database, selecting the desired categories, items and degrees of granularity and aggregation across different dimensions.", + "\nThe reports are generated with the help of **DataCube**, a Systemorph concept that allows for the targeted retrieval of information from a large multi-dimensional (in-memory) database, selecting the desired categories, items and degrees of granularity and aggregation across different dimensions.", "\n", "\nSome reports of ReportScopes just present existing data from the database, namely the imported data and the results already calculated using the methods of [ImportScopes](#model-calc).", "\n", - "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#ifrs-17-financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#ifrs-17-financial-performance)." + "\nSome other reports related to **[Financial Performance](./Report/ReportScopes#ifrs-17-financial-performance)** (profit & loss) require further calculations provided by ReportScopes. An IFRS 17 financial performance report has at least four sections: Insurance Revenue, Insurance Service Expense, Insurance Finance Income/Expense and Other Comprehensive Income. Formulas are provided [here](./Report/ReportScopes#ifrs-17-financial-performance)." + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Functionality", + "\n", + "\nThe Systemorph IFRS 17 Calculation Engine is constantly being maintained and enhanced for additional functionality.", + "\n", + "\nThe main features available are mentioned below (not an exhaustive list):", + "\n- IFRS 17 Data Import: Nominal Cashflows, Actuals, Opening and/or Pre-Calculated values", + "\n- Discounting using Current or Locked In economic assumptions", + "\n- Calculation: BBA for Gross and Reinsurance", + "\n- Liability for Remaining Coverage (LRC) and Liability for Incurred Claims (LIC)", + "\n- Timing consideration for Effective Actuals (Payables and Receivables mapped into Paid in Advance or Overdue Actuals)", + "\n- Credit Default Risk for Reinsurance", + "\n- Financial Performance (FP) and Other Comprehensive Income (OCI)", + "\n- Scenario and Sensitivity analysis", + "\n- Run-off Projections (coming soon)", + "\n ", + "\n", + "\n For more information on the latest developments, please refer to our [GitHub](https://github.com/Systemorph/IFRS17CalculationEngine) project page. From there, you can get to know about future releases, place requests, track the current work and report issues." ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb index 2d580c86..03f24a5f 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -502,8 +502,8 @@ "\n GetScope(Identity).Overdue.Filter((\"LiabilityType\", LiabilityTypes.LIC));", "\n private IDataCube licData => licActuarial + accrual;", "\n ", - "\n private IDataCube bop => licData.Filter((\"VariableType\", AocTypes.BOP));", - "\n private IDataCube delta => licData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\"))", + "\n private IDataCube bop => licData.Filter((\"VariableType\", AocTypes.BOP), (\"Novelty\", Novelties.I));", + "\n private IDataCube delta => (licData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\")) + licData.Filter((\"VariableType\", AocTypes.BOP), (\"Novelty\", Novelties.N)))", "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = \"D\" });", "\n private IDataCube eop => licData.Filter((\"VariableType\",AocTypes.EOP));", @@ -563,8 +563,8 @@ "\n GetScope(Identity).Overdue.Filter((\"LiabilityType\", LiabilityTypes.LRC));", "\n private IDataCube lrcData => lrcActuarial + accrual;", "\n ", - "\n private IDataCube bop => lrcData.Filter((\"VariableType\",AocTypes.BOP));", - "\n private IDataCube delta => lrcData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\"))", + "\n private IDataCube bop => lrcData.Filter((\"VariableType\", AocTypes.BOP), (\"Novelty\", Novelties.I));", + "\n private IDataCube delta => (lrcData.Filter((\"VariableType\",\"!BOP\"),(\"VariableType\",\"!EOP\")) + lrcData.Filter((\"VariableType\", AocTypes.BOP), (\"Novelty\", Novelties.N)))", "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(x => Math.Abs(x.Value) >= Precision, x => x with { Novelty = Novelties.C, VariableType = \"D\" });", "\n private IDataCube eop => lrcData.Filter((\"VariableType\",AocTypes.EOP));", @@ -904,7 +904,7 @@ { "cell_type": "markdown", "source": [ - "After the main Balance Sheet items, we need to disclose the Incurred Cashflows (i.e. Actuals) for the period in the Financial Performance (which includes the effect of Advance and Overdue Accruals, but Write-Off amounts are not taken into account).", + "After the main Balance Sheet items, we need to disclose the Incurred Cashflows (i.e. Effective Actuals) for the period in the Financial Performance (which takes into consideration Write-Off on Accruals).", "\nAs another requirement, we exclude any investment components explicitly.", "\n", "\nThese contributions are splitted by Amount Type to the following sections:", @@ -922,32 +922,35 @@ "cell_type": "code", "source": [ "public interface IncurredActuals: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", - "\n private IDataCube WrittenAndAccruals => GetScope(Identity).Filter((\"VariableType\", \"CF\"));", + "\n private IDataCube WrittenCashflow => GetScope(Identity).Written.Filter((\"VariableType\", \"CF\"));", + "\n private IDataCube AdvanceWriteOff => GetScope(Identity).Advance.Filter((\"VariableType\", \"WO\"));", + "\n private IDataCube OverdueWriteOff => GetScope(Identity).Overdue.Filter((\"VariableType\", \"WO\"));", + "\n private IDataCube EffectiveActuals => WrittenCashflow -1 * (AdvanceWriteOff + OverdueWriteOff);", "\n ", "\n private string premiumsVariableType => Identity.Id switch {", "\n { IsReinsurance: false} => \"IR1\",", "\n { IsReinsurance: true } => \"ISE1\"", "\n }; ", "\n ", - "\n IDataCube Premiums => WrittenAndAccruals", + "\n IDataCube Premiums => EffectiveActuals", "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.PR))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = premiumsVariableType });", "\n ", - "\n IDataCube ClaimsNic => WrittenAndAccruals", + "\n IDataCube ClaimsNic => EffectiveActuals", "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.NIC))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE2\" });", "\n ", - "\n private IDataCube ClaimsIco => WrittenAndAccruals", + "\n private IDataCube ClaimsIco => EffectiveActuals", "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.ICO)).ToDataCube();", "\n ", "\n IDataCube ClaimsIcoToIr => ClaimsIco.SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR2\" });", "\n IDataCube ClaimsIcoToIse => (-1 * ClaimsIco).SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE5\" });", "\n ", - "\n IDataCube Expenses => WrittenAndAccruals", + "\n IDataCube Expenses => EffectiveActuals", "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.AE))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE3\" });", "\n", - "\n IDataCube Commissions => WrittenAndAccruals", + "\n IDataCube Commissions => EffectiveActuals", "\n .Where(x => GetStorage().GetHierarchy().Ancestors(x.AmountType, includeSelf: true).Any(x => x.SystemName == AmountTypes.AC))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"ISE4\" });", "\n}" @@ -1015,11 +1018,9 @@ "source": [ "public interface ExperienceAdjustmentOnPremium: IScope<(ReportIdentity Id, CurrencyType CurrencyType), ReportStorage>, IDataCube {", "\n private IDataCube WrittenPremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.APA)).FxData;", - "\n private IDataCube AdvancePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.AAPA)).FxData;", - "\n private IDataCube OverduePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.OAPA)).FxData;", "\n private IDataCube BestEstimatePremiumToCsm => -1 * GetScope((Identity.Id, Identity.CurrencyType, EstimateTypes.BEPA)).FxData;", "\n ", - "\n IDataCube ExperienceAdjustmentOnPremium => (WrittenPremiumToCsm + AdvancePremiumToCsm + OverduePremiumToCsm - BestEstimatePremiumToCsm)", + "\n IDataCube ExperienceAdjustmentOnPremium => (WrittenPremiumToCsm - BestEstimatePremiumToCsm)", "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = \"IR6\" });", "\n}" From 23c4cf2e57c90d65c6e979506c72971fcfd2bb35 Mon Sep 17 00:00:00 2001 From: Teo Kukuljan <116903719+tkukuljan@users.noreply.github.com> Date: Fri, 18 Nov 2022 11:22:31 +0100 Subject: [PATCH 33/43] Present value series (#70) * Uploading the files to start working with. * Finsihing with the second video, up to some corrections coming up. * Finishing the notebook for the third video. * Work on readme * some commit * Updating to the newest calculation engine, updating readme. * simpler names + no mandatory accidentYear * better * fix Application Message * better x2 * compute discount and cumulate * implement feedback * improve overall * aoc configuration * better importers * reset and initialize only once * solve remaining merge conflict * revisions for signs + new overview * metadata + fix importers validate datanode * extra type + utils reports * implement all feedback * updated links YT Co-authored-by: Andrea Muolo --- PresentValueSeries/CF_CH_2021_12.xlsx | Bin 0 -> 22926 bytes PresentValueSeries/CF_DE_2021_12.xlsx | Bin 0 -> 22827 bytes PresentValueSeries/CF_DE_2022_12.xlsx | Bin 0 -> 28391 bytes PresentValueSeries/Cashflows.xlsx | Bin 0 -> 22854 bytes PresentValueSeries/DataNodes.xlsx | Bin 0 -> 17573 bytes PresentValueSeries/DataNodes_CH.xlsx | Bin 0 -> 17554 bytes PresentValueSeries/DataNodes_DE.xlsx | Bin 0 -> 17578 bytes PresentValueSeries/Dimensions.xlsx | Bin 0 -> 56055 bytes PresentValueSeries/Images/PvFlowchart.png | Bin 0 -> 48936 bytes PresentValueSeries/Images/PvOverview.png | Bin 0 -> 509880 bytes .../Images/PvWaterfallChart.png | Bin 0 -> 251315 bytes .../Images/SM-Thumbnail-S01-288x142.png | Bin 0 -> 65447 bytes .../Images/SM-YoutubePreview-S01E01.png | Bin 0 -> 795253 bytes .../Images/SM-YoutubePreview-S01E02.png | Bin 0 -> 805392 bytes .../Images/SM-YoutubePreview-S01E03.png | Bin 0 -> 804352 bytes PresentValueSeries/Images/Systemorph_logo.png | Bin 0 -> 17061 bytes PresentValueSeries/Images/VanessaAndrea.png | Bin 0 -> 243605 bytes PresentValueSeries/InitializeData.ipynb | 96 +++ .../PresentValue - Episode 2.ipynb | 482 +++++++++++++++ .../PresentValue - Episode 3.ipynb | 564 ++++++++++++++++++ PresentValueSeries/Readme.md | 161 +++++ PresentValueSeries/YieldCurve.xlsx | Bin 0 -> 13820 bytes full-ifrs17-template/Report/Reports.ipynb | 248 ++++---- ifrs17/CalculationEngine.ipynb | 2 +- ifrs17/DataModel/DataStructure.ipynb | 3 +- ifrs17/Import/Importers.ipynb | 95 +-- .../Report/ReportConfigurationAndUtils.ipynb | 105 ++++ ifrs17/Report/ReportMutableScopes.ipynb | 4 +- ifrs17/Utils/ApplicationMessage.ipynb | 7 +- ifrs17/Utils/ImportCalculationMethods.ipynb | 34 +- 30 files changed, 1604 insertions(+), 197 deletions(-) create mode 100644 PresentValueSeries/CF_CH_2021_12.xlsx create mode 100644 PresentValueSeries/CF_DE_2021_12.xlsx create mode 100644 PresentValueSeries/CF_DE_2022_12.xlsx create mode 100644 PresentValueSeries/Cashflows.xlsx create mode 100644 PresentValueSeries/DataNodes.xlsx create mode 100644 PresentValueSeries/DataNodes_CH.xlsx create mode 100644 PresentValueSeries/DataNodes_DE.xlsx create mode 100644 PresentValueSeries/Dimensions.xlsx create mode 100644 PresentValueSeries/Images/PvFlowchart.png create mode 100644 PresentValueSeries/Images/PvOverview.png create mode 100644 PresentValueSeries/Images/PvWaterfallChart.png create mode 100644 PresentValueSeries/Images/SM-Thumbnail-S01-288x142.png create mode 100644 PresentValueSeries/Images/SM-YoutubePreview-S01E01.png create mode 100644 PresentValueSeries/Images/SM-YoutubePreview-S01E02.png create mode 100644 PresentValueSeries/Images/SM-YoutubePreview-S01E03.png create mode 100644 PresentValueSeries/Images/Systemorph_logo.png create mode 100644 PresentValueSeries/Images/VanessaAndrea.png create mode 100644 PresentValueSeries/InitializeData.ipynb create mode 100644 PresentValueSeries/PresentValue - Episode 2.ipynb create mode 100644 PresentValueSeries/PresentValue - Episode 3.ipynb create mode 100644 PresentValueSeries/Readme.md create mode 100644 PresentValueSeries/YieldCurve.xlsx diff --git a/PresentValueSeries/CF_CH_2021_12.xlsx b/PresentValueSeries/CF_CH_2021_12.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bdc502b9dee82ff54fd14ec993a5dcb9137e1824 GIT binary patch literal 22926 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 Kt-^Nk+y4N|oe*FE literal 0 HcmV?d00001 diff --git a/PresentValueSeries/CF_DE_2021_12.xlsx b/PresentValueSeries/CF_DE_2021_12.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..72fb2affc7b60155b1080ff269e8781afa810e12 GIT binary patch literal 22827 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 literal 0 HcmV?d00001 diff --git a/PresentValueSeries/CF_DE_2022_12.xlsx b/PresentValueSeries/CF_DE_2022_12.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fe5e13b8f35227c1478fbd6fd39d889cf5f337e7 GIT binary patch literal 28391 zcmeFZV|ZmvxGfsnwmP1Yv)fu*of{Zv+v`-UR1u|sl|GH0^1+(t zyPXQkgcOc(aKzMA;HdD^5ya$YdJqh}-*qT#N^j(3XE->arV%@yrr64b5&jF(;y+ic zz@2#U{1Ul6Komf&mnAhJ1P6x|M;o%B@!Y=gwNi62!w#&AzYQ)kFgDVp>*DYE z-8zz5=Xoea`jv)tO;jcKh-fhgYoxCTwHK3@l-i^`Nc>WNx-(1h#Co7DdPooCIm7y- z;O6g1M%d$kWcI%jNP=_T2TE{5sJ*hz5VB`lp$`0x+;arD0{Iy3&JSJ;Vj;SlePkKU z!+(11{;=O&89yEQAtOGMz7yg-C6NAckxS!8A#Nw+ z&J)%=g3YMg_5eY}>b`JgIGr%DIa}iYH8VdyL4g$iAM{4m>ox`XqWAU}dttxmt?y)N z^2}SMi zkK#fu`OO4gSvBrCp5GtL>I*#zk-Xhd(!`*Hvdk7b)cR%KTU#NKlbyt4FC_Z|No>l` zD;`*4sSop4ANZpx_XEVg(0oc*6F$3RD^Sb-N!nNIH+~v1{z_sD zN0pYgQ% z3dVQXK=iS*$&{|=cp zp*}7Xz+O5Q)#;#JX6bEPz4R-66nsGgJSIj8wdzmLHkR-Y)-~&EaVj+Lqwgd8H;l;> zH5IH%X&LAtX1+_jEUMt<#Icfp=G8xQz}G{|(eO->r7gl<&u}o$R{E}bbi0-QyvUwb zfBm9%qmTDMGE{L|k4J@gMGB=4|uTo*L z#z{qtu+pkz-Qa}mf;r~t(@N^GT3C9(=tQkrf43%RfFKGmofvQkJW7Ano&H!oEND)?Uv$`y7I`^H;LY5G(aSzCl{Bf9w zYD=ozq)U56FvIDIF%z}`)a?b{ksDLJzI*d&s``NOf0g(gr?*l)- zzY?c?lYjWuXFt@TK3G`qMWQLX{Zeig)unSK&<#jdAl-x2FqvrACn1t#nH9F9@HLgu~7%2(u@li|9DNh(O9%q(K&2_;=y7<6>B8D}+ zk5Ng}dmqL$h&JXx8iet5#cQj!ThciBWRt!BoPp*Uv@EQO|K=zF-K}%R1Cwj9qN7c< zptyc1-qbaREZtu(e^5UxAS{_ci5LL(3lnc6@B1N)QGXgIg5-2s2#>5D&P9Hab0De(xERFnG zAquC5Fp?+%;<@N(0%afYITZ5}>0u}~Vhh$UKI>>|^A+uK^`(5a*mwx2iaRrQMZ1KJjNFY8w9&MHry2WdncvIn*;n09;n|`o3mu{t*ZT2 zsvEdn@R5}hxJ!S;{i(LLQpw<0a8SFU*}ltlZ-81T><}C~Ea!de$WK&dt3{m6=@p4! z89b1GQTuADL`n+4{P>uwkWy!q^Akxl3@TVP*!lYosR8Bs8cy$%m ze%^Uj=KkCuv}iQ3mWMr=&0tdYTBx3-@t_QZ0J5NpDxdcrj*WOrup?h>naiV=&Xu1| zlWNnSPiX$$z<_z7d;MHk$ao5vIJ@G8)5!XjJCK06Y3h#Bs~ z5k*?xf3NrV50E^lUwW_kwSeIOK>>d)UjIt|e_q1=Z}|uQdaD15{oni3nKENFzz8>d z72Fj(=j)hcr;F|CwTgA$?uuw&Lxv!CVc_Y1`-g>#6gK4o#fwR@fBR9SzEj|>5&l(J zp{W6+o)kPxjZ1e!x_9LC!45Jes8Nf3x*&i68e!=7)CW8+_8u9ts|0Pi28x03Ne(B4 zX>DpsD}rrh%5)3!;H-LQ@)<47f#(mqw$BRSA=za7CLsSsT!WJC=;=@Ej`~XUZqA3b z0(eZ?raXJ9aQl#aXwtl4QMl2I-vvgOUZ7qWL<1> z?Vz=4Xc2L*#jCy%K%S*&!#&F6KsjT+{oYY*Of+4sk74>Nj9CjZ@tKTBKs(+)KOiUE8IeXI z(CV!SO1&%8e6#Rbz-X{kHayGD{I3KFI+W>8rF*g9a``-Xefi77F8VaeHnPI}1fd&+ z)9Zg7+>bo=XDS-u+ska7U^sb!$mE*m3dkX@+t|YIK*3Z^S^m~ZXEGCmkJ8q6pEXkW z8M}vIKNYq%4a5*0uR2gbgvBysDl;Q&M!@6(kOG#WbA!=x7l&ir+IP2 zwV1}BK!Ud2!V@NFH=S-fge{U_`lNAC{tcqr0#7uuC&4 z_uHXm@Po2%@@0N>d;z7h_s3w}dy#vn9a0~SQvJ5JhVmQdU@)z2Y}H_{Xdh(^l4h`L z=!KH>;52uYpRQiJqB+&L7*4Xrti1enIwoQ9$=L39D$#1<#z1TDq5gmac*b;k*0`J=v<|KQv;Lsz0e}37riMtz;O%32P-dS8X}Fv2Z{BkPEFCO z3cr@hc+LHl&QRwMVJ{fxE1q$7$@deN;v7Rkqw@_q9FGlr5RslGKD04ms-!#OMN{HZ zqggs$D=XWqEg{r!g_^4(q7ApZY)4Kt`=6x=*ss{GdGNC#c10FQo)D4LHs^`Go2bM? z_8$YLpS0U1%1?DQ0dBl=E4$!-BtXTgbn!7w8F5{VuPD?D?VN}w+nuh9B4;M`%Y$ym z^t>2*Y837%A0qDwxPjCJ{^^SU`mz@YWgWag4Fn`v^}l2)^FK^Y*@*jMYS`3lOt-AO+^(g|Ek>%+K-TuSw(8{)Uqn)E9KHi(r*6vUF5cYWj{`=kvx&5` zra6>1u#<+IY2UeRSdRa}B^cLwLOW4vrDm93hB)F~JfRsy*&nZw495V)bGY9zmc`vQ zr*Y5)d~3BhZqj97OpE|+eU7Na0#}q&LWsUm%#fARZ?a2BVYD*xYg+Tc22H0#QGme! zzpnk*OUodHKIno!;ln?bSp!zDqcYPmqVR-D;y1LY>&u9)SmK~vr(vp*E=v&?s<*{Z zvZ%{UEqRGvvyWcyRRkWOyOJ*N2t)enYE~0BK(-WjUrBcl#$oJhPqJ(0(9PmyMq|?rcZLl+T`(Ox-A48ws7IbD5iyR2nTZMg%3^Nl4#_M$+lQ==x^+HQ{TzMmI-tC|}ZDAa8<1RA@)U z%9QR(G#jCJzJtf_iah<2u45m)uHn|(=qm2CeX}2@(vU((eWq8)#ooSzi-_)`3`DJ? zW24hsmQ^`1jkqLBlQ9KH^572Iut(8K%-XmaglzzYwQ4Y2KiKR~5J6m*yg9G;6mprq zHamwizOo74H$e*u3PdW^gAJ?;2iu~IONQzRMA4^Y)T1opz*d;wp;H!gamV6-LFgp< zPHM?Ykb`{5^^Nf*Yv-6FVZVj!>4_ci7ENH9_KNio`hY{>fB z<#xyT17E)*5^E}_=9g@Y*~*F?wRppoH3w$l+H+H8%$&{p`tS6)i}&@J)U~(RT$+Yg zTmf~nR}R1G$q)NC9c&1TFF^PU7=MA_FOdHQ`oF+#@vei-{};sng8W}l`wMy&zjWln zFts?;lXpXxr}JaPFSmu)mxMwO387uSRh;Y`BJdMoh3$!Rb9 zZXAouA=+8Z(7LA28M55l&H+62ynQ})%3j?{UkYYAnrVNG|1OG8Yo9qQs4Q=`pXg-B z?En3!kmfadTR(GNeGL9KJrOjM(@yhJeo;|<(VqWc?P*uavp7^taF!!Qn@P>^tGKOp zQEYk9RNX~Rpb@a`LH}V?Hc|PzgPY+t&OcrEit}z>SslA#!PS-P0HA`=mYGZ=^UK6_ zrSW~%)piapG<{+vt$iX2rrpb+yrTWV>19~?ajmy?qW<@7=b`tnxGuIu-^9A6J9_)u zb_VUV1*;$KY3<|f`4!e~QvCN^+m>Zlbgr2XV!E}4Od#HDTosNhWAG zz^>Z8RJX*&C5%V)CW-ANrJ8A-77gt|X*rr?Goyt=G@Rr#Q8_(f547vlCx*>;<&zL~ z1GBxhwwD5nAQ(Ih6BX^0w-^v0x}8==$kBWmO*_Oitg848R|1Q|YIAODioG+Y>S?~9 zUTg4-T9ZLnYcaaocd;?%C!OrZLKTzF%Z(7h8D2z-_QP`pYMOAGu#;|VP>hUxegt$j zspto;BWV|~KwZ~F99o+}uJt&r<9F2)nrbr=h2Zq-nu`c&7EL4LeHH2$ZRMTQXLy(P zG#c#&^uI*4PRhsCyz@pgF%-ez@R~xa%L(dn9PFa~^leI6(+eywdFqEa`gVsH;~!hK6$5oh>0?lm83eO>D2N1ezGUSA z4|pDC$_9+SjLsM;iC(zTI|#=!uk@Gu2r1WOb3tU-^?NcMlu^2nrJrEH4f<|!x^rzS z*;P@1I)7{NtyFmZD5SgclA+piD}yBrsVEQ8lf&-E7PE^8SeHfwJF#&nviA}#BpR8N z>`su|GYEMY5qGTN53wVXfm;ORFdf&s6UNGuK;EKDAfChf%T(`ZL;MYQAd={Mp#`c} z#@`qN)T&f@!QaD^1xGh=Au$GESg}|W@vy9mdck1LqYZ~Da^2(V>1640Y!WSQOkmlg zDYSVtdDo1F_r@?VFcg}z1O%AWz;e1D>;#YnjKu_RPq6RR2J7brt`jZ4E{>)imZL1{ z$BB0%DS(nItjwkEdpUbLuDqhDF8%R9 z*^=R{_ol0Dg+Y)S);6tViDX`Vg)8$*2D@;geRy$S|Iasjc*k6G0AgN21MrouKKB`q zOl%YkNXv<5C8cs7{K1wo2b3X|n%GnebKq8kRT-psQ2tmuBNABNikY}boSSlfv0B4! zAowNOn@JhZ1>qP19FeFADr*Ht7#4ofmm`XopxIG5C%h+k?CAHB{u9P3sE+bR~yH$IIOw{Z#_GM5Sobw;9jV%-Xruo zq^H=UT%=5Jlasy`Ff5`-n)Q6sK;3ANz$S^>T(hR;L&jbn4D~hA1r!exRucfW-_q{7 zTJ?)UW`;8+LFf*q7IOr=Jn@8bSEh5O0RRfIFt+jFF%zYVN<}W<`~usvk|d+ZSXrbH{7m#i&+lf=j!c>;J%`G~Yoe_-od@nZs$ z*0nIz5Xp!%zSaS5!U4K3tiA!bHjuhbJbXMP!xI6mU;fiP5BXcKS+5$rTF4q>L?2v= z$Yh-$bJiP%hr}5hHnb6!8zw~0w-%rjwVyDh8+Ahk63I3!ug**eJWcZ3YQfTjy^ogb5JKEaYU z_M)7n%a!iec?QstK`=pX zgL?2rnoG9!R_4Q2eJ1C_pcI-V8ybm0rZ5=N*hTZ!oO~OJ&qQpXzL+Z_c-shXh?CvO zrN#bdD{QsX6Em_`BsBBvX2#WZuk7Y_EKrf83fM*BeOVb3yPdRMG9I?rj0~S9*UJj~ zJb>#YW`E4vcFWT$i!G=bhp$ois)gsQtK{;v6YbKtf|awB_Tl?adX`D3i_~JHj&Zd5 zMM7S-FeF{0(wzoGzlZoVt#xO3G%JY2V>@YnPorJ}s)%k%y*r&hYsxFwAL<7yK1-N%7{RmbvSuZv7v*vn&@FT5->RxD3}50#P71A zH5Hp$RwSg8>^Go|#EbcxzmvY$yDVB7p=4on&C%hwjcY{;dIl|?P^(wJKsO!yQ_Uot zLG-cm+7xpOn=LL4PcF!JTml7Bv>%CuEHC((KJxVqt-NLPHnUwJS8uhFW7=OWIko z%R*8M7Osl_^YSVrqM!ZoM^r6dCe~GouOh0}x9=N=2WAr4z)M$P)mm zffYj_4Z)g*-VCgX^Yl*~FOpa>Vs*;ZP~e%2F@cE1qf;?}j#U*-ZDV9{?ihw$nwwbOTF~%(H59A%a=e?E zbA&GOp7{lgWKJ_pS}Xx|d|GT@^%rr?)t`DpY;A9#Y9kF8_Li?ZHwx|f*qC)*u_c&$ zZgRR+6k=)A6H7?gD6Ihj=1|06m> zfdWCbC1Eb1VU;C!BDW_LfG1we%%^YthYYw$!6~G zM>!3ov}`aKx7qJSqwFu?@v<6cY6yDIlaQg1Y5|6~D zSzba-Owf&~xf}!)ibW;w;BOGnpf6z7v``4R9o$MWQI)by8jpr?)h%*v8?Yp8uI>!R z^`~nMlITflA?rl)hL#vdj0j^iW9dh^Mzy6pdZ-J>CF94)g3dcJaxp#xiq;fp%?fAL z0x*(wx(+N`ZstP1*g?NdaJ9MlwU47toFw;yt~GpraijNei@iJz6e z#*M>hF`F_A>6-L{_<<&aq=SI&=G7r>?_`c^0T^LGl z0%{>j8VvxMh|FkJXj&aouZNU8Fd<2;#c96!`CZZn?Yimhfzxa4w)^huT?ToWJToK& z{pWFhXGfjJy^%jCD5HQSi<5k~M{+2`W)F5bZBIY=%$3jjmBkJ0K8{l-O-7kbM#hN+ zFx*J6M`TW_WkT}o`LLfoKe{&d68i7_(*J#{;{9cC5JVPa2{pa8!hh*i)S$=hLaqu9pV52 z83jH4C7KNAhybrG9V9bQB?41fo$3f?6doXBNBRLuGsJ#(pmuYX(iL^oPXHRigf8OJ zFHh=JMpPQbAPcQUJmgZ36($wDM?wZV7NvPP=e2IMIv=yzX>TbWLZMx&`2#u73>I64 zg=E%-OW+6cZ(_5Mh+L*`L~EJIeihxC>|VGxqpUC2UysPREW)xj9K&PvYw!2A1-}1O9 z;AH@5^SLS0P0HOa+o=0JJpny|N@~{CFZ*PNe9o=I<{Q5t1dDw5FAC131Nyl+--6$U zYhem0*^9e(YxLomX2u02j?!#V;eXEPpex6>h9$)|mh~0GRCMu6aNuPUb4pg>nfPsH z*O;zCoTJ9X2TVU`b9bplk+{HQai1fx#yn>)lzrH7#9@zV(g|gr!toF;P#4|cDv>5| zRdhITn(wZdY{HNu5pi2kXhb{^7uKe8Mp@@d+=w?xaG6jab3U~QF zaR!{9$Qjw2$B?NG@&?wN4T^+?Ry%oGp0UoSbO$(bWw_jzLurtA$;k!_L>crY{8wJ`$! z#74D*em;)$%v8R$WsZ^f(P0q43U_hJRdjsch(;k#Wyyg(JOGq7BV)xTA!+2{vhK8} zT(a)7t6T!3(CpK+SOzkcW}LGOQx@3d!uRqrI!kJr1ih zIekt_Rg4S20*-I}On}!*c@uKw$ao4?!QnNGwjCRG6BO6vgE-CrjcHPK&16BkyJHb` zCqCdMG{jufXQya{9H-3-KbYMqoom!R=b%4Zmv%J=&Gw8ZX+f+!GdApS$=C!B2MU2d z(HS1>%q>;ygXb9?bj3XsQMfypXH2(UIO%|bA*m<^t)@5ynWK`$i7gNJRY5+F&aoIJ z0{BZzl>2P)q`d(uvSacAH?XSXO4BzV&Q(|H@h*y?a24rAxv<}>U>N!faT#LTB%>ov*x$V~#}!JcI8Ig}J?xT@YbGv_R{4A9WQz{ADl#6H5H=7n2^cLzze9i!oudmdJKA~FQMH@nG36}IpM$?luxfa1BcdA=cPL`}QvD;2GW3|5@ce=qCnvmfZiafoK}5YJAtZqJ-JXkdAE|#>uhr}* z4BQZ^(x*{VMB+#^+*X5v|BH0pF5UKobkUYbB|t|mt}WrxK;J3-2V6A7q zESqn|RcGE?ZLH*8I3=q4nWo<)BDqlH&JaL+5Zs?eW1lW8*=Uw5TH(a=4dR$N$94}Z zMJ4UMzUBapI{& zU8RUDf1^QTm8;t``I;M=6ORF)r5mJ#GuRQW@?9+#oHu+b(mQftccTG2-X_bAVNlUL zcqvkKdnrkt$-A9#4OgT>J8Zp2{peUEl~ih3{6+lB4g_^TD8gfD3)^hCKDPmd^EE*KbMtfU|3h8DT;el6A23}rWR)`v;P~66fwQ_SI&nC z2c}SPZ9NT?HrUus6zQZf#zhF|(p`&03E<*vr1LrycWQ4&MK~`fkGjW6qRT3@HKlk% zDH`z>@a;yI?^owJMd~I^97zi4=+(Z(I=DPWCtvqq`N*I8@8p^9hHqV{vY)VlS zu!lhuipCZ*VBMS?Ps5Yn4_1~|G@DE^Ub!mIUv&{;FZ3{b!-#j(9k6l?$W9oSBcYO~ z#7{M+bR#;Zc}>8@K-WID15hlvIn@=Tl9Xftlr%;9-VWg6FK&yjDUkG&Ix-iP ztzRN8?-kLj#mtE-UIe3BI(b^JTM=MUA;H@qTAq(UI|h!xQSKC#nMN_RQ&}6s`pIky zhK2(Rl3qS7Zc4lse$4|SR)Xx3vZ}BazBn@dLIeZn3Zc62!&j1@<%in|8PzxUu7vM# znab$-qoRR5!f7JPl9yh@-l42Yj#S4SlpDxy%F5FGe}v(wXaN`8d$^n}T{9$96pvk# z;imwQT$WmHn?t(6qP)$=AiYS*jAPO8qjwZC@WXD@N=QJqUEMk7gcNz?hLn_4+ZFhv zqMYE_rqK;j(_?31O6sd#L`&%^a&FP$cZXgxS(pi522tfy2x(+=1MH7$vzw_ORTFk9 zVjwOe^L1<8`5+R?dY2>pLTWD9tkkJt^Hl5{9a4eMs}nl-z%?kv2XBP-Cp9l5Pm)V; z38|CxYe#-Pq^3uHwBwv0T@lfVYlBwLtQ$p>J{MxvMdML;5TGg|fk#ENI&t7tQJXjb zef+l@HTpCu$&QgRbcsSAl@RF%ERkPlMU$J4B)w=fNo@tmih3ox1wYt~=YUaD6I9z9 zmG8R9a#Oy?PeyFPxb620jFI_HJ%c7OJ4Y&&+YIw7jeB!)PlI#ObVq0;TP5vs3Hv4I z?Ka$%6wPkNiY=WBaU$@Z%g0k=TxzqRDc>rxjp={G`UwK72b+;pyl+Q|XJ{(y>KRy$ ziG+F6*8m7gEF{R_@W^9qMT*aFe4%a|m6BG2bV~!oad)qNF33n_`F)NlNYGMwuEL-nGuC#RP+}aU)%-d6L_P*r11-?5)wzVR`@~n z=n|lZ5!LgRabm#VsmZLUXmAf^L?~P+ruwoe_G%KO5+}ctRTu2ApcK6PZ^(-%#*~%nsTlyjc$(5k%o@(F9 z)CKG{9_+`pZ7oDE;0qc*Q?emX5CqpnjXx+4*cdVSUS+0LT0!HTf zu;5!Y9-g-)7oF~a$kQ(!pb9W5{#-v+_qhwyS?}nWb27OD&d@pP`X%g)^aHLkO2Ykj za5zU|vK}yPB&A^~&#cMr9QDhwj2t;jvXXWeCXwn;_5tIrjD4xl2?{En**LN29Et9d z{6+YeEWF5?ld9q-l#eUlK zLG2*bnIVXJOse{0!f*Qdhx}0<^brv-; zf$8>4uvtw1c5ACfL=Prc3U2uM1jMyq*mGp1OHuA!W)<6RohD5upV_0g1bv*~iU3Pk zRlQR5(S|=Z)h=IJJSc^WQ0kziw(@gL-fqQJxY3xY)jw0r5g2(sXaGNk$c~8 z`|Ee7nln-NBkIM9^9h#Bsl5ot4u`Sr{(T7 zM%~K=Ro*+{rzfxGiyZ!*Dq3)ltSYU%u!&if6l_A~oSR&Z76il1bvRNljZ_}fQ~pfV zWQH)`mS2eyGD$vCgFH^uy;!7pt>&dL7hoC z{<-hbtgh`M0~Dy_5Y*u%RSV-eCdH&_-`OPKm^!3mDF?}hmWtQ}l;q^J0=tCST84iu z!gw0Q7++wlta$0Y3)M0`_T!iyGl-#+132OhaIdw7dw1%2?UK|;8}??`JwiZpG+43 zJhG@+=rGMp#qg*PO78FwQ9V6p`UqD2OVVuM+PgTH^j9}#6lbzkzV+|aV!`UVbF!~U zTswNuLfEV$9XVA6lRVb4pV1BRkp%LZcf}iag^vz~#db6&0g<7m~bj%OnRrbqi3di*-sP{$tlc zhRr5d1qe#1_pSr4UTTQn1C(Mfdy8v6*p6Sn%--V!by;Z#*73R%X9Lx_h+fQVLAGjE z1G3-e?##BH91n7fM`N;jv;@y?gGVDO+1Eu|tw$s1^H3qa(M)_Ls3ZqywL6gQC9*6} zK%VEzwN0JP!)5-r4IDhd%$D=F3qli|w+I^N^KB)gLw9C)jQd@%Q7I*Y!>ha4CST^d5#G)F>E?g5%{ zB*FU#v+p^lDcLS|Tv2yy4X;BkW!fEfO!-YLNbAsLoX z{!@hVq_%I1-zRMu$Y+w(*uQao;XsE5yv$=Su7hCon)G z#)iNjX9pZ8Ue4#qU}cBvgO(Srwc#LQDEL%_d;wu67Pu2TnkitQ5Pua1lvD9{!W>p_ zpjEi_HdBCW=%E(qQ|mRRUQP&w{Xp`<^?|O(Ek7?8tO9=s1>r!l!tU7d^#Lz$8`AB#}#W-jyTgpxlBmS;E>e}6vC(RQS@m9+TD zH#iA{VCX@t5JuH8bfk6ASjRXeeO6uPkcplpO7zK4=Y*-6RhaLMvHAfE6BihlJ}tH) zHkey+Xo=jC{tI*Vto94x1!5{ zu_vxESx(_=7i!q2bjs_h7K9{##}XIH(SXQyFRFg|7s-5UE4{Jsn|qceA){kP!ZmT3 z?uh5XliWF(mqDgL67}4jZsMsVjowOvWxVmdy_~`~5ZiY}7?R|%XU}#!tn$b*qTiRv^Op)I0ts<@CNA7%M3ApS+?B$GX7daF!FVHM zPcEZRn4=UT%aizTG)JykI=OLcpWx0x_B$TFR^Q@tda#R{G<&=9LsNm>6vyBGOjkFO zbZA_5W1q|23s-P48#mph8NlT2WLqb~-cBPshP12fG^0GfQg;|$Cl)O2*C)Sm&O3?d3287uC-)@BUvwM={{MxQwL;1hl2+Q(cH^S0x z2QwvH1PQBgp}Ag_0}xl@nEGIbN8Q*X%e%cHlc&_8RP$2o+i;Mjn|x21mJ<0hLSHl-FV!Z;fwnmX7mB2Drp{Aj0Obo181hAsSmy zLpG(}bActx;!Ke7W(qd;U=^K`O{8%JTuQQT9;63mFd{2W2SydoN|DpCNZ+)Mi2OH3 zx4P%ha)VSR@#1`Yo6dmilB--W5r-si-aNN02i)iueT%8~Pi%G~c4fEvpB~*4Qx3$n zbvuwoO(vha-(pNcZg5Y#KcujJpnTIitPQ*>eKMw+TZ={S8Aw9xKjK)OrB5a_1?+6= z&rflWvm**=4O=Ggi=Pv1R4xPmB2Sr4rj;LGBJ9*rMRD^eg~3+B^bosC5~m`c2+hsQ zRnEE)c(lM8&0Y@gyMYTVFr;eJ)_w_mGgBn9aAD6p zVK^LsHVuKXLI)N?qwMsgW+1w{wvk+^qq4&#&SR)c1&Ja4W|6JdBTm?bB2LG;V%?|L zgqYkkD^nw9ziv~HQGTaYyVC07Wk5L--KRIi^hWog&vYaA3j04dtfs7Q*ewWRf$gZ5 z-2yG1@6*GiN-lIt0H__oOUpPr`B2@O|NMY6yX@teyo!D2B0K$fdwza?czSyAXz_o3 z**`iQpue!2-X`eDx+!_wzdSNOAIz>*G(Pb@-u{cFiw_mG)viUbX0oYDJl4}699Q3W1%mRSd_CU7Zcn$S_~}&%^*?pp;+}@SuGIv5MmwGHOJ)43(G_wz zoF6X_C$YZwri2wN{0E`WQJ-x*S2YBDhlS1}59J8MYdTmv%?b-vm&6Q}dZDis5(>|y zt?FN=38~@^ZPc6*zlyZ~if#5nCpW%SJ*pOaiW z{4#s&3-U_c>`lpXF){}CS3X`2!+d92qDl7uZ{z-N$bXoujiB0D9tN&Tk@KGn z|H(|-R@MHeq*>+*P+uJ*8tlK`ufBr~HU>6q{;#I+U*~_A-Oc8wl*SkRjgx;G-T$A> z*#P56zXmNWzhjj?$KNZL{(tWCpks)C^?(g32KoQXv{hkV!6yIvE&q)vi}%KdRjHeW z{U;_TvzC$TpOzuv!$LL4X+*? zzv|a)`r1{HDDNk!N=!YU_Iu1){Wd0guYG9KGbE|7K8__)as*!5H==OT56430qjR!F z^QCuf>_Cr=>{I&F26>OU-6gTQpriK6p`47xBjvkdHaTd=nGHT10CC3+mjtYAo4246 zIqJZ_RkB(itp%JWO3Ce-TCN0yBZOU1=1MIKd+EXX(ju!oK5OX!51!>rh~0ps{kW3M ziA7TM=GCHsElifv8QPp{S@VN=EdO0GxJ<`jx$-wp7J1;B-X4E~+bl2gi;x7>z|n!3 zs}rentrE=5KV9)(kDc^kB6Z7usqHY)-@g#~=fJd!g{iG6!$0`X*{}=Esc2jdv>wbC z0XS#(H@5wFvaOvNo8(`lCfO-?P0bfdYAno2ow%qVWLyu*ltn+&h3)xL<^@6FyYAzm zNgGcI=P0IDzf~QQX4*(=xxq(Ed~}tRJm&a$-MQS%cV&1Fj~Y>f~Vzs^8-wpoe!`AQy|zV^V1%x^u#mV0YO zQ7Na^F#6CYEBCf_bd&y*IMgk;V44S(QA@wcdEM&_baU4uvsT;)F=MuTIr z&2Kb$OB_TDIegw9*Qa;kJ$(N6C(i@=^=(bmGIo$;Dk_&t@n6S0-Z8iIdp@quZa7XC zDQ@})d)}TW(tAE{xF2fwHqjZneQ$41lQFk_AC48`@z*!-@H4K7BkQiKca5*eqYVQQ zUT=T}vIiN32a^PmPuxl`Cq_Z^w2998U2A{$Z{TSRgLm@wSg*Ac-n5a%eXkL(1K%`` zal>-w-YNevaeeKOBl|1)t}U`7ayHTWl3uzJ=<%2(Pkm2$EwzOuN zpqu;O%}83o53GKqP(-|#PUF{g#(eK0#B>R&jW%89ZC-7fie%y8zAH;z@4!-Vi5bT7 zZsB*K-4omi5?q2b1eaie0D;DNO=j-R43j6{ z`+d8=vpG%mUZ?7uT~)hwRj=}MsOvX2S`zuz4ol=?P4xJz;cNs`%_dOTBm@x|m0&UO z4c@JRR7RPe?Lk7?TpBM14DK_nHk|m4sNS)#TKa4EL2~y;&hT(C`bSp@f@utZuTlYZ zNMH(P8?Tp{UpgJ*%AIFCpF0~)pWj`TT1**=RslwBQcv{yPR~vytW#Tk0tV?0kGC^b zT5C4BC=(8b;Cfr0y8FVmPDCQG7cZza(>GZ^8l^ga$CJYRC4rh{-HA?&o^w8C992&e zu-KU%u6U~H!9|yCmLKZ+1TSm6;!63%BPMD}*|Mp;`CSPLT-=2Rqd}BpvV7sTp2*=+ z#pgZ0ZB2LGWOxS96rqWt1&Nv~p_&o;Q(QyKAVW~9&V-B3gz9c`j@~n;O=NaEJUoxh zvlZ#K%}|MXi4Y6Ygs*0JMekEvBP)?dQ=fUobCsk%QZ;4cdK}}T0cv*gw05;BZIjMt zp^kK^i(;Q-4^=|N|Bt1ZjIUZ&m8F7Z2|LK|ph$C96G znF{Q0lv#k4HmptP*wdc!t*f7XBVfANS+a&Xm2_K`d&2AL)E3@zF(aa?eC9p3bA84y za#Tq#Hjpu_=PJ&;C!cYCIryb@+5*8nK-kOCpT9_bTlJ|!GBv~HB*{PmuW`hec-<(( z3{1wQ z-K?tmXIT%{H(5r4u_7WAjfM$6tX{6Q8-RSA4zV6*TzweK*0po94z~Cp!T{T*oHxEd zBN%L0p?`?xwOBntD*U~T8V!AZ+Fo^!5BUSIK_AhY7T}ksTa1t>FI3z>a+7`Y_=%bE zCZn%;I~3TurTz}`3)p{B{7@{bYP3T-W;{+PD6~JiUuPFjTY&TZ2zOs!!C`?Pvz@K_ zPGbDU1a;CZFAae!=_9!LTygbmZM|I5TpvW-j70Z|yCq71zPz5T2Er#34uS|$wJeK} z6ZU)+P@1yiVdicUW9rqB^oF-)QmH90?JCP5!g$NOg0hy%K#uJt|0VPWzc6p2?dfu@sCfL$bs+e>)QCd}!2n~Ge=dFg zp$Y1X>NL-jotWLx9#7f9M@VnSB*UlJ<;mxkcDQ2catgu2_E{an*0f4{iPrQ=2lUy+ zu3c+on*KxGnSo@Y<$4z1#Fj)>ABWvIrY43z`9?G+_&q&dmg;54TDW8V#4u}Fn6b}t z1kMx37GE8D!t*6$$ugO$5yz}lkrN-)&_!te^=tFpf)B{BL#U?Rsw^le9-&9y+8?FS z1UXct>4PJt^_9+?;zVx(WxnTVIHcMoR6cHs);Dcijz}UZ`tT^`Wqn(nOdj$1B7@mu zsAS#V0WG=i3ceU^Qg~w@If0HEr1Jv5SBuk`U&5ZIxIaITWLog$NAI!~3M$?{@@nd( z$UB{*p2O9=_0_2=!vNDN^?)hdO(k7dz#^mf|qb;&m*!2ba(M}rD?FzDQ;Ie0dT8iF~@CPc-b#PIjNWhn@B~V~ZGGK1f0j^5tdXEHS zeDyz!V)jDwW;j!2CZCh62{pwKiJ1-(!M*>_e$HJ3`6ajEn)ovx-x(b1bDvA*OH5yn z4MMTO&GAW=fH$_FlV}4UQy_Hehg=?zle4#A>Q&D4SfpTx#3`+@cd z3n0#I%NGUJiQh|T1bDZ+H*Ius>KY4M_mT&NE}0u`YsZ=_KfY|*>&0*$P4gx1+IO+n zU5BCqQ1DK|y6;InZZD1ZB`(q=lCJVTc`JN&8$QSUOui?oQaG`|9UZvF8UFfH!f+ty z2PaxMxAM%?r(Hpo$=HLPRK+`n$o1Q_M`b?E?24+R8%|ZxLflE+bX`BhBC87Z? z)#aTfG?PmS{n_nORM+S2%&n}qlM_$3}d@^2!{IAnj+E7)HN#s^+58ChYKkVWEb-I#4zZ5Za9@ZZIde1f8me0!V z_J*#B1-;#{Vy6mBpENc5^aet`@Xyx1IQbyigFU*5P^N}Gib!4MLpIifjG_R^oO!N@r3WZnu?>jO$KFz=R2u1NNor;kcA57 zBDtv*Ce*WTDTj4Mzu4=ZL*XH6ky|{Kol=Ux=)_$N0T!<}z+j!oCw|L_f z#Hcj8hop$!IA!Nc41zNtCC|mN&jPZ*flm0X~ zRgwnfL!~(7#T*deS+)OUVxj48{%Lx@kmbAfqRSjtOxXCdBVTqSX__}{~dyFei zSjXgJ1|73_G6F7&-ZGO9N)&6YF}e5WyPa6ze27=WH|dX0=T#@mHbWx++- zEfEHG61bJn-}R&koP=ZEzYPH+mW+-)n&`f@+LeoL#y1p|r@d+KSyTMFV_`WC|D4Ey z#m4R!d1)T2F{w#9v>*#xCkVjkOlXzv8^$dBN%bAI=5dzJ2@L*D9NhFfcDwnY^<@to z9Iwi5e3hB^&EHNBg1M-j%j%PatLkO?)FtpTF2}wvs$z%4Tm$S$ z3}Ux&hRoYm>bcybY5kC@07}7OVB5^R!?bBUzc!&IR&tf1qO`re^~H7T7UA{ zUH0qoSDoH`3p5+)8F3c5#_;vVx+d8pp@pkDApukw-PSbDvos(cI7b~BIeGf{%hrUj=m-7`(ua@4d zuY#Ip>&oa|MRR2VzBe_EkcdoJ@QNg0=8XqmLf)FBOIXA52jSw@+HL>zG?ylDgx+t@o` z_he$9{2U9LV&(Oz+dXS%FRO-#DDEG&Xp2_Y&P|?%WNHG1j5*Y3T>3qzJS%BoAwX(0 z-15|mYDqLlf$3^$G(POuTGwQ`o}{iMc$7lgZ~k*&WMEd2F#0N)!Gw_N<*lX zYY8IQX@S-d5yZlh{Nbr#+_-8$OfSnBj>U*V8(pSon?G8Y?aW@QZ8bsgGhIqCP?}OM zQVmninQnAYDiBAsCPjwtNh-muydz^cHbt>u?4pGrMvz@surYC=iG_vIk}o(8Q!pI{zI%L?!q?m_6f zlJcpRduio}UAkO@@0;%GUE$KMClM4s(cSgz3qUeqmAq9J9S=^e%ahe$CtnFtfEd(B z&3Dl836m3oDz*4nHPzzfax2n;EOZ^&pl4Y zr5>~JoFI-KwcIAaXPej`(r5Z-6J9b*XjgrBJ$NHD?C?ynh^CD8*$g?6Cc@4mUT0;# zg&>OB7!%_-0@mP}XL#@N4@&!2%$0f0Sl_+MjCb8BDL+ev*j2wVmzs&-<_fj-h5*|$ z0&E5i8ZNvD9^Hi@9lf&&K^dW$>X@y>y3ew(g9OmsSeMA@k?Pq^(pnye8`fD?%A3Q>=G zfKLn#IY6~BJGS|g)f7?11vHpUHUyFiJub1NHO#PhG$D_Ot{@q365v+1nrmp1eO^l& zj;|=6{#qW3bfQmf6jxzB$*=%Gp>ZNE&9jeCsT12co5EP;I!uJ^GAxA>2~buDy__j~ zzrW7p3b{m8`9?5a%pk=?taBt`95gj(z}6Y}OG!j4O8ir46e4q-SQMU|vSiJ2Y zW~*bAbyGS~*A*p#k)G2E+Ukpo6dERMK+L{&EM&hd#Fw%JeSlAmyjNP?g&2V_?0FJ$ zyy__Qp=rrkYIRK6-9+?3E?j96J}&}w zJ0%)0tUwrJro4o>48FF`*on$iTXTKwy9({ucWF5Nkp$*$hI)OR!U=0sr(M>^y+91t zs@Q!dglhal?&rk*;x{PODdXMqxVdJ{9mr*)siT#WvG86iD-~KPVWVcjU9cJoB67lJ z@bL*UQv~a~=~nTi;oQS!$R~Q1DvCMP>>-HbI!*8A^~Q9&1%8Abrci`)4{+JIXbs}1 ztuTh2DLl3Ch?v;Mjl&>_Y814@{*-#Y_bEPoeZe_nS(zhuKP zN@&eVLzg1DXx38vv}@|3u7ib5v=pOAIrMZ2IR(nAH1Tmrx$cKg^`m@s&(E)~s@bmPl|ct7NqLitzM8U=BS)^u?TL9i z`L~2vLto|tz-x&-Qhu;00gmR-gySQ|WtF@k+n}#(B3@M0ycM0jVLP2r$6B!IOlPWe^ zCciHoh6k5+mEgY6jsc5N+Pm5M$NB|6pb%RUP{2MRD0rV3^m?BN6uM7x0exY*0R=SP zzy!YBKm?j^5CUyCV1cF^xIpU-RG`HMDbRic8fdbC4Yb-ohQt^UvjsQr$}l+W_HBdf z*K8B(cWtBUxAu9+lL>>G>riE0@(<+)71l+{J3dDm4p-i)Gu8=wqF}7&!gau-r1f54}S zPpw1Su-X}&``Zb3_QMC;=FBZPEe9X>qakW;^lpn`ATkKlzVd!EPMr`09+WZXN^ju~ zxn!+S&7ShT#uC8YbT%Vpaf0#gg&*!gd~q`Oi@S>cJ^Rmb*B$f@ZtE4c3C92&2i_=K ziTX%e$@-{$akt3*r*2XE5@(V7l4nsq0X`f+C;@gLq5wA#R)7bb7T^FP3-AEp z1-O9d0(`(nP3%CVCT<{H6Q}z6(HV(c(e)wCH@Uev5VBn_h{nFA1TUz;E_^Z((Qg|srZZ`Blf*l~lG;qD|qd3(pB_aWMW zv-jmBs&mir<62nf@+rgIuD}+H_U=uXIf{hbeYUKbbW#DNmz}sFJ6N>sBt=BI9bZe6Va&BTd{hq!8yV zXLEL)TkqXdaT15GEn~|W9W7iPb6SGd;f-s z*rVLH*HMlx@r(rZ^QePGk#YNqoa8je2v2H1B45)4DZRm+c`m-XJu{3S9OnVpEPN`t z&n#Dn+7Lw7f1Q7Tv>xp=GkzDhrB#1=(K20$4u|5WJF6#`{awCBbyC*>C49+&)_OEV zg1mG{)jmBpLzbU}+>=gXT^KV0`n}93I=Wxfcz8YRX6p*t2yue>i;d~A#|xgMBCq=E z)4A6yP zkHeih!nKQ9)R#Ok!_x}qzEtVOCXIT74O!GU*#2HQu5u8LfeSY~*%ZB<`TY$Cv8Ig~ z*^;G@iVmP69DG$AG&P&J_Ld6ozJ#}LzIEOj^w6uR~DZHmJ3^uzl2DPrUbABc9VQ-AFfWslP|d$WRfAdmBKfWbpcoiLQA)|6_!U)m z5VjGNfrQmtf&ytB8IV*#gCWYBJTZ+0@N3Pe#CR?EmxFWEi5gI4VOKq?4u%{({;?T} z4KAxL1_qJ(M-=CQUTBiqYhb#vG&(aPISfxF?4*6U_D@-e3!F&@Q_Uk;7!-s}X#%|i zh-771rY~HjziH>lX5O&dvloCuKrY~uy-;!7Gx80Rq{@bs81kD18_x^q}r(ZYc zkF(!w?WC&kcYwcd7xPzuWr)N4m(61yDn8sa#Cgb6{tJl;{ok4R2XFa9l!q+JzfguDJA(XKl)s|`<{H0o^@`vif$;XEX59g|W zAylh9ya&IXxq1lraQ^2PV1@es0QhS*=po?4X_H@o{Te?3|1pX35aD6W{TIUU^PdR+ zmk9hr(1)S(U!Zzg|H#&F&F|qD_ZPy6;ZKCWjd&kk|L;!yFI^}oaZ@O$f4KM$)&K6z y{Z&20{4eT%`gRYs|K92SRXfA-FWP4R?gCX6;2=)reGiEP1rG-WHDq=F>AwJS(w-Us literal 0 HcmV?d00001 diff --git a/PresentValueSeries/Cashflows.xlsx b/PresentValueSeries/Cashflows.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1b1ffd523cf19fd84b85ecf04ea75e8bd947506c GIT binary patch literal 22854 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

_)8sZc?_sjD%YzK5w(4C*!no5Bu)bD4C-*mP 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 P0Z9S8RmPuj5zzkuh2LU5 literal 0 HcmV?d00001 diff --git a/PresentValueSeries/DataNodes_DE.xlsx b/PresentValueSeries/DataNodes_DE.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..32e40f558fd1036e04457f39ca6a2bd7696f9405 GIT binary patch literal 17578 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

^x`XD$Z4NFC@mnC#pY<^uysEp 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 literal 0 HcmV?d00001 diff --git a/PresentValueSeries/Dimensions.xlsx b/PresentValueSeries/Dimensions.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..806a6c76506a23e2419f17ca07f417fc62638a1c GIT binary patch literal 56055 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 literal 0 HcmV?d00001 diff --git a/PresentValueSeries/Images/PvFlowchart.png b/PresentValueSeries/Images/PvFlowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..156bdf4c17d992fd77a3d39b5e688202fd848887 GIT binary patch literal 48936 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�lai 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

C|1j^g@^o!({?eiWc(%!7cwAuwy^_`S?ol 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

Yw3zpeXs(|=p+zl86?`8@!Y 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

dq@qQzLE5@7 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 z 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

x%m)|CEHxB1XUGYl6uc|Ncl4ltX0oSh?m*vVV1r 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 oLAbFfYtZ%o}-8$6kkD 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�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 z z!4^IgZz0Xg68&f(R@~RKw7Cl#&dyWh(!Or<(4H=L_JBb*NT{@Tg~Jvf(&+EUTwhoe6C2&u33a2+V3h@cV5+i$r+ynGgw`{xr4WY zVtKX>_n&+i_m_u4 z$kRu5v-0!L$qz^3E7ryt$(|o*k`Uo{1pOq9`yUU=e!75R=oDv^lWNl*tsde)ChR`* z;{Q#|0W>WbkKLsmQyO`4X8@fQiR#G%ZyQ8c7Xc0e6@;3fz2%K9EtxScl|rYT>~>J0 zZq11EkJrehqB}yrc|Yv8RGc>6-=Kl>7)(n>@GULeHpXMzgL!&B!4#2^fmIc1vZ#&= z2MjzhW^%Y-TEOjEle9=lr93me^=5V3RkLV)m5qWInk%=qrK%z;YKhb@(sIh7& zu=57W?qB0N;P3)1g3TB0;0~b#LUl`K0`%d3=Ry2{Eb01u>WS*XPss36dO&-iRN!NtK2;YAOz@tK=E_J03DgW;pgK9Dn|at;hdkQ3XZ+fgH*l zxhX}Vj(dmT^+5~aCCf?#hEAHOYMb$E`#kt@u6zo)S;3Rc6$!~@P$XWbbj~=4D!O9} z{%=t5*0+4=<5MZC!AWU@3x-<;O&dA`Rln3^ggwgGT&`)3q_5)A$KHc0X%Y!&zgVOB zmjB>cm@<2epd>|GwlC3wVkK*^r!JCRMD^d9G){eMRgFyA4F1x(AvV(UsuN&!8luw0wl3w!w=-KLsh_z$enKMlQ{ z>EmKkdQ@4wP1Mq8!Bga_YIesJ1-cRj#(I$h=KYdx=-amHA;~0KI3bt9nJBtiV`%S{YlVYKrF)<6S7L%f4n15esS^BP|Geyl?r7 z5#fz|)Ue^)O9`-W;e~*`qRPzl8ICQA+6K3we0fOKGRnOqT^&)j987CyiG!^E86^(h z3+gXK3Sgjggte*bC`@$y>nr>I<5Xx)o4&lECr~YobL6(3T zu6!oxuB0s+kO0Rs3pt%D<#A%Zwphf+7QrLJ6{7c4?S(+_Od(pkwY4>ss8??{Gbv7k zhDz0K1TE-lR%Sy)u11Xq0*>w&|AG7}?7A1mpsbi{7S&vnydA*RO*`s{Xtg&aN)7{O z|B$NF7P65xh$RDll0x}Z3d!1BD!H}zQ-Q&w%{NSV@NDgmz^hgZy;Yqp?CU{{vzgK4xCShz16+LTu;Zzso{7x5h2Tqw8pgx!X^G!|MIa!5mfR2f*| z9kbVH;%L>;i61W~dYu`P36Z@0TiS&EX!$1#R~T>^!^%Dgy^{m0)2OVa6Z8IgL!pgR z#^WA|`WgFHY5*g4Dtj7j9`}0q7;?81O{jy1Is3Ff+&jB9_zQLw4Rmczf0CgQ>M8K! zLQ8kkEg93gzau*S?__~*Kh(qu3(CXL9v!898*`YF=>L5H1!?cOPEDD zB;)`gIZTlBHnO^O-+!vc$NYnfPrzr553@%D8)o@4Av0!tLReH}Z&03SCkrz%3YsB9 z4Oz}2~uIE9P*2LPx=C z46<%)uP$nC?gEU{XZ^94PWN2ubBxCTx>(H#P-curyA;ih-n=N;zi@%Qvv(Yq=_=q1 z!<6n3xi^=VmbSLGwzp~R!X~QM`?oKjo}K`_N{6p6Rw;A;O~GuJsF=8p1L=5*z)VKBhWv+}J zkmUfBw)k%5-Juynw{LAtXc9ZUOBF<@u>M3`P1%jagxjfVP9W*gqce|6u3XciL@v!s zU_+hOS5sqz4r6R>4f>hiSL^uUfs~j=#+O|N6$dv-sdiCsQJ0_ZHz1*bemPHG1N0x| z|EUTXF=2pJYs@C9Z7_sIO>xcKK+}!v1-7#ScW2z`@t^kd^i(?7?F!IS7c3NP(Fm=e!Dko;f)>0`u`*>(Cr_Dl-omU}8?H8dqmIP=3B; ztJT<5XsA=ZC?L?P&Gvg`*k?xab)Zzuj-34azBMo#s?x0-vgk|5Rb_r*N*!|$3C(+> zqT4v+mb5m;3JrUAmXI`qo3Oist}l``4mU?I#!+BRsJx{&L(;C#wu5V=I>j7` zQaThYLz^{ywTw{4o;Oj9BtBhIsGv?ptpvBInM^9$^aV>!3;#iQ3nYZ~PnrcK7MV^w zl6mX8Zz~v?awBMcm**XH^k3H0#h(b#;5tFHMSD+r!$C?o%aRZtZi7kkev75O$dQXX zBxkfa7E8PQfyAJlZ`y2Jeu26jMLlB>oV`cs?X0Y<^4eNzGBOCVQshmGV#lz{+3DHY zy03F)#O2Q9JT9Flpj0RYUet*_7d2&-ySw{uP!lhNHX;RuXkXt94$d8_P#YI7XVdrb zb-=cZ$G=FL>Z8cMmZBf_8dMbe2yr6uRov^;YG)1xsEJfpW=}rQI=dt??*wDM!Sbor?d#3z3QWYk`-CV?U2O?=N%~7hZ-X{!YC<%>2uGo#FbMcj5Qy zo0u=^cw&2TcBT{6-y&b!1t_(P5CIWK{`U5EeLc@w&s7`}2pYmc>+}^c%xl4@N5bj* zU3M1bhjx0o7J|~I`WR^lHKDqrQKQ*mIdP4{Eng+z1Sv3(UQAjiwq4%+6~}#Jbl~#5 z4lbBD`Yf{Mk+bgSQ6VvZc77T}Ehw@zTzPvYU~Y&A>S-&naUGJAX(S`;HBvT%=!v)1W}+rw!_f*guL z5O%G8*VR`DQ8frhwSnKG7=kNBFUEmA8Bz>^h-Pj?^3Jz+Q6&M55=N$IK+JVV?U;Af zp~@^^d0e)8L#F%HQAQ_$8P40~2a&=DGFDTT6USDgqPZ<_h%XixOSG!Uy2tk(?8xcG z_suplo%$5VlV5aPu$fP7N_mySfl7OP^}|_Vp&(Rf-Mwb}Jv<@?DHe+4z}adm0IgS5 zRdqJ{ERrW%g#Xo2Ajf4>CTnmC{SVxt6)z=_Wnn9@D6p_7Cr?7mX-*~Vl2?dkisMm1fT}PFYTgy=*QAV@`G=t!3#mnL3D>x26VN+#taaA zs;H=_6^I91ZoxagqP_Q1EG{oEsjqME$}0)7kL=zFGKL$aIR(v->Lcj_k57MM^YQQ7 zJ>uK`o$Ixi9oR3dB_&~T;diav!eacb+?%uWetQe?ub1l=e(ty90FI>H<;2?3lAas$ z{-YI&!xLasELAJ$|2aDg2ZIRU!N-pN1`KDl(Dv)~i$L5v0AK_3tYZFMfZMBWE$MpU zyKHAGZZ=PT?n<>l>rY~gAmKN*JN<)PfgTY`%XlWwQRxJd$1{ww{N5+kAh%7XDjXrxp0;EeQS+uePhIKC%6H zc697$|M8R4rxV+O#Px{gsd$yVGfKiD0KD>Zd^`F4E@5LD3@qzL+cC z^7#{SR~cBsGfMqVM|)*ew4scW&F{7B!FU*qYiw{*#+|CQ2I&cj!AvA&|t#T6CD zE6w(8xEl56AxD|3^Ms)i=mQ~GkYjRk00Q%;sRQF*y$j>{I8apPts6VT zD@fw4O>Tt*I6LJO6cl7-!Kd{i%L21#Fc@q>?07))rKKe!A)zHdzoxJ6{a{}N%j4Et zX%yS7WjOGQmX?+?yxZ=s%ez|m}8u{~6ll~%~QN?XMP6K2X2jZ9c8`Ja`8D75s;P9CH!)+DYyIr|~ z*?T}p>E2#7SIlt_2Cba#lPbhk9pp-4)Hv`Ck9 zqX^Q?S$_XH7stmdFL1N>`>vQZGwZF`KDflwh)IK}n;4nn9op~=`pC9(c0qYL>r(QI zYX8=+U+1j76A=cT5s4hIad5zCxO2HJ0L@YAp0!%(gf%aoB0{G9oal{5=IcUk@?^q5 z7M6I!fS(Q)Dw)ehoR2Yl1r3%Kkdlo?6FOJ6E)fY0gLGnpHZhpkC?e^u{BhBTc8}_H zDECPeNfF2Ym^~0N`shjr2+s7iOi&rAIm$%DPw|#au zldTt1tp}&RyPLO*e!H7DJHxlpt!J{gM|C&dmwT-^VV0Jbh;#uJkE%$w?lD*yS>FHJ zX;-RN>Y!vF^|pk+p?*iKjo+&6*&}vzoMqBT)J?>}NOVRd1EW9=mQ4LS#*q<`qgSf@ z)l00x-FVr(k2%j*$Qaim2~adqLaRfwa$!3a+WO&nzWMh$?RSrsp6j=I+#83;?6pjJ zN}tspw!jEu`kV^zdqxO_wJHHF`Lai!kBm}ZtP_NHE3oJJBAfk-X#qVm|Lmh43VIf4 znciz<7xryV={3izjl)KBBmP;p&*5`=BlPomz%uT979(kQ@fIuL2h%>3&}_CB{)Ll| zq8T~vA$J)zhq;om-6PJFUUI9?5XEr!rnGC@j1KI0uK`TZ=Z5=W3aWq}A$zzT5hF#n zjMka2#8icsAV=RWJxwE++eLJ>@|#s0FEeEeMZzRP;Vz$Kf>LZea%@^kK6PYXOtQ{_ zaXCIhT#q{&Z+PEtP2xYTlAM9prbYobByXxtsqvzOka{iNy_e&SmXP2uGQ#|9E!>0o zhIA!qP3cT*-v9~yS#`>B@G6+wwU1Ce!a^mb=}bhgM_?Xe9SpESFuzj?qqZDo_x=3F zk2wuF12-gQO?a zVtzl+4$pp8iT1vx%y7$yvf#luYbzG9LyV{=mp>B{uI%#;Hd!7vcj7m@Iyif^*1Ai^ zmSMZ5<~!=Z;$C#e5rM~{im1PHjzPd%=b3wn$Ntt$d`VB@@*zQUEgM3ERDJQ%UyAV> zC<8~|Q@d{$;MUzkr!4O1=&sb$?he@AxtRTIxqdN3=6*$?8kO@guUVF})!mE{rM^BI z8w+cRitHKPTHK`C(RU1#r2_H0-o^dtsz)=l*KwlKKNuL%Gy*P#EbmlK$-cF!p6N0Z ztnM>`9f$>}B6+bciPX4kR~kY5p*X0t(oz_z-v>|>N$3^PeW_#UnA@NL0gI7hzgO}G6%nJkrCDQXp>}~%w-G0^ce4AF z{`mXs2q$a)FYgJKygLkj`4ap1<Sj#{}{_S zlG9VZjO4i=)Q+&j`uoh)J*vZm)3;v6SFj&Q)L*p8Jz~I1O=){=G)DO#h=z1!j2YdR zNld0ZSN**&-Tk1Y9%RQH#NS(68v6QZXVige&53bQ*u4cpKjvG!e*MYw`bSHuaY^lc z!dqc&ZJYMtL-!a%;<#)RDN`}#I+-f-RtcEif$65NgQ1I$jfDoM@Kb~!^ftJm#9m=*z6h{Ahi{y@v--=#&lVQjCR5ya!NI_Q?E=|;4QnpSks zW2qAYm@nSk_v`)4h^(3sr~~wM{ci)?b_w}NXpX>`s$6VxJzOX+m@wU@WRQHjb`!?z zS2soNMQ&J&%JThqS&W>TEcGwtI_m@k@0o8Ia~Y8{mR-MI zUS7iV4BCi=3pF-rQ8vN8ML+kw@10+Pme6jX5T)bz|A+~&VW;<*LZEt7bNjMXMbP9T10<^{eiawVW5U_ zdSBttP?Qv-rpNuqtRD{m_1R(gKM9^aVx*lJq{?u zDcmT$UWw>gC*Gu!xk!W`qY528qBm4hfQG%*VYhLY|; ztSDb;sRQLRlxF6p+$`n`RcWQrvF+z5;V*Rrx4h|4TOY*`OAmNddLnQ%3>i_JfwWQymE!#RH##>F_XBR{OlIv zUq+W^sj&_Y(crwT#w2l%yfSz&D>FN3TNfP}IWay_VN-_0(~4DJ2B%7|WY{aGZ?*Gv z+@&;VP%xQq1>g%#P-NOY6A-YpvI4r*%o>rM3wNvYk|2C=LxI8#i)7OiLBXGki*`@6F&YGi5Rq>;E`rUB zxk;mb9NSZoRVqG{O7E2L9p?vP9;;3HuXHloN`}L$pTPuB@+KEz63v!YJaa7%V`k6# z)g1#omLsw_#x+DoX^FH2PlSf6_O`S9&tBQ)Vl`W?UyC;wq+4HuvanI_VZ&Mw7Ne6T zm+R@tm)g4By*)n?a*bqccv%k&-me#5V0v3;g^Qg~8ac9I0mI)I3WT;$b8odCr!AOI;X z8&cBwin!&B^~wHz708RFC&s{0K)>y_ME4Q7H~|iom;JzF;nuY|BXiymA6PXz`60df zkXx@cWKxN@w;Vp6l=Hp*hg!5FB?llj&bNE_b8fb&5)O z-BcF=2|PRogki{s~kf)5g@X z8k(Btog!DAJF{s%9|(sv&~rv~%Y^yOS==p3Wn%@OoRzuG?QiuC&GBszn)x8GyN1|1 zJ}xPu{wvO+&$YjFfRF6I>7jyoFz}qRJeN<|Iclxn^m9*7kNbv-{42^2#4FM#6mxFK zKwNeowB5B#*GoZgT*vVE|DMd-DEqr`xmvn>VQc=otz%CR6M#BSQ&o9>ey%!KZ5#e& z0A)Y!w5(O8679wCJcA5)GH~&f)jRE-e70mFW^1iF^kh<38JS~nHBZvL3Dh~dw)PY# z0cEd1qN8chAT%d0)j@I>E$^4G@{};zhxX8h@Y#V9Q&K298#_{v zxIS8Dx1H`7uDADcroQ9wCfKF36GEf5aMJ=5{E{h^WsCFDiUWT57*Vpm-R%LgTQ z7T zimlQ!GJY;B@TSVOaTRyQK5t0eJUF3udcr@hlsjeT=Dzn8uA&sQa{ct?=O55wJG+R(xUA=K^pfR#z_x-6E0&`JP=lsmeG@im1YkxDlgcO5Slw z!Lqp)5JX~i)(2KS5~oy;K9+cAn)I7H0VaPPfFy);{Z)XqDxlkIPP^fe<$79Ls`uXN zY2|!NRDag;#^Gtb%=>?Dl1saRG>ueDSF1c}(*xsnC6tCpDW0^V%FfdenLkmc0MWl~ zW+wGTo+5K1;QbO360kp%hK2?>k8^W#*dePmWDEHc*{kcLSCijeU+I<`nMnQq{+b3+ zP4`c%n##zO%7G<9$4U@xgRrTpq}{u%BcVcX1e^&ZiGa?2&fO6zFau$_(Ju4;^fo|O zOS9>4-&VqEHRncjM^}UZ;5QCK&(TRwXJ^_PW*-#l$@V{7saVsG$+5Lr z2n|5Gu{8!8kr$d~e*SD~X`u}7#=Uor&*w=of>*%(&ddulC)pS{#@cC?ifx04u z&@cr>1>L_jxSzuW9^?vk4w+SpR($&OskoRap#3d#vQbO9k$JcZGhM^@$saWvWnERD zniB(&56g$$8TB8@;|2e(%!Df=^Ul8)2w&{qChaxx{(Q`ETxOK0)pzaLGuD50cbk1K zPtMNV8S!&dveXmkJ(j-3-#wnS)RpkLHOT7oPU;i7+(0@ips#R_NRGd#Lnk3hhn$(QebxZpq#9tR<~l+OGnsv;;GBW=3!y49}97{wHyBU3=Wx_ zcORi6W|-U4x8os8#ULZRL*{=#D|Ua0rTDfDZC#Hnfzc5!;rZ4jO5%l@S;e3ZW~%;; zQ+ZHOU!Sz6fkdWNv-r{-hrk$}JbDQkGt2Snt<07`6nng~Y#U912byeB6~BLGfXQX$ z)a_@&z5s>f5R2e1Li?C($*_5&AU{7LAz|9OHZPB6CNd|E$=S}%#nsK!#I)qeI`1VG zEm2sa+7JiU1Io7QbL8YMCrWa1XJ_ZOVl`FO)FHFRe!3xCvn8w_NL}`SpXm*sb!nLC z5z?w_hkS2tKEEnht6Op>H25ysOFNa~(NvVr&nGf$z=7W9Lei|@j_|0zQ0g-%!@y07 zl$4ZrV6w}Gjj6s z`U*v2QBe_`Yg@IGskjPq{+s#h=Gc+t%h#0N7u^rForlu3$ygdv4)1gIJ+Y}yVw7Ru zVr%#_sOG{hUcp4dr|6E5tn58Lqo~Th%R==d>5?55S z{3O3ean-ik_5_6`*f8Zm)8u=fw+b|P7=0*9BD!ouSIkMD?W^HL?j58n?V)g*l2bmU zXmwu@DY^|2x!Mr9PHwfewVAcAj9<&;#$DL-ze_+BuM?kC+_93I(WC=bi%G&%zk{|e zMn|jO%TQJ0!b`57|1&c))6&us78X`kR@T+^{Db_avp}rO(@*Rq{@23+#4dN@N-J`N z1$bX5YjSd1;dpvyvb%F)Ibqn-FLh>R76+mC4JlO{va_>yw$szn^6>CX@1AsaN_fa0 zm%PpUh#U87>-=x;);`gq_j$Pf?fp0_C#!(W_4}Lsbx55VGVsZM^xE6{>iHVBgMC0S zqY`^DX6~tk@$T>601J%$s*iXphrt{e`C-$eNlDyfl zM;W^(PQDDgrac_5G##(58F03~Q8&}RGf8E~d5t_c7emwVyyrgZHxoCz*M<(UwIz;* zh6uX2oK$;$Dl7?VetxYo1^t7A5z*0pC%;Lsg2WZ|^+h;1IQaNpR;J_pb~1d2?b_Kq z^JAR&lBJ?aTxipoymiTZlO)*VnLYl#!4ifCR@Ur+giY|7hL)!MfK+sZX9;-vnwv{U z1#&8+nk=22;^4@wehVD$Lc_zkytvrHGt5YReB{ry_d!9XVr4WAil+5-Q@PVvm8F#$0@}mZ3X68o?F@f&&rhX??-EOga>*1i{T%EQs z`8~#7=~pneT~%8c9Vebaoij|l@hVWx5iT?VA(2?<;P9}rNw1j8)>w=h5)#tZU&va# z>G#q#Y(kR)GqU5T8osC|DsqnCCS%Hmi^csqNNeX9oaopjmFEwfdf{8u_Nj9nF-`}h zoz+ndThl49O`vGP67u&<2W8gQk!*!x{IaxjS5}43!jB(SpFUAtGa8O*8l@^a6 z{|Z`DN`T$yg`Cfsgui49yzR*O^s^FV)HkO2zMD&j*wh;<$dS2;H4{*z=O?Uz?z)#< zMZ)D=Ya`?{Csrr&Q)EZHM^)GD5|jin%Ez9~F*>J|KW|UIY6BY<$UOdQ_N|Q)Su;1w z{tnhWY}+$#r*>{|G;M4~e%l8LD{M4BfGA)_$zG}OSk=_5`e|UalJs3Aks=CCvDhxt z2n6Oa&b@IJOR5H~Ip@-fC(jiH#XGW+4T(3<+LXo8nkHqvt9%32@I_Zgq@*fh6+8L( zDn#6mVt8IYT6}p&IHx(_`tSQsYY_<$eYTD-K763aAdxA+NwyAt3Y0gtGT$_7Pe8C~qYiJAHJSq-9zvtO+V0j9(oB@zorz6Ui? zD<*?z@APd^L@%it2IC(@(`4qGn_=PL07q!eV;3)oM7aC>V7+}Lr&|D}&t>&w2nKq9 zuxy{MIE3|@{r3UVYBjZ;%N2B2Qe~W#WqkO~zBOmHxrW9NqLYObGb)QiuY7D<&sUHb z)MOcK*nxT`G1$-0jBF&VF||CUH#SCR^}zJVMj`gbVW|=^6W(;0HU4%}o)<*d>j=o6r+Tx0$3P z{QgkFf)NxZkNXoMhhBj{U`KV}kV2RL9rCH7zM@H$C8>MgMr?-V&%8*34Zq`<$h3K` zqjGZY!JpmTkuJHLuB;oX6*u>m)9l=tw>kn>S3t{X_By?P|2`@jT0v_8;kVG}yXFRl zZ}gNk|MIUWzIn6#`!~z?JJgcQBoL1`Tl?4d)VK6TDQn%T7JrOuD5z*CtADMpXWY#* z(Q(-lUGls@LzBTTD3A$q82qw&j7*_7P0rrQK_pg>NQ~Syxv@d7f?3QNhVRjP_Tz2O zq3){Z@rg%t4-Ec*$e_wR(bd%j%L`2}V`^5rbBr0hCTbA-Ts9YWo0HS=TtY;nPuvsp9_s$i4-NYG?U`zGxOk(BUp{i^v=^>k;$QdFw``Y` zO)fNE+qk;c4w=QvumwNGxbR<4fwg?1;(RKt z_%S1`R@8#}m1mXU3H;YTtY7hd+ypD2KnC^vhh>Y8no(LAXp`Fw-maCDm3^7pM&3mxCu%PE+bB~s&t6)gD+Ry#1h75H+Zzo5@o$t7_k~{ZBOx*ly5gguQ zqK*UqmxP4m{AA8^R96*l`su4KT?d&M2#w+-Mst3+FkkXlatz8L7%J; ztYD7^|GxZXt@Rz!H(Tb9tx92;n@dd#Lx!tsNAc#!Ck5zfVQ9epnJb5VGb0Luc$W+g zZw7XTVT$a!ge#E++5WtmH%gNbEi7Ta)xTNS7xp?CwBYG@NNrC1i&b3C2_4!q;3l@V z`0j%B0SJg!Osf+5IqcTO`3Q^Ip~g;SU^u`yu=@4uqm9~yjJ$@cn0p4Hu9c#+gM@OP zli|(&89G{DK%`+x)!H=95g`e*EkcSi}rTe0_`@%SKQv9uJ7t41#72qh`y?d9>&PQ8Sx%so} zmgZ-ZM|FOFmsvH%MXM*tLIwNQ)}w|aB%iy|e@QgAH~RjTe`p&pK!CEEr8ijz z--t(EPVQ&37axSKm+G4vNn}FN`9ep`%Mm7%C3yz}SJpIg+-f?Owh`Mx?X zy!DFA?_1MFDfJes(~P`$OdsDy@2GGb@Yk)~Zw`A-@Zv+eLA~p)mbj9Uxf>BJQNew? z-FG*77e4-@uMpGot@9Olsd10xK|R!XQoAyG|Mpjph9f7|gN>Lqada4xKWb1?QiA#$ zI6WC6)JW&T*tJ61ALc1y74ZPp;2?h4BGb0CT2^|$jL!PL}$oW=35w;tWwNNYL z4@&Rru%)srJXH znk1U3Aj|=zaLeyT$4<-y^H13gYuHhwqhIYQe^tRy9$C1Is%CfvLEJBzri$+zgFSEU zt@hh!8_uCTR%De#rHFvIHPxe^5&&hSoR<~YLCcCpgP_~>9fy_fxj6`_Zs zu*atYs+Cp_b|G#XZzH*jGeLL&O{j76f2dY82|Bk&z&=)~3ek71n3)Th-S!36jQz{@ zDmA>{KGLrz5Z+6D@j*6xF0(CMHTG!{kN);vRdODaip@eO($tj@s49p&u< zv1{+zv~+dhQNY~6U#+xe#yT{41IuoU!|k*=pc9GdO&?Hrem@+ytDov#_M_eOZ+JxH zlZ2UPYh*;t#ujDEB11Q&eK$@=uhI=%+rDlw+!o%>-R|FBm$rHzuzb`g-g-!$l98dK zr!%{__)=HHv3WI~%yIzILbcW`X)`JcG#I z{Gs!)vv6e8)$c=*T9>U!KHX59OIaT|^jN1v+1bwQK&YL7$W*MvX-zzHg8auu8BGX9 zF_icdBSvYFmadbL+66oKn6{ps-VWH^o=L0dSjXn7XsgbQj3C%R^8}Dm)k1F8DYyyJ zxZRO2;ap^Viua)EdjKO^qU*79vU<^+!0hJ6l7oWF5*stA1nO=F2bPlym3lC4=Dkr2 z)TTe9qxaR)w^K=uBk!%y;Vnmw7j&LLgxc{k%Iel>J%9C5{TVG$cQ}>_$6$K>R<#bU z5X@PCXr&-&yz!T!a!9ts|opOL#CFZkWqhIW;%?@i7bA!S%P542q6u z+GHM_P7XQuJ9YH5MB zytDXoR+RSp9r6Be9EDCf<_$lFA2noqjgF4)knS+BDlata>h~l#D|5*oe9T`>Wm@gr`V(foCAVtBQzV+85_P>0m-e4f=2(O8bo?gx3 ziSdTRaK+S=(6vHl_1i(>x-XbF?|-SHp`nFbqFsLVDjj$Xbramg*w|RV+f%<=H@{Oi zzkdvm*SFgu*W4nvyYRaJ6BK$!Jv}{r{l&StXCPRrs)D9Qto75Y0)MBP9oiTjjWq&% z0=21078d^PZ`87EP&eP_=VN5$Hz7vM(slOfNLX4^Ld1<|JqW&VxKW zP#WTs-rKxhGB0mOVIbO|5o=k?wfFP$^Y#{`rl#f-u`{rUX)y>DbN_b3@VVKnl89ZO zTm+}-!Ew;u2aW&mMPmblJB=mT*-PId$-unI@Axq5R*;vMkP})>P)h-#0c4!Vk4xdA zRaW9S;@ToAy}#-p(I!CN4YIegDlIP1RQ%YbWar{S@&_IJWqw@yKafXMMeI#`pM<+1 zLQ{SH^z=`a5|y@z%8H87iOQ;Eol&H~Z=}3f&`TyThLv-ViS4bgFunD7OqBSqCxllD zDB3G&+3rzuD~A1a@z| z^)v^UP4)M|*$?szUkrf4>*n zvp>F{(IZuIJO~`bcd}m8;p4@vy$gtZEoWgfRt_KjUXSP`hvd$Lq1|r%<%L(ga=g-L z+)(`LQS~HsbP6UE1--F4xgq`(mF6bn`>;YxslaHItH!PBp%nVl%AI^vQ7W2`wZfe>eo8zwh7qj4?+F329l>d&V#DWq1hiylsMr^z@cGJsN@>tYWGR^BAH6 z1$@T5wIAPl%yf@^&^6oU1qVzWv5U{Bm!hHCbPS z!z_5`w3${sKlr|%htiBmjaIdjlkI%-0|KIS<(SG*m2sYNzS>%qi3xEpu}I)V0?S{F zOwril<(tm$(^4i#mmz4-8~?l#Bxk~&`E?wIh_G$~)ecT?In`0Qy1pPopQ>5~bEN`V zkDRvlqMzn#-lIEr`(L7;e}*1yv&Xg$E}4=bE+5|l=89n3GVsi|X0?r1a$zF|Xf{q< zmu5`;UI0Snn7K|ZWpC}}3KD>prV~{$MJoKhKR1*G!7W4=0}`Kd*J^5NCV6$$%M7w!7|Z1O&Fuwe!DzHbXz=y3F>jlh5K%|sf8yH?#Ct4@|68lyK?e&UeXV@5{z zli!;1@=@YBMI|Mq#KdjyNK|Q%JeE#__+Q-Vo0y$M>`P2b6X4~20aelW??DxghO}kn zUuOkoD}4@YYD?}T9qgZt+V0AtKAC6h3Jq%O@PwNiI2$lJYj0=7ggSMn)0#IqG11h- zL`7YlEb_$`_gdjM<$+?xM^V7HCB+PxoS8@QC{#+;Hb)fM#_0NE#~K2-jU|Hm`*k`% zXUBLib1Z%en)U-$19R*$hHbRg+e0m3Q5k4r(82koqu=84cgTOY0r!2vag zFjBhj68Z`DNwe427)}4e-`9RsoWwB6+8R3kq1V~jN!+aTfi^ouIa@~P>jEH!`3WYk z3J4G6J!e>Y0r|U&12LohkGqiaSQ0>qC25x7E@_m;jiFYQkd2&SRnL}>#mp74; zMxD)1dAKrS5~desJ~cHWmIqLIGU@)%r%jBAF~L=pNJlR)I1gHn9Wv{jmXelkPrF+J zV?s>nn-AVzcQ5e~37XwMeXi9iQ2_*shnJ6)g*9yb1LGP?0YG#*R7;a5?aS?x-%kMU z&n~L^STSja!?z{~9l`^^eaPGM9Q-+e&zf-Z zd+M7SRkZby`X;8Q87KFDpQlzkjhHv6=~_XE)7QJi5I6C4@UMW82&>B3!t+}Um3t6q zADty#0c1X%AKK9)TDx930e%DiexLQpGCb?qK*1wD~Y?j6FPZ8bBuO%4FqViFX3^1&ZCx^`CLFjAUF%>gxUds<-Da z{ghRecT?QLD%_M}b?_G-H+px6q1NkEwD|gHYQiKDK%=f%bWRPg5pM1AJAuRmu3sr; z4h{~EJcYVaiQ95xD-*4hfB{Lh2esKmT9}^C;>E{3v^AtRl}r9T9CFilLS6{pTi9FL z!j-qPFyZHXTHGXV^GRNRzt5pwhb2*4OY2d?=-AkDbHT7A_=tVuQd;$+@GCa?7S#zsG*}`0>1bg2Zz|q9`Dk@ zxOX&?sQ?|t*a8Tx5rgtC&UE0{>zqmR%Q?OU6a()y4S}i5ML(};cE%HTBDcCdQ_bVVLdi@?~Y2~hX1`&PbVv7MQKCmE-x+w z{!PJpTR(;R1{+q_{sF6!CZAJz?U$DaJ7KrxMXd~9d=wLcE28bq&CvpC>#G=7{>H=n z{>25%gW5H~#B~DaC_1&r+-%oL9&OSjaY9w|=?sWRk0vA)d$n_{HT*SMlJfKOS5}Pj zMx=-)U_#Y#-?0{b`OY$j4^$)Nb#;939ZEjVnq^VdP#whhxYpLyg#-u3#mDF6=0ZEV ztf&~oh>;!{8JXpGb3Uc-_aQ3_Cs`Kb^`o?x>B%9^rcpa;x{nhlv>HEcIW|}v-(aV; z2i_y{^roD5n5aSRbJ=V6@$8UxZXO`M&-hA<#q!j%d3ALagnOWG8O{_6pzVjR@_ndX z-`7yg;f-{$QjSt`GNa5GH#Z#12g>oduX##}af=-=w6(SEaTk3~brlsyj*h(@F1 zA9g(M7!ud@PfR4R$P3Kxn!ONUF?Dl8vTH`=qD_Y7cfWqgN=da*lT;9p%I+j7Zuj;| zJ%8R+nB|+6k^*)LXR}`6<__~j&pj=0gQCtG-sN5ag3SBm2^1Hf*NnaoG|&+>W;^q+ zv9SX^X`$J#@@t*B%{*O&qhcoRNq2T`l{BY<2sEoLEy7UF=HwXKyZ7>&b?Cd;MCQt+ zCdFo^WhN!WWhBPWPgO4d^c+$?G5<>xqvP3p^Zmm!j36U3v*3T|(?cZt6ni%XLFl0b zKCm&&Qv$pQQociFQhQ>PSW3+ixGfq#=*gX zfPi2h<$r}_pnBkH(D?M+oRh!@fDU4G!25Qfw1qDr)AZ8?efBgKssvyu-rn9XU!q|Y zl7;8$F$yNip!6li#E7<w znTpVd;;`!VaGTCeIN~r~6{dMSJWtHb%$Zb8QCEuq370}&!5J{p=w!*0{bPzc$4ul!2ZiB*o$}-vb&A^*BTvG zQ9EE1?K#rKc<&wRgl?;^5HGK*y*-DNV_&HXYEkH;xrQZ1Hr98rtL2SDgO2lkMx_0{ zc8)>^Xie{Y(}RKV(pKjZr1|r4){d?SdKB03X)y?`P16U>hjOmJ*XJ~MYwFCB@&wu!<*eS z!w5Tg_)@UL`K?P!j1IL)%2+H@0|)Jo&O0WAghJ9xeem6B8yJxa;wYH6`nhLv5%8lu zqcb1Aex+SvS(4L8nw}2&W)2x9Zn5P0E9B zjhHEL^T@LqM5X!pwEqtBKm!LmEJCSB`CT2*tkCiMx3z=A-(lYq?k(n`3V(kD&nZES zBX>djhN%i&FF=0uDskd;){+)U#%ZN0o^Dzff2L&In@~ ze3-Y|7L6j7AtZ8onCaYPe@{|Uvd(tCqeIqPG02dZo&}GRGG^_w1`BBN*Ludj!8!C@GWiZv5~DN`0@ z;_eUB^!c>J_;VhC&+3bHHPx?%*;etX5)Zfsw|o7PFs~`g>}+}JY6U$HQhfIrq{gz@ zQOkZ%3GiV_Rg8>`92_`Cz<|~;Vswc06e^a_jm(9QT8j%j3=P}AuKMqYoBgIY)>y*j zsDjNlkcl5PRP96J^F@>R0Oh3*)lZhUS*PxTP^3f4&Hb#@&%W(+-MJ6Pzqd`q>&&&M zgcx(SzrP17|!#^&bm@UX-mop08TY)dE5Py-72n);#J zscS=BokdH0=HuX}6z9W^=g$Yji7FzG!R-*lcVg~hjwnI{bTtw|ty=n@i2Z3BD1|(a zRv+H-)6<*T+sCvN@pJH`BqeIhS`Ii#G)g{5 z(6*DwNEIkac0YGJJ!#vGe_4PjrGNRt6Iu?^iuDPCf)^j+Vi(3oBPK?d zZxD9x^N4>BwR2eYla}-LZqlpN*T?aui2HYlVjCT#av?#3vampj>nwX6MhY_HT*O`Lnha$J2 z0@`{x)9@4!r=F&2<;C=vxQJjN#z?XCv*&pf*@E8_fTvK?JbOmwGIEAP%MEXyLa7f$ z8oAJ%D-|C@($aJGNAG^H*8}00pV`*tjOB>rl$3vd|27EvIW?uOp^=iDtgfm$0dlxx ztGc<@H`!FKILynR#gGQ$S0UHfE;NpeO*QY%;0-$}q6T|BcC2tjVY%Hwiz_Y96B6dk zX|9$4P#LeIWs7XF68(8|$FJj)qa&SG-|L6hd45OXt(OH#s=VA*c4MdB7welaQh!K7 zk|RkBQU|_lfg*vtk+a`3-28|ZmDzjW|D79>wH5D$Nk48wC#Nw3jy42w$9rTipm&nXHDyN>2W7m6n77Z*`xUB^iv%M`Tv`I?% zvIfEisar9hL`4vd<@5k=tIDUjXh2*)sY4okE=>WW%REqH`V>E+-sV#4*NM$6Md-O-WD z`b+z^Gj*a05!XP`MN>8#&t0ln>re7@^b9{?&>3Fg(b?P=7ygu;%Z^2fp>wB4z*sqf z$!_7I7T)|-*^}V*f)nwC*T}Wk1_=2h7QTmH7jMG-&Tnt72H1TMezjiiY#d)~(DyXO zlS%|!HDwbR#8_>IqHhXJz8GZQP-xuXh`jm$! z(2%LI#ScGF$zAacV5!7r5Iv5%=;+#Cg#P6K9~3Pu&+Ch0pz;vnM;(QAEeeZ}2j{HEp}{8H26*o4CI3qDXMq8DoAGIn##RsSjwbQIi~ z$&OoYq$&qF8C*A*aDxPN?`K1NVxp?9?)>EBi&;z?3EnSik7Up-^?q#3?wwvN|HYwXH%_Ue-ee{cWsqPGJR|0Y#f6344D^s?LiZ9CQ2R;5IVv9I za13S_aG=9{M%wx=6l!3s2Nko_MX^ejpl1zf{7gPkOY*@n4)*isFA0*8kZF?#r(VHL z(76{l7pOl!J-zkoSAZ4kWA&L$vt}>h)-c-Ej=SrZq|X&QM7d#Q;>AVdylsd&`{T!t zSy<#=zmATMel0H#%(b_qfbR3A+jw}8d{3RFaczCX$ZBv-H#L4_V&?j7Y)k4|bTP{9 z@_YbukY(`Yd+)v=TnTV$6mOH9q5ESy{q5irNF?|zW9Hua#Fm69;RB}rO zZG~eH`Er4el03Cr5lIRn1nP(v#sGNg=`B>759j9Q!T?4|S$V<|Hd}bXSh}kV*~}lf zF0;D$jKjCGb8k@x1%9XXV@PUlR~cHkEncpyZ^BC#+hc=32(Ae0` zfJpMpEhIsz{Lj_ZoNXKnq-1131>7=pbw?Wo1_ULgJTzg578VxhRy5mmY)@^x{*JCY zifNjynW#@p7zJ&9ebpxs0mJJTMfd6z_(x&4^x47z#uM+QXE8b)Kkftu^1T0&4235K z3kyq=-|dZ^-{stEk?W($a&1sFOUkLMC!cBZZY#!6Au%H#e}8KJ_{&bm%DbFcvEe`8 zM-D{^a$~Wa1RQCTx4x#Qr%TXuny!~Xm9rO_SJ@Is-GTc~h5{SS$I0EmARELga4`!C zP{JuAko`h%#-&6Qq6@&cTU$pbzpkP8p&h$k1!c8SlvZB&Xuv4y==sQ*Apb$jAEz20A?l3^+u6p(6)4NrlxH4>1v(0Mdpw*49i4l%5I;%hx?K zjjki=8D6%{X5x1I{PozU#jg0rl;yw1oq~TD(kehte`zkFt)C0f7B%E((} z5{6(R`{8L5X9BJklyT4jd3k!mAT~KE$>JI(CiMgb--*q_?K9_qsH3XI1d8POw@)MU zK6`(|_a4$GZJ4C+Is8|PdJ592tG{;p5A598VeSqej|te>`SlC5BdW}aBNl->9rSOT z8yciNERcD1iM+0UPAJ&WTovrP~yE?+H>{dJ}Yx5f~n#F?BnLXlTc^pA9+o+s)S*x1}5 z`!$|+@Sf@LW;s*Ev9IFYc~Q*ynV=|60IKCLi{ak>@tQga+wXl}lZa!MK!r?3N(zKT zVBbBYpa>$efX&cMOmA#$Yv*=H=fd?W>%M-y1lwHu2O3%JroFZVv{Qg4xY)eXF%qw9 zvGZ~2RL95pH(DZHmd6{tbb~u6&?xZfcmBgtf?|`vz(+4xWnMIWp$=so)m}-$@jjbOKWLGMZ8d*iG?FP?#xKCh*tm5>k@dT4*p9fNhK26LMtK4l^u zP0csfw*9^Rpq<5AjfrE#qGF8c?|KJCIft;YFcnn}+}Fyfu?MH8mv3NK4aFQhKLaH?-kpOubHIwWlDq>)-Zn zjhUHAPVS`nBK;#-|D7uv!PBb_Z|mNM{-Br_D75OJXjT&;j#>FeZ5k7tgSZ}V4eA!) z19^COUc1ezS%H1+i|nRv*=?{_DJ%>l!alz5 zc_jkot^*)Q-U{eMXlV5{H4_Un{sm8j3dN%BA0dgB^pZFhdGjB_ECqfri06WXQPIm_ zZycnsn;YMN_8(JIA; z!yXYuJ~f3Rs*#!QADx3hzNM~?$T!7z4sC%Fd&YtX`gkMixAdL;`oZxcG({u)ylF|X zq!eUNczID#Ubu`DXAAx>sStyH{mF^u&)W-qzcQs{{o1v-lQ+{vR&U9karEBACE$3^9Kue@UU7&}ml9$52)Cex?kC~Z;FMn63q!4@d6rXWEyo2;WOkV!` z{8zUct=*qL$%SMdY89zkM6~lGHXrZ0@low@j7aTe^`_{gMB_e*QBJaI8Gq5V>7RPxTUOJI@5);kH;ZLeLoc#WEop)(_D z(7XZHXbB+N&yEw-foDLa`OBpg>(48J>EeKOhl>L>+aFl$DpTtEKF6i{*E;|i0$4%p z4+RRd%lVg~onz1LwiqgmPx(-(F)B0$u8ed;*$T`yH8nM0Y(lp*JTwfQCjDNBJ2Ae} zM$B78q@=|;N(JJ@%-pZ#LvP%QL-DYY6lhhZuCAKo3jv>AfSs7s zG&F|?2Wi^cW!$wk!`NwIx?Or-247STT4NF*-E%@;1*}VcpT{O z&mI=v%IY@Em1Ai|3qgxhj(^mEh1%K2wD)c^@SHftBN0<{3+Twk$I80et0``|&rpwB zaZkJuDM(lE8B$?qaDoql$Bwj%WOFUr-%hI(KSd`C_IxMiFUBY3Z~L>=F|DTSJ01{f{` zdiT{dG|Ye#k&f2r^v^F}K6@Xa`t@FBP5r9TDhC)ArW3&4A@;gsl?FadWsXp)rl+Mj z3w-D^dB-8(yL?IUd<1cuSeQur*&t2!ZDZKa7YsjPJC3U$!^d+<*uI z?BmXvFn5f*VS>-rV!B)Kjqb#eOKwNh0^e2pUzXc(L!@F10Df$$!>1W2aMdV62j!ga6eP~MpI+eTO!H`lyM zPR~N?t7&YM2_c!40D|OscJ^awduIhQjUmEBd?I`TY-}7c$GbJppRQAFU@CFrs%mrs zzR^0VEAg}KurNRWxuj%baN}Z&+m}$-<-nOIB#G*w^Rqc`wz7s5kHS-r!Xpam}%d?q8iD29tb>oV!ptK z@G?hJo288tUqN~^*{0UUwLB3+QV&n;K8vC>`#cc#E~y7+UMtW2cHApt6{y^ z;DpBg?u;TK=8@LBkGT~$Vm>ljTsI0|kN$eRbL1Li0^$P?^N*3Qjg4{2%KeYW!P_gD zwE-PV5Z<>>gf|vzSs1LBCL$#K*3$!H2fy3PMSU=Z%g)YjZS|X|sr7T;znUnQw2X+L zFSoN5Rff{)OKolLi@0=uo__%mSzhl<;B5M{Bf-s!S1&wMR7FWFUc?}{_AqM|j!jHX zrpeJ)PLWCN(+IMXSm1QcK#4g%u3~4$o-_%e2SWsaFX(cB6ct2|$-MS1ly`|3q;tS% zecyK%n3iVM=Sv~c?6NjMRCc5#LTEthBgjfoP*M7w;+C19lkCq(9!$Ksbpdw(UOtd) ziM=4;S)=i0b7KQqsA828z+`EI zyj59b4&4PCPbTZnrX$Ln2l+K_WpM<*ByuhH!_?>vcHq`eknW|SJ zhHT!p>>oy-e(a@-qrj+5!qM=RS!TxmZ_ii+g;K`Dh7^~<97aZ2DYmjt3fKhQz$!U0 z5QE#6s2+nOA|h-keEx)K=EnmqD0%=mQ7a`#U(4$2LF{)Oz0=$D=XSXpG+7G^3xMWA z&(nqc>OqbvaE_EU@kj_16%t^ez_BjPfdA(3f6N#YQAfizd_p2sizl*=2gDuy2e!N! zS-K-O9DbEG7c}3~f_&iR;jj&j`W03BYxfasJ5hW#tp7vPRYqmC zHf;q(x)cfNkWOil1_?pBL0YnM76Igo{Eh`(sFmg{37}KjZo-#X=e^Vw)d7GZmMyKS))H!)%L#tp4uqc+mL1 zUvv^&f#Erd!B$-fgLs)1psY-L&_Ur~VHq9K!1(L1Q?`=9R$yau{Q0mK^AalzbAX+l zDooK`LtEG1eXh1+jx>yP&tk$_VA6XNqbqw{O|+R96D8-x$JcNmOagEM;(Qmo`}&|9 zfdqn{E`ekA4wn)+{IZ{l6NQ13hVdC*zT~j>F2Tycj`Nx~Lr}U9m1JDaj~^Na86Vxx zv#KjByk{M~ygL8G+UN*9&!EONH;WoMDl6!3bx*Bd#OU2pXD=?YV5)T6o>7m>N5P`0 z?T?uA+UuyUSp4GM@S1Ozo9=LAtxs^$8{aufujb4{YhKJuMF@u#rYoXcoPb3@Pk`|O zQ|})wp*7aIJF?V7)bz%1XTjc?k>O#e{r2i!ib`<|3LkSexBx5z1XgXmEIT`JWngGi zz90fkeo=;P-ITUQZQV)#?es;wo}rtMy@UJetpCLc`7^IiaYT4zM?P0R*O65;6qP3@ zwa=aoygDbpMDqP(|JU?l9^>0L*7j^V&^iN&3p0WYH3KprWm@9c_Z#g1PX&oz9)_?| zC(S(a+&bpF?cucNi;`3@PXq=Af`Fa_*MALp>;tB~c#;@*WV+0)i^8JodZn`{NcxUn z`)tYMI+mZ`!)`!Y4p3`oZ@ymh)*A^YOQuTja37x5uX^p25u%{X_9TD-%2s`;HH1Fx za;-e=dY|wn`DW&ZmyO2E$!;07FQdSI!Stdut6b|li1Oe`LMs~(8NmhperFVlIFJPU zt3zL*9C^gZiwfX@8Qx?&BrGgov21$lH4D0G*r6{gRShn6*TSBSy}c?*^vXXaCloPXJ9_GLUe9y?pz${8{?~zVo=VZ^n2&m;cU&4i*Bl+d)Tm z5lL~iUe$DVRXGsc`#9n40jMDS@B5Pqy!81bPs!x>E2-keJW)pNUy>Z$-EW@|KsJ_x z3ohs5SVlU!?1~B(D=Tzw1KPX9_JK|VZnrl$T&`C}J0Bd_ z@IFF$LU$%-4BwDyKqw#y{=-a+j4&^i>J-w`O-$nTk8B)4&n@D8SzS^RMVpW)?Dw(# z@jeX!^JQS*U5M~%3$Zb!M1-jn6xcX8C2Oo0_GSRd1RqQO`Bg@9sz-LoY!f(zUp8PAt z8T;hd@&U~&e5XvdZs}i;j|O>%;^KbL!)?tyZPwML<3jZ>aso6TaN*{iL4TxS8Z$)A z`g;g@tdtg`Ry<*%1$uu)<|}-E8p;5A`{Bb++OpD8N4Vub`hYl?k0cz|i!CA4SP6;v z)>H9tpzbq7<9_@=;dIGBTcuS?Z=HX?2rxsyB7UWe#N2S2k)qVHI$HoPH}shBox`~v zY)p{Hq-VNUdryMx8P68I&&8bgLGm2n6;R_MA|oM1R%U0zguTMZ(XkX1U=mvvf}I3n;o1qZzl)`llnYtNb1Vg+e%{?C>cr{0KQlUtU=Smw;{i; zHVXwm-)Cz!PAwX=0{=+qFZ3<{&j@)q*KUAA7R*p^H=CK6L8ImyfbpK|_IT@V4(yt0 z$uBFz-!KhfihFr26g7tPX$^@C6_lMqu=o(6A=H< z*K{#9cQcW8z4*(ms_ft($)yllC2@ULcJ_R=ys$9L1_PYRfEiyGuP@l@^gK!-9!{AB zdUpYMf5@Ai3xCUec+XN^QIX=ym%&MB^LJ@kUd@lqm$D*ua=RHBQQbkL=b46gK-D&ODzw>1jDLIKxdceW@ znBXCsL)1rOX-45!vX~pt>!`7kkyC`fOk~c_-=1wcSxCFAqPUu%xH)%gYIt{J0Kvcz zH~ozwtQVl)Kyfh)vfZh@v&WK(MxrKS>)Bb^(4zj{dPB9q5dR;KAJKnuJ&>0d6N8UR zv&W#GBT4|IK$Lcr90=xMf(2YS=k6YN#vluF$F_^0WqYW5X)&rY>b{}dDzE2qTN<6| z;EMotHw{H|uYcu1-_HA3`P3EeZ0^tyEgwO5J$l1IRI;yR&6Hj%?jA4CRIU_JkpuZT zz_jLnuPdoug@d#|cZG9vm3DQOc6GTT@={jTSCxT*;r(pOU?49#$)`Iumh+J873eD_ z%w^?Hy0<86dgqz&%RR*7$EtyNbAoIYw4Etf(JkHuq(p%)ZXRfiZdW$@KEgy%lkERw zP#s8Akkj=RV@@&o0XZ2N96hP?we@xMjK$11)RF|e$%T^2DX$VI@^>bu&VHUyGd}w7 z_%wAx?%FfpwT`|P=3&m4>xo?$#~L5k*R2lbn87xn1=a5(MhXXGny;>=2I$kg@X5%q z=I;`O1br|fmQ7 zCyfBK9$y3jH3*ofwvO1wfFHXbCQ>@2K7a!z;*RMk=cIS@pI zh5Q^#s+yn$uC9iqAf>>oUUa?m-UkILiwiDAC)?z+>Ks1GGBkf$!iEHl)-OdiCb(Zp zMd2>UM}5|cT^x~Z4(cM%r$ErAK(i86JwstsX}YUmDiHNr@-Ra}RRy5DxS*i-)OQho zoxbzR_&%K$%csS~MUcFjNTZ%%DJ9LM3x~>~!)+TZjRFs6KZ?EPf2un4&`|F9DfNjY zmp!~ypOux(r_}UTZ88qMPp#LjC}8nS7Y_$VNqs$Or=z#zR?GWP&Xk(vpK>${UrOYFJl--=&mF9T|ZeCuP<3Kp~TtRvxtWVH7E!C~Is_GaA z2Mo{`-pyO_6?oo6C<5#3jpt?c;tln+;(LIhF8rnvT=-|q^<*Smx^;GzTt{A(8VBJD z-nVD*6e9mRq@_`mS6Dp#2i@y+l**jgiUh$m-Z?3agZX%bxumo-{9PtSv~L+7C$VC( z)W29Tfg6LUm&pDwlN}!FZje{{#7&RT$@UCXwD&~lp6?`3#ax?L25_(;v7l1N_CGto z$jr1!636tiIcGaa$KTYG4-_SM^CsxX7&==`#eDhfxRqQCg3`((ToGp!hfNg!`L5XK zU0oj}B#@z#@c`RjJQKko3*nK7+%x%=uQq<7o0F)U67^m+bxnNyLJ!Eu!hIq7kM-hF z%XN#lq2Z;;=RmXjpTHlpwY@E;`XAoD?*u(G9KkuS1FQxrasIQOTRbY+yR}eb2X&$2 zP1KvJt1Bo!E=;xEncbfKc|E^}r@xfhdq=jYAY~Jx2Ea90T_thMl8|$k*+ZtNvy+~Y zQP$u8D$z{KiIXeJ$HWoPO*rgLC8D`Z2dd_N#vGR=ho386w70cA zARq{jj11Or5+Gbo)=7ec0h33LX&863FBG-QU60>{>@dNKXH+|{L@0juzw~_VjT1U; znOq4FiDpzvV^*l#L6F*S8ra{|D4Y_YYzmN4O}Cq_sJ7613>ke7zW=8<}c-5 z)Ho8RK@ft0{IQ}U?($O4-$<*MON`YBBy8+8Kq>(L3$jsGeE*#^2uB>Q< zTJ{3}udU$lXK%WU@xJ@w82MhNmXV>J(O!TFi}I;=Mf86xo5}ln(i8&-A$N9ua%t5$ z$9@hxPt;Vaj;HnOX>MT+jSR&u8O_|Di}NET{V3IcdmgtRM_48kcw+b@V${EFq!$(U zb2xIihH2=-hdoGKf;Wyhlc4FXuB!`W%TbGm*&32F0{T5JNcT-#jGhOST`<3yKHglN znx?EtN=nku)LbHTHQt5atyg{yiho%?2<>a|n`dBI4s8AC4_Z=sQt79U}|- zU>W-38_5Pjoevu8-U2f0SAy1*ZQnecs99;AJ>`3CXn`B*z_j>J2C`S(;5!iz&_+h~ zv{AV{!CIE}6+q^qNbAT$qH(aYl2grXm(kMF5h`A6*@gxlpkL@&paB8S5$?*0MghVc zCr6Lm#?pBRI)vHy5MRin;b!sg&uS9hFiGiW;U7W)jTHY+i_5n-pP!$<)}AG9T954I z)XiRlyG>61LgzbJqe|;LUWFF94s!)E`WtvCsG^vs!Fvahi<18CZ+dorecVyM)+#L) zc!E+=cUxQi=@aJmACoPcEc}TH-M-3ro00HR@!T%W#E7%08uxHeuuQg&(#CNFH)wk6 zSF?qkZEisklS)M?DEE#VEcKC`*TUU@H^*Fjgrxj z6LMiZOz_CC$%brr5h9Ov5g1MVXSL~Q6O?o^Uy0ijV>W8m5<(1$6KFVuu`C@PknK@6nDw{IvkwuXl9$Dftmd;eRRsL>=PWl+s(s2`Rn zDnEsL!X4QSeZq5RwgIxqAnav+cn-s%eNY8@SPK=<4BLwQuR(=^hiha(&zsQ-W17UQ z;tOU_&S<%U)zoUk+T7fB_`~wEFAtZysZ^bePK_{Myg0Q>6A6zXc@k-oizjp7T=uku z@~yYG!PlWS`p2W=6GqP$5_3V=^_}wOyb$CJT@)YX<-L%$4JmwR9lbK_OMK=EW#1aT zdm=1spriBA^(FL>q<5$}@sU3FN9KqV(IO&V#wvMSEXmaMN*=-$f|CZKVj$h_;gAE- z6nshV(vRV_52-aNLZ2FUk73#XIdZ9YdIcC0|1B)6-7B20$c~lDaX)e`&Fr=+bTv<+ zBc#Fk%=hs2VFy$@MFTq*o8A&5+SLn|VFT3U^miZzR#uJ{&mbb^v9YUZcw4u<#X54T zwOL+$vzvBvzLCtwWNi(|lKKP*3eJ8g$xzQT@&Wjb;5@V&uWfAsM-TmE1*!y!8kJLw zBU{^cizxD@b2;R|C&{sj^dR8gR`8JM>ON}gYi@pjx;1rz`WT6S5wv|4V#$5qCN{wO zuuAq21_o$J50^POUj^JzCdnfwA(4}n?`Q5LBPKIP43v$F;uC2}N!@(|Zx0t8-RuV- z=&NEy*7i_w3WMtXqTeh`->}9bN~uw7f4?2DhtJwi+xoz~d%8#~lfrpW4N_?}>|=3W z7tb(mRF<$(kbT08dwA%=A4u5{*lU_XsO-m~w9q}3_am=NE%$w6*6SJv{`dc@;|?zH zbql6q$5=Z!>`FxGi8TvA0ErQbFSkqGOk!k!?n7*$07D(l0EhIA1 zFh60W^Ds3HC`L4;(YF}CYUD#6#N6=kKc||%!De;ip){`j!{*J>m{GhtTvHyvee?2a zFh+tH7MFNOiF1aZ3PcFRL)m3!fM=t;i2C^i1VVF2&pV@JkG>Y;6mR z3(FOBt7dc=U?cON$!UFUH}$bG?{`nBrNZlBBDzV3Sz$Y6t`3t93+qFS?gULPAixNaBJ5mUD>E{vgoPWkv(2Du zzN!@-RXqJ3z0>|G3ab-aKx+(U#pmrpeSHJ-9V^6>opE}jN1Ts09z7c78V2WNTe;rw zwHp@-I1s=%M4z24uBo7)`)67=?!^Y$Z-bnoN_EJdI$&=)g%~AhD`Gz}7EdtCP0!5* z+xhoGNM!ILJYXe;2ShkvM)JeVz1}yFP?Gn<&24$VST@int|9I!OOe)8?+Y1m2eZC7 zZPY(%YKUhmffDDX77=fv$M$e@BUJ6})8%v8FWYi{@}P@jMXGVpPaGuvJDUv5nrGet zMsIa#qp471xNu+cCbJ3)FbeX1`&RVE(Zh0wk}@Xhw!p62;idaH=e@%F1ou^xq!)(+DF!RKRT_*ovIRIHwy~FirmHA`+9p}5=z%v1spWzwmo%@!}}Ss z14U9AZiY{Ic8r4X(h(C1mX^LgJNpv7x%oV5*uroU~yu60%GZ62MRGb11>8t#CZ25>S8%RrGE3X_9HsZUXSPl z7R_eQv*Cq3kfNu{j3#}AOF1@1p2;}tX^aB8rKK6MTqv6xLEHn7N%Z#j7Zn$O4OKO# zeDhriw}SC~GrC+$iHEAWZzm;Y#h{QtbkdigA7ZT^jOTP7K$VIAwd6F!o_BP747T*; zg~PYBH5`*-p289CY8mS6EPbl@tto^815Q+Jzx_)=#RG<+s5q^RF>sYSx_;b!jk9=< zT3VEI;8o-AWB!YadCw0LoHAqtjW zN?#}yw~@Md0J!Y#>hJH1hO{V{Xi>N@ih$OFdn4-0#{2T@tVrAxUjVSb4@H9suH#aV z@{>`2SD+n>IDYucundgjLsxdTehLZ+r!#I`Gs?@!fjis}<1_$38&?N#6L19tiGQr* zq!v*jN|aSAiRr6=Z{)jmK*^c{E)dQGcR=XvydmZLYe!3S$0j0w?Clo{GJx)@+};>g zT9Q85a=)5;n6RMHdIusmW@b|3VnD7lz|MBZn0Ps*v%XYj9^cSSV+gmtFuG>lCuFv%|+fv2g@!KkNaje=WaCWfbr+mhP+U2yZ@E+2Uhu zxjwJi`?G3w7qSxnjVt>_ap0%b5Mrpr^p>TmjZCaK&qQ%_GTw+ZJrT?BXJS|c)j zD9&G<81g1VDtw%r8Jq}^7(&DYY$EJg5@+I)z`5Oxv)IMLSRAkSi*w{FePmOe^IHc8 zSe7064}l$gCTyHw6L+Hf{=L%8P0Z=6{$B@u%^fZK$gr@S(Is25EudC?wSolb_tTb; zq9{jr<+W?dN~#TwjsI-S_%7~;_iD;)O^6S(mN+8C;mij{6hY7Or{+E(;k~o5i3v!C z0qu9TCx#3`vXG>FfLILkW42>Um(kPHYWGhYg&jZ=JG**#yI^*yt7<+XzK_*aIX@dP z^45{%wE!8)-$952`e`_*p?-XLgi>_I*$eK##hC6SXg@c4T|Q*;^E@-N>8&m=C!nqA z_imT3B@DpclA#LdhisI;e+_}F2e-1771INvfCPvZqip@RV9NTsSo5QWKgS?G7~9lx z8CclLCT$MmUp!#5WksM=dzbCq-ROFAebaM172L)4cBd(`9VaY=x6_&`E3+pydb$xS zPC?KQ)`yf>XL+{VB;Pxw1APzTA4qpd6Jxf*7V^eurf8b)GO_8*DxDu z4G^T~(Ri#|w!j^xF<)!Vkds~mp|AM8r@znAcBFLC*wi`WQK%Aa#F>ChQONg~FzNB~ zP59GJXj3W^+=-|79rgFfv-CI#h;LqJ)2_1E6cven7~UkY88zJ?n*lF;^|`xQJpG9qBbFfuXO1Xbg~; z^rJ{|^?JbjK_8|&uK8T%WM=H-H)Qc=YO1B=jtu^!cpwAr66BxUf=FDjJ5}nW!i^Oj zt*oLl4Ej;{KFRVrUxsHi^!vdu6{SZLR2nyWxHuY@oBIKloe?L2H3?z|*sEYn6cQ=` zajeD$QE*IhR)vJfL%Z+{jZZhfBs3CahpBp zd~FL4(Up<#>7t{D9-!~r@{;}~kC;yL9Y(yO`&HA=I5^(BvUo8zP^?hPTyaoRFq5-q zC|CyJpmXDdUiSAZ_Ohc+Oq?+h(%e6b!7vN}A-^kDrCdDHaPVvfWgo7%63Z`oN&eYYk zVt=`war67n+PZ-nsnPKfMzRCSLm`=?JrZhEc@iPYoG|Nxfj%zI1z=E!LWC#e|Ffi` z;&6(c7lo?(0m@~6oSC$`!R@XkhhAvw5z?%lQQ$`*TmJKBcuy~I!cjZi-}u$DDd75I zp@radpZQW^Pj0<|BL@iu+uL>_${$S=52#h0hIU0!yRvf&WCmV9)S%0r_OFsSUkhZh zc01!?7CGq$q-R%8Y_#L+*W!B@K6twm!V4D%A2&DXmR4N^5d~km zKU``EgUZEkwiLf-EmVY?n)C<^ATZPe zvI=&3=(Ky51lQa}7zUZRy}`AD#0_jTXqt}`(1;L@Att?a82~kw2=WrES7B}mqoY;M z>%8xz$VhC9?2C2NvjJ+T$B!RxzIj>`HiAco0bjD+4^#6c$ZmT1a*yvJanKpj`%Wz= zhqkuud9L8yzWg3G_P9RVA(5kmh?gWBpdyhoU>vSCUIDGVapY<7G?R8_vrENq9e!jaM=#9GeA2Mv?wU_=eccM8_0u-n$?XPKv1Xg>Xpwgx{YK?w~x36 zBug%D-pqo|b>Mn);CfQz;kZsBp(6lp*tg3Ip+mKz5 zmuGHaVfr>X4F(c~FHD>SpNLnUITQl9ZW3;`ZwiJiT2!2jay9eR;uz$pYO*5UBgU}F z8|lCgubaF&|$QL|JTYe_5NE!gR*}42I3;lGP>L#cGV+msK|agwR~=$GLFS zm;2)3OIpL=3Teffag6HgPLO6WCP*D*L`1yl{_N{x6Ej!!=g&KahhwVe=y9qQs7tnj z0|>ne5FQ^=7Rck-{rj^onGa->RCb$hF23CmPD?7{GPL8g>+xn%_adyBg@v{wBR{UL zFjBFWO{60h@ePGo*w`)dx#wnT0;6R`{6+l(++QQp(1whoBX2kJoByv#2k;5{!#LV! z(ul)}3{aJOj#{pTogK7vk0a?@)8tdFqNW4fq-Yl(IMmI6k_zD4gFZe`ZJL4k9>(S| zD=DG)_e!F5O(qWbfXavwb1b zD=aQPA94ZKR8*tf1qqECZ;2fsd9jFh|Gf|%|7WbJ34YRjcro^KjUc*!k9o_1KS1eV z=WsinMEMB5BIpIp%y?)gW@qnRp>r-vEJKhhXg1Bsj;GEcDX49J{%1HAA&NQW7CQB> zat;Kh!>XDsCk5d~8it3$&2A!_aM{n&!5s@oG)efk@^a^Q@2*k>8X(%NkG1M2zmArk z%g)cMo$WurK33&seBlJJ@?n2}-df<6> ziI;b8m%r;u+T^}HJ4=$rkyQ&UOq>7U+X1;60rVCxe2sukR- ztge2yi-(i*CuGosgF?;av)k*}-zy90n3gR)0EmkJsQGG7!7=e~yzTs@*^o~d@Coz^6{*GNjxIs*qOB>~z6~O{l)E|T{y&v;bur@0D=Vd7eL!6! zMDJHkWA!D(#O!ZX%|Vne?7D&xPt0`)`RI^T3zy2C){_791~Li4r2)S0NBsF<-Ggi@ zN7#o|py#nNYpee@f4X5_H!UD_5%RnrB`3RV*}{V~zH)Jm1WaMM5X5v6x}YK!cmKf0 zgL=>1L)83kp-qDUyN(LDF~9|%l9G~;05=r$Zx}PkU4f6O=v#WMA62$lRRUoQ=8c7b z-Eb*sUQh(P+PSoWk)}3iYH^g--*IuwUvDlH-;cNWPG)6G`s*6V?*i6NYdxC%mgYt^ z;speDEI@(4<$D~9Rut)Vz0{R7A#V4ON^JrVaCvzQ+KI2vBk}LwhaMwbdZD}fqx zI)T^9fQ0t+^|3NA5P|c2N0~DWbMe)Zcs1y3r^aLAW6`=Q8^Ysp1>YIIFm?#~vC)Jq z=^rRI;KWn)1F$(6M7qlhBEW>72np#yK7d(yL&FuDKEJmpkfCb@!4|Ahq(>myWzlEAa$8nS&-|H+i}?gWQKhBxf`WqX z*Fp}?&jM1fQ>ms{Ffo@uM>p53$y}Et~|j`8pw) z-iLkwP<^lxfSwqKTuTc16HAk&N2#9;gHM$VEqp z6$WPm9=&c=le%^H$_iO<@WpD1rdqU8c{bH<(_NGL@;Yk^(?sunRJ|c&$eI(N(NYA> zN=O)B5ugPTwaLM2JS-HHT@0v&fhspIPfkt_`V(g5xb>;&f+xHu$K%)YKlegcI-hH| zvvG8OD*RPaH?lTrRhi=kelEnrs2NmeOXz_m4h|>RsrXWRe^TE0P>}82dzVzEkCu}= zj0Kt z_eC+qf@9d~1H!(h#%oAl32FI9%@PI~OSlFAp5hwBO*U-=;tKoxZw(ymlBFYb#)HHf zV`xJSb3~{Z8*{P-?W(r6J^g4W2!wb;42kK{#=8bEpV`E~mv9OA}DwEevqZ&qS zu`iIKrtLV@0ITFEeyX0+D+QUngKoJr#y^eHl9lrwWOw7s6g51vKb2(zO72_H52=Zd z>JcFcoGws-i_oLAp#a181{%NNlZ61>7ZkW}qPVpBr~}Fgwi6!UM|tYl$R*#t003Z| zb7Ev7Su^TpwacXT&shFWdH-*aeMB?Oko|Bu2n!+M0|S_#AVf5u-t$QerF`zB%r1G- zo(P5yt0A6=QT3;!XJ3Tp-c;2PmDkOXK=)ki9TxS5ifMlHTJSg1S%rK`Z|NF>V%2$fZ zXzZ|9|3&}6Bqpre09y|len7wa3WgpR&l+9>_p+3y`JYXO_1>U~;51SIWj*G0Eg z30uja18g||0^#PHo4s9+La9hI6R>#HNswgNu0(x6U>>L;5wn3#1|gYYLJ&eSWC0WV z_{Nc4RWh~2>J?=&IItk-$Xzo#uK>`8@5P$gY_Kc+8luwEB!wg1Jv`tR#FzFo*MY^( zpBe$;Dly9Pak%xXZFF(8qMdU`Pe*%pYI64J@8`b1H^)vOQx?$In3NRE27V5XzYhHA zwMdm;C*_jl*@P z0Eb+V!4ef@$jY*%-&E>KO5VFi|2NUVP7E<8pr-YQ7Y-Og*|cr#YBcq&A)y}k#kalE z?b)K`@y8YgE&q@@i|4Md`O@B9cK}?I-upLz>U*XMReR>Ye`$2tv?~OQaHE4lGOP6$ zeJ@9ekm3u)TAv$lH8nNJnE>W_G{$D)-KLKd#YJWmNY}u91RYkW1^+V53aAchDQ`;| zrzL~VOsYc~3kL@f*L(Pv@6-$keIi3pVtsKXdJIWf*;t1()b|$-ptR76Vk+o-gXIPA zX~B%cY47T(aw5YUcqkh06G*P*+gfZ)E{58Mta~dN&ce-J!BHSxN0ynFgZr&egG;P% z%*doLKnn*AAYjht;$rS_ove5q%SONta3dv?J*Y5 z_b=87*Z%Eb44HG`w%j$`%Tj@BcLG2#aGo2%YHF{RKcmA?hfHPIxNc<;FftWS)IrAC z!fQ`Yl7sfaLEOVX0FbsDmrifNNCzm?+j|#K9oacr>xE!V`|+hiYr}_M)x6^~)4ISn zJ>1}4)O5DS`1JEM-`?iEb5Ll1-#|}SPy2qgq%!)&@zyj5uM{8?5xv7E@G;s?dK~Uz zxF+iAM(nE2(say;1X6UJK175nhLv(#e(q%MY@Zt)jXQixYEPC%K`F+DOhr4tiu7p;l}EcOE^(HCQERB+f09H%H|ZfI=j|~Iye{yk z8iDKs?jXpI0Ees;BHManV*>K8#>X{Ju!WuvoMbd8jl(XF2&&JQRCf?-TwYILkOfH> z)sBDC_yo5DutMBK%%((;(g4#|51JVU?fxLE7huQbRuV~)+XAE6rI6m7 zZbKTdB)xd>xDWd}V0)U#^_=odr=zu~<@J0F?&-1&p$ze1%sR}oR@@G3?4mEmF&>!nR zd7|M?aLh(cu;ngm-ZkN zd(8W@)m2r3b#-c1a|1fDi{gun*QB!4@t6U^Hv$4+G)4Oy9~U<|Ir$;}3_=iHeuK>l z#D`qXQ2d+KxC8}tG&N5qSA5RrZYXYWd=6ltn31Ewjp5FA=%gx4Y!K=QSM^wbZE27JZGZ&KU2){eYyP_bH5Fa$JfZegMpfZ+GfWy)(b$6s(? zu%MM?b5aOrR%Y()qW*7SRh0+3Dp&S@S2KiJ9rt5{``VNX6oN7G5B8U6J4HP@rQN-} zHX$U$^D6bJ8yq0G8Patq%VEx8#Nm=T8ieQ`kYuzA!ey}k%KP#wNU#USlFD+|WJ5$A z1Y=T{yF6zMd9Y`E^>WPUKHaU4LWC7Gmp%YJ$jgr`W=-CVyuqXi1~hyqo)f$DmP%Ya zKtqtOI9h&pw1%;sDP;WPF9|0wS{`6vFjbIv%C=bt3qp6vUs_TD*|`%+_LVyGD1q`> zqp>ovok96oC%MvqyGThv5NNF)n3(LrdGSqy>N*Q4_ICGe(1V2wuT#~W?s-7lZO4LiXc*an+@)@iVP$3c z2jbbkV`iOY^rd&=kPhh#xt}J1<_>~}<7-JJu%kgw0d$o)8Q7T$Z3SU9`_f^JP)#T1 zO-*&RmWm2KAt6LaLA;Jkp8UF$QE1=7g2^VDFV7QeW`^!}_-DBCo}sRuH@kn|mP!Sk z#!|ZeZ9!@IH2(HY4mYU`s6S~F+PTm^5XqP%Is^EbfdRSqI~>u+CEMRn&b~!0eAwa-yce|C@Sre;z=7w zWO#RZ3S?E6DTEBDMa&I(?4kAA8ONtPkP`J8wl3=hpFvWa&^MUej2|Kvb&(u;)RTTTw>i*9{f#X#kIwk$vka zyq>z?Un#jjB66R(|Dy-FD|fTWNJ&L`!EOjL9q`2NjiYtn@?EN{K5A{DssT01!oPpe zF=q^OOx(ery+>P9viQp@_!m1H+rN6y7Zb@l$dmM-nxQ<8;0?I!(7cf?_F7d7*zK6EFx*%8tNX^4T;PBI!6@f_Jl>u&_ zgf&cXYtIP1;{P|IE_Aq!*xD4RX=jed0b?9Gy=83LO`b`CY9T_a2^&^D0&5$}7p@|_ z;LeDmIT|*l(bLtrGtHD$xQ`ySv-f?-A{_~KPhGtG5mqydu;!w05J7wt z=)}vNxae8$6B2)-z#jh9di;)ggac`3WMm?gfQWi-=M>>kq*~nb6Sp7(ElhtyT@+#~ zU`ticuD3CvLaHed2?;{^19}r+XsoRzFw4-)4!rGI@L>jp zp$&Koeu4kQSxwz{yY9}Xr6v>HC$!~=*lajwWJWJ$K>QM(4Ui_p<5~#|OC17?14(Di>Anak8=>bPBiE*Zqe5 zlEIUfp&u3g#;Zxmgz^~`Iu#b6SA=5M<$AO=DkG}o!rmMxn`yw6K7ZMpBuCAd0 zQ52BP2toli78cS5Px`z;-JO$gOks~zd$g%>_=YAX=*jI&h=@UjMD!#|k0_k(<1nm= z%fOr4aZtv`B3ipuCm!O6?SQIfFJ=Q84G46G@8`eJie2$j+gpf?beP79taH9o2!0*K z_4~J51p@P?>RS}a(eY@3u+-L;H@T|n-JB1-_M0+;`Amt~EIu(FaZAfegya3}%)^_V zkR};X;DcX#*Ur;2csNj3@^`t%2Cga~}yYnUZW#;Xjd!E@4Dd+ZpCl3k&%=56NvN~V%NKS&f zV$0)xP9PJ4!L_h}hT(6%Uau5lHBaW9m>%qNz3&vwd?QWTKj$6m6dh_G^ zH&$4N5v2#x9Jy>K3yaQq2g4!ehO9d$@_nMGc6y~do2S-#`uc&h>swoabKzqDN{2}T73iV)NwtU<7U(s z&xXdPCJN6uJ5R1KOc>a?fVKr~GHkf&=v^>ktN|qmrEe*dBMo>OA@qBK9Ecl{_(jLzi#mxuCyU=IWEN`UFZmQ+|e zS2wf0=RRBd2hSFOP|nXUq`yW3mB8kg(y@|Dn7LuX2^tVNg_juq9V^*b50Akn?)r}oz@P_nxJTS!pQuc!UN z2=GlB8lPaV#h4XUJ+8lduP~MUur;1Kgq#De0#Ps`H&-tUIY1o*vgh;;iJghjvE}6z zg%=72M+uTLk2aqQ-8_bcY5Y?l*czkLcsrbepvZ64@HDL)G|*;BDkmkTjQ;*3$@j3m z{fj(Od`tk6FM|j!p9S=Yh`+rWAugsO_S1O_ zJqArqZb-s}`xHjTj2(=i#(Ix(9WvRW|c0;w29Q(VvY5|}z))SI&EG(=+ z13(KQk{h;boOcFW&=adD{z|zkXc_=fHlR0X4T^?9T*y(jK}2x4ulmSJf-H@-E z)t!jLzAh20|NrVG;$3t48InaQH+vkfi{?SfhL}S#kqSknY1EItHZ79nu>XOZTMdAJ zphpZ06zz9)UcDl0y34pPe-c0S`uQfvYGKPD$Pe`&Z9E@1dlVY>0xaf8SCFKp17x9c z+|=e1Blem$oa_JLfM`gwFV+V;zrfM4&S7U@0(D~SV$8C~z0*eo?~U6QR5@@z;D(QG z9Ki|`l5pu>kTwzKcTkmC>IoeqhYSfb)Ba|%dcyQKEqsSlq%MMOVVRk z1&2<I;n9JlVf4P+fr|bo*GtDBcHL|s=R&wcE2q2IX8dbI~#qm zXW>G~nMyhn)6(p%ECCt}+AD{74RYU^Tm>`~_sN?9Z9OwYb9(n1)TZ6cospqFC|z{# z_^*)nwpwsP>%uLFvgTm{twHh5>MFpn>vjPH2lLYhZjXUc~J1B7#?` zTr3qL47Vu8NAz-MX8^9!>DtwUQ8+Xdp%sA*GH+i8_bj3BE5OgwOq$5U`-Ote?&zutZDOJ4S~-C+_J2-(x__%pM-1+XxQ)f$m4Ka8}??3K}kBf0%m`(<-FqHAbJ7do`&R27nKy?G{t+0{7 z+@HTE|Ks5}Ps395zP6YXzf>X zyBNaH?R7Cz`0W!U@j3-j6mIyh0MZY@f$ zU~kz0&NVFT>|Z!&f${!H`J0hbA~nKKNSdCKC_LoPgNcG$GZ<7gG&HpfMvRV25aWQg z?;_k49wcPh6sv@qCxI(Bzu&J^O>gNG@`6^dQej0eapk`!02f;+sFgXmwI-BAxVh>< zT&-w=AMD}fWmBqU{LdH?7{-Z{`5o4X5x%DNJ7*Ozi$l;ps7<4lk@aVSpIlm8k@vsv zGgr+YgWkFJm{+FgN}_S$XQ$-1MZek>N(i=qY$(_h{&Sv+B?wUU_(z$ehC?=C++T-6 zvcEt;@J8ZS87ST*RGn*hQF>rM03V{3Jme%$FMn-ly9+BgHs2t=F2Hu2twT*_Yus@C z5(>B|=s`!Vr1OBBoLr}HydG)JxYIn%R}_t;iYQx*lY-xZRV*1d8hlUic_9{(%7;>u z%hd8W3GZ%N-YL`$Gk&ad_3gPK#d1!Gfu=Q)qUy5`^8Qk zLgeL>1!_!CP+&=$@vWuXCE2Y+KU`v?w#A8W+2a3>Tc%=oglf}7jm!KYVLR0Q_b_IQ zw9KojECr;`AmB479ssbc+uY2SCu+CV29E#yZJ}w-KZ`wtknPOEv-h0uVK%!5{lZry z=by0M)x0(shr)_GDL0p~cCwp;3z4Wun=oXd#_#|>52z+^zhzl65TNW$^^JJg{@~l% zVCNB~lwRaXEErdu5bCs39dJpZ%rz95>WzUO$3y0oH zDN%Y>mFGYG@8Kd`bS~xbMy8anoFJU#PD;_>Rdm9@iQ`|v@+Z(Rw3`|&5PAcX` zs`%}9)&!7}#W>$n`<8U!)?w&=R@u*K|h#ha6Vtb2h)AK~=bb97wIL&@! zBTz|#98|3D^>L}6QX4_`r_mE7KM|G9&|#&=u=U}1@18&Ub0L*ybx%+I8>&{?y-#V7 z1J6SD{^D?+()jPYH$2S=o$|+3|LOsQCHUWb&i^?}eRcx5_dS{5fff+A@BYmKp^`9+ z7cv9A48=+V0%Rcp@`S{lr#a2a(5u2f(6@rsCAlvMjrzZKZ8=;DQyfTkAWFx~Ds?iV zC^g_^QkSBNV!9+w+I&e$0wM6@Z@nhwv6g>AqQaD8jey$p@*?$!8Zj8K!X|0qjTfS!Tvl=6h8wTs(o)9eA1Um)b0` z<_AQ)dwc?xzyy>{zvH19=Q<(o6ewQXCZ?Wk8}s<}0ZxPuZX zHG{DJ<6*2kb-*qw%(tOy;M10`P;ldTN*>u^$N_(0MP;Rt-~E9qgjk-Y1{@L){RQZi z8e!HjJOW6JrNuCngW_*ymi?a)8^Wd_4u?ReQYD)~{S!mC+@5A80~-q)18k=|h8*jU zDL@EQZ9+E5p-sG8pmFoVG^`%bR*H+v1aFJc>lO2i z7p9_8o!a`k>bko6+8?-j;^g99p+G>GN`7IwLL~_gL#ejry&>?!*QQeoSXUBm%?IOiYq6YHSb4- z2~}1C#T{mGk&(TzS`*dCL^1z;5VgB$tdKp+mK6(0@r(WZ@|R2o3TiT@cr8s5Udb%x zeyDz@sP8Zrqsk&xR&q%+1r=V%6_szr{Xksbt^4grho)ZW^aI~30$=;;5dGfuSD17B z5<-vr5=BKSXkwYxuX}Ij@R_fck5EM5c|7+QcWYCnJZ{;KAwr+2EDj#b#vPc}7e`bP zF!$4=;F$@(OPKg}p65Xpw|>DgFv*Onj1)DcqO{*d`)bA;X_|^!DJM-dF3U(uq%{`y zED=0>2z(J>L(LLL*CL#YQrD^}@A>sxaNnkK-x((QUE#rn-~8$1Lkd}5J7oI2c_Zwx zFPY7DqJMUfiV+m;{{q6loyPzS14Z@j4(NNpO&Aup})-}*GNPOiY zNJxqye*m0jPrf`LS%aK_e=FIb8nr@`3^KLHv0a87iGAjEGZF3qjh&7(Gg^>?JBV`_ z9)=y6gozq%@->8*gjh1~on6p1>4CG$)0k}?YDr(Xq+#5((?cQxFE#`5FBq6KH3`)} z3IV+X`UaSq90Uh#VLIY}7-lQl!G@gj@PXe*+3IT}BVX(^8%N$jn}W>0Yb9t=74`LD zWHbL)-MRlW`Tu{MZDtsTIiF^RQHo*?i5<`=hggw{kqRk?9CDm(4nuNUMO0HH)jM>2 zcfdkUZ-+S)DLIu;$|RA~_todW`1p zmzPEt1l_#VDAK1wG=;^GB!;BADDra`AaVhPww@t2OIWrukCtU6MMI-LBOnshh~^E! zT{x2(qJyw^;!TMWe1*f2dD6wT$*?|Z^_8#a*Ejia0$Eg% z`VUr}bFM>|s8tHHPAu=+#*Oj~`ps{VaNVv{1yh64Ve-DDDgZgyf;#(PcF?h2qT~D> z==*AD)qs$`sup4NXfK@tdEMX#aS^h+cn|Fhw&)o@{`XPf@QGhe+cs+(EH`|EIY|;# zE|vSas}$N+aTTh-GxerF1^Oh%5FUnA-yne|S1rvKqj6VTPHwbmd$ zQ~U7oq$6@SDc9~(nZZ{b%wCFN1% zFRUh&1++6-9yAIQkI19E%WFkG>6>9`m_=1s8xgjww4tAmg#|$$kwoBX*gFWeSqMvO4-gk_d z11+NwjKy0b#!VUI-rlE2jzSi+D{=(IrwQdmN7J@=4G7^Dg-o3yVl{y3Xl{+-idQ>O=8a95wExxeQSW$cE^ zkpm~>3_~XZ&!e4h*pPVMcdkT2hN94ynGLSmkFXWg5D{zWCx?9ji6Jpl{OPvF;f~=c z_{Kqtx5}54#_x@_j&+U62iHpWq{t^eSbuXMh85tx_39f7O{oy1ck*p%W{%e!GW4Zg z_@y!C_1y_@P*v0OO?v^D%!@&0OT`QsRM?`(KS!YoNy`scQ8DgoPI*~@mTeH(E{>f()jCff>%s{yb5gqXUL!`}}K4g(t7!feOzu-XNw<%%gInLL@S zK)j~z0!Hgv5`YPP(JpR(t(%(jldZsM8Pn(!SG(=O+N5ldUM@~5IB{_0#s0ebHNrdi zj&xa5)GCwtq%0rYw*%)`GCFzll5%cwkXm{CHH1A_tD;NK|Nb$XU7jWQ()&gz9H*4a z3lRzFjlkFxDnwqZYbw z%Ix|p%tfd<<)QNHV|}a+xg7{6$d$D*3!n!a3kVqV*O_s5qoao*oqt0DUzF+YT`2n$(1B#T)ITI{$?mgFe1fca8EvmhK5abyZcU>V!6r z$*ur18wm4*1*VSK_`C5go$fI~?*K1Oh~pZ~8H-e!(d)j4udS~9Z>0Tdfcl(kKMrwT zIJqL)N6Tl1iaIz;41W&P2|QBzRLSA76q_GxZ`aIqs*}5#v1l5vRyAu?c?>XyW;$%F zK%Kg(s=3Pfn;@DycU2QC=WBr003b17Ae$_bxc=jII|9mJH&Ld^VEOizpxJogzUw!Z zT@>^i2PK?#^){d%BA+Gjauua-x~NinD0w*n6{ZmTtaDYyJSu9)RlLTPH)?DgAp+guu5>l)oy_G;Li`(eBO>2kxyo9g7%lAijtiMMk<{~O#7ioe=s7f6}1Jk#ra14b7+z({s` z8%Le-@oCEXxCQWVgM~3@Py@J@T-|H-HaX|B8J8{=9`!zwirTPVI;2s$9G3hWls_%c zfPS4k18ai5k-qhgS;Lsj%xo8DrPL;&j`m*GKGBA|DJ_;&dz6BVAE z>92qeWpS#wD}k@iq_DrIPNdrN&T$B-+&LWe#zSRpMgWn17=qOyx!-#vO5&-e#MtST zpaT`G*tUC`J@?nc>sSTdtTrUn*kJsEdr*9-cfpi9&3#rT;~22@0Ke${8h|5Clmz$+ zZE%P^a=9qco(UW?ahmUQRHGM9rFze% zoJ~wjMNJ@2GB;9frHq&H$tW;Bp*#U zyg9}Pe$2lr@KgSg>;pSe(HimD_a6gLpcPmRowH~&9|H2MH(vLm&5i|KLpwV=un4lX z-577m09}61V}JM_IieAOkp_q{FkS%Yv=3+}GnMYw+r8`(h3t&8#9sdIc&+yzaN_#& z2Utv_RU#~-Qu=N-)fXMNAP}Z?Y@X{m4~ErbQW5@uN|5d zI80yQL|}TTs;g57W&i@y7waVvD1yo_*DaF~l`K0)%c7ipF%lKz4h3dFXT%)NkSNd8 zPu8Fd(3z9Vazl)h3hYpdDrisD0@mf=mly@C)h2mBcP*> z_B@g0%d};?L`gIU-8Cv}0c!i=%4NT`3FQWUfrvIr6CzVA^Xa^x7CPMgj(xAWs-?J9 zl^>Oz%(@BSGksrwEedefD&NMvM%ntk5(xvc$P_KkPJOX2s4ogfA=X%vH8`HlvQRxH%~KH zj8YjGI(dC_roU%nIm69vW!->5Tpqdlewjj$KM9aK(;~|^yHg7G>mF6OTKt%j_o|7Q zMaq~vw;QbH*WzO8bk-box=p%~u2RoMKS)`ZfgsmaW$KBdvyr`bkL(+oyq@VB`bT>! z`)ey!rG)v&lX<=ILrN8-LnKS|r}+Fx!y@|zUQ0o}N`ZqMYGb1a0VW2oc$zvp@K9vu z;Ub9X7m%bH92fwlgiY$e-*Jp(uz4X)^V)7>UCpn-(>CWq_GO@?&7S(lq#oh>3dF%O zw&)<#_!8z87P2QN-gGh`%b~6)$@IUzXw7Cpe;C65n2&=^QZK2ppCk?(3>GU5&BUI1 zx^4OZ#RFs(3V1Y{ks?lN(HU%C!GRkb+JNf_$VV{%Z$ad!bbiMxV6Ju8+hBWfXil*@ zUBN2iL{LmCPBbnRX;~*gk@hU=PdB9Jzl&%>;c1O5Ee9{Po8ah?XXQlCo-AMa*w6+C7m1<2LyM2upihD zI{b!Pep%LtfJBr}+gK({wP$8lIrV9j9L_s-Sp9p~$a)Nj zQk+zB?5DF^K0Qo5Tz2k(n`m5{-|B}a+Qa#I))6XP(R?(N&QXcHfEfSU{<`VwtEc3{ zbooY@1n^e?RSdX&ie{%j9zU}7kW-ltWEh}gINKFjnjY_yI%itwpN@F+E82Z-{-2_6 zrmYkj$vf{HIod=d0OiI)8j}bG0YxV;F1%S(z*{r5oB>+rZh@q`L`waEEGL9cpyZU- zpI$LYf@olqefEMJnMQ)q4j#lBaHW&pqjzCvF(!kJ$7vzac@}50*_`(oKk9;(_PY%t5bVZtMbnt55U5nr^F;{wC|X8!ZfQFoCl(+^m)xTjBooLt zqr|GuJdiG+d*aNb7p0fLvzaCuQZ}3CtUQGI#`_qKC|{cV8aXO))LTH z-kSm!*Bm@W(u&Zc6J`A!Nr<@Ao%=i_=n9^@kPU$g!TN!4vj%zE$RVRT1WoylOz38f zWANHDVzH%nqVF;)Vs>7%x0NY~wd$2kh1hP5AJX1^ddP%j$Bu{^2(-u7i<;~R;Wy_Z zy^%m_?VsF4fYFF|DK886yvO&)<}Czy?Tz_Bp=iZLph_1P9|F%5H-&|-0A>ak4~ZsiDr zL#(ah&HoULT|v+-A`*C8mObxu$QKr#`S@qa%`b5SoX1ld?2>-zJsParBddGthVG4< z^)F(7->t58cx^wqMxPN|Nvq?z3oGB!XsZqNP*VEYk3++Kg1!$QN8Y@BbLjn$03saj zm5COU$VQzk>S*ukVXwDq+a-Y5yC*?WVg88Mi-~DCCM_pd;8ac}x-& zo^P8nbu+;_4`CVDDK0o!R9BPP-Z^^XDdm@B2@;cY8JnYAIf3IEBRV>= z7y2(M60urvauh8>E*A7Y8kK|L8W_$WKUVaCtv@R(BURDJ-gjw6xH1hh53`}srGDGX zQWJJgql_4sgNM=aU76GyM^jzku7*kVmUW!wTPFu!O#Y&qKYlQ^y0oR-$jlRzoYC}Y zw74|2En89-QyB3lTK;(vduFsDcKz+s>wc@V+11sg!u2WHhRx5_j9*_z*P4E8%&&rR z6k^)2x>yKi(I31a`roeHhV@B<(Zt_#BN?(agPP{utiv=uaB2H6{tg$Nv!z&Glw-n>*8|M)! zVDf8pg+1sf_a9n}7p(UhLzV_Z`{UEs_3CQzxbY#VdbMSevf*NxNXK>n{MjLB&G;^< zmm#xHQeCs?%mCT9r?XSgv{`pDc!zcf{_<9NskM^Iy!7%5M_ zeS3R#QZ(>;jDCE!{<~o%gRxS*S;-J?u6Qxl{gM~^{Wc~VHr6Wb098FHZn6XvI*`Kr zw?|hT^gJpSEvB>U+vZi-RDri;yXA^|lY6J-`x`>^j?Nj-8N5wyVNY|r3NgR=)G^50 zEvyBBKB@#=aJZ7n(y+i7XmOG*s+J9*2_#bk30wnNO}C3k;B{fjof;kSKKREHS!JcE zQ3?bULA9?l3{vbsQ1K`^zZ2Ubyc|)VBzEI7Sf&>qciu_$tauXYjxe8cscy?y~r$>~3+MD-S%y!rHa z2YE$uegLhJN6nH`b)DEE*0hol#^H~S3-e>cVo#k^U&yWx3a)kS9|bWn5GMnub4ECE z@Z&Ao#fzuRU7jC|*jsye)WR$zC7|TVq03%gyf4#@IPQJMn#;c1R2N|i!EOB8JIJL}UfV;iLTW?U#@N~NB7RFT zNurO;B8ZWMw>jM=jSr7Fqp4DH##rbbjQV)lr=(+8-}oA=JYv!V?DtF13g}IJ`(*1Z zUS0UhKHWyATMu1IM4p&InKlSH2~+0+?tL_wtOKi;`grYX9XqM#erzlw*LNq=Wi;)P zSG<>x-06ZGw?jiP54IZL#K0e5JH>tV=~ww*?st!|6YE_b_~O)cPDA`x7o5IXD1Prz z)Nsr9P?pGD84eZws)%iQ+MwM_LvaeeMR(}OpjVxLma?K^F(auu#`7+mqxhGI8+aCh zL|=vV4Lp4Mb1UY{j2M<3b&H!*?P4HfRU@R7&si0Vo3;^!Bu%$r0|%`Rw|s**Pp#nn z*k6k`0@(qX{G}4RfP4dd1Gi8}Q`5|+?*2?H*Mo(^!Zv{OvQc&irANmmeuFK;exCS7 z=gVDc@a(C`Yr{6_a^PMD)>L4Phyrc{pnd~eu=U@B2e{ic-%Bb}ec(^>_Y(5#-;c)se)j+2uPeU1eRH$&$DyX17FQu6;LFLu K)&4%2&iX%}VW}tp literal 0 HcmV?d00001 diff --git a/PresentValueSeries/Images/SM-Thumbnail-S01-288x142.png b/PresentValueSeries/Images/SM-Thumbnail-S01-288x142.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4c699227fede55eb06c39b82e7938550137814 GIT binary patch literal 65447 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%0AkyvdG>psD9cqYO!rJLTdcC|2#ky}dp|S5 zjCSle?#SlzU{e?w$&Y2ijWNsvBjdyQeiSD*t@2CCbAB(VmJR5ky?0-hryKN_8D_PKOnMS9@kD1XbJ#gFLt2pv-u6{U6v!&NbL#omdG$S($CzW3&JA(;Ni>;2NE7=NPyKH>MZI^Q7UvAO?; zxVQPWWy$h`ek(HfKIh*1>bttCySm+N+GEwi^2MijJ?mfuc}SHckbRhGcsbu ziuD~UBC=X~(KTq?@%=nb>$>9d^d#9FZE?P^6P|N*tu;-nzmG7%&1kTFN(bt7cZiDc zOa@5#Hh()Sr184%n0>YDc70!sxDW6js+kbut&TBA;NU>q?8{`#@V5J%HT#N0o>)Ll zEgP5HcJi)>mY~lABrfCNLuZp9GO=k+PVKBaV%oMz$5{4Pov0GfKNvunW<-(4?0ffq z1)NEds@20*FK44f?w4)!55XF^qZRVl%<ILD$&R}s$)+Tno)$#6kbM#ywnb*OIyEsRFSo9R7AC*ZVw zyEI#=K==K=QR_4P-}haz|2E71i_E5)Vc4C%mbRo-0)*f{t{H*q&~$TT>^}{ptxAJt@VDdy zWxS1J|154PmSUL=6B#XGn2*js5`R~fZ!#?*-uq%O9%0H({V~(+n0e-sfhVIl$dP$a zD$`SB^VmB>>F6Xv#ztL->JL}$cYQzGyraqTsdnN3b#j`I&kA%1+?moC>1YUYGEx@B zobv*oIT%^%E>Lh}4@SGtwoUGb)1RGOBG_37@Qv#yFl4^BJ#`}^ENr&ogr>k#ks-+! zJJ`KkpWFL>FVS|qO0K^U)y%Oq65;Imy^BKnv)e8c*+Ke!EbsWYOs!HmfShG(lEKDR zyQ~@J=7aa%C#TY9K98(YW;>t{j?a=EnC?YQf%k)*{0uq^I7s6?@{-K60~$9E{Q2p- zdf8H6I}C(~V`8V<`ROS3iH(5-uN5s6`!klw7nLnJTfGJZM?1jE&;gfn$Pi)FKQ-tV zzJ$>kJI`4C(asu7a-VSrdYJ%k3|E^mo~rV+gr#n@H^M`1obG#M+%+Pc*0TtTeaEsa zy2-iB+&?`%fe3hddct?V`(2#QC!Ee_7?*tKJKvUUh-F1*#_1&M$!!h!PuHK|{rmU$ z`0*pQZIj49t$6?bJ!BTU#YUcH^s)sAMT;{~2;zV~1OpaEOnA+odG^lg@MGph!oVCV zYCzw^2C{c0^RGLsX4E6~Bkw0r6ht2Nq6?H_4+DFTwraigRVp9PUFH2^kP-?NW|)tJ zeQ?0y%}KC&)>p3MW(7w+IQErGgK6S+Xd=w-(%UE4GA+&>x!q|9hTmOJLRMy zDuS&#ESLx{Q{uM_x+!>vZse}tzMh>TcqxfUJ)<3?_eQg();)Xat3y-`ra}1UFFf9u z)CH6SHl~f$Mh~?WT2J)VlCo*dWVV`BgJLfA2H`1uXTAwMFpm;B=${av1;wTI(pH!kO6Qu&# zd>-B>4@N2;OxJAthRan?{oOY;fEdfNVm-?;2|N6&%wij^vva37N9se-L1o+%{_VNq z&0w>>4PL6((^;1UQ<`;VkyFJ1wNI0EHZaB617zkJ&i4c7xVYuHujrRVUVkZAc@oFY7)$38zCzhGbZ5+a{+% zUnP@KXhfVZV1X^q3|mC%YSgfvR$XGVs)5OBhqYKDN0L#_2xFKTZj(_XJUpD!>9Hwe zX!xE#O<(0cjX?}Yt?M!!b(0_Ntp@^YPz9(PXd7R{4f$w0lWm1*cHJ%?vTEps>j=wa zyXE}mdUKgs`O#6oA1KIjIQmxuR!5C#nQ=8>SFS`fxiZ;Gq#tR51Aij7 zr6${YMD9u7^A-{nFO+ydA=CbfPGEqSuqoJ<3uhj#d_Uu#IdY6nX8bnz`-k^tJT+;u z@I@A?cLhpnrz0`|CGe6D{;(5(Hwy?_)kF^e!5(ncpJYz9VaDqosHWJ}QV_kyXcVo= zX|pG+r+k=|j92fn3S+YXrt`kg0a;Q;*MPOH3}BX}r`#o|uNjhn*yBbcX781bBwgmu zXHFW|*D5||n4&_bpz<>E_!s#!5pnFF>74|Y!5q3e+4{Afk<((ETqfx2O~C7w`+-vZ>bO;i2lFpkXNG3UB9nW5?|sq@To zN)i#UY)v*uCpjcw)tRf#%>(O3r(qEBAlUxZU3{00UTSRoLLm7=YU>xl1qXc|R|**9 zvg2&84V%wwCh?4Yw zGxp73PFc(tf&kgjp^6OwHD=OihAaz^knN3U?`qwejbZ&XxKb?3pDt;I(4=Wo;X5Xoj93fU6&=GBc$cJ5je4|n2~1247=ONsdiJY zC!f+-4mAKH8{X#p*Ji^0icue7#NFS8tAc0_^;DR$eNq+jy`b9cUj9C2pWT8pE`f9A zz~ny6pN}wEzm$H`64xBGn&GQ%oNn*K`yym(bw^;MxkH%n;Xa1xx(HV0eq?$vydASS zk2II@>-&KvIggxN5u=m2}RN)hDIBb?1z;Yk6qR` z%tpCpiu>z9bVKo^-=_6N9fk8bGA0vmgKb=Bp00^Df49cU&82wCNAqb%FQ z1~HR>nnKe#Wl)D*;FCpW%Oq#s4=SU~7d6;l`6Z+HNbl3DvXWo7-wC=KUmV*~73afT zWjg!buzqma^@@G(x<{>SPm#0E%V5t5aOl+S%jwC616jXVfw1jlX=vDgZE5K=`vuD) zTarn?B{p%rUVM_R>qMB1_vv(k1?=qp-aBa5HX31}1&!rE6zh^&GWwb2WB6+!2S&RK z*&Ir$*urdPuw?nEcK#vYO>X00q&cg{aqD+okEMmM&Pzrxrla%sWm!B)%MSdo6$Q3u zbMIZZojC^hz-Hg<4m)=Vx_W%X&X`yjyfe@QH@k{bQHW<2#S%bozJfeHNdCqL08y-)b?;RC+At^i9$AOn72N8csI__}R)e0=n_ zw{1r=W0irY>%~*OvPA59xdwo?42&Z%U>S(&=LcQf>6ViIi@Kltz{7VM z%GG*?J8s;#{J90#zw(O?--5Yr1_1#Vj&@Ikbi-*~bq4B+^Z6`e-sC8B8Rn+^Bul&c z-d#Z2iF3E?wS4it=lAe@$ICh=60?3${ZgfEbHxFqQ`4LGgKKj0Un11Q=b^cGzVXz_A3{ z`=$2{o+P79saq-6QOW6Y@2NDIHRDKnQQLSIoQwqXB7l(99EKDlX43af4tCgg+xJg8 zBQvIY@W(20eQ6EV(W}#MIfKui7+sAv-wQ7WbPqL@09W}vFj8J_=HxPX8DTgkTgL-; zguE25HJhlDeNuPcWvR`RWX0L(=wgSOrZO$A*>WU7F%PgNSaTq2AS2haHl-#;dSt2; zzBTymJCWlK)?Y^#rC_8Pi|n?^u1lJ?T{c&j<;_>$7J?DWl`PP)0DkC)?fn<(DT1|@ zA>jdVr5ElBL+|LD1XI^#IT)jJ19&vJ`Nn79!kRb7Bb@c%m(lsO4!MDzU zl?hq<0N9kVRb_oCMT+efLwn0ej$QpeYL^58TUBh>iq z*e_S7X`FKX794U|dMpieJ(lb^lZnM*D&xclq3!{(@mV@RCmN{myG9-K%FU|)ijk;F zoq6)4whA9V4-8U*)p2hbI`Ik*{;-TmNAKi3WczAK06GVXbB1g9X|A`@#H42tvQD%s z?YJz_aX0uzRw`MA{xQ%E((@6O$bMuZ#De~DB~X@?xjvJdxO1u2vk4;Ga>Hya z%bx4pb$gDmJFE{cwc}q%eNnd1IV(IJ%esUV)V&J(vdAPPcMz?*99R-A2n*KJ2@j7C z5}&xp;A9Dl`!LZ}I1@@9Kle(8=piNR`n_>(w`%vPDyV+&>r0NWRn)+_F-oDm5 z&kQ`c*t`cD9c0k`D)pV)MY1q!v4@#5p)Fel2z}c?L=x2NjMKvz=Z6P3atXlaKl>b~ z^BF(+$xre4_<&_u@wKmi9s9Q9!^aPJ{rWY&`1}i8uNQp%8{fdb?KnT2@r`eM1Lub` z-hTNdE|-fgbCD%M+qNOnwslz$vo99{vT-QEIO(<;3OTByhGaGjZV^N{u<-gis`D)Y z(JIsd6^vsj&lJzu$C};9 z7tl<3+l+pCA6&ttpck>|l6*_XmML2|crvbrhfZ4we`+45J{D8GzGwd!C}oKf>RTi_ z#WJ;-W!dWWdc}3S>Rvixm@YO$y5v)TWA8skjAC$;O1qZE!kIqN#o)9>Uv3BMayi#K z5mA{s>BZsEvXM2KX?t!)RVPi#Zrg^PY|>;GGm#Tb5vdWL` zBjYiGEPu1r14cvk#RHJ)+)yK&eVJ5b*?3vZ4BAXyflVvM2|w9+w%pqk9|*)?elKVJ z6fj(Du-a+4{%oh(dt7KN$U1%>`#6@ZI`~#FEe9X-Dax_D8t%y44#=^$6LlTiJO(dk zeaX12qG8tjJo_-)90t>IoC21R71Eb67{RH18gLzB?kBRFla_eu=;ZO?dp(@#*jKsV zQ~Q;6f``YtrT?~xyU_GeCm>gm;Lbcy#xR6Rd?X$1I%rbAuTWu|$bss69zpQej-)aw zwaJ@9nQ1*Lzq7tA;3nOi>6j6Vl(T!In@(zn24DK0B1uGhC!~ZD2iwJ ztXjg)6*Y592Z=&yQzM^|223z(&;x|F5Z=6gjn{A9;O*PDSknxB-*>!!_YO}_5BTP{ zzKJhB{{olG1z-ExXSiN2`26#q;pyoKZ{NPdx-NKp^$Oqq_P6o)>JhJBy~4Y9@9_5R zTfBewPWQ5DlJ?yhi!!bo^eTX}ky|rZX4o*=)d!KFF^5i4%bXkmyc5F9vVV`#S_wh3mqaUheVr4v+71;nW+Hqq!T&t zSri8*KMwEb{vLar%Z;%;%4usp8nOtm?_T&sF%$^IY}(v_!5`P_6}!zccL{`^%vf4i&E#6#Xw29< zHmnA)w=Dpe!$M{VkNwW$Hya1j=lNOE^8-4hjqJ#Yat#csoG06dPRod6Po+B1jqJ0( z7KkQYn%C2z7m?+v1|3p%U!qr#ECrz+v`2^W&nU9~&nNl9mZS1}79jI7#%s1`5W^?@ zWY0eh0BZ2B?|oVyGXuS2x0aKsVyi9;A4oQhZPLy*{9UpRyJn)UYiyi8l6EzSk9e{^ zjWg%P=}F8v3mV6E1~uDF>ha1@54y_PmPgnkmnyk6mR)=(pW93_$}tkWpWB~aMtg-{ z23eV8_IQl}$LiqM?_-&qeKb1-ckFNeeqiqs1Um*h#vq{C)B$50jxpPd&G4Gv%h|-G zuNmGHL`>rBM&E8KaEA@BV8KfarlC&8Tt0!#|dF!MZMRY^Z-xleQUX zgvP>O-DPCT@JpaI*oqNN=;E;ZVv>-ZPYomE9^F73G@{5#x|2+h4TGUDm;lE>IKMvB z$L)?D%KF=Ac6N<-*8?Yg3h(gn{UAiO*2%L>xQC1?>lADD0U?ZavZ!iL?aC5fBEqsR z_{KNC0YH|T7-Kzse8NY31T$kjt-5ieEQ5Xe_=GRN{1P8NNG9O-zV|)6d-o1M{pru} z^zkFU`K@o^)#EFyrxU*R^{?Z@`w#f?%P;W77oUTB$GR@E*Bamo7?g#%_9+=-2gA>K zdQd#})s1jl29*>thZ2`1y`&qLcNJ8^P<`(@6W?kORh#L_sbOZ{Of$(6DNpfI^9&V{ ze0Sx_fe!AQ29&?e6w^>&6^1WqVcOUL_knOrYu<=4GwjxlmS@)Fp`~EtXLNJanJz}~ zi!F5nBuL(L>1AuNbY$V!sbn3>6{sE^}cgNIqRZSyAUEGHE0wPzzrB8s{6LN@m>cv|IQhV zd34NS2pqxjB;%rZgalfy+ZEUA#g~|vPFzo`&zM@~pB$*A%jJ?|T%kyYeA2yU^yKWT zmtI2pHkiS1neO~MbBxU-nvm@Qha>A%gOh~rjLc*lWm%UfK9u*(5SL(};TdjB8w_j) zp9ci3166xWC1?WEX2?aC50o<0RkjwF9gF~*Txf+JiHw8%zV9_h!K<~+IqV7zbeMSV38 z=Q^q5Cf;j5Qxheqob_fcPlQS4nZcdpdjY@#O`(0+aF8bHrZz26@n5UFyFo7#{dnv5 z%<{}sUi8V0_lj2I5kF?flmB@FN|wDA=srM#2r4pwl>L+C(9t0e9uObu7ES1(l4ytL zCHu>C;SoCp8~4JoPOAxdN4s>?)Cn6-W0Sz7iE0kHCILXn{M&Vp*sj}CSVo-dw<@+{ zxKck~8u**h)Cj9hI^?#Q;U|UL1a^lkTc$>6`{FQzkYW@a%*|!avMzX_2ju0U1oD8V zoiu!YIOBYNz=sbXaJf7I)WFzMKL#BNn~>pR3;D#ytH=(qA*1%-0xXT>fqcw5}TPTh>$A_s`Y6!O;ko^=GtZ-}O=0^XAi-ylY0M z02$pq1);nAAf=~x_tkafAxnZ zs%wVY@hbdA!}rN=zdh7xLA|JMR8|zqh++f9IAEjh$3YN9wVqbIe)S69`~LUv;~)PR zAD^CNqw8(Mw#mUA>-miDeCInjKb+A>PVoKWXP@KU`}eqR8@~Vj@8NpA;$QrWe+e+- za=GB$`}g?r-Is!}w&0uJ`X-ij#TQ?E;WHDL%SDLT9B|U5F{vNa+5a8y_YbaO49p9Ex4QD@OLLoXX`I%Y%`8R5wY(7 zwPM@$QW=rZ_O|b-L5?87FXDO$F7tgiie3i5O#>j?M9;u9>nlyZ9m))J|FUw&HvPGN zy7IkODGVVm%qd`FfoS$2jx z4!tpS(&)zxSBknP^@o8Ar z*kKtB78uC=9d*`>-^p5X!@dS^y)MNWcaFXO(uvU9b&I7aE%A!kEF&ed^0(1|2JwuJ ztoI&-SDX=IPr=h^l>p!pa^bnGzdSzmH^AJZO&zQV_*LWFvQDx+WpdW)sxrquDV!ch zZE_3|bp&Zv-9Fcyvyq)ED3Om*-tcM@5Ls8(_u_qXj$W=y4R3H9+^T!*@7-FpuE@l* z`>m9-0IX-27PzFJ^-zWwyVmkMd8|Sf*;tJMw0v5mO(y5%UR6U@S(3*-g4(8gg1Lzz z0Pb{yyw94oQ-5ahSu-F>aTU*d@7_)gV#Obu(}4K&fP$ANUqy7d2K|@)6R-6v8je{8 z=1+T8s3Pf;neA)O$~X*_QhGh#tP_-phbZ_m^Hl`=klvGLNox(`FEYvMvffAFAm}l= z9C|VAp)_{+w%ueiv5rggD=sW}VRUW$Gs@JEEmNc>+aa!$-Nkkwh8&X7`>y(GbDup= zV0b@fL@`_*z(vJd^y0?ri9Z595?x zcr&--XD!3@E=?<%14^#cOz@_qA4+_b3;Io@~s<%O%2ty$cZtJ zj}Ks$rLAwj{1P9YK7t_3{qF5M{NxY*0PDJky+*tZ?qb;JAj@A3BSTVFc!`0#+o z$49(-_YT{>`M_A_ox$f)8F0=jLLBxeGcXbbbi1G09%j%$AAaZ15mu>^18DF zK&VTK!`WqwOTWXn3Fz&+EuXnwuXws#JiycY4kF)qPhCci9;VzbjQ$AaRoiU2`dFHxf59dpQ!*Si*g?bZ z3i~0;_E0u+?x$VMu@d3f7j>8$l`+V19wKoJt$#V-mB-wFyR(&?Pwm4vP9aykeX=&@|AbJXuyNpidDWtUuD zhuPc48#xeoFWYSFtwCb&n#_*?%h8$5 zl*`qT6&c=rqHW)MTJ~!v)Ng(gFc>wMLc=F2j~^c1csi9x9*l8*ah57r% z?nyjtHnFRZM3Vu1MyAqxi#p7X5PKwahd0NeD{X?V!W@}!tu1(be8j`UgD(L-=_$Z= zg0j(FJ}KI~8`Ft4rZu>oc`I9O(CyJEBVwR$f=R)AugdlDdy=;l<64r$ZU%BKX~Lc* zJ>}z5UZ{V$1A1u&;3$Gq9rn*b`c5uRkCVhsG&HH7hN^?hLx@yC6F3w}ZA()az;?aj z!-tQWg#oOmwbZ?yR$T@oPE+TOt1fx$`;NWuc+kTVTzTl*+!?3!g!k{?;r+Y!cz8HV zu*4aaeb&PJejtEj{{>xxAv?iW2>JA>LPTaNNjEUB0Z7{ev5{m5MwW&!s?Yi}@ZsYJ z{Oo5x#c4g^SAXyW-BA9xS-91oPY|{`&DkzxM;b~-d{gCH@RKz@<#&*IsQzSNy577{ zRsFnu-71mBa~Qirzh|$_icINZUPZRLdh-QzHEF24(u%{zrx21Uk z^a89~FQK{0b9M0~Z{UeOyzXE{50a5yN{qyKPLMwIFw zvayYq$}$|P{G~8>Hsc`MC}n!bp-Ral=c>cX>&eKREr&ECs5tY8Jr!AJg)f&2E>BNt zKntJChRGTLJf*`w+Tw;MO@Q+8Ft|{Qu)=NQUueZ>AYDZwQ|(*?glpT9^&hX;L|V{X z)MfgNxtL?6L&XvE!HtsBfDp_;JsPPtF04NoW<2M<;&9De;xTxd?T%4xhC$Cx_cc%^ z8H~FIg)f&2uDUnzu8x&$FmKyK*vg7Apl&>B`yh4;eo|Uq?{LMI620&0#L04~^Z6tv z|KheT$r*vi3;^-Iuj`{Fk7lfnP-sb?~|@f#dMPfj&0gCI)}N8$=2vgcIJY|hdK{q zGzKro$H^Quz#L3%IR(QH{>cD0Xx6U^S8m_%oZ^Ym+lfw`(_6q<_{Y#%H5EEd3nHhMvlO7#Shc&rsfRHPDIMF68=te6LXr zKtz*aFUEP*d>gG%ClMkDC8yFxaI8?F+dS+6z_y4k z-?q(HaO}Gs_5oQQt(lQ_`S&am5+jh0i-Uf&kFpFhTC;vq!p21Jrng+q0GSQ~pH2hG zk}|u>Y%KWwXh)K^9yR!P#_1HN|N4rLWC!GlkprAXc4tXp+pAP;WMmp|hAnRQBj{fw zA%#wj*gyp9W)p8C-1%ST_?`U*+@R5yTQy9E}`8BEv%Tn@T zV7O4&d-pzCkgxB%G-Lalfy;hAL?rv2ksPhfz59%K&S2ZNO)~$qJ~PM(z}xG^k^T1V zmw5g9H6G3nIGs+4m*7GV2>RelAIIgq^O-W~^@x+~mWMF0y?FBS8+qSSt82MD94U)(k5hU0aE6mB|1FKhKqgZHm2gvz(g>YU=^a96FC@%2FcWhu@O%?KiBQ;vF~D2S=MB1HkyZko~hm`?E-c96K_W5h{}Z& z{Il!|f-KuJ=Rr9XNFI65PGr~El}y?sWy*gZyu^iCRf$*R*!K+ z&a#PdiAs`9az{u<)?Mveh*Sn_;x&ZB-D~D-1dO-K8@_8B^}YLjiSpI?I*N(7$HV)8 z;cVVtF6I1Ql2kUI5A$5h5Ymbj1OZ2XH%L!`VmB|4EVGyB!G zkmAcSC4)|GSOx`uRkC}(#?AvScl~vPyGX`#F{i_^ZrD9ZwjDH%${rt;8L{N%#(Hna z)>=BtoRPK+=A@4R5Ha+y*CMm>yUemTobB7!I|}U!EtBfowt0_p5KGA>EgETUzy3b$H~m=UA8H>>i60!6(?EG8}>R8TaSOK(kxSuC&w3 z%`Vm=$uy=doz2p#IbMa7>v*8Mp@JWbLErj@T?P4xb6hT`xfwv0EaNoswW--nq>w# z6?I)#UlMb@T(w$uf|79x;dDNq{iL40?;cztl9b%*^$GxZ{rWXtzk2PzEVKSH+rOkkKMIPerpy~Y4VRP(ckZtI-hB2MKKtx5T%IoI zb_mF1OiSM>|E00!^j?B%K#~Ym{gdD1OlO#D3zcP9BN{1xc?QSF$8>mLvw4Sm (D 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 bBqT|Ft|m8$fxPdZX~CfH*3pT4&#hL= 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 bNC%4|(0c;>G^BM99> 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 z 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 XMC;u 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%0A`9e_Sb)0<0&t9+N#xIlr0?DQt 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 z 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

`sy-S5DwA!X8g>cF0XEZ=6 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]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%0AUx?)gWsa6LB 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

0+Vpm@GLw@q?ug&pBiwu1X{1lS=1RKzx& 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 ?a%(yrH5rc6-h15AoBk4W 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�*QKNp!F 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≦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�V=L*M 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˪FbvpiHs(U4kk_#uSCP+TuSJ!n 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 R;9l>Zzf(gbSEQEG5u4ovm118x;1 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

^BbWi%&a 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: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

jkX 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 z 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�j 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 k}F}|<>ryjUVmJgv?m%8jU-tdVe;yfPlLr@ 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%0AeM*oVK>oC=Ei~Z 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