From 797bc752e1f3c4afddf2bcda9eec8bccf19a3b93 Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Wed, 2 Nov 2022 13:40:47 +0100 Subject: [PATCH 01/19] Develop (with removed Arithmetic) to Main (#63) * base code * correct broken links * fixed Opening re-import * Rename "PvBase" to "PresentValue" (#32) * include new default spaces * reorder global metadata using alphabetical order * 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 * Including FX positions to FP scope * FP specification nb - add FX aoc step * 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 * new data node factory * metadata * metadata x2 * metadata x3 * implement feedback * split directories * fix tests + add readme + seperate overview nb * include changes on factory * adapt to the split * update packages and fix csm with bm * approaching * better * implement feedback * final feedback * fix * const version ce * Update links (#51) * working on links * read me * remove redundant code * clean up * AocConfiguration ImportFormat * remove reference to init from Overview * removal arithmetics * Simple value test data (#54) * Adding data files * Fix input * Fix input * change to importers test * Fix to sign * Int convention * reset consts * implement feedback part 1 * Overview texts (#53) * Overview (Template), revised text * Reports of template with small adjustments * Overview IFRS17, some adjustments * finalized + hot fixes * ReportGridOptions * final fixes and feedback implementations Co-authored-by: Sara Busato Co-authored-by: sbusato <103484221+sbusato@users.noreply.github.com> Co-authored-by: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Co-authored-by: nnikolopoulos Co-authored-by: Andrea Muolo Co-authored-by: amuolo Co-authored-by: Daniel Trzesniak Co-authored-by: UMueller1 <108468853+UMueller1@users.noreply.github.com> --- README.md | 1 - full-ifrs17-template/Constants/Consts.ipynb | 28 + full-ifrs17-template/Database/.gitignore | 1 + full-ifrs17-template/Database/Configure.ipynb | 93 + .../Database/Schema Delete.ipynb | 63 + full-ifrs17-template/Export/MapTemplate.ipynb | 232 ++ .../300.ReportingNodes/ReportingNodes.csv | 10 + .../DataNodeParameters_CH_2020_12.csv | 22 + .../DataNodeStates_CH_2020_12.csv | 20 + .../Files/700.DataNodes/DataNodes_CH.csv | 38 + .../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 + .../SimpleValue_CH_2020_12.csv | 44 + .../Files/DimensionsAndPartitions.csv | 256 +++ full-ifrs17-template/Images/ActualFormat.png | Bin 0 -> 25544 bytes .../Images/CashflowFormat.png | Bin 0 -> 66204 bytes full-ifrs17-template/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 .../InitSystemorphBaseToMemory.ipynb | 195 ++ .../InitSystemorphToDatabase.ipynb | 209 ++ .../InitSystemorphToMemory.ipynb | 107 + .../InputFormatDescription.ipynb | 101 + LICENSE => full-ifrs17-template/LICENSE | 0 .../OverviewIFRS17Template.ipynb | 144 ++ full-ifrs17-template/README.md | 36 + full-ifrs17-template/Report/Reports.ipynb | 408 ++++ .../Test/AocStructureTest.ipynb | 568 +++++ .../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 | 20 + .../BM_CH_2020_12_F.csv | 16 + .../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 | 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 ++ ...ableBenchmarks_2020_12_CH__Contractual.csv | 537 +++++ ...iableBenchmarks_2021_3_CH__Contractual.csv | 1114 +++++++++ .../Test/ExportIfrsVariable.ipynb | 96 + .../Test/ExportReportVariables.ipynb | 136 ++ .../Test/IfrsVariablesTest.ipynb | 268 +++ .../Test/ImportStorageTest.ipynb | 595 +++++ .../Test/MapTemplateAndImportTest.ipynb | 487 ++++ .../Test/ReportStorageTest.ipynb | 91 + .../Test/ReportVariablesTest.ipynb | 164 ++ .../Test/ReportVariablesTestBase.ipynb | 135 ++ .../SpecificationsFinancialPerformance.ipynb | 1461 ++++++++++++ .../Test/SpecificationsImportActuals.ipynb | 507 +++++ .../Test/SpecificationsImportCashflows.ipynb | 1996 ++++++++++++++++ .../Test/SpecificationsSetup.ipynb | 125 + .../Test/SpecificationsTechnicalMargin.ipynb | 1768 +++++++++++++++ .../Test/TechnicalMarginTest.ipynb | 259 +++ full-ifrs17-template/Test/Tests.ipynb | 117 + ifrs17/CalculationEngine.ipynb | 30 + ifrs17/Constants/Consts.ipynb | 275 +++ ifrs17/Constants/Enums.ipynb | 193 ++ ifrs17/Constants/Validations.ipynb | 173 ++ ifrs17/DataModel/DataStructure.ipynb | 1741 ++++++++++++++ ifrs17/Export/ExportConfiguration.ipynb | 206 ++ ifrs17/Images/BigPicture.PNG | Bin 0 -> 38530 bytes ifrs17/Images/Systemorph_logo.png | Bin 0 -> 17061 bytes ifrs17/Import/ImportScopeCalculation.ipynb | 2009 +++++++++++++++++ ifrs17/Import/ImportStorage.ipynb | 371 +++ ifrs17/Import/Importers.ipynb | 1171 ++++++++++ ifrs17/LICENSE | 21 + ifrs17/OverviewCalculationEngine.ipynb | 166 ++ ifrs17/README.md | 29 + .../Report/ReportConfigurationAndUtils.ipynb | 151 ++ ifrs17/Report/ReportScopes.ipynb | 875 +++++++ ifrs17/Report/ReportStorage.ipynb | 219 ++ ifrs17/Test/AocConfigurationTest.ipynb | 328 +++ ifrs17/Test/QueriesTest.ipynb | 425 ++++ ifrs17/Test/Tests.ipynb | 37 + ifrs17/Utils/ApplicationMessage.ipynb | 118 + ifrs17/Utils/Extensions.ipynb | 145 ++ ifrs17/Utils/ImportCalculationMethods.ipynb | 185 ++ ifrs17/Utils/Queries.ipynb | 320 +++ ifrs17/Utils/TestHelper.ipynb | 114 + 108 files changed, 23558 insertions(+), 1 deletion(-) delete mode 100644 README.md create mode 100644 full-ifrs17-template/Constants/Consts.ipynb create mode 100644 full-ifrs17-template/Database/.gitignore create mode 100644 full-ifrs17-template/Database/Configure.ipynb create mode 100644 full-ifrs17-template/Database/Schema Delete.ipynb create mode 100644 full-ifrs17-template/Export/MapTemplate.ipynb create mode 100644 full-ifrs17-template/Files/300.ReportingNodes/ReportingNodes.csv create mode 100644 full-ifrs17-template/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv create mode 100644 full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv create mode 100644 full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv create mode 100644 full-ifrs17-template/Files/800.Parameters/CreditDefaultRate.csv create mode 100644 full-ifrs17-template/Files/800.Parameters/ExchangeRate.csv create mode 100644 full-ifrs17-template/Files/800.Parameters/PartnerRating.csv create mode 100644 full-ifrs17-template/Files/800.Parameters/YieldCurve.csv create mode 100644 full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv create mode 100644 full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv create mode 100644 full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv create mode 100644 full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv create mode 100644 full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv create mode 100644 full-ifrs17-template/Files/900.TransactionalData/SimpleValue_CH_2020_12.csv create mode 100644 full-ifrs17-template/Files/DimensionsAndPartitions.csv create mode 100644 full-ifrs17-template/Images/ActualFormat.png create mode 100644 full-ifrs17-template/Images/CashflowFormat.png create mode 100644 full-ifrs17-template/Images/OpeningFormat.png create mode 100644 full-ifrs17-template/Images/SpecificationsCSM.PNG create mode 100644 full-ifrs17-template/Images/SpecificationsImportActuals.PNG create mode 100644 full-ifrs17-template/Images/SpecificationsImportCashflows.PNG create mode 100644 full-ifrs17-template/Images/SpecificationsPL.PNG create mode 100644 full-ifrs17-template/Images/Systemorph_logo.png create mode 100644 full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb create mode 100644 full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb create mode 100644 full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb create mode 100644 full-ifrs17-template/InputFormatDescription.ipynb 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 create mode 100644 full-ifrs17-template/Test/AocStructureTest.ipynb create mode 100644 full-ifrs17-template/Test/Data/CashflowComplex.csv create mode 100644 full-ifrs17-template/Test/Data/DataNodeParameter_Duplicate.csv create mode 100644 full-ifrs17-template/Test/Data/DataNodeParameter_InvalidDataNode.csv create mode 100644 full-ifrs17-template/Test/Data/DataNodeParameter_InvalidReinsCov.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_AA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BE.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv 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 create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_AAPA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BE.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv 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_OAPA.csv create mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_RA.csv create mode 100644 full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv create mode 100644 full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv create mode 100644 full-ifrs17-template/Test/ExportIfrsVariable.ipynb create mode 100644 full-ifrs17-template/Test/ExportReportVariables.ipynb create mode 100644 full-ifrs17-template/Test/IfrsVariablesTest.ipynb create mode 100644 full-ifrs17-template/Test/ImportStorageTest.ipynb create mode 100644 full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb create mode 100644 full-ifrs17-template/Test/ReportStorageTest.ipynb create mode 100644 full-ifrs17-template/Test/ReportVariablesTest.ipynb create mode 100644 full-ifrs17-template/Test/ReportVariablesTestBase.ipynb create mode 100644 full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb create mode 100644 full-ifrs17-template/Test/SpecificationsImportActuals.ipynb create mode 100644 full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb create mode 100644 full-ifrs17-template/Test/SpecificationsSetup.ipynb create mode 100644 full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb create mode 100644 full-ifrs17-template/Test/TechnicalMarginTest.ipynb create mode 100644 full-ifrs17-template/Test/Tests.ipynb create mode 100644 ifrs17/CalculationEngine.ipynb create mode 100644 ifrs17/Constants/Consts.ipynb create mode 100644 ifrs17/Constants/Enums.ipynb create mode 100644 ifrs17/Constants/Validations.ipynb create mode 100644 ifrs17/DataModel/DataStructure.ipynb create mode 100644 ifrs17/Export/ExportConfiguration.ipynb create mode 100644 ifrs17/Images/BigPicture.PNG create mode 100644 ifrs17/Images/Systemorph_logo.png create mode 100644 ifrs17/Import/ImportScopeCalculation.ipynb create mode 100644 ifrs17/Import/ImportStorage.ipynb create mode 100644 ifrs17/Import/Importers.ipynb create mode 100644 ifrs17/LICENSE create mode 100644 ifrs17/OverviewCalculationEngine.ipynb create mode 100644 ifrs17/README.md create mode 100644 ifrs17/Report/ReportConfigurationAndUtils.ipynb create mode 100644 ifrs17/Report/ReportScopes.ipynb create mode 100644 ifrs17/Report/ReportStorage.ipynb create mode 100644 ifrs17/Test/AocConfigurationTest.ipynb create mode 100644 ifrs17/Test/QueriesTest.ipynb create mode 100644 ifrs17/Test/Tests.ipynb create mode 100644 ifrs17/Utils/ApplicationMessage.ipynb create mode 100644 ifrs17/Utils/Extensions.ipynb create mode 100644 ifrs17/Utils/ImportCalculationMethods.ipynb create mode 100644 ifrs17/Utils/Queries.ipynb create mode 100644 ifrs17/Utils/TestHelper.ipynb 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/full-ifrs17-template/Constants/Consts.ipynb b/full-ifrs17-template/Constants/Consts.ipynb new file mode 100644 index 00000000..1ef5ee81 --- /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}\\\"\";" + ] + } + ] +} diff --git a/full-ifrs17-template/Database/.gitignore b/full-ifrs17-template/Database/.gitignore new file mode 100644 index 00000000..34be061b --- /dev/null +++ b/full-ifrs17-template/Database/.gitignore @@ -0,0 +1 @@ +PersonalConnection.ipynb \ No newline at end of file diff --git a/full-ifrs17-template/Database/Configure.ipynb b/full-ifrs17-template/Database/Configure.ipynb new file mode 100644 index 00000000..b332a43c --- /dev/null +++ b/full-ifrs17-template/Database/Configure.ipynb @@ -0,0 +1,93 @@ +{ + "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" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

DataSource Configuration

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"//ifrs17ce/dev/CalculationEngine\"" + ] + }, + { + "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/full-ifrs17-template/Database/Schema Delete.ipynb b/full-ifrs17-template/Database/Schema Delete.ipynb new file mode 100644 index 00000000..f1f25629 --- /dev/null +++ b/full-ifrs17-template/Database/Schema Delete.ipynb @@ -0,0 +1,63 @@ +{ + "metadata": { + "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, + "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/full-ifrs17-template/Export/MapTemplate.ipynb b/full-ifrs17-template/Export/MapTemplate.ipynb new file mode 100644 index 00000000..af901570 --- /dev/null +++ b/full-ifrs17-template/Export/MapTemplate.ipynb @@ -0,0 +1,232 @@ +{ + "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": [ + "

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": [ + "# 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/full-ifrs17-template/Files/300.ReportingNodes/ReportingNodes.csv b/full-ifrs17-template/Files/300.ReportingNodes/ReportingNodes.csv new file mode 100644 index 00000000..ffaab637 --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv b/full-ifrs17-template/Files/700.DataNodes/DataNodeParameters_CH_2020_12.csv new file mode 100644 index 00000000..19a655dc --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv b/full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv new file mode 100644 index 00000000..14a81d65 --- /dev/null +++ b/full-ifrs17-template/Files/700.DataNodes/DataNodeStates_CH_2020_12.csv @@ -0,0 +1,20 @@ +@@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, +DT5.1,Active, +DTR1.1,Active, +DTR1.2,Active, +DTR2.1,Active, +DTR2.2,Active, diff --git a/full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv b/full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv new file mode 100644 index 00000000..8862c011 --- /dev/null +++ b/full-ifrs17-template/Files/700.DataNodes/DataNodes_CH.csv @@ -0,0 +1,38 @@ +@@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, +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, +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 +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/800.Parameters/CreditDefaultRate.csv b/full-ifrs17-template/Files/800.Parameters/CreditDefaultRate.csv new file mode 100644 index 00000000..b39c644e --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/800.Parameters/ExchangeRate.csv b/full-ifrs17-template/Files/800.Parameters/ExchangeRate.csv new file mode 100644 index 00000000..8ac834c7 --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/800.Parameters/PartnerRating.csv b/full-ifrs17-template/Files/800.Parameters/PartnerRating.csv new file mode 100644 index 00000000..8f9d717c --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/800.Parameters/YieldCurve.csv b/full-ifrs17-template/Files/800.Parameters/YieldCurve.csv new file mode 100644 index 00000000..892b7ee7 --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv new file mode 100644 index 00000000..12bfc994 --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv b/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv new file mode 100644 index 00000000..d52bae26 --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv new file mode 100644 index 00000000..8808da31 --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv new file mode 100644 index 00000000..7bd3bdce --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv new file mode 100644 index 00000000..b52ac64c --- /dev/null +++ b/full-ifrs17-template/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/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/Files/DimensionsAndPartitions.csv b/full-ifrs17-template/Files/DimensionsAndPartitions.csv new file mode 100644 index 00000000..bcfe9d1d --- /dev/null +++ b/full-ifrs17-template/Files/DimensionsAndPartitions.csv @@ -0,0 +1,256 @@ +@@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 +,,,,,,,,,,, +@@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,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,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,,,,,,,,,, +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,,,,,,,, +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,,,,,,,,,, +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/full-ifrs17-template/Images/ActualFormat.png b/full-ifrs17-template/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/full-ifrs17-template/Images/OpeningFormat.png b/full-ifrs17-template/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/full-ifrs17-template/Images/SpecificationsCSM.PNG b/full-ifrs17-template/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/full-ifrs17-template/Images/SpecificationsImportActuals.PNG b/full-ifrs17-template/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/full-ifrs17-template/Images/SpecificationsImportCashflows.PNG b/full-ifrs17-template/Images/SpecificationsImportCashflows.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bcb093c83f1aeed76336d9853ce6074735e120e8 GIT binary patch literal 38471 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 z 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 In Memory Initialization of unconfigured DataSource

", + "\n

Reference Data and DataNode

", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Constants/Consts\"", + "\n#!eval calculationEngine" + ] + }, + { + "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 .WithTarget(DataSource)", + "\n .ExecuteAsync()" + ] + }, + { + "cell_type": "code", + "source": [ + "await Import.FromFile(\"../Files/DimensionsAndPartitions.csv\").WithFormat(ImportFormats.AocConfiguration).WithTarget(DataSource).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/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb new file mode 100644 index 00000000..9b7b5ab5 --- /dev/null +++ b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb @@ -0,0 +1,209 @@ +{ + "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": [ + "

Physical Database Initialization

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Database/Configure\"" + ] + }, + { + "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 .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/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb new file mode 100644 index 00000000..c9eb277e --- /dev/null +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -0,0 +1,107 @@ +{ + "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": [ + "

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": "code", + "source": [ + "//await UploadSimpleValueAsync(\"../Files/900.TransactionalData/SimpleValue_CH_2020_12.csv\") TODO: missing benchmarks" + ] + }, + { + "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/full-ifrs17-template/InputFormatDescription.ipynb b/full-ifrs17-template/InputFormatDescription.ipynb new file mode 100644 index 00000000..9dd70de5 --- /dev/null +++ b/full-ifrs17-template/InputFormatDescription.ipynb @@ -0,0 +1,101 @@ +{ + "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": [ + "

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](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](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](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. " + ] + }, + { + "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](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](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." + ] + }, + { + "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](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](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." + ] + } + ] +} \ No newline at end of file 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..026e24e4 --- /dev/null +++ b/full-ifrs17-template/OverviewIFRS17Template.ipynb @@ -0,0 +1,144 @@ +{ + "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", + "\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." + ] + }, + { + "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" + ] + }, + { + "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 supported, but not a subject of this notebook in its current state." + ] + }, + { + "cell_type": "markdown", + "source": [ + "", + "\n# Reports", + "\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)." + ] + }, + { + "cell_type": "markdown", + "source": [ + "" + ] + } + ] +} \ 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..682bf0c1 --- /dev/null +++ b/full-ifrs17-template/README.md @@ -0,0 +1,36 @@ +![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 + +# Supporting Material + +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 computed for our use-cases [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 IFRS 17 CalculationEngine get in contact with our Community: + +- [Community]() -link to the community page- +- [Evangelists]() -link to Evangelists page- \ 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..4caa201d --- /dev/null +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -0,0 +1,408 @@ +{ + "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": [ + "This is the notebook to be run for the production of all the reports." + ] + }, + { + "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 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" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Present Value", + "\n", + "\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 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/full-ifrs17-template/Test/AocStructureTest.ipynb b/full-ifrs17-template/Test/AocStructureTest.ipynb new file mode 100644 index 00000000..f279ad6f --- /dev/null +++ b/full-ifrs17-template/Test/AocStructureTest.ipynb @@ -0,0 +1,568 @@ +{ + "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": [ + "

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\", 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};" + ] + }, + { + "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\", 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};" + ] + }, + { + "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\", 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};" + ] + }, + { + "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/full-ifrs17-template/Test/Data/CashflowComplex.csv b/full-ifrs17-template/Test/Data/CashflowComplex.csv new file mode 100644 index 00000000..150c4a31 --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Test/Data/DataNodeParameter_Duplicate.csv b/full-ifrs17-template/Test/Data/DataNodeParameter_Duplicate.csv new file mode 100644 index 00000000..2c844eef --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidDataNode.csv b/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidDataNode.csv new file mode 100644 index 00000000..681a63c5 --- /dev/null +++ b/full-ifrs17-template/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/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidReinsCov.csv b/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidReinsCov.csv new file mode 100644 index 00000000..802ab7b7 --- /dev/null +++ b/full-ifrs17-template/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/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 new file mode 100644 index 00000000..1a81ddf9 --- /dev/null +++ b/full-ifrs17-template/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/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..d0c36f7e --- /dev/null +++ b/full-ifrs17-template/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/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 new file mode 100644 index 00000000..28224af3 --- /dev/null +++ b/full-ifrs17-template/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/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..8dbc1e48 --- /dev/null +++ b/full-ifrs17-template/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/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 new file mode 100644 index 00000000..66ec38ea --- /dev/null +++ b/full-ifrs17-template/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/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..061f2e7e --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_C.csv @@ -0,0 +1,40 @@ +@@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 new file mode 100644 index 00000000..900aadb2 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_DA.csv @@ -0,0 +1,20 @@ +@@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 new file mode 100644 index 00000000..8c0006b2 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_F.csv @@ -0,0 +1,16 @@ +@@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_OA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_OA.csv new file mode 100644 index 00000000..08356dd2 --- /dev/null +++ b/full-ifrs17-template/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/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..d61cc7d7 --- /dev/null +++ b/full-ifrs17-template/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/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 new file mode 100644 index 00000000..4411cdfd --- /dev/null +++ b/full-ifrs17-template/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/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..4364bf3b --- /dev/null +++ b/full-ifrs17-template/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/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 new file mode 100644 index 00000000..f489cba8 --- /dev/null +++ b/full-ifrs17-template/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/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 new file mode 100644 index 00000000..e25da1c5 --- /dev/null +++ b/full-ifrs17-template/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/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..e367c61e --- /dev/null +++ b/full-ifrs17-template/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/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 new file mode 100644 index 00000000..61c6344a --- /dev/null +++ b/full-ifrs17-template/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/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..fdf3a318 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_C.csv @@ -0,0 +1,54 @@ +@@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 new file mode 100644 index 00000000..be7fcf90 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_DA.csv @@ -0,0 +1,24 @@ +@@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 new file mode 100644 index 00000000..f7419efa --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_F.csv @@ -0,0 +1,16 @@ +@@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 new file mode 100644 index 00000000..9a6831e3 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_L.csv @@ -0,0 +1,23 @@ +@@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 new file mode 100644 index 00000000..0596dea4 --- /dev/null +++ b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_LR.csv @@ -0,0 +1,13 @@ +@@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 new file mode 100644 index 00000000..0b556852 --- /dev/null +++ b/full-ifrs17-template/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/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 new file mode 100644 index 00000000..8e8b0328 --- /dev/null +++ b/full-ifrs17-template/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/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..8009c335 --- /dev/null +++ b/full-ifrs17-template/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/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 new file mode 100644 index 00000000..80bfedb2 --- /dev/null +++ b/full-ifrs17-template/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,-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,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 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 new file mode 100644 index 00000000..bef760f1 --- /dev/null +++ b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv @@ -0,0 +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 diff --git a/full-ifrs17-template/Test/ExportIfrsVariable.ipynb b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb new file mode 100644 index 00000000..9d21556c --- /dev/null +++ b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb @@ -0,0 +1,96 @@ +{ + "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": [ + "

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/full-ifrs17-template/Test/ExportReportVariables.ipynb b/full-ifrs17-template/Test/ExportReportVariables.ipynb new file mode 100644 index 00000000..96db0b99 --- /dev/null +++ b/full-ifrs17-template/Test/ExportReportVariables.ipynb @@ -0,0 +1,136 @@ +{ + "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": [ + "

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/full-ifrs17-template/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb new file mode 100644 index 00000000..50a59c01 --- /dev/null +++ b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb @@ -0,0 +1,268 @@ +{ + "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": [ + "

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 foreach (var error in expectedNotComputed)", + "\n errors.Add(new BenchmarkTestResult(\"Extra expected variable for: \" + error));", + "\n if (computedNotExpected.Any())", + "\n foreach (var error in computedNotExpected)", + "\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())", + "\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();", + "\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()).DataSet;", + "\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 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 }", + "\n}", + "\nerrorList = errorList.Distinct().ToList();" + ] + }, + { + "cell_type": "code", + "source": [ + "errorList.Count().Should().Be(0);" + ] + }, + { + "cell_type": "code", + "source": [ + "errorList" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/full-ifrs17-template/Test/ImportStorageTest.ipynb b/full-ifrs17-template/Test/ImportStorageTest.ipynb new file mode 100644 index 00000000..effe2de0 --- /dev/null +++ b/full-ifrs17-template/Test/ImportStorageTest.ipynb @@ -0,0 +1,595 @@ +{ + "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 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/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb new file mode 100644 index 00000000..e0b58e97 --- /dev/null +++ b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb @@ -0,0 +1,487 @@ +{ + "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": [ + "

Test Map Template Export and Import

" + ] + }, + { + "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);" + ] + }, + { + "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);", + "\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)};", + "\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*/" + ] + }, + { + "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);" + ] + }, + { + "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);", + "\nvar tables = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet;", + "\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();", + "\n*/" + ] + }, + { + "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);" + ] + }, + { + "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);", + "\nvar tables = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet;", + "\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);", + "\n*/" + ] + }, + { + "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/full-ifrs17-template/Test/ReportStorageTest.ipynb b/full-ifrs17-template/Test/ReportStorageTest.ipynb new file mode 100644 index 00000000..5fc57968 --- /dev/null +++ b/full-ifrs17-template/Test/ReportStorageTest.ipynb @@ -0,0 +1,91 @@ +{ + "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": [ + "#!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/full-ifrs17-template/Test/ReportVariablesTest.ipynb b/full-ifrs17-template/Test/ReportVariablesTest.ipynb new file mode 100644 index 00000000..cbaca38e --- /dev/null +++ b/full-ifrs17-template/Test/ReportVariablesTest.ipynb @@ -0,0 +1,164 @@ +{ + "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": [ + "

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": [ + "## 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/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb new file mode 100644 index 00000000..99e9ac16 --- /dev/null +++ b/full-ifrs17-template/Test/ReportVariablesTestBase.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": [ + "

Report Variable Test Base

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Initialization/InitSystemorphToMemory\"" + ] + }, + { + "cell_type": "code", + "source": [ + "Workspace.InitializeFrom(DataSource);" + ] + }, + { + "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/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb new file mode 100644 index 00000000..7016fa12 --- /dev/null +++ b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb @@ -0,0 +1,1461 @@ +{ + "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(CurrencyGrouper(currencyType), \"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 new file mode 100644 index 00000000..8993aa5c --- /dev/null +++ b/full-ifrs17-template/Test/SpecificationsImportActuals.ipynb @@ -0,0 +1,507 @@ +{ + "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 new file mode 100644 index 00000000..12b9fc30 --- /dev/null +++ b/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb @@ -0,0 +1,1996 @@ +{ + "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 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](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\\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 => 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) );" + ] + }, + { + "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) );" + ] + }, + { + "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" + ] + }, + { + "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 - 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 = 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" + ] + }, + { + "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 new file mode 100644 index 00000000..335f1ca3 --- /dev/null +++ b/full-ifrs17-template/Test/SpecificationsSetup.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#" + }, + "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 ContractualServiceMaring 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 new file mode 100644 index 00000000..43191eec --- /dev/null +++ b/full-ifrs17-template/Test/SpecificationsTechnicalMargin.ipynb @@ -0,0 +1,1768 @@ +{ + "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/TechnicalMarginTest.ipynb b/full-ifrs17-template/Test/TechnicalMarginTest.ipynb new file mode 100644 index 00000000..827833ed --- /dev/null +++ b/full-ifrs17-template/Test/TechnicalMarginTest.ipynb @@ -0,0 +1,259 @@ +{ + "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 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/full-ifrs17-template/Test/Tests.ipynb b/full-ifrs17-template/Test/Tests.ipynb new file mode 100644 index 00000000..47f5ea85 --- /dev/null +++ b/full-ifrs17-template/Test/Tests.ipynb @@ -0,0 +1,117 @@ +{ + "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": [ + "

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 \"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/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/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb new file mode 100644 index 00000000..8c67e92e --- /dev/null +++ b/ifrs17/Constants/Consts.ipynb @@ -0,0 +1,275 @@ +{ + "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" + }, + "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 public const string AocConfiguration = nameof(AocConfiguration);", + "\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 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 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 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}" + ] + }, + { + "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/ifrs17/Constants/Enums.ipynb b/ifrs17/Constants/Enums.ipynb new file mode 100644 index 00000000..04c87848 --- /dev/null +++ b/ifrs17/Constants/Enums.ipynb @@ -0,0 +1,193 @@ +{ + "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" + }, + "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/ifrs17/Constants/Validations.ipynb b/ifrs17/Constants/Validations.ipynb new file mode 100644 index 00000000..afd2e82e --- /dev/null +++ b/ifrs17/Constants/Validations.ipynb @@ -0,0 +1,173 @@ +{ + "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" + }, + "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, ", + "\n AocTypeNotValid, AocTypeCompulsoryNotFound, AocTypePositionNotSupported, AocConfigurationOrderNotUnique,", + "\n // Partition", + "\n PartitionNotFound, ParsedPartitionNotFound, PartititionNameNotFound, PartitionTypeNotFound,", + "\n // Dimensions", + "\n AmountTypeNotFound, EstimateTypeNotFound, 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 (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]}.\",", + "\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.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/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb new file mode 100644 index 00000000..78851b13 --- /dev/null +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -0,0 +1,1741 @@ +{ + "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" + }, + "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.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\"" + ] + }, + { + "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## 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", + "\n [Dimension(typeof(PeriodType))]", + "\n public PeriodType PeriodType { 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(EstimateType))]", + "\n [IdentityProperty]", + "\n public string EstimateType { 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/ifrs17/Export/ExportConfiguration.ipynb b/ifrs17/Export/ExportConfiguration.ipynb new file mode 100644 index 00000000..e3fa8ad4 --- /dev/null +++ b/ifrs17/Export/ExportConfiguration.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/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 z^CQE~j@z~DCB>WN>$ZSzq9O+Ue$an;6d=pYJ3pBMypfVMY;eK>{FaIoUU|<+gwEu| zRjEY>d~g$O0a!|PE?E&Epi?{D3;w>Ttki`iyijOL8YUz&H+WK%*StIWug1PJ^a+hA z(V0_<2qC&pRsxJvXFu-zbvYn%X)WQy9<+sAy56}6#o7B<{evC|&|}Hi2w=7kH?C5} zb@$#n85xDR5njwYEe0n3A9J$&;uB=;MZK)>!tECvQb?()r!#i1sZ~!7B;-kYgPHVSqG| zf#)fd_@^$S)LyDTHi34Ro2#ZEZzB*FCj-Q@pd8oDz9#z zcJ~fXrO2A*07^jbJm__}SkM{d*aRT>!&gm?H!pKxhDTrm1Ea{a9-1_6Ha6G6`H ztQ)t3q?dyq(61Kzr-;o?Tp9CRnm2yLKy~IVW`70h(KOF;h4}z($TN~u$FqpDq#qNR zI~t#}Hh`CB+@c=|s{Yv&{V^yfux)zHQbsogpr~m8P%B- zt$9T2v=eaXzZqMSYimm~JNN*qKfjM}4CZ`pOe6z_wAfx`?lf$&Ed!Z~x@rVv0=I$9 z2aw1kC}1f+B?9 zGU#nA5czlguqi=5x$dg9sfW-8zP<)wjD(zeCeDy$e}KCupnrv=ZtW8u!?(MLbNygU zt75HjofP>N^wae}Ozq?LachHjC*s96oS=vQv4)){mIFmgi56%59!F_!{@9cLe;92R zZGMu+S$N0o7>Q>BlHYFUd-(5s8-n8V?SrqbIqJ$AyV|);h`1^A`yaf1`JYO08CDlR zZ-?`uPO`glwQVDZzRzw87Q^VR!5u}gRws?1*c^&1y%X_TIFFonba;@hydZo$;M?M9jGQDtVRHwcpCo4s5FpgZ4(NeT|lo|T-}M?ceT@M zwRJv#-aq_z>Bc&ny9fNhXPH0+K7YEJp2z=t*%bs@(Y&n@DxM;{C1hish%cslW^DV- zPlf~u6*Ig7Mf@i#^&jtq(W1f-i_NT+y`9B5Vvnak^lpc|ME+MD)Ve^LO4vRHOLEa_ zWPmP~`Zd_h)qFU31^WKqB4d{TskT*JQBT?!P*t5;RptkoqrO9HwHZViq&8y~y4vrK z3vUtc&?RytwLZlWw;UL!2Ac0HLnUi1q|1mDPM);P-|a;1`yd*o3U^9#ym8KMTc z+2d)unF^x@fs=iA`F`2FLW9`HMH-S)g}hPBT#9{%X(yQBj*D@^!i~$Ox^4PaCqRBw z(zJ%_*3ss-6{RuTiF7J;*y^$iMwp*KY;`d9#cCh^goYn395@G)$6;=i{#Zc;C$VJT}IajIgLz5PkCsS+N=wrtb6AK z*zNudC(*_pkA~KT=scu+Oe;wn5^wKJBSW-nB3}ED%M%_}ZWk3*9Z_6vl1HnNXLC+w zW?oxbW8lzJ6czO_gTR)Skn)Y$+zR*D$;F^Vj6FkdlIp>!r!A!J%9x`kbq)deoMzEX z@F8i5A7g(gPsZ9jHw!F)yGn=O>Ui10cfTK;?-?FKzUEf)MKJ8bhQKx=&n4FaDN>Nr zuscbm4FiJU@E9=JU+9zPhjK!?E04Q69ilUjf2=*2iLbGfl>Ad<=%j)_mBCkBLOE6_ z4t1{SS{OOBO?ro{i%2QcM!L z*{fJg0b9sAq2wxuyWhULa4&Fiu}f*akLJ9(C3#Nq*P$2dXT%pcn^0nA@aYv6TKb>8 z-In5@P>~Kiw*Ou#jdriZ*BzEk}n0CkM%){5PH!T`Vix7A1^JxynVvRZU91 zDcOD0#Uv`mhmcJW21c>Nkchjycz1G=I$}r^&Wz2nilq^B#<*2W^&`jv22|Jvuaac@ zq)#^HlgxY2a^uhzHh;Npd=y}jt@0|n)Mw#i6mc?`m-qT}($+2fU3BKfw>+fPP5g!D zv;#((0|%k!(*4nMayrmJY2=wM*E0jzLiWlTqtrxO?cuoh-8SVWso(K!&s-8lXiO4Y zk|&m6R*M-O468a$qqz=2BMcBR1}I(eM%hko+xY-J-Sn@Sq05ZzMVfO1@bW0Ro}wET zC7~027u&gw+z&5V=$86{G$aNxDZj@Z1W$?cd${FLJ4dUEr&FU$aF~#%ndQZsB)oW( z@$HxDQz)I&lnYN~beV^!E6&o2iu3%X;C43$PXO%WXT+lh?u8m54c#v{mXn_LgcoxjQL}X(bmKwdT@;b1PUB z@#dsr{cE5q&u}u^g#5arhoIS?G~GlAcRTJeO~!yiLt6m0Jnle_~rQJJj0KW*Gm-n@;kC>`9I=dJ@7 zb1z&942{KNi9IKoDhpYaDU2#;WOeeP>XXv8`U4c|*WE_~5JJX{18%T9%#^Fb3sTSQnYQK&7n>t4o1XUyN*!Lm~&kN16!r#b@ zhV)a1j3;~UoNJ#E3Bb}0mcSG@7*$rD#S*n9YxsWLIPY;8vrvyjwvj?s+o(CQpcUD7 zv=AK0T^G%$v3e>WY*zTGN&t2otH%jXiYk1m`<+Tgv7KG>wo^IB<*4y)wuwfM^*+2fB&~={K_^9R@qmnPF_UR)m8E+ zAxf0bbnRx)dM@?Pbm8diNh-CSBmAA@0%g}wOzBEx67qn)Zn>#PQV$} zE7^IBw8CfkXKF--UOTDQlixJ<$*~(aWe26FCGB|`Q%w=PrD{nQi*JppNMf%1>|9(U z=W~uN{cd!$=rgr;ta`?J$!)Kx&55AFkSiem=Z66I#rA1W^yVb_=UZ=(D(xM#6Vj5s zids5mX+G;HR%Jdh9w=p-dkPUY={lXogkIC1ix-(c-;2OuUW;Q`O=T!D@z@*dav0){ zIS5~m&VCM6-*OjG(Nlu71&x*Bu!dL{T(?O@WqYwQ#st0@b?sGMzXlqQ1g<>#E4MWq zWtl`J#xe75@49EX*T@I+OB4#E*0=ovQLamc=mYz`+n(f~J)k@zJxkkowj^$F&O+)5 zvk?l@&SaCA8jnUsNPYIP_t<&k$0YUt@fJ-sjob$I)<)6(y1+)sn8|g>*6C&Qo&n6Ni zD-*hG`wdv4@eVIm4~EP*?GXRyYsnzj#+?;A!UvYu|5H@ReBWO7Lo0i{wk?&xe0eyO^|>`eQ0A;i_^YwD=!4J)R!HXccj zqNB{yed%ibVlN>KJCpF(^YT{x!6oH9R+tUB6I}yF%X;^bWiOa_euxEV=Oq_fdL3DAcu5HUzWdWzp8x*3)F?(xf5ZX zehC;6({L)Sx<$Ci=ts6z*1!%`jT4?46%oT)%Ef$SGR%$GCBW@v`Hc;yco}Ok>XUHF z?k5u9^TVayxY{+61LpcVN)J}YPjN1k)&=_~I#gpJ^6t{{81OB|+TCvMvQ1q6{qk-6 z!@wv!^}1B!d|>+r^z8;aSr@9v%1muHj1vzHDd7w6<*(xZVPXrs01gJ?RMuzrKW{H0 z{gK^Qik;ov0KK(1-eo>LD%^`M3wv+q$x^XASbyvTbERz%AJmaQn+=N)J`M<--mjzB z@@FD6=na2=^=cqzTVV^2`Nn(_OE)E!EVXbpJi68Y+~i0QO}{FJazx%xb;o)Be3V30 zwQs)^{C#?-TGUjAxrmG?0`6>8+JPFTYOtfuBPw5*I*h9`6yOTh4;AHhcvlweI7Umg zMfmpMaKSugBWY`=+_aq5rHrIlBhCjGtU5QDkbbS`-mqDkM|F7_ymnGZSg`h@A-zH^ zENQGpzAP{UovoVmK&^}5Fc58#wQ{(AK4_tdgVX8vpI<0y#F-d38EfH5YAvV6NE>Q5 z+K?5kl-!h{^vq_7IiIeH_sd^Lalyy0BCBo)4pM`4*Yk6Eeoxo|C2K5i_lVevDFolB zzI0d1kfV7L5uWL#e~Qv>^?X|m`~_yN#>>LFCD_Fz_~1yuy-|dHC1QiZa6;@_tX|XK zg+V^o{iXBv=fI^6H8$nBKx1q5w*8|(+2v8jOh!zp{6IoH9Sy#-nDuJHwx_oR$wZnEbawb!QzNYFRmr9RafLSW(%@sK^{-8h zY#vX{;-_uNMF3w)6}YsPP7T2{NV>T^pk}kr)g3S(Z4N6z{91>0?=H=iHnN5AAtsV| zF1w|MSjXgpzLvsS%z2 zz?f_sR^>Y01y&c~?c!vr%>cGqnXcc+AJsi4JKa9zHBdlf)f$!5e}?ypcSBbQrT9iY0RBCLAqa?svE{2OQUGKsG+ zj_1P@XVNq<)%598Dt5*CfQXslGg|uh(a`ifFqD|trSPPekFIU31}k~BM!qE(*IkKV zP@and;!%ui?u=1y(g!Q!!C{T>aL$7{lF-;%9V)96EQ=<+Kq2~`UK+@2QKrGsE^(qt z`+@h(*f%pKl-^V^j%Ku)<(Vd2in1WEY(rR;P_e)7%{ax-M9<0UBI8NL#I$RtPF-+#tW*kUg8#!YkrQ_&@!6KOxX=}+3U2y&z;n1FO{;_ z4e?#p#3EaAj^A<{|4gx>(S35><2cqSwPwJ#V6YRn7Y)yThq*Nax$wBk6LHF0+bd)f z!$$73CRr4BPQhI}&#xNmj%cBE7f_{BuQ4#HVGB5JmfAXl_^iw4^J-|?ZL&}5SFJ^- zU@Z}Tvv?_H$eeUA`^tc$#Ki88U5f{z28!86S1 zREsq0eov-e2$cWcTxOSV(`uiA)a@!^)8g(Zv%{h#+{}-jt52?o?5pU(gx2Nby=aOX zMbdeTc2R{t5@O}8jgTioXflCDjha33Ik$5)(^Q<4JU(_)-gpkx5o@DfnblDjnV?vd zN(YF>^072!^Al*p_ctu?*V?<9DY-8gI@Fyl=To2$!Dcz%UzvU-nDOZ;Ak+Jzi=(zc z$9j;x6&d9#YjmSS+U#!_BAI)(xmMo14)MZW(>bp*>6P>Y%_DmT#>Q)n8pWNUp+3YH?W{r(+e0Wk$}SU;Z(wD|s9sZ63htiHStNl}w|` z8tbt`08t)zT^4MAYK~9Q!6&Ep>LI(47@|q+fcVWqgFpo~Y5xr5Q3&dOXjwZQlbR(4 zir~6^Pvz>P^~x4h2I6w$tH#raUOa1tL)O z40S7LSeT>dsLa=l(a54@mzqCFz zI`n?*Bkews_gofMnd^d8<~^PC5!Jb6J;E2c00#G8I@c5Q)Q)Y~17Qdv!$3UYH|>ETcAB zQMV+6uNL;{oRjKpGqUZ86Zv|!n>f=Sn|>X==mUB}lHEpx9nj}CT%G18qkQJbMAOxJ zVXuR<=D%YNS_)^eSbnKG^<|*N8q873&edH>E9T7`?!A1V_Pe|86I5LasIVbn7BRHYObe!#ZQ4-JhdyE7PZ2C<*t3 zASd^*X_296-TAj~q14jMIhHyGm;_?nl1wdK$tRy6P?3g3J(tY3zaTs`p9$s-(<2Ou zUJ6O%r76sw>2hIN^P30G8HoejXLPG@ZwI=Q|a(c^T~yBAf~( zN@7^-T-r?l9hMm?ryMr-OnAn_4V~tX@$PM6qJ6omSjN5b)HSqp{&r`V==?c~SWe?I4)!cmu1->QKqBbg?r*g0>=npRuY_TG| zR^6<-NqKQ{31EJ8+zbTqtupE8LNqfNohn~>i`ZRo_1@E}V%Hs}ck$_!9^1&8#p0pl!+wx)2~V#rbyFaz7X4TKdu4}T+tT( z`ObAvD;z$Hh*_N+aEauUCF(a8J=4R$6JsIgMYA8gc)QnK|5{qYZl^v%a7>6h^%bow z3ps|8Mem!(oP&W!1CWE(X9V#=c#Oan!FiY7m}~mJbi=!YPw$OU=j?m=b^cOe0;9O! z8SD_Rwl5c?Cj{SMAA0HL+@9PnYJW1@(WXG)iE+i&iea_mnpoH|HclZoaLQcBt}5^= zF2&9OK{!S8nebzgw_hHAX*yBHAIc30;~XJ|TBNWGy_D~mgE^`+lo-|OQSBv=*-?vu z1m=wFC3K~2$rpqy#wv?#l3)J7=48uub`cTjT}W>AQRX#3R$J0p7?lc7;*^MsS|)$w z9z`hYp-{;izpzXp7=&+YBzACu^Hep6+%E4OG;vO{+-#unq<5b0-0rj}gWPvxoGb*FQR}vx?~)$G{nDf`b;yLh!F6FQj~Na-Ug) z_Zx@I9U&^mS5J-K0Ou{x1@?~m9@bVIDnhV*?w>?v?zp`E;Hd4Ff=djk*Tz@HmU&IR zV&9dSRv);*|4>>tw*z+qip_Z5r6w6);Wg#@R7OtZ?cR+$9LUM>7q| zWF)LG=gn?U6}}rNt926lVtdU`u;GI$DR9;cuYV6?&Y#Q=IosWjdW|CI6qVxcI4}b5w?rzD=aq@A3o7 z1KS*3kVOh#M?(|}M%|ypl}3i%k?&DI4aRuFd~*3(erwY}?IXDZ3wI8(RRZRj&TX zk(1Q{>`p7_)eeHM2%)^VS_8tmpt#0gM$LpR35G^LNTfW*9Fc1lmM9=*1c#SF3*Ny< z;Wa+IJVVb=&&9^@=rWt)Qbyb#U?ykk4`MrYOfjrcF^R$J^uw%8mc?zq4Q)=WgfPIh zep;oj7dV*R5>>N_P7@lN{(?4Hd@SdUKXCHm>Sh+P!G=jtA zVtEl40_lE+)c|Q1_S2DuU46rgd7yiW1jKjAMxq3gD9lDA2?u@!#5FtwDlCEYMh7J+J+C`M=0kNJKp&eSMe?BoSh-Ln_pmbYj9T|XW?3b+dT z#h_Hujo}B}Vn`)PkjKCjRXJ{Om|_QwraHWh!ecSCWk+IZMZxL#>=k*DS>f{d7W@Lf zg3jS+H575TKMx&fjZ6x%O90cQUwtEuOD3;c+`{ceyuPD4U6=j@di|a@gCdHSz?LPi z9A491zR`yclyR1JcpsgOOdxsDf;_?mK2exR!SpPeh^6xh;e?#dN=w`@GexEbw<4d2 z(!T7*@UqH-)NI6WNMWrpG*QjNWz77f^E*{Qs22t@cYu82NcotLSQv9jfD2NU69g0a zN=g|p9a6KQNz@wPxbrYj%LtnX<4RgtCmQZ5&!W7ZFELwx`LW>l-UO?jx<__ z^LK51IgyfJDjJ8e^MyWL`F_68un$@Sl(@uc9e!c_*G`8M zMPH$w$H*HEL=L8NEdRK>x1?5&7R$Qc>_HQ`p=WH>5ZRP#eytSgSRLV zD{W1BgZx(s0dY|;wFXE87c>X@%aoyoflO=N__7SE9^;WysgSgWfr-70!9GJ%W~yFO zA-i0gFxM42o5s}wH~TYWx4B7z$vp^uu9C(z&5;pyyEfSWkFyEe>I6~A=wfhrWoj3h z?r$h>KVRXTFK-CmfWo#8m=_U!Lq@jxVeId+W=lX5>-WXh1v=ivkoGen*Ar!0AaEJ7 zdTFdY{6_i!^Kb^b2rGO*HxQ9a)o_1A=&mVaX+^6LmkxF_(zsR$Q_h zZGc#m`dz2mZ{U0-b9`}eockZW!e!6x_0iy1z%XGHIVh?M8Ci6#ffDFR?>{Q`i! zIrG#pXNXL_KzWSedFLq7X-YL-i>b%*T=Cz)j+$l{G-bO-_KX2C>S|Lg9HC;xNBI)E@e~Ubv{3 zrNJiSK9$Ui+*IYMIw=-|cDoDeJhx`AETkR_6Hs%sEn^&k9>tTJaC_o%Bqx#~#d;7pyd ziehUSPOuaGqQNlIoOC9c)AtWAX54lW z&Rg!-qu`_@mx?oyJsXdI{FNyv3nI^*pYry3KH6<+um zKPGx&G4jw2>wz@~T8UwyZHisvO}~ivkPF|@{*dN<4BjrkO%KAemh?1O|kJk88IYWC%$xc8{%s^ta)rR`Z^W=1VQhsv*)zJS&7s<+I*wfQ5h-Ht=^ zhmc|>6vj1<)5;%m1AVPxV;MDZ*PGTx`K2b9v^JHS`q_sd)=Kvr8d;Wf{-E)qlpQ^l zn6Ie7Z5E}n!+cSvhTVlM(RDeS?r91ODKH6{#7ktiLIQ$P!vxEr==a}Vu+sTw@8H>v zGY^Shhz%ab{M4Pzl6=^@t3FRuv*u;&|>ZV5MuMq`5KKuh?nq;*n4<7?)2xa+;nFDgV!8gY2+#Y^|@tkBYPdMR0*TGqA8Wnv0+ez{b!` z>uuF&D53u7>O)!(ZxnyLpF$Xi+o@38of^uLFLIskLb5|N9E7hq{;tk(zG%#HBZw{1 ze1(p8KfFGw6@o>5IF$bH&e*5wcoB=v=JpLyqe;pi>Ik?lt$_zPspY)As^laS2B|I{ z9>oM}e@4GDAD+cUb-I;W3a&1leX&jole+EbL7C`R$xzR^$q>xB``rxH$2Jgte=o!b z9M-_UQy5pen9S$C9-FIO6OH7uz+ptabC6mCDK2HaSh-1inP{;m&w+bpauh!`S7M^D z&Cs);F^INfEc(@MtU>lX^3N!xPICdVXKz2Ino{uK9il3`${#816*7rE>S@pDD4(k_ zicR~+P47NAT{f(|02;Vmjyq)P#CcuAw1DrSUmajU_`7ax8e`bMArL~5!zP+`Hc}Ct z>{OJF6+)aXY;ezQeH;;YX!%`kYe1?O!M!?nv!Nj|9JDvfxh6Ks9H(G=a@jt>L2Yzu zdQ|x|JowfD@1z{bBmqsGQrTYuYb-NmJrScUC`3Yk*~o1YfT}WC>?AQ^=iWvHKwz=_ z(gq&??2~221;t{0xP7f&t*0>wivy+fN1hq6#_2|^gh`68(?!^u3$xOGILCqFZ{7Bs zb<9>PAE>=~OLS}WwIVZ5CKR{wa9)8s%C}GO*{NiOo$sSin%;)OpRPbMYVmY)t%3fp zynfqwoT2Rv^SPQ4e8}iN1g-2M?hEi2nb}P$E3)K482#Sa6UvSh!X2KXmqGlpBsg9`B2q&+Ji!;-lOtcvLkfA%r$-Vb~mIQ*wV_NvCJh+W}PyB19S z-VV?ZmY3wBOhFvaX{&4%2;!qUjhsJ;)qkma36b2iZps?A%=(C~yzDwxK6NFZsw1Co z)3E9DONMHkGAY!g1vQ^(a-Q{ zK-hGJ@LFG0TYieBiyu+Cs&8doPnJoJD*>Fho)OJ6@1n4%E!KbAjK{_M;?uAjQ*8RB zd()g?GpQuBEFyX^fE7hq1A$O73Jtn7Q4)$W+G=W-VqSAZmdBQ;SVOrh_`BM* zT9sD3nBzwh;HFt8-NZ{}Nxtq+oTFz@9*J%XWqI?>SJrEgI@<&=7kX$N zkn{qEKSG94icY`S+fmJYZSKHi-y|b^=^SyTbS**HPbd|ZVXQG?=!Y}-L@oUhsx}oY zb2rG%9Ktze1Ul_okCo+K`+3+Xb2Y@9G|E$uw#2b)G@#(BL*FS`9rQSh5%C~!y<{Jj zRGzNKG|RI?5C(HKN(gm13RN0t3}8b+sg%If%h3bcY{EM}QJLg&+Zbf)AwE>T5jF`y z;?$xCrW4@5E~0`Ae?^($CI33kz0N6g-bqcqWFzk_(yON=SL?4o6v`{V6q^Z{!7kUM zWsZjRtwy?BiAujQfuQhq6|iq#&t~Lhmk}NS>PUP0or7FMprwwE-(mY0j|#i8@E-&X=5;tyAe-C*Zx4@ zp04wl_lfAg>Y&}Hci;)9baK_1FvEeQ^+`wIgT85%b~F1dRqx2XLh0*@5B*GQpH_tm znGJ}KeQi~H#aba7lW^A#3J+xjpJP>LGF!lV1^=3Qe{375^(2WMb1xov?L&~V60ATd z+^v5Q!6-l3F+mZ_&q-G;JQHi%Ik)gusAw%C!e=Xo!1kMx7{fmw3QOVuZ0GbNrxNoEr z^-h?p1Q3ae*56a~Hq~8xV0ARCp?B4BX=uq#TRQlxC*iM;cv+wquWWRgV>c-w=?&bi z4Pvk-Kx8{cy4oqnu=9|v1+(NbJ}DdMeRGocu2jx$#9OuTn&zC(PIAA-yqVtZrY3u$ z^>zVE!}c{!P_CZ!PqY6`kixjw5bi7o_)&S^7bUCd?u>60*{Le2o4;GGUP6TLBHnX5<=bIqH@@_pN1Bd9@K}Gfh$ObnPctQG;GLE`kM-$ZB5Ic z!3@`<^J3t&hU}uTxxLm#E5;C|ujM0zkR48`$cksTq0gY1i7n)BQqh50LuOZ05Mv8b z**d2fYrjkKX2>uu2#stf+17_(GCq`TA9oAUNo0Q!-Ni!!7YP zzlK(HM`OG>e|b(5cic{~j+17rtWzrqF?zUgo{$1v%j|-+Gw)Ew(3I&AnjYDsm`Ns&+Ad!~Hmv6i*<@KIhVh+nD2OD=Y*TPy7I7(we;>UQAS zH-BXLE+e_P<_t2uLu0E&iZR&6da^|V;qydfdWtUb$1RPQsdEmj7YIH?=GI71+_fQ# zIRNAMbu{X|u~<(EIIZj(UtCPf3j@b~1^vxV_q7`A8-n2^$S@jCeIwW2FPh&^a+{`52 zOAv<;K?&|;GGwtLs!hURYc|fjex{_+g@@I1-)5iF*td*yI`9{l0S!}8xJXz;md_Nq zw6F2cGIXPrOQ8+;2ouYf6+6ir*IW-};U$GX4sVfazXdBEP;zi*Wm$88(~A1DE*0Eu zsYou4%tN`1Tr!w2R<=fF&iBh{4h{aSloza*aDha1`ln@dzN(lp_fMZ&wbM|-oV8M5 zKhEtP#4Xjwwnv#z*+C$2k(E$4-5`4!oZHtr$xrJT#9;aaw=W@-R;QHLT=(JETcb|L zz(~+x5T`lN1q0qtzy+e@s)?k%ZP(yFw~v+#ku9cSs*=Qx&@&B z2k;>ye+8Z_cp_G-m(1Tqkg@s!{Cl=pwbS2G|72u)Jhk-| ztL2^s$1L94dm5eBD@hvFL|?pbUD&;$Q2w~s~Tzj7u*Fm*@(QFuH46@|KqsQ;eo;O5E2ig{Kz(5wvrjwS&FQ14=} z(Y>68_oOTQIWzB;T%=K}((-m}-cQ0Ia-hxyfx`TYm+u)Q->zDgmPk4w zqIn5O^zpA8twdv78J*FMn8hc+=$6#dIrEk9*9ks<>HH!b<9biTv}Mn@`70U;^yxu5 zv~%{AdE?ZT`TXrf@;+=8)mby!X@N20CV*nPQi+16Ff;s@wgBJ{>FMHL2p(Vrz{*?R zGtJtIv>11C_gh4A@BD|0Tm8y+Pel6$&D|0NK4UM2TNMMJAt>", + "\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." + ] + }, + { + "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." + ] + }, + { + "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/Queries#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.Select(x => Math.Pow(x, -1)).ToArray();", + "\n}" + ] + }, + { + "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 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.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.EstimateType, 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 => Subtract(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.EstimateType, 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": [ + "", + "\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 EstimateType, int? Accidentyear), ImportStorage>", + "\n{", + "\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));", + "\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": [ + "", + "\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 EstimateType, 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.EstimateType, Identity.Accidentyear)).Values)", + "\n .Where(cf => cf.Count() > 0)", + "\n .Aggregate();", + "\n ", + "\n double[] Values => Subtract(CurrentValues, PreviousValues);", + "\n}" + ] + }, + { + "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 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", + "\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": [ + "", + "\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 EstimateType, 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.EstimateType);", + "\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 EstimateType, int? AccidentYear), ImportStorage>", + "\n{", + "\n private double[] nominalClaimsCashflow => GetScope(Identity).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 ", + "\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 Subtract(effectCreditRisk, nominalValuesCreditRisk);", + "\n }", + "\n}" + ] + }, + { + "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.EstimateType, EconomicBasis, Identity.AccidentYear);", + "\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 => Multiply(-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": [ + "", + "\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(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, EstimateType, 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(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, EstimateType, 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 [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}}", + "\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(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, EstimateType, 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(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, EstimateType, 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 [EstimateType](../DataModel/DataStructure#estimate-type) CU." + ] + }, + { + "cell_type": "code", + "source": [ + "public interface CoverageUnitCashflow : IScope", + "\n{ ", + "\n [NotVisible] string EconomicBasis => GetContext();", + "\n ", + "\n [IdentityProperty][NotVisible][Dimension(typeof(EstimateType))]", + "\n string EstimateType => EstimateTypes.CU;", + "\n ", + "\n double[] Values => GetScope((Identity, (string)null, EstimateType, (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, 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();", + "\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 = 1 - \\prod _{i = S}^{S + TS - 1} \\text{Monthly }AF_i ~.", + "\n$$", + "\n", + "\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." + ] + }, + { + "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 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", + "\n{", + "\n double CurrentPeriodAmortizationFactor.Value => GetStorage().GetValue(Identity, (string)null, EstimateType, EconomicBasis, (int?)null);", + "\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": [ + "", + "\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", + "\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", + "\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", + "\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", + "\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": [ + "", + "\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 => ", + "\n Multiply( GetStorage().GetPremiumAllocationFactor(Identity), ", + "\n 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.Select(et => ", + "\n Multiply(GetStorage().GetPremiumAllocationFactor(Identity), 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 Estimate 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, EstimateTypes.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, 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, 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 ", + "\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 ContractualServiceMaring : 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 LossComponent : 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 LossRecoveryComponent : 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.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 PvCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n 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 RaCurrent => GetScope(Identity).PresentValues.Where(x => Math.Abs(x.Value) >= Precision).Select(x => new IfrsVariable{ EconomicBasis = x.EconomicBasis, ", + "\n 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 = 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.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 = 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/ifrs17/Import/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb new file mode 100644 index 00000000..8dc36adc --- /dev/null +++ b/ifrs17/Import/ImportStorage.ipynb @@ -0,0 +1,371 @@ +{ + "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": [ + "", + "\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- [DataNodeParameters](../DataModel/DataStructure)", + "\n- [AocType](../DataModel/DataStructure)", + "\n- [AmountType](../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)." + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Utils/ImportCalculationMethods\"", + "\n#!import \"../Utils/Queries\"" + ] + }, + { + "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 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 ", + "\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 estimateType) => ", + "\n amountType != null && AmountTypeDimension.TryGetValue(amountType, out var at) ", + "\n ? at.PeriodType", + "\n : estimateType != null && EstimateTypeDimension.TryGetValue(estimateType, 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 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 ", + "\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/ifrs17/Import/Importers.ipynb b/ifrs17/Import/Importers.ipynb new file mode 100644 index 00000000..6be43097 --- /dev/null +++ b/ifrs17/Import/Importers.ipynb @@ -0,0 +1,1171 @@ +{ + "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" + }, + "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 EstimateType;", + "\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 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 {", + "\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": [ + "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; }", + "\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", + "\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}" + ] + }, + { + "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": [ + "### 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(ImportFormats.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();", + "\n }", + "\n ", + "\n var logConfig = await Import.FromDataSet(dataSet).WithType().WithTarget(workspace).ExecuteAsync();", + "\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())", + "\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 Activity.Finish().Merge(logConfig); ", + "\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()).DataSet.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 await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\n await CommitToDatabase(partition);", + "\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 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();", + "\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 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, estimateType, 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 await DataNodeFactoryAsync(fileName, ImportFormats.Cashflow, args);", + "\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 = GetSign((aocType, amountType, estimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache) ", + "\n * 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 await DataNodeFactoryAsync(fileName, ImportFormats.Actual, args);", + "\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 //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 // This should indicate the table name, not the input format", + "\n ).WithTarget(Workspace).ExecuteAsync();", + "\n ", + "\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 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;", + "\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 await DataNodeFactoryAsync(fileName, 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 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 await DataNodeFactoryAsync(fileName, 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 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/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/ifrs17/OverviewCalculationEngine.ipynb b/ifrs17/OverviewCalculationEngine.ipynb new file mode 100644 index 00000000..866c5502 --- /dev/null +++ b/ifrs17/OverviewCalculationEngine.ipynb @@ -0,0 +1,166 @@ +{ + "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": [ + "

IFRS 17 Calculation Engine - an Overview

" + ] + }, + { + "cell_type": "markdown", + "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.", + "\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 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", + "\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." + ] + }, + { + "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 in the corresponding input files together with the attributes." + ] + }, + { + "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 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", + "\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)." + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/ifrs17/README.md b/ifrs17/README.md new file mode 100644 index 00000000..9891b004 --- /dev/null +++ b/ifrs17/README.md @@ -0,0 +1,29 @@ +![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 IFRS 17 CalculationEngine get in contact with our Community: + +- [Community]() -link to the community page- +- [Evangelists]() -link to Evangelists page- \ No newline at end of file diff --git a/ifrs17/Report/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb new file mode 100644 index 00000000..39128784 --- /dev/null +++ b/ifrs17/Report/ReportConfigurationAndUtils.ipynb @@ -0,0 +1,151 @@ +{ + "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": [ + "

Report Configuration And Utils

" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Utils/Queries\"" + ] + }, + { + "cell_type": "code", + "source": [ + "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 DataCubePivotBuilder, 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": "markdown", + "source": [ + "# 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": [ + "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": [ + "# 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/ifrs17/Report/ReportScopes.ipynb b/ifrs17/Report/ReportScopes.ipynb new file mode 100644 index 00000000..d9344d3c --- /dev/null +++ b/ifrs17/Report/ReportScopes.ipynb @@ -0,0 +1,875 @@ +{ + "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": [ + "", + "\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 => 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)", + "\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\"), (\"VariableType\", \"!FX\")); ", + "\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 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});", + "\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\"), (\"VariableType\", \"!FX\"))", + "\n .AggregateOver(nameof(Novelty), nameof(VariableType))", + "\n .SelectToDataCube(v => v with { Novelty = Novelties.C, VariableType = variableType.nonFinancial });", + "\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)) )", + "\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\"), (\"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)) )", + "\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\"), (\"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)) )", + "\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 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\" });", + "\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/ifrs17/Report/ReportStorage.ipynb b/ifrs17/Report/ReportStorage.ipynb new file mode 100644 index 00000000..0c61fe1a --- /dev/null +++ b/ifrs17/Report/ReportStorage.ipynb @@ -0,0 +1,219 @@ +{ + "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": [ + "", + "\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.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 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.Builder.Interfaces.IPivotFactory 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.Builder.Interfaces.IPivotFactory 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/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/ifrs17/Test/QueriesTest.ipynb b/ifrs17/Test/QueriesTest.ipynb new file mode 100644 index 00000000..07990aa7 --- /dev/null +++ b/ifrs17/Test/QueriesTest.ipynb @@ -0,0 +1,425 @@ +{ + "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 \"../CalculationEngine\"" + ] + }, + { + "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.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 Workspace.Reset(x => x.ResetCurrentPartitions());", + "\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.Partition.SetAsync(args);", + "\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 Workspace.Reset(x => x.ResetCurrentPartitions());", + "\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.Partition.SetAsync(args);", + "\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 Workspace.Reset(x => x.ResetCurrentPartitions());", + "\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/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 new file mode 100644 index 00000000..f2253bd6 --- /dev/null +++ b/ifrs17/Utils/ApplicationMessage.ipynb @@ -0,0 +1,118 @@ +{ + "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" + }, + "nbformat": 4, + "nbformat_minor": 5, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Application Message

" + ] + }, + { + "cell_type": "code", + "source": [ + "#r \"nuget:Systemorph.Activities,1.5.1\"" + ] + }, + { + "cell_type": "code", + "source": [ + "#!import \"../Constants/Validations\"" + ] + }, + { + "cell_type": "code", + "source": [ + "using Microsoft.Extensions.Logging;", + "\n", + "\npublic static 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 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}" + ] + }, + { + "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 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 = 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", + "\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/ifrs17/Utils/Extensions.ipynb b/ifrs17/Utils/Extensions.ipynb new file mode 100644 index 00000000..0eb9c443 --- /dev/null +++ b/ifrs17/Utils/Extensions.ipynb @@ -0,0 +1,145 @@ +{ + "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) 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(\", \")).ToArray();", + "\n return propertyInfos.Count() == 0? v.ToString() : propertyInfos.Select(p => p.ToString()).ToArray().Last();", + "\n}" + ] + }, + { + "cell_type": "code", + "source": [ + "" + ] + } + ] +} \ No newline at end of file diff --git a/ifrs17/Utils/ImportCalculationMethods.ipynb b/ifrs17/Utils/ImportCalculationMethods.ipynb new file mode 100644 index 00000000..ec78d688 --- /dev/null +++ b/ifrs17/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/ifrs17/Utils/Queries.ipynb b/ifrs17/Utils/Queries.ipynb new file mode 100644 index 00000000..02105032 --- /dev/null +++ b/ifrs17/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/ifrs17/Utils/TestHelper.ipynb b/ifrs17/Utils/TestHelper.ipynb new file mode 100644 index 00000000..9a46850e --- /dev/null +++ b/ifrs17/Utils/TestHelper.ipynb @@ -0,0 +1,114 @@ +{ + "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 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 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 From ef3e24688f559bd85af544b6af29079b203224ae Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Fri, 4 Nov 2022 08:41:11 +0100 Subject: [PATCH 02/19] Dev to main (#66) * base code * correct broken links * fixed Opening re-import * Rename "PvBase" to "PresentValue" (#32) * include new default spaces * reorder global metadata using alphabetical order * 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 * Including FX positions to FP scope * FP specification nb - add FX aoc step * 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 * new data node factory * metadata * metadata x2 * metadata x3 * implement feedback * split directories * fix tests + add readme + seperate overview nb * include changes on factory * adapt to the split * update packages and fix csm with bm * approaching * better * implement feedback * final feedback * fix * const version ce * Update links (#51) * working on links * read me * remove redundant code * clean up * AocConfiguration ImportFormat * remove reference to init from Overview * removal arithmetics * Simple value test data (#54) * Adding data files * Fix input * Fix input * change to importers test * Fix to sign * Int convention * reset consts * implement feedback part 1 * Overview texts (#53) * Overview (Template), revised text * Reports of template with small adjustments * Overview IFRS17, some adjustments * finalized + hot fixes * ReportGridOptions * final fixes and feedback implementations * 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 * 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 * Package update (#65) * update packages * add anchors Co-authored-by: Sara Busato Co-authored-by: sbusato <103484221+sbusato@users.noreply.github.com> Co-authored-by: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Co-authored-by: nnikolopoulos Co-authored-by: Andrea Muolo Co-authored-by: amuolo Co-authored-by: Daniel Trzesniak Co-authored-by: UMueller1 <108468853+UMueller1@users.noreply.github.com> --- full-ifrs17-template/Database/Configure.ipynb | 3 +- .../Files/DimensionsAndPartitions.csv | 3 - .../InitSystemorphBaseToMemory.ipynb | 14 +- .../InitSystemorphToDatabase.ipynb | 24 +- .../InitSystemorphToMemory.ipynb | 10 +- full-ifrs17-template/Report/Reports.ipynb | 302 ++++++----------- .../Test/MapTemplateAndImportTest.ipynb | 3 +- .../Test/SpecificationsImportCashflows.ipynb | 2 +- .../Test/SpecificationsSetup.ipynb | 2 +- .../Test/SpecificationsTechnicalMargin.ipynb | 10 +- ifrs17/CalculationEngine.ipynb | 8 +- ifrs17/Constants/Consts.ipynb | 2 + ifrs17/DataModel/DataStructure.ipynb | 32 +- ifrs17/Import/ImportScopeCalculation.ipynb | 4 +- ifrs17/Import/Importers.ipynb | 132 +++----- .../Report/ReportConfigurationAndUtils.ipynb | 7 +- ifrs17/Report/ReportMutableScopes.ipynb | 311 ++++++++++++++++++ ifrs17/Report/ReportScopes.ipynb | 16 +- ifrs17/Utils/ApplicationMessage.ipynb | 2 +- 19 files changed, 541 insertions(+), 346 deletions(-) create mode 100644 ifrs17/Report/ReportMutableScopes.ipynb 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/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/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/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/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/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/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/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index 78851b13..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\"" ] }, { @@ -1056,15 +1057,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/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});" ] }, { 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..b6fd584d 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." ] }, { @@ -375,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." ] @@ -423,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 f693727d975d44afbe2ce6439e31d82ea27c2981 Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Mon, 7 Nov 2022 09:35:59 +0100 Subject: [PATCH 03/19] 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 911cd7174cc79e926ad9a2b330b45a9517155cf5 Mon Sep 17 00:00:00 2001 From: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Date: Mon, 14 Nov 2022 11:29:34 +0100 Subject: [PATCH 04/19] Dev to main (#84) * base code * correct broken links * fixed Opening re-import * Rename "PvBase" to "PresentValue" (#32) * include new default spaces * reorder global metadata using alphabetical order * 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 * Including FX positions to FP scope * FP specification nb - add FX aoc step * 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 * new data node factory * metadata * metadata x2 * metadata x3 * implement feedback * split directories * fix tests + add readme + seperate overview nb * include changes on factory * adapt to the split * still not working properly * code cleanup * new file creation * update packages and fix csm with bm * approaching * better * testing ifrsvariables * implement feedback * final feedback * fix * const version ce * testing IfrsVariables calculations * new partition added * implementing new test * test cleaned * Update links (#51) * working on links * read me * remove redundant code * clean up * AocConfiguration ImportFormat * remove reference to init from Overview * removal arithmetics * testing queries * Simple value test data (#54) * Adding data files * Fix input * Fix input * change to importers test * Fix to sign * Int convention * reset consts * implement feedback part 1 * Overview texts (#53) * Overview (Template), revised text * Reports of template with small adjustments * Overview IFRS17, some adjustments * finalized + hot fixes * ReportGridOptions * checking multiple import of the same scenario * final fixes and feedback implementations * dynamic problems solved * fixing aoctype for scenario * 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 * test for actualsr * code cleanup * 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 * forward * Package update (#65) * update packages * add anchors * cleanups * 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 * much better * implemented * Aggregate by in report variable (#67) * included back AggregateBy * included Currency column in ReportVariable benchmarks * 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 * implement feedback * cleanups * cleanups x2 * fixes needed after merge * all tests are green * implement feedback * Doc cleanup2 (#76) * forbiddenSlices and chose init or db connection * clean ups * small letters to capital * complete sentence about filters * implement all feedbacks * packages + withGridOption + await HierarchyCache init (#83) Co-authored-by: Sara Busato Co-authored-by: sbusato <103484221+sbusato@users.noreply.github.com> Co-authored-by: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Co-authored-by: nnikolopoulos Co-authored-by: Andrea Muolo Co-authored-by: amuolo Co-authored-by: Danilo Calderini Co-authored-by: Daniel Trzesniak Co-authored-by: UMueller1 <108468853+UMueller1@users.noreply.github.com> --- .../{Consts.ipynb => CalculationEngine.ipynb} | 6 +- full-ifrs17-template/Database/Configure.ipynb | 2 +- .../Database/PersonalConnectionExample.ipynb | 25 + full-ifrs17-template/Export/MapTemplate.ipynb | 70 +- .../Actuals_CH_2020_12.csv | 33 - .../Actuals_CH_2021_3.csv | 62 - .../NominalCashflows_CH_2020_12.csv | 85 - .../NominalCashflows_CH_2021_3.csv | 158 -- .../DataNodeParameters_CH_2020_12.csv | 0 .../DataNodeStates_CH_2020_12.csv | 0 .../DataNodes_CH.csv | 0 ...nsionsAndPartitions.csv => Dimensions.csv} | 26 +- .../CreditDefaultRate.csv | 0 .../ExchangeRate.csv | 0 .../PartnerRating.csv | 0 .../YieldCurve.csv | 0 .../ReportingNodes.csv | 0 .../TransactionalData/Actuals_CH_2020_12.csv | 33 + .../Actuals_CH_2020_12_MTUP10pct.csv | 12 + .../TransactionalData/Actuals_CH_2021_3.csv | 62 + .../NominalCashflows_CH_2020_12.csv | 85 + .../NominalCashflows_CH_2020_12_MTUP10pct.csv | 13 + .../NominalCashflows_CH_2021_3.csv | 158 ++ .../Openings_CH_2020_12.csv | 4 +- .../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 | 143 ++ .../InitSystemorphBaseToMemory.ipynb | 32 +- .../InitSystemorphToDatabase.ipynb | 38 +- .../InitSystemorphToMemory.ipynb | 24 +- .../InputFormatDescription.ipynb | 28 +- .../OverviewIFRS17Template.ipynb | 60 +- full-ifrs17-template/README.md | 42 +- full-ifrs17-template/Report/Reports.ipynb | 109 +- .../Test/AocStructureTest.ipynb | 25 +- .../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 + ...ableBenchmarks_2020_12_CH__Contractual.csv | 1133 +++++---- ...iableBenchmarks_2021_3_CH__Contractual.csv | 2228 ++++++++--------- .../Test/ExportIfrsVariable.ipynb | 42 +- .../Test/ExportReportVariables.ipynb | 30 +- .../Test/IfrsVariablesTest.ipynb | 38 +- .../Test/ImportStorageTest.ipynb | 30 +- .../Test/MapTemplateAndImportTest.ipynb | 19 +- full-ifrs17-template/Test/ScenarioTest.ipynb | 195 ++ .../Test/SequenceImportTest.ipynb | 121 + .../SpecificationsFinancialPerformance.ipynb | 1461 ----------- .../Test/SpecificationsImportActuals.ipynb | 507 ---- .../Test/SpecificationsImportCashflows.ipynb | 1996 --------------- .../Test/SpecificationsSetup.ipynb | 125 - .../Test/SpecificationsTechnicalMargin.ipynb | 1768 ------------- full-ifrs17-template/Test/Tests.ipynb | 22 +- ifrs17/CalculationEngine.ipynb | 3 +- ifrs17/Constants/Consts.ipynb | 125 +- ifrs17/Constants/Validations.ipynb | 10 +- ifrs17/DataModel/DataStructure.ipynb | 102 +- ifrs17/Export/ExportConfiguration.ipynb | 13 + ifrs17/Images/BigPicture.PNG | Bin 38530 -> 42091 bytes ifrs17/Import/ImportScopeCalculation.ipynb | 54 +- ifrs17/Import/ImportStorage.ipynb | 42 +- ifrs17/Import/Importers.ipynb | 127 +- ifrs17/OverviewCalculationEngine.ipynb | 43 +- ifrs17/README.md | 30 +- .../Report/ReportConfigurationAndUtils.ipynb | 39 +- ifrs17/Report/ReportMutableScopes.ipynb | 45 +- ifrs17/Report/ReportScopes.ipynb | 15 +- ifrs17/Report/ReportStorage.ipynb | 12 +- ifrs17/Test/QueriesTest.ipynb | 130 +- ifrs17/Utils/ApplicationMessage.ipynb | 11 +- ifrs17/Utils/EqualityComparers.ipynb | 139 + ifrs17/Utils/Extensions.ipynb | 6 + ifrs17/Utils/ImportCalculationMethods.ipynb | 12 +- ifrs17/Utils/Queries.ipynb | 42 +- ifrs17/Utils/TestHelper.ipynb | 8 +- 83 files changed, 3816 insertions(+), 8413 deletions(-) rename full-ifrs17-template/Constants/{Consts.ipynb => CalculationEngine.ipynb} (86%) create mode 100644 full-ifrs17-template/Database/PersonalConnectionExample.ipynb delete mode 100644 full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv delete mode 100644 full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv delete mode 100644 full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv delete mode 100644 full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv 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/{DimensionsAndPartitions.csv => Dimensions.csv} (93%) 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%) create mode 100644 full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv create mode 100644 full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv create mode 100644 full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv create mode 100644 full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv create mode 100644 full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv create mode 100644 full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv rename full-ifrs17-template/Files/{900.TransactionalData => TransactionalData}/Openings_CH_2020_12.csv (79%) 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 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 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 create mode 100644 ifrs17/Utils/EqualityComparers.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..f9062ea3 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. " ] }, { @@ -44,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 are dispatched to the unconfigured in-memory DataSource */", - "\n#!eval-notebook \"../Initialization/InitSystemorphBaseToMemory\"" + "#!eval-notebook \"../Import/CloseImportTemplate\"" ] }, { @@ -77,7 +82,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 +96,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 +122,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 +136,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 +163,12 @@ "\n .ToArray();" ] }, + { + "cell_type": "markdown", + "source": [ + "Export is performed." + ] + }, { "cell_type": "code", "source": [ @@ -172,7 +183,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 +197,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 +226,12 @@ "\n .ToArray() );" ] }, + { + "cell_type": "markdown", + "source": [ + "Export is performed." + ] + }, { "cell_type": "code", "source": [ 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 deleted file mode 100644 index 12bfc994..00000000 --- a/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2020_12.csv +++ /dev/null @@ -1,33 +0,0 @@ -@@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/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv b/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv deleted file mode 100644 index d52bae26..00000000 --- a/full-ifrs17-template/Files/900.TransactionalData/Actuals_CH_2021_3.csv +++ /dev/null @@ -1,62 +0,0 @@ -@@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/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv deleted file mode 100644 index 8808da31..00000000 --- a/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2020_12.csv +++ /dev/null @@ -1,85 +0,0 @@ -@@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/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv b/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv deleted file mode 100644 index 7bd3bdce..00000000 --- a/full-ifrs17-template/Files/900.TransactionalData/NominalCashflows_CH_2021_3.csv +++ /dev/null @@ -1,158 +0,0 @@ -@@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/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/DimensionsAndPartitions.csv b/full-ifrs17-template/Files/Dimensions.csv similarity index 93% rename from full-ifrs17-template/Files/DimensionsAndPartitions.csv rename to full-ifrs17-template/Files/Dimensions.csv index 4f648680..d0a29c98 100644 --- a/full-ifrs17-template/Files/DimensionsAndPartitions.csv +++ b/full-ifrs17-template/Files/Dimensions.csv @@ -214,21 +214,27 @@ 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,,,,,,,,,, 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/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/TransactionalData/Actuals_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv new file mode 100644 index 00000000..9a97158a --- /dev/null +++ b/full-ifrs17-template/Files/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/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/Actuals_CH_2021_3.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv new file mode 100644 index 00000000..e68c8a90 --- /dev/null +++ b/full-ifrs17-template/Files/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/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv new file mode 100644 index 00000000..54bd5acd --- /dev/null +++ b/full-ifrs17-template/Files/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/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/Files/TransactionalData/NominalCashflows_CH_2021_3.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv new file mode 100644 index 00000000..f8a3818c --- /dev/null +++ b/full-ifrs17-template/Files/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/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/Openings_CH_2020_12.csv similarity index 79% 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 index b52ac64c..dab25bf9 100644 --- a/full-ifrs17-template/Files/900.TransactionalData/Openings_CH_2020_12.csv +++ b/full-ifrs17-template/Files/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/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..3ba75fe8 --- /dev/null +++ b/full-ifrs17-template/Import/CloseImportTemplate.ipynb @@ -0,0 +1,143 @@ +{ + "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": [ + "*Note: before configuring your data please refer to [Map Template](../Export/MapTemplate) Notebook.*" + ] + }, + { + "cell_type": "markdown", + "source": [ + "

Close Import 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": "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": [ + "#!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());", + "\nawait DataSource.Partition.SetAsync(null);", + "\nawait DataSource.Partition.SetAsync(null);" + ] + } + ] +} \ No newline at end of file diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb index e910c089..dfe320cb 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" ] }, @@ -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,23 +100,13 @@ { "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()" ] }, { "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()" + "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -128,25 +118,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 +148,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..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()", @@ -84,17 +84,7 @@ { "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()" + "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" ] }, { @@ -106,25 +96,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 +126,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 +150,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 1685c887..37489f3f 100644 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb @@ -52,37 +52,49 @@ { "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 UploadSimpleValueAsync(\"../Files/900.TransactionalData/SimpleValue_CH_2020_12.csv\") TODO: missing benchmarks" + "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()" ] }, { 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..d1d48400 100644 --- a/full-ifrs17-template/README.md +++ b/full-ifrs17-template/README.md @@ -1,36 +1,42 @@ -![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) +# 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 -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 23a3804b..b31f2e68 100644 --- a/full-ifrs17-template/Report/Reports.ipynb +++ b/full-ifrs17-template/Report/Reports.ipynb @@ -20,18 +20,17 @@ { "cell_type": "markdown", "source": [ - "

Reports

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

Reports

" ] }, { "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. ", - "\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." ] @@ -39,13 +38,19 @@ { "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." ] }, { "cell_type": "code", "source": [ - "#!eval-notebook \"../Initialization/InitSystemorphToMemory\"" + "#!eval-notebook \"../Import/CloseImportTemplate\"" ] }, { @@ -60,11 +65,10 @@ "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.", - "\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 +79,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}" @@ -85,16 +90,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 +111,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. ", + "\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\")}." ] }, { "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 +133,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 +155,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 +174,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 +197,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 +216,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 +224,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 +236,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 +245,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,14 +255,18 @@ { "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.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\nactuarialLrcReport.ReportingNode = \"CH\";", + "\nactuarialLrcReport.ReportingPeriod = (2021, 3);", + "\nactuarialLrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", "\nactuarialLrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await actuarialLrcReport.ToReportAsync) with {Height = 750}" ] @@ -243,14 +274,18 @@ { "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.ColumnSlices = new string[]{};//\"GroupOfContract\", \"AmountType\"", + "\nlrcReport.ReportingNode = \"CH\";", + "\nlrcReport.ReportingPeriod = (2021, 3);", + "\nlrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\",", "\nlrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", "\n(await lrcReport.ToReportAsync) with {Height = 250}" ] @@ -258,13 +293,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 +312,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 +333,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 +342,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/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/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/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv index 80bfedb2..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,537 +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,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/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/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..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,9 +77,23 @@ "\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};" ] }, + { + "cell_type": "code", + "source": [ + "var excludedDataNodes = new[] {\"DT5.1\"}; // DT5.1 is simple importer and tested at report variable level" + ] + }, { "cell_type": "markdown", "source": [ @@ -202,22 +216,25 @@ "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())", "\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 {", @@ -236,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/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/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/SpecificationsFinancialPerformance.ipynb b/full-ifrs17-template/Test/SpecificationsFinancialPerformance.ipynb deleted file mode 100644 index 7016fa12..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(CurrencyGrouper(currencyType), \"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 d75b5206..00000000 --- a/full-ifrs17-template/Test/SpecificationsImportCashflows.ipynb +++ /dev/null @@ -1,1996 +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\\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 => 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) );" - ] - }, - { - "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) );" - ] - }, - { - "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" - ] - }, - { - "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 - 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 = 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" - ] - }, - { - "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..2b7fefcb 100644 --- a/full-ifrs17-template/Test/Tests.ipynb +++ b/full-ifrs17-template/Test/Tests.ipynb @@ -53,34 +53,16 @@ "#!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\"" + "#!eval-notebook \"SequenceImportTest\"" ] }, { "cell_type": "code", "source": [ - "#!eval-notebook \"SpecificationsFinancialPerformance\"" + "#!eval-notebook \"ScenarioTest\"" ] }, { 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 d5dafed5..9d54b276 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}" ] }, @@ -243,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 afd2e82e..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}; " @@ -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.\",", @@ -156,7 +160,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.\"", @@ -170,4 +174,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/ifrs17/DataModel/DataStructure.ipynb b/ifrs17/DataModel/DataStructure.ipynb index 2c3fac39..2f63475c 100644 --- a/ifrs17/DataModel/DataStructure.ipynb +++ b/ifrs17/DataModel/DataStructure.ipynb @@ -43,18 +43,20 @@ { "cell_type": "code", "source": [ - "#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\"" + "#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\"" ] }, { @@ -69,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;" ] }, @@ -149,13 +154,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}" ] @@ -177,6 +179,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": [ @@ -798,7 +816,7 @@ { "cell_type": "code", "source": [ - "public record ExchangeRate : KeyedRecord", + "public record ExchangeRate : KeyedRecord, IWithYearMonthAndScenario", "\n{ ", "\n [Required]", "\n [IdentityProperty]", @@ -829,6 +847,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}" ] }, @@ -847,7 +870,7 @@ { "cell_type": "code", "source": [ - "public record CreditDefaultRate : KeyedRecord, IWithYearAndMonth", + "public record CreditDefaultRate : KeyedRecord, IWithYearMonthAndScenario", "\n{ ", "\n [Required]", "\n [IdentityProperty]", @@ -874,6 +897,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}" ] }, @@ -893,7 +921,7 @@ { "cell_type": "code", "source": [ - "public record YieldCurve : KeyedRecord, IWithYearAndMonth", + "public record YieldCurve : KeyedRecord, IWithYearMonthAndScenario", "\n{ ", "\n [Required]", "\n [IdentityProperty]", @@ -919,6 +947,7 @@ "\n", "\n [IdentityProperty]", "\n [Display(Order = 35)]", + "\n [Dimension(typeof(Scenario))]", "\n public string Scenario { get; init; }", "\n", "\n [Conversion(typeof(PrimitiveArrayConverter))]", @@ -938,7 +967,7 @@ { "cell_type": "code", "source": [ - "public record PartnerRating : KeyedRecord, IWithYearAndMonth", + "public record PartnerRating : KeyedRecord, IWithYearMonthAndScenario", "\n{ ", "\n [Required]", "\n [IdentityProperty]", @@ -966,6 +995,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}" ] }, @@ -1067,13 +1101,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 ", @@ -1207,7 +1239,7 @@ { "cell_type": "code", "source": [ - "public record DataNodeState : KeyedRecord, IPartitioned, IWithYearAndMonth", + "public record DataNodeState : KeyedRecord, IPartitioned, IWithYearMonthAndScenario", "\n{", "\n [NotVisible]", "\n [PartitionKey(typeof(PartitionByReportingNode))]", @@ -1240,6 +1272,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}" ] }, @@ -1259,7 +1296,7 @@ { "cell_type": "code", "source": [ - "public record DataNodeParameter : KeyedRecord, IPartitioned, IWithYearAndMonth", + "public record DataNodeParameter : KeyedRecord, IPartitioned, IWithYearMonthAndScenario", "\n{", "\n [NotVisible]", "\n [PartitionKey(typeof(PartitionByReportingNode))]", @@ -1287,6 +1324,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}" ] }, @@ -1345,7 +1387,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}" ] @@ -1529,17 +1571,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 +1674,6 @@ "\n [NotVisible]", "\n [Dimension(typeof(EconomicBasis))]", "\n [IdentityProperty]", - "\n //[AggregateBy]", "\n public string EconomicBasis { get; init; }", "\n ", "\n public double Value { get; init; }", @@ -1637,6 +1682,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/Export/ExportConfiguration.ipynb b/ifrs17/Export/ExportConfiguration.ipynb index e3fa8ad4..622371c3 100644 --- a/ifrs17/Export/ExportConfiguration.ipynb +++ b/ifrs17/Export/ExportConfiguration.ipynb @@ -17,12 +17,25 @@ "nbformat": 4, "nbformat_minor": 5, "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Export Configuration

" + ] + }, { "cell_type": "code", "source": [ "#!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/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 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}" ] }, @@ -571,9 +571,9 @@ "\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.", + "\nPresent Value figures for a specific period are typically reported through an analysis of change, where for each [AocStep](#aoc-step-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. ", + "\nThe Telescoping Difference is basically the delta between two adjacent AoC steps, whereby the [ParentAocStep](#aoc-step-structure) is used to determine the AoC step. ", "\n", "\nIt is defined as follows:", "\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(),", @@ -1061,10 +1061,10 @@ "\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- [Actuals](#actuals) (A)", + "\n- [Advance Actuals](#advance-actuals) (AA)", + "\n- [Overdue Actuals](#overdue-actuals) (OA)", + "\n- [Deferrable Actuals](#deferrable-actuals) (DA)", "\n", "\nwith the Estimate Type's system name shown between parenthesis above.", "\n", @@ -1778,7 +1778,7 @@ { "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:" + "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:" ] }, { @@ -1982,11 +1982,7 @@ "\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 ", "\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/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb index 8dc36adc..41731861 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\"" ] }, @@ -131,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,}", @@ -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 8a499aa5..d3f3eacf 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." ] }, { @@ -149,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", @@ -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 |", @@ -405,7 +411,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. " ] }, { @@ -414,43 +422,65 @@ "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}" ] }, { "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 +790,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 +857,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 ", @@ -865,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);", @@ -945,8 +982,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", @@ -991,7 +1027,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." ] }, { @@ -1040,9 +1081,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/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/ReportConfigurationAndUtils.ipynb b/ifrs17/Report/ReportConfigurationAndUtils.ipynb index e380125c..43ecc78c 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\"" ] }, { @@ -37,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\"))", @@ -58,15 +59,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": [ @@ -100,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,", @@ -143,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/ReportMutableScopes.ipynb b/ifrs17/Report/ReportMutableScopes.ipynb index 2cd03b41..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", @@ -137,15 +139,16 @@ "\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);", "\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[] { 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", @@ -154,8 +157,9 @@ "\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[] { 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 +167,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 +177,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 +193,23 @@ "\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.forbiddenSlices => new string[] {\"AmountType\", nameof(EconomicBasis)};", "\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.forbiddenSlices => new string[] {\"AmountType\", nameof(EconomicBasis)};", "\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 + ", @@ -213,36 +219,41 @@ "\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[] { 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.forbiddenSlices => new string[] {\"AmountType\"};", "\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.forbiddenSlices => new string[] {\"AmountType\"};", "\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.forbiddenSlices => new string[] {\"AmountType\"};", "\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.forbiddenSlices => new string[] {\"AmountType\", nameof(EconomicBasis)};", "\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..b8a73b15 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)", @@ -177,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." ] }, { @@ -365,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)." ] }, { @@ -382,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." ] }, { @@ -410,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)." ] }, { @@ -456,7 +459,7 @@ { "cell_type": "markdown", "source": [ - "", + "", "\n# IFRS 17 Financial Performance" ] }, diff --git a/ifrs17/Report/ReportStorage.ipynb b/ifrs17/Report/ReportStorage.ipynb index 0c61fe1a..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) {", @@ -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/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 1;" ] }, { diff --git a/ifrs17/Utils/Queries.ipynb b/ifrs17/Utils/Queries.ipynb index 02105032..83b6c1ef 100644 --- a/ifrs17/Utils/Queries.ipynb +++ b/ifrs17/Utils/Queries.ipynb @@ -17,6 +17,12 @@ "nbformat": 4, "nbformat_minor": 5, "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Queries 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}" ] }, @@ -103,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}" @@ -144,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))", @@ -309,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 diff --git a/ifrs17/Utils/TestHelper.ipynb b/ifrs17/Utils/TestHelper.ipynb index 9a46850e..741b3e11 100644 --- a/ifrs17/Utils/TestHelper.ipynb +++ b/ifrs17/Utils/TestHelper.ipynb @@ -17,6 +17,12 @@ "nbformat": 4, "nbformat_minor": 5, "cells": [ + { + "cell_type": "markdown", + "source": [ + "

Test Helper Methods 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 87d05abbc6cf153facb1ee50c503c55b1be88036 Mon Sep 17 00:00:00 2001 From: nnikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Mon, 14 Nov 2022 15:22:47 +0100 Subject: [PATCH 05/19] Dev to main (#86) * base code * correct broken links * fixed Opening re-import * Rename "PvBase" to "PresentValue" (#32) * include new default spaces * reorder global metadata using alphabetical order * 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 * Including FX positions to FP scope * FP specification nb - add FX aoc step * 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 * new data node factory * metadata * metadata x2 * metadata x3 * implement feedback * split directories * fix tests + add readme + seperate overview nb * include changes on factory * adapt to the split * still not working properly * code cleanup * new file creation * update packages and fix csm with bm * approaching * better * testing ifrsvariables * implement feedback * final feedback * fix * const version ce * testing IfrsVariables calculations * new partition added * implementing new test * test cleaned * Update links (#51) * working on links * read me * remove redundant code * clean up * AocConfiguration ImportFormat * remove reference to init from Overview * removal arithmetics * testing queries * Simple value test data (#54) * Adding data files * Fix input * Fix input * change to importers test * Fix to sign * Int convention * reset consts * implement feedback part 1 * Overview texts (#53) * Overview (Template), revised text * Reports of template with small adjustments * Overview IFRS17, some adjustments * finalized + hot fixes * ReportGridOptions * checking multiple import of the same scenario * final fixes and feedback implementations * dynamic problems solved * fixing aoctype for scenario * 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 * test for actualsr * code cleanup * 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 * forward * Package update (#65) * update packages * add anchors * cleanups * 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 * much better * implemented * Aggregate by in report variable (#67) * included back AggregateBy * included Currency column in ReportVariable benchmarks * 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 * implement feedback * cleanups * cleanups x2 * fixes needed after merge * all tests are green * implement feedback * Doc cleanup2 (#76) * forbiddenSlices and chose init or db connection * clean ups * small letters to capital * complete sentence about filters * implement all feedbacks * packages + withGridOption + await HierarchyCache init (#83) * Change in ReportMutableScopes NB * Change in ReportMutableScopes NB (#85) Co-authored-by: Davide Colleoni Co-authored-by: Davide Colleoni <103409906+dcolleoni@users.noreply.github.com> Co-authored-by: Sara Busato Co-authored-by: sbusato <103484221+sbusato@users.noreply.github.com> Co-authored-by: Andrea Muolo Co-authored-by: amuolo Co-authored-by: Danilo Calderini Co-authored-by: Daniel Trzesniak Co-authored-by: UMueller1 <108468853+UMueller1@users.noreply.github.com> --- 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 e8db491ff146b44464cc7b68a783b304cc96bdc1 Mon Sep 17 00:00:00 2001 From: Davide Colleoni Date: Wed, 30 Nov 2022 21:14:49 +0100 Subject: [PATCH 06/19] delete full template dir --- .../Constants/CalculationEngine.ipynb | 28 - full-ifrs17-template/Database/.gitignore | 1 - full-ifrs17-template/Database/Configure.ipynb | 94 -- .../Database/PersonalConnectionExample.ipynb | 25 - .../Database/Schema Delete.ipynb | 63 - full-ifrs17-template/Export/MapTemplate.ipynb | 252 ---- .../DataNodeParameters_CH_2020_12.csv | 22 - .../DataNodes/DataNodeStates_CH_2020_12.csv | 20 - .../Files/DataNodes/DataNodes_CH.csv | 38 - full-ifrs17-template/Files/Dimensions.csv | 259 ---- .../Files/Parameters/CreditDefaultRate.csv | 23 - .../Files/Parameters/ExchangeRate.csv | 14 - .../Files/Parameters/PartnerRating.csv | 4 - .../Files/Parameters/YieldCurve.csv | 11 - .../Files/ReportingNodes/ReportingNodes.csv | 10 - .../TransactionalData/Actuals_CH_2020_12.csv | 33 - .../Actuals_CH_2020_12_MTUP10pct.csv | 12 - .../TransactionalData/Actuals_CH_2021_3.csv | 62 - .../NominalCashflows_CH_2020_12.csv | 85 -- .../NominalCashflows_CH_2020_12_MTUP10pct.csv | 13 - .../NominalCashflows_CH_2021_3.csv | 158 --- .../TransactionalData/Openings_CH_2020_12.csv | 8 - .../SimpleValue_CH_2020_12.csv | 44 - full-ifrs17-template/Images/ActualFormat.png | Bin 25544 -> 0 bytes .../Images/CashflowFormat.png | Bin 66204 -> 0 bytes full-ifrs17-template/Images/OpeningFormat.png | Bin 19729 -> 0 bytes .../Images/Systemorph_logo.png | Bin 17061 -> 0 bytes full-ifrs17-template/Images/video1.png | Bin 283562 -> 0 bytes .../Import/CloseImportTemplate.ipynb | 143 --- .../InitSystemorphBaseToMemory.ipynb | 185 --- .../InitSystemorphToDatabase.ipynb | 199 --- .../InitSystemorphToMemory.ipynb | 119 -- .../InputFormatDescription.ipynb | 101 -- .../OverviewIFRS17Template.ipynb | 180 --- full-ifrs17-template/README.md | 42 - full-ifrs17-template/Report/Reports.ipynb | 359 ------ .../Test/AocStructureTest.ipynb | 581 --------- .../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 | 20 - .../BM_CH_2020_12_F.csv | 16 - .../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 - .../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 | 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 ---- ...ableBenchmarks_2020_12_CH__Contractual.csv | 596 --------- ...iableBenchmarks_2021_3_CH__Contractual.csv | 1114 ----------------- .../Test/ExportIfrsVariable.ipynb | 102 -- .../Test/ExportReportVariables.ipynb | 152 --- .../Test/IfrsVariablesTest.ipynb | 284 ----- .../Test/ImportStorageTest.ipynb | 603 --------- .../Test/MapTemplateAndImportTest.ipynb | 473 ------- .../Test/ReportStorageTest.ipynb | 91 -- .../Test/ReportVariablesTest.ipynb | 164 --- .../Test/ReportVariablesTestBase.ipynb | 135 -- full-ifrs17-template/Test/ScenarioTest.ipynb | 195 --- .../Test/SequenceImportTest.ipynb | 121 -- .../Test/TechnicalMarginTest.ipynb | 259 ---- full-ifrs17-template/Test/Tests.ipynb | 99 -- 86 files changed, 9174 deletions(-) delete mode 100644 full-ifrs17-template/Constants/CalculationEngine.ipynb delete mode 100644 full-ifrs17-template/Database/.gitignore delete mode 100644 full-ifrs17-template/Database/Configure.ipynb delete mode 100644 full-ifrs17-template/Database/PersonalConnectionExample.ipynb delete mode 100644 full-ifrs17-template/Database/Schema Delete.ipynb delete mode 100644 full-ifrs17-template/Export/MapTemplate.ipynb delete mode 100644 full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv delete mode 100644 full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv delete mode 100644 full-ifrs17-template/Files/DataNodes/DataNodes_CH.csv delete mode 100644 full-ifrs17-template/Files/Dimensions.csv delete mode 100644 full-ifrs17-template/Files/Parameters/CreditDefaultRate.csv delete mode 100644 full-ifrs17-template/Files/Parameters/ExchangeRate.csv delete mode 100644 full-ifrs17-template/Files/Parameters/PartnerRating.csv delete mode 100644 full-ifrs17-template/Files/Parameters/YieldCurve.csv delete mode 100644 full-ifrs17-template/Files/ReportingNodes/ReportingNodes.csv delete mode 100644 full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv delete mode 100644 full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv delete mode 100644 full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv delete mode 100644 full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv delete mode 100644 full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv delete mode 100644 full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv delete mode 100644 full-ifrs17-template/Files/TransactionalData/Openings_CH_2020_12.csv delete mode 100644 full-ifrs17-template/Files/TransactionalData/SimpleValue_CH_2020_12.csv delete mode 100644 full-ifrs17-template/Images/ActualFormat.png delete mode 100644 full-ifrs17-template/Images/CashflowFormat.png delete mode 100644 full-ifrs17-template/Images/OpeningFormat.png delete mode 100644 full-ifrs17-template/Images/Systemorph_logo.png delete mode 100644 full-ifrs17-template/Images/video1.png delete mode 100644 full-ifrs17-template/Import/CloseImportTemplate.ipynb delete mode 100644 full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb delete mode 100644 full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb delete mode 100644 full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb delete mode 100644 full-ifrs17-template/InputFormatDescription.ipynb delete mode 100644 full-ifrs17-template/OverviewIFRS17Template.ipynb delete mode 100644 full-ifrs17-template/README.md delete mode 100644 full-ifrs17-template/Report/Reports.ipynb delete mode 100644 full-ifrs17-template/Test/AocStructureTest.ipynb delete mode 100644 full-ifrs17-template/Test/Data/CashflowComplex.csv delete mode 100644 full-ifrs17-template/Test/Data/DataNodeParameter_Duplicate.csv delete mode 100644 full-ifrs17-template/Test/Data/DataNodeParameter_InvalidDataNode.csv delete mode 100644 full-ifrs17-template/Test/Data/DataNodeParameter_InvalidReinsCov.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv 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_APA.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_BEPA.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_MTUP10pct_A.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BEPA.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.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 delete mode 100644 full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.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_APA.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_BEPA.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 delete mode 100644 full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv delete mode 100644 full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv delete mode 100644 full-ifrs17-template/Test/ExportIfrsVariable.ipynb delete mode 100644 full-ifrs17-template/Test/ExportReportVariables.ipynb delete mode 100644 full-ifrs17-template/Test/IfrsVariablesTest.ipynb delete mode 100644 full-ifrs17-template/Test/ImportStorageTest.ipynb delete mode 100644 full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb delete mode 100644 full-ifrs17-template/Test/ReportStorageTest.ipynb delete mode 100644 full-ifrs17-template/Test/ReportVariablesTest.ipynb delete mode 100644 full-ifrs17-template/Test/ReportVariablesTestBase.ipynb delete mode 100644 full-ifrs17-template/Test/ScenarioTest.ipynb delete mode 100644 full-ifrs17-template/Test/SequenceImportTest.ipynb delete mode 100644 full-ifrs17-template/Test/TechnicalMarginTest.ipynb delete mode 100644 full-ifrs17-template/Test/Tests.ipynb diff --git a/full-ifrs17-template/Constants/CalculationEngine.ipynb b/full-ifrs17-template/Constants/CalculationEngine.ipynb deleted file mode 100644 index cf36e68d..00000000 --- a/full-ifrs17-template/Constants/CalculationEngine.ipynb +++ /dev/null @@ -1,28 +0,0 @@ -{ - "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 = \"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/.gitignore b/full-ifrs17-template/Database/.gitignore deleted file mode 100644 index 34be061b..00000000 --- a/full-ifrs17-template/Database/.gitignore +++ /dev/null @@ -1 +0,0 @@ -PersonalConnection.ipynb \ No newline at end of file diff --git a/full-ifrs17-template/Database/Configure.ipynb b/full-ifrs17-template/Database/Configure.ipynb deleted file mode 100644 index 44886de4..00000000 --- a/full-ifrs17-template/Database/Configure.ipynb +++ /dev/null @@ -1,94 +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" - }, - "nbformat": 4, - "nbformat_minor": 5, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "

DataSource Configuration

" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"../Constants/CalculationEngine\"", - "\n#!eval calculationEngine" - ] - }, - { - "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/full-ifrs17-template/Database/PersonalConnectionExample.ipynb b/full-ifrs17-template/Database/PersonalConnectionExample.ipynb deleted file mode 100644 index 0bcdbdd5..00000000 --- a/full-ifrs17-template/Database/PersonalConnectionExample.ipynb +++ /dev/null @@ -1,25 +0,0 @@ -{ - "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/Database/Schema Delete.ipynb b/full-ifrs17-template/Database/Schema Delete.ipynb deleted file mode 100644 index f1f25629..00000000 --- a/full-ifrs17-template/Database/Schema Delete.ipynb +++ /dev/null @@ -1,63 +0,0 @@ -{ - "metadata": { - "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, - "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/full-ifrs17-template/Export/MapTemplate.ipynb b/full-ifrs17-template/Export/MapTemplate.ipynb deleted file mode 100644 index f9062ea3..00000000 --- a/full-ifrs17-template/Export/MapTemplate.ipynb +++ /dev/null @@ -1,252 +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": [ - "

Map Template

" - ] - }, - { - "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." - ] - }, - { - "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. " - ] - }, - { - "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: ", - "\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": [ - "#!eval-notebook \"../Import/CloseImportTemplate\"" - ] - }, - { - "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", - "\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)." - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Set Partition" - ] - }, - { - "cell_type": "code", - "source": [ - "static var partition = new PartitionByReportingNode() { ReportingNode = \"CH\" };", - "\nawait 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", - "\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)." - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Set Partition" - ] - }, - { - "cell_type": "code", - "source": [ - "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", - "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Export" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The data is retrieved for the Workspace and prepared for 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": "markdown", - "source": [ - "Export is performed." - ] - }, - { - "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", - "\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. " - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Set Partition" - ] - }, - { - "cell_type": "code", - "source": [ - "static var partition = new PartitionByReportingNodeAndPeriod() { ReportingNode = \"CH\", Year = 2020, Month = 12 };", - "\nawait Workspace.Partition.SetAsync( new PartitionByReportingNode() { ReportingNode = partition.ReportingNode } );" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Export" - ] - }, - { - "cell_type": "markdown", - "source": [ - "The data is retrieved for the Workspace and prepared for 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": "markdown", - "source": [ - "Export is performed." - ] - }, - { - "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/full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv b/full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv deleted file mode 100644 index 19a655dc..00000000 --- a/full-ifrs17-template/Files/DataNodes/DataNodeParameters_CH_2020_12.csv +++ /dev/null @@ -1,22 +0,0 @@ -@@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/full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv b/full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv deleted file mode 100644 index 14a81d65..00000000 --- a/full-ifrs17-template/Files/DataNodes/DataNodeStates_CH_2020_12.csv +++ /dev/null @@ -1,20 +0,0 @@ -@@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, -DT5.1,Active, -DTR1.1,Active, -DTR1.2,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 deleted file mode 100644 index 8862c011..00000000 --- a/full-ifrs17-template/Files/DataNodes/DataNodes_CH.csv +++ /dev/null @@ -1,38 +0,0 @@ -@@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, -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, -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 -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 deleted file mode 100644 index d0a29c98..00000000 --- a/full-ifrs17-template/Files/Dimensions.csv +++ /dev/null @@ -1,259 +0,0 @@ -@@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 -,,,,,,,,,,, -@@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,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,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,,,,,,,,,, -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,,,,,,,, -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,,,,,,,,,, -O,Onerous,,,,,,,,,, -P,Profitabile,,,,,,,,,, -U,Undetermined,,,,,,,,,, -,,,,,,,,,,, -@@RiskDriver,,,,,,,,,,, -SystemName,DisplayName,,,,,,,,,, -Default,Default,,,,,,,,,, -,,,,,,,,,,, -@@Scenario,,,,,,,,,,, -SystemName,DisplayName,,,,,,,,,, -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,,,,,,,,,, -BBA,Building Block Approach,,,,,,,,,, -,,,,,,,,,,, -@@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/full-ifrs17-template/Files/Parameters/CreditDefaultRate.csv b/full-ifrs17-template/Files/Parameters/CreditDefaultRate.csv deleted file mode 100644 index b39c644e..00000000 --- a/full-ifrs17-template/Files/Parameters/CreditDefaultRate.csv +++ /dev/null @@ -1,23 +0,0 @@ -@@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/full-ifrs17-template/Files/Parameters/ExchangeRate.csv b/full-ifrs17-template/Files/Parameters/ExchangeRate.csv deleted file mode 100644 index 8ac834c7..00000000 --- a/full-ifrs17-template/Files/Parameters/ExchangeRate.csv +++ /dev/null @@ -1,14 +0,0 @@ -@@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/full-ifrs17-template/Files/Parameters/PartnerRating.csv b/full-ifrs17-template/Files/Parameters/PartnerRating.csv deleted file mode 100644 index 8f9d717c..00000000 --- a/full-ifrs17-template/Files/Parameters/PartnerRating.csv +++ /dev/null @@ -1,4 +0,0 @@ -@@PartnerRating -Partner,CreditRiskRating,Year,Month -PT1,AAA,2020,12 -PT1,BBB,2021,3 \ No newline at end of file diff --git a/full-ifrs17-template/Files/Parameters/YieldCurve.csv b/full-ifrs17-template/Files/Parameters/YieldCurve.csv deleted file mode 100644 index 892b7ee7..00000000 --- a/full-ifrs17-template/Files/Parameters/YieldCurve.csv +++ /dev/null @@ -1,11 +0,0 @@ -@@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/full-ifrs17-template/Files/ReportingNodes/ReportingNodes.csv b/full-ifrs17-template/Files/ReportingNodes/ReportingNodes.csv deleted file mode 100644 index ffaab637..00000000 --- a/full-ifrs17-template/Files/ReportingNodes/ReportingNodes.csv +++ /dev/null @@ -1,10 +0,0 @@ -@@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/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv deleted file mode 100644 index 9a97158a..00000000 --- a/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12.csv +++ /dev/null @@ -1,33 +0,0 @@ -@@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/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv deleted file mode 100644 index eb8fb4c5..00000000 --- a/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2020_12_MTUP10pct.csv +++ /dev/null @@ -1,12 +0,0 @@ -@@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/Actuals_CH_2021_3.csv b/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv deleted file mode 100644 index e68c8a90..00000000 --- a/full-ifrs17-template/Files/TransactionalData/Actuals_CH_2021_3.csv +++ /dev/null @@ -1,62 +0,0 @@ -@@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/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv deleted file mode 100644 index 54bd5acd..00000000 --- a/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12.csv +++ /dev/null @@ -1,85 +0,0 @@ -@@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/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv deleted file mode 100644 index 3e08a787..00000000 --- a/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2020_12_MTUP10pct.csv +++ /dev/null @@ -1,13 +0,0 @@ -@@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/Files/TransactionalData/NominalCashflows_CH_2021_3.csv b/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv deleted file mode 100644 index f8a3818c..00000000 --- a/full-ifrs17-template/Files/TransactionalData/NominalCashflows_CH_2021_3.csv +++ /dev/null @@ -1,158 +0,0 @@ -@@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/full-ifrs17-template/Files/TransactionalData/Openings_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/Openings_CH_2020_12.csv deleted file mode 100644 index dab25bf9..00000000 --- a/full-ifrs17-template/Files/TransactionalData/Openings_CH_2020_12.csv +++ /dev/null @@ -1,8 +0,0 @@ -@@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/full-ifrs17-template/Files/TransactionalData/SimpleValue_CH_2020_12.csv b/full-ifrs17-template/Files/TransactionalData/SimpleValue_CH_2020_12.csv deleted file mode 100644 index 4d80bce3..00000000 --- a/full-ifrs17-template/Files/TransactionalData/SimpleValue_CH_2020_12.csv +++ /dev/null @@ -1,44 +0,0 @@ -@@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/Images/ActualFormat.png b/full-ifrs17-template/Images/ActualFormat.png deleted file mode 100644 index e055a0a7fae2ea3eebedf69392d79299c25ab40b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25544 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 diff --git a/full-ifrs17-template/Images/OpeningFormat.png b/full-ifrs17-template/Images/OpeningFormat.png deleted file mode 100644 index 8bd3a0d7487a0a82cbdacf4dd0e68ec56e58278f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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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 diff --git a/full-ifrs17-template/Images/Systemorph_logo.png b/full-ifrs17-template/Images/Systemorph_logo.png deleted file mode 100644 index 402f8cfbac5e9afffa104d2d6cf3618653f4244f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17061 zcmZ{L1yt1C6X^P(7?hy2fFP*k(nyIkONexLcXzWAN-wZ@> 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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

GkJ}&o=@#D>_ov@=)8CG67#8 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 diff --git a/full-ifrs17-template/Import/CloseImportTemplate.ipynb b/full-ifrs17-template/Import/CloseImportTemplate.ipynb deleted file mode 100644 index 3ba75fe8..00000000 --- a/full-ifrs17-template/Import/CloseImportTemplate.ipynb +++ /dev/null @@ -1,143 +0,0 @@ -{ - "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": [ - "*Note: before configuring your data please refer to [Map Template](../Export/MapTemplate) Notebook.*" - ] - }, - { - "cell_type": "markdown", - "source": [ - "

Close Import 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": "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": [ - "#!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());", - "\nawait DataSource.Partition.SetAsync(null);", - "\nawait DataSource.Partition.SetAsync(null);" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb deleted file mode 100644 index dfe320cb..00000000 --- a/full-ifrs17-template/Initialization/InitSystemorphBaseToMemory.ipynb +++ /dev/null @@ -1,185 +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": [ - "

In Memory Initialization of unconfigured DataSource

", - "\n

Reference Data and DataNode

", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"../Constants/CalculationEngine\"", - "\n#!eval calculationEngine" - ] - }, - { - "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/Dimensions.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 .WithTarget(DataSource)", - "\n .ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/Dimensions.csv\").WithFormat(ImportFormats.AocConfiguration).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import Parameters" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import DataNodes and DataNodeParameters" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "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/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb deleted file mode 100644 index 04d2caa5..00000000 --- a/full-ifrs17-template/Initialization/InitSystemorphToDatabase.ipynb +++ /dev/null @@ -1,199 +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": [ - "

Physical Database Initialization

" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"../Database/Configure\"" - ] - }, - { - "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/Dimensions.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 .WithTarget(DataSource)", - "\n .ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/ReportingNodes/ReportingNodes.csv\").WithType().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import Parameters" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/Parameters/YieldCurve.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/Parameters/ExchangeRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/Parameters/PartnerRating.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/Parameters/CreditDefaultRate.csv\").WithType().SnapshotMode().WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import DataNodes and DataNodeParameters" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DataNodes/DataNodes_CH.csv\").WithFormat(ImportFormats.DataNode).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DataNodes/DataNodeStates_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeState).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/DataNodes/DataNodeParameters_CH_2020_12.csv\").WithFormat(ImportFormats.DataNodeParameter).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Import Cashflow and Actuals" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "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/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb b/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb deleted file mode 100644 index 37489f3f..00000000 --- a/full-ifrs17-template/Initialization/InitSystemorphToMemory.ipynb +++ /dev/null @@ -1,119 +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": [ - "

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 Import.FromFile(\"../Files/TransactionalData/Openings_CH_2020_12.csv\").WithFormat(ImportFormats.Opening).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2020_12.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2020_12.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/TransactionalData/NominalCashflows_CH_2021_3.csv\").WithFormat(ImportFormats.Cashflow).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "await Import.FromFile(\"../Files/TransactionalData/Actuals_CH_2021_3.csv\").WithFormat(ImportFormats.Actual).WithTarget(DataSource).ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "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": [ - "# 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/full-ifrs17-template/InputFormatDescription.ipynb b/full-ifrs17-template/InputFormatDescription.ipynb deleted file mode 100644 index 2b083f04..00000000 --- a/full-ifrs17-template/InputFormatDescription.ipynb +++ /dev/null @@ -1,101 +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": [ - "

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](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/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/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. " - ] - }, - { - "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](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/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." - ] - }, - { - "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](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/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." - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/OverviewIFRS17Template.ipynb b/full-ifrs17-template/OverviewIFRS17Template.ipynb deleted file mode 100644 index 2475dbde..00000000 --- a/full-ifrs17-template/OverviewIFRS17Template.ipynb +++ /dev/null @@ -1,180 +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": [ - "

IFRS17 Template - an Overview

" - ] - }, - { - "cell_type": "markdown", - "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.", - "\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." - ] - }, - { - "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", - "\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.", - "\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" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Data input", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Reporting nodes, dimensions", - "\n", - "\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$$", - "\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." - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Groups of insurance and reinsurance contracts", - "\n", - "\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" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Parameters from financial markets", - "\n", - "\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)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "", - "\n## Data input: Groups of insurance and reinsurance contracts", - "\n", - "\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).", - "\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." - ] - }, - { - "cell_type": "markdown", - "source": [ - "# 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", - "\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" - ] - }, - { - "cell_type": "markdown", - "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 deleted file mode 100644 index d1d48400..00000000 --- a/full-ifrs17-template/README.md +++ /dev/null @@ -1,42 +0,0 @@ -

-Systemorph logo -

- -

Full IFRS 17 Template

- -**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. - -**IFRS 17 Calculation Engine** is a tool to conduct all the essential IFRS 17 calculations given some key figures. - -# Get Started - -Clone this project to start interacting with it. - -# Supporting Material - -Check out our video series. You can get started here: -[](https://www.youtube.com/watch?v=M1B5AyYvXT8) - -For more information on our IFRS 17 initiative check out our [IFRS 17 page](*landing page*). - -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 - -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). - -# 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 - -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). - -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 deleted file mode 100644 index b31f2e68..00000000 --- a/full-ifrs17-template/Report/Reports.ipynb +++ /dev/null @@ -1,359 +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": [ - "", - "\n

Reports

" - ] - }, - { - "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).", - "\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." - ] - }, - { - "cell_type": "markdown", - "source": [ - "# 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." - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../Import/CloseImportTemplate\"" - ] - }, - { - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);", - "\nifrs17Report.Reset(Workspace)" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Best Estimate", - "\n", - "\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.", - "\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": [ - "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}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Risk Adjustment", - "\n", - "\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." - ] - }, - { - "cell_type": "code", - "source": [ - "var raReport = ifrs17Report.RiskAdjustments;", - "\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}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Written Actuals", - "\n", - "\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. ", - "\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\")}." - ] - }, - { - "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}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "## Advance, Overdue Actuals", - "\n", - "\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 [] {(\"EstimateType\", \"AA\")};", - "\n(await accrualActualReport.ToReportAsync) with {Height = 400}" - ] - }, - { - "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. " - ] - }, - { - "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}" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# Fulfilment Cashflow", - "\n", - "\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}" - ] - }, - { - "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)." - ] - }, - { - "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}" - ] - }, - { - "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**." - ] - }, - { - "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}" - ] - }, - { - "cell_type": "markdown", - "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/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. " - ] - }, - { - "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}" - ] - }, - { - "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. " - ] - }, - { - "cell_type": "code", - "source": [ - "var actuarialLrcReport = ifrs17Report.ActuarialLrc;", - "\nactuarialLrcReport.ReportingNode = \"CH\";", - "\nactuarialLrcReport.ReportingPeriod = (2021, 3);", - "\nactuarialLrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\"", - "\nactuarialLrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", - "\n(await actuarialLrcReport.ToReportAsync) with {Height = 750}" - ] - }, - { - "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. " - ] - }, - { - "cell_type": "code", - "source": [ - "var lrcReport = ifrs17Report.Lrc;", - "\nlrcReport.ReportingNode = \"CH\";", - "\nlrcReport.ReportingPeriod = (2021, 3);", - "\nlrcReport.ColumnSlices = new string[]{};//\"GroupOfContract\",", - "\nlrcReport.DataFilter = null; //new [] {(\"GroupOfContract\", \"DT1.1\")};", - "\n(await lrcReport.ToReportAsync) with {Height = 250}" - ] - }, - { - "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. " - ] - }, - { - "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}" - ] - }, - { - "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." - ] - }, - { - "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}" - ] - }, - { - "cell_type": "markdown", - "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." - ] - }, - { - "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}" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Test/AocStructureTest.ipynb b/full-ifrs17-template/Test/AocStructureTest.ipynb deleted file mode 100644 index 7a350bb4..00000000 --- a/full-ifrs17-template/Test/AocStructureTest.ipynb +++ /dev/null @@ -1,581 +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": [ - "

Test Aoc Management

" - ] - }, - { - "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" - ] - }, - { - "cell_type": "code", - "source": [ - "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();" - ] - }, - { - "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\", 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};" - ] - }, - { - "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 };" - ] - }, - { - "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\", 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};" - ] - }, - { - "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\", 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};" - ] - }, - { - "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/full-ifrs17-template/Test/Data/CashflowComplex.csv b/full-ifrs17-template/Test/Data/CashflowComplex.csv deleted file mode 100644 index 150c4a31..00000000 --- a/full-ifrs17-template/Test/Data/CashflowComplex.csv +++ /dev/null @@ -1,9 +0,0 @@ -@@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/full-ifrs17-template/Test/Data/DataNodeParameter_Duplicate.csv b/full-ifrs17-template/Test/Data/DataNodeParameter_Duplicate.csv deleted file mode 100644 index 2c844eef..00000000 --- a/full-ifrs17-template/Test/Data/DataNodeParameter_Duplicate.csv +++ /dev/null @@ -1,13 +0,0 @@ -@@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/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidDataNode.csv b/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidDataNode.csv deleted file mode 100644 index 681a63c5..00000000 --- a/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidDataNode.csv +++ /dev/null @@ -1,14 +0,0 @@ -@@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/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidReinsCov.csv b/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidReinsCov.csv deleted file mode 100644 index 802ab7b7..00000000 --- a/full-ifrs17-template/Test/Data/DataNodeParameter_InvalidReinsCov.csv +++ /dev/null @@ -1,12 +0,0 @@ -@@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/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 deleted file mode 100644 index 1a81ddf9..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_A.csv +++ /dev/null @@ -1,34 +0,0 @@ -$$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/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_APA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv deleted file mode 100644 index 28224af3..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_APA.csv +++ /dev/null @@ -1,11 +0,0 @@ -$$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/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_BEPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv deleted file mode 100644 index 66ec38ea..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_BEPA.csv +++ /dev/null @@ -1,11 +0,0 @@ -$$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/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_A.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_A.csv deleted file mode 100644 index 6a49b39f..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_A.csv +++ /dev/null @@ -1,14 +0,0 @@ -@@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 deleted file mode 100644 index 9d548fcb..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv +++ /dev/null @@ -1,69 +0,0 @@ -@@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 deleted file mode 100644 index 4674e6db..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BEPA.csv +++ /dev/null @@ -1,6 +0,0 @@ -@@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 deleted file mode 100644 index 5b4b8afc..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_C.csv +++ /dev/null @@ -1,22 +0,0 @@ -@@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 deleted file mode 100644 index a3a224c1..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_F.csv +++ /dev/null @@ -1,9 +0,0 @@ -@@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 deleted file mode 100644 index 4f72f891..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_L.csv +++ /dev/null @@ -1,14 +0,0 @@ -@@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 deleted file mode 100644 index fdff21b6..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_RA.csv +++ /dev/null @@ -1,37 +0,0 @@ -@@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/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_2021_3_A.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv deleted file mode 100644 index 4411cdfd..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_A.csv +++ /dev/null @@ -1,39 +0,0 @@ -$$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/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_APA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv deleted file mode 100644 index e25da1c5..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_APA.csv +++ /dev/null @@ -1,11 +0,0 @@ -$$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/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_BEPA.csv b/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv deleted file mode 100644 index 61c6344a..00000000 --- a/full-ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3_BEPA.csv +++ /dev/null @@ -1,16 +0,0 @@ -$$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/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/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv b/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv deleted file mode 100644 index 27ef2063..00000000 --- a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2020_12_CH__Contractual.csv +++ /dev/null @@ -1,596 +0,0 @@ -@@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 deleted file mode 100644 index 6de7cc3a..00000000 --- a/full-ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv +++ /dev/null @@ -1,1114 +0,0 @@ -@@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/ExportIfrsVariable.ipynb b/full-ifrs17-template/Test/ExportIfrsVariable.ipynb deleted file mode 100644 index f844924b..00000000 --- a/full-ifrs17-template/Test/ExportIfrsVariable.ipynb +++ /dev/null @@ -1,102 +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": [ - "

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": [ - "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)", - "\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 .WithSource(DataSource)", - "\n .ExecuteAsync()" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Test/ExportReportVariables.ipynb b/full-ifrs17-template/Test/ExportReportVariables.ipynb deleted file mode 100644 index 65d0e2cb..00000000 --- a/full-ifrs17-template/Test/ExportReportVariables.ipynb +++ /dev/null @@ -1,152 +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": [ - "

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": [ - "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()" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb b/full-ifrs17-template/Test/IfrsVariablesTest.ipynb deleted file mode 100644 index 78347e9c..00000000 --- a/full-ifrs17-template/Test/IfrsVariablesTest.ipynb +++ /dev/null @@ -1,284 +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": [ - "

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, string Scenario = null){} " - ] - }, - { - "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 // 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};" - ] - }, - { - "cell_type": "code", - "source": [ - "var excludedDataNodes = new[] {\"DT5.1\"}; // DT5.1 is simple importer and tested at report variable level" - ] - }, - { - "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 foreach (var error in expectedNotComputed)", - "\n errors.Add(new BenchmarkTestResult(\"Extra expected variable for: \" + error));", - "\n if (computedNotExpected.Any())", - "\n foreach (var error in computedNotExpected)", - "\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())", - "\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();", - "\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 = g.Key.Scenario;", - "\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()", - "\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 {", - "\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()).DataSet;", - "\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 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)).Distinct().ToList();", - "\n }", - "\n}" - ] - }, - { - "cell_type": "code", - "source": [ - "errorList.Count().Should().Be(0);" - ] - }, - { - "cell_type": "code", - "source": [ - "errorList" - ] - }, - { - "cell_type": "code", - "source": [ - "" - ] - } - ] -} \ No newline at end of file diff --git a/full-ifrs17-template/Test/ImportStorageTest.ipynb b/full-ifrs17-template/Test/ImportStorageTest.ipynb deleted file mode 100644 index bb0d0a2e..00000000 --- a/full-ifrs17-template/Test/ImportStorageTest.ipynb +++ /dev/null @@ -1,603 +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 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\";", - "\nvar 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 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();" - ] - }, - { - "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/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb b/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb deleted file mode 100644 index 92b8091b..00000000 --- a/full-ifrs17-template/Test/MapTemplateAndImportTest.ipynb +++ /dev/null @@ -1,473 +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": [ - "

Test Map Template Export and Import

" - ] - }, - { - "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);" - ] - }, - { - "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);", - "\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)};", - "\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", - "\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());", - "\nUtils.EqualityComparer(grics, Workspace.Query().ToArray());", - "\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);" - ] - }, - { - "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);", - "\nvar tables = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet;", - "\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 ", - "\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*/" - ] - }, - { - "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);" - ] - }, - { - "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);", - "\nvar tables = (await DataSetReader.ReadFromStream(stream).WithContentType(extension).ExecuteAsync()).DataSet;", - "\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 ", - "\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);", - "\nUtils.EqualityComparer(interDataNodeParamBm, expectedInterDataNodeParamBm);", - "\n*/" - ] - }, - { - "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 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}" - ] - }, - { - "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/full-ifrs17-template/Test/ReportStorageTest.ipynb b/full-ifrs17-template/Test/ReportStorageTest.ipynb deleted file mode 100644 index 5fc57968..00000000 --- a/full-ifrs17-template/Test/ReportStorageTest.ipynb +++ /dev/null @@ -1,91 +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": [ - "#!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/full-ifrs17-template/Test/ReportVariablesTest.ipynb b/full-ifrs17-template/Test/ReportVariablesTest.ipynb deleted file mode 100644 index cbaca38e..00000000 --- a/full-ifrs17-template/Test/ReportVariablesTest.ipynb +++ /dev/null @@ -1,164 +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": [ - "

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": [ - "## 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/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb b/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb deleted file mode 100644 index 99e9ac16..00000000 --- a/full-ifrs17-template/Test/ReportVariablesTestBase.ipynb +++ /dev/null @@ -1,135 +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": [ - "

Report Variable Test Base

" - ] - }, - { - "cell_type": "code", - "source": [ - "#!import \"../Initialization/InitSystemorphToMemory\"" - ] - }, - { - "cell_type": "code", - "source": [ - "Workspace.InitializeFrom(DataSource);" - ] - }, - { - "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/full-ifrs17-template/Test/ScenarioTest.ipynb b/full-ifrs17-template/Test/ScenarioTest.ipynb deleted file mode 100644 index c86a432b..00000000 --- a/full-ifrs17-template/Test/ScenarioTest.ipynb +++ /dev/null @@ -1,195 +0,0 @@ -{ - "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 deleted file mode 100644 index cfbc24c3..00000000 --- a/full-ifrs17-template/Test/SequenceImportTest.ipynb +++ /dev/null @@ -1,121 +0,0 @@ -{ - "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/TechnicalMarginTest.ipynb b/full-ifrs17-template/Test/TechnicalMarginTest.ipynb deleted file mode 100644 index 827833ed..00000000 --- a/full-ifrs17-template/Test/TechnicalMarginTest.ipynb +++ /dev/null @@ -1,259 +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 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/full-ifrs17-template/Test/Tests.ipynb b/full-ifrs17-template/Test/Tests.ipynb deleted file mode 100644 index 2b7fefcb..00000000 --- a/full-ifrs17-template/Test/Tests.ipynb +++ /dev/null @@ -1,99 +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": [ - "

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 \"AocStructureTest\"" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"TechnicalMarginTest\"" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"SequenceImportTest\"" - ] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"ScenarioTest\"" - ] - }, - { - "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 From 3b8acd01d6f081abf38fff9e9c7705d9222b0de0 Mon Sep 17 00:00:00 2001 From: Davide Colleoni Date: Wed, 30 Nov 2022 21:16:42 +0100 Subject: [PATCH 07/19] remove images --- ifrs17/Images/BigPicture.PNG | Bin 42091 -> 0 bytes ifrs17/Images/Systemorph_logo.png | Bin 17061 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ifrs17/Images/BigPicture.PNG delete mode 100644 ifrs17/Images/Systemorph_logo.png diff --git a/ifrs17/Images/BigPicture.PNG b/ifrs17/Images/BigPicture.PNG deleted file mode 100644 index d4a6699180f8c29f87014e1eafa71e6a001fa215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42091 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 n{u2DB4L@> 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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 Date: Thu, 22 Dec 2022 09:27:03 +0100 Subject: [PATCH 08/19] Openings: remove reimport duplicates (#150) * fixed ImportStorage queries for openings * clean up --- ifrs17/Import/ImportStorage.ipynb | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ifrs17/Import/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb index c6572abc..8b7e04f6 100644 --- a/ifrs17/Import/ImportStorage.ipynb +++ b/ifrs17/Import/ImportStorage.ipynb @@ -223,7 +223,10 @@ "\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 var allImportScopesAtInceptionYear = allImportScopes.Select(dn => DataNodeDataBySystemName[dn]).Where(dnd => dnd.Year == args.Year).Select(x => x.DataNode).ToHashSet();", + "\n var allImportScopesNotAtInceptionYear = allImportScopes.Except(allImportScopesAtInceptionYear);", + "\n", + "\n if(allImportScopesNotAtInceptionYear.Any()) {", "\n PreviousPeriodPartition = (await querySource.Query().Where(p => p.ReportingNode == args.ReportingNode &&", "\n p.Year == PreviousReportingPeriod.Year &&", "\n p.Month == PreviousReportingPeriod.Month &&", @@ -240,7 +243,7 @@ "\n ", "\n openingIfrsVariables = (await querySource.Query()", "\n .Where(iv => iv.Partition == PreviousPeriodPartition && iv.AocType == AocTypes.EOP)", - "\n .Where(v => allImportScopes.Contains(v.DataNode))", + "\n .Where(v => allImportScopesNotAtInceptionYear.Contains(v.DataNode))", "\n .ToArrayAsync())", "\n .Select(iv => iv with {AocType = AocTypes.BOP, Novelty = Novelties.I, Partition = TargetPartition});", "\n ", @@ -250,11 +253,15 @@ "\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", + "\n var primaryScopeAtInceptionYear = allImportScopesAtInceptionYear.Where(dn => primaryScope.Contains(dn));", + "\n var secondaryScopeAtInceptionYear = allImportScopesAtInceptionYear.Where(dn => secondaryScope.Contains(dn)); ", + "\n if(allImportScopesAtInceptionYear.Any() && 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 .Where(iv => primaryScopeAtInceptionYear.Contains(iv.DataNode) ", + "\n && EstimateTypesByImportFormat[InputSource.Opening.ToString()].Contains(iv.EstimateType) ", + "\n || secondaryScopeAtInceptionYear.Contains(iv.DataNode))", "\n .ToArrayAsync());", "\n ", "\n //Variables", From caf13b3e2dab856c5a371b356a899041ad1a0017 Mon Sep 17 00:00:00 2001 From: Davide Colleoni Date: Wed, 1 Feb 2023 14:47:21 +0100 Subject: [PATCH 09/19] debug import scopes --- .../Import/DebugCalculation/DebugScopes.ipynb | 247 ++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 ifrs17-template/Import/DebugCalculation/DebugScopes.ipynb diff --git a/ifrs17-template/Import/DebugCalculation/DebugScopes.ipynb b/ifrs17-template/Import/DebugCalculation/DebugScopes.ipynb new file mode 100644 index 00000000..5e547ab9 --- /dev/null +++ b/ifrs17-template/Import/DebugCalculation/DebugScopes.ipynb @@ -0,0 +1,247 @@ +{ + "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": [ + "

Debug Import Scope Calculation

" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#!eval-notebook \"../CloseImportTemplate\"" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Args" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var reportingNode = \"CH\";", + "\nvar year = 2020;", + "\nvar month = 12;", + "\nvar importFormat = ImportFormats.Cashflow;", + "\nvar scenario = (string)null;", + "\n", + "\nImportArgs args = new ImportArgs(reportingNode, year, month, default(Periodicity), scenario, importFormat);", + "\nargs" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "Workspace.Initialize(x => x.FromSource(DataSource).DisableInitialization().DisableInitialization());" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# EstimateType to load" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var estimateTypes = (await DataSource.Query().ToArrayAsync());" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var estimateTypesByImportFormat = new Dictionary>(); ", + "\nestimateTypesByImportFormat[ImportFormats.Actual] = estimateTypes.Where(et => (et.InputSource == (InputSource)2 || et.InputSource == (InputSource)3) && ", + "\n et.SystemName != EstimateTypes.APA)", + "\n .Select(x => x.SystemName);", + "\nestimateTypesByImportFormat[ImportFormats.Cashflow] = estimateTypes.Where(et => et.InputSource == (InputSource)4 && ", + "\n et.SystemName != EstimateTypes.BEPA && et.SystemName != EstimateTypes.F)", + "\n .Select(x => x.SystemName);", + "\nestimateTypesByImportFormat[ImportFormats.Opening] = estimateTypes.Where(et => (et.InputSource == (InputSource)3 || et.InputSource == (InputSource)7) && ", + "\n et.SystemName != \"PL\")", + "\n .Select(x => x.SystemName);", + "\n", + "\nestimateTypesByImportFormat" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Load variables to workspace" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "DataSource.Partition.GetCurrent()" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "await DataSource.Partition.SetAsync(args);", + "\nawait Workspace.Partition.SetAsync(args);" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "switch (args.ImportFormat)", + "\n{ ", + "\n case ImportFormats.Actual : ", + "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => estimateTypesByImportFormat[ImportFormats.Actual].Contains(x.EstimateType)).ToArrayAsync());", + "\n break;", + "\n case ImportFormats.Cashflow : ", + "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => estimateTypesByImportFormat[ImportFormats.Cashflow].Contains(x.EstimateType)).ToArrayAsync());", + "\n break;", + "\n default : ", + "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => estimateTypesByImportFormat[ImportFormats.Opening].Contains(x.EstimateType)).ToArrayAsync());", + "\n break;", + "\n}" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Set up copy of DataSource" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var customDataSource = Workspace.CreateNew();" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "customDataSource.Initialize(x => x.FromSource(DataSource).DisableInitialization().DisableInitialization());" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Construct ImportStorage" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var storage = new ImportStorage(args, customDataSource, Workspace);", + "\nawait storage.InitializeAsync();" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# Create universe and Identities" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var universe = Scopes.ForStorage(storage).ToScope();", + "\nvar identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var pvLocked = universe.GetScopes(identities)", + "\n .SelectMany(x => x.PresentValues)", + "\n .Select(x => new {Value= x.Value, ", + "\n Id = x.Identity.Id, ", + "\n AmoutType = x.Identity.AmountType,", + "\n EstimateType = x.Identity.EstimateType,", + "\n AccidentYear = x.Identity.AccidentYear});", + "\npvLocked" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + } + ] +} \ No newline at end of file From 50f326fb23bed9d63323ac2576394cc17d7c9b7d Mon Sep 17 00:00:00 2001 From: Davide Colleoni Date: Tue, 7 Feb 2023 16:11:27 +0100 Subject: [PATCH 10/19] enhance technical margin test - reproduce the bug - --- ifrs17/Test/TechnicalMarginTest.ipynb | 173 ++++++++++++++++++++++---- 1 file changed, 152 insertions(+), 21 deletions(-) diff --git a/ifrs17/Test/TechnicalMarginTest.ipynb b/ifrs17/Test/TechnicalMarginTest.ipynb index 1e60b92a..acc59124 100644 --- a/ifrs17/Test/TechnicalMarginTest.ipynb +++ b/ifrs17/Test/TechnicalMarginTest.ipynb @@ -59,10 +59,12 @@ { "cell_type": "code", "source": [ - "await DataSource.UpdateAsync(dt1.RepeatOnce());", + "await DataSource.UpdateAsync(new []{dt1, dtr1});", "\nawait DataSource.UpdateAsync(new[]{dt11});", - "\nawait DataSource.UpdateAsync(new[]{dt11State});", - "\nawait DataSource.UpdateAsync(new[]{dt11SingleParameter});" + "\nawait DataSource.UpdateAsync(new[]{dtr11});", + "\nawait DataSource.UpdateAsync(new[]{dt11State, dtr11State});", + "\nawait DataSource.UpdateAsync(new[]{dt11SingleParameter});", + "\nawait DataSource.UpdateAsync(new[]{dt11Inter});" ], "metadata": {}, "execution_count": 0, @@ -108,8 +110,9 @@ { "cell_type": "code", "source": [ - "await DataSource.UpdateAsync(previousPeriodPartition.RepeatOnce());", - "\nawait DataSource.UpdateAsync(partitionReportingNode.RepeatOnce());" + "await DataSource.UpdateAsync(partitionReportingNode.RepeatOnce());", + "\nawait DataSource.UpdateAsync(previousPeriodPartition.RepeatOnce());", + "\nawait DataSource.UpdateAsync(partition.RepeatOnce());" ], "metadata": {}, "execution_count": 0, @@ -127,25 +130,35 @@ { "cell_type": "code", "source": [ - "public async Task CheckSwitchLogicAsync(IEnumerable inputDataSet, Dictionary csmLcSwitchBenchmark)", + "public async Task CheckSwitchLogicAsync(IEnumerable inputDataSet, Dictionary csmLcSwitchBenchmark)", "\n{", "\n Activity.Start();", - "\n //Save test input data", + "\n var primaryDataNode = inputDataSet.Any(x => x.DataNode == groupOfReinsuranceContracts) ? groupOfReinsuranceContracts : groupOfInsuranceContracts;", + "\n var partitionId = inputDataSet.First().Partition;", + "\n", + "\n //Clean Workspace and Save test input data", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync());", "\n await Workspace.UpdateAsync(inputDataSet);", "\n ", "\n //Set up import storage and test universe", - "\n var testStorage = new ImportStorage(previousArgs, DataSource, Workspace);", + "\n var partition = (await Workspace.Query().ToArrayAsync()).Single(x => x.Id == partitionId);", + "\n var args = new ImportArgs(partition.ReportingNode, partition.Year, partition.Month, Periodicity.Quarterly, partition.Scenario, ImportFormats.Actual);", + "\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 == groupOfInsuranceContracts)).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 var identities = testUniverse.GetScopes(testStorage.DataNodesByImportScope[ImportScope.Primary].Where(dn => dn == primaryDataNode)).SelectMany(s => s.Identities);", + "\n var csm = testUniverse.GetScopes(identities, o => o.WithContext(EstimateTypes.C)).Where(x => Math.Abs(x.Value) > Precision);", + "\n IEnumerable loss = Enumerable.Empty();", + "\n if (primaryDataNode == groupOfInsuranceContracts) loss = testUniverse.GetScopes(identities, o => o.WithContext(EstimateTypes.L)).Where(x => Math.Abs(x.Value) > Precision);", + "\n if (primaryDataNode == groupOfReinsuranceContracts) loss = testUniverse.GetScopes(identities, o => o.WithContext(EstimateTypes.LR)).Where(x => Math.Abs(x.Value) > Precision);", + "\n ", "\n //Clean up Workspace", - "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync()); ", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync());", + "\n await Workspace.DeleteAsync(inputDataSet);", "\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 var lossBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueLoss) > Precision).ToDictionary(x => x.Key, x => x.Value);", "\n ", "\n ", "\n var errors = new List();", @@ -155,11 +168,11 @@ "\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 if(loss.Count() > lossBenchmark.Count()) ", "\n {", - "\n var extraVariables = lc.Where(x => !lcBenchmark.Keys.Contains(new AocStep(x.Identity.AocType, x.Identity.Novelty)))", + "\n var extraVariables = loss.Where(x => !lossBenchmark.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 errors.Add( $\"{nameof(AllocateTechnicalMargin)} scope for LOSS(LC/LoReCo) has more non zero items compared to benchmark: \\n {string.Join(\"\\n\", extraVariables)}.\" );", "\n }", "\n ", "\n //Check ValueCsm", @@ -176,10 +189,10 @@ "\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 //Check ValueLoss", + "\n foreach(var kvp in lossBenchmark)", "\n {", - "\n var scopeSwitch = lc.SingleOrDefault(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", + "\n var scopeSwitch = loss.SingleOrDefault(y => y.Identity.AocType == kvp.Key.AocType && y.Identity.Novelty == kvp.Key.Novelty);", "\n ", "\n if(scopeSwitch == null)", "\n {", @@ -187,8 +200,8 @@ "\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 if(Math.Abs(scopeSwitch.Value - kvp.Value.valueLoss) > Precision) ", + "\n errors.Add( $\"Values not matching for AocType {kvp.Key.AocType} and Novelty {kvp.Key.Novelty}. Scope: Lc/LoReCo {scopeSwitch.Value}; Benchmark: Lc {kvp.Value.valueLoss}.\" );", "\n }", "\n ", "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", @@ -364,6 +377,124 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "markdown", + "source": [ + "# Reinsurance" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var basicIfrsVariable = new IfrsVariable{Partition = previousPeriodPartition.Id, DataNode = groupOfInsuranceContracts, AccidentYear = null, AmountType = \"Cl\", 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\"),(100d, 0d)},", + "\n {new AocStep(\"IA\",\"N\"), (15d, 0d)},", + "\n {new AocStep(\"EV\",\"N\"), (100d, 0d)},", + "\n {new AocStep(\"CL\",\"C\"), (-100d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), (-57.5, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(57.5, 0d)},", + "\n };", + "\n", + "\nvar activity = await CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);", + "\nactivity" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "DataSource.Query()" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "partition" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "DataSource.Query().Single(x => x.Id == partition.Id)" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "previousArgs" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var reinsBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfReinsuranceContracts, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar grossBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfInsuranceContracts, AccidentYear = null, AmountType = \"Cl\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n grossBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = -100.0},", + "\n grossBasicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = 10.0},", + "\n grossBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -15.0},", + "\n grossBasicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = -100.0},", + "\n grossBasicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = +100.0},", + "\n grossBasicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n", + "\n reinsBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n reinsBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -10.0},", + "\n reinsBasicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -30.0},", + "\n reinsBasicIfrsVariable 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\"),(-100d, 0d)},", + "\n {new AocStep(\"IA\",\"N\"),(+10d, 0d)},", + "\n {new AocStep(\"CL\",\"C\"), (+30d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), (+30d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(-30d, 0d)},", + "\n };", + "\n" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var activity = await CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);", + "\n activity" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, { "cell_type": "code", "source": [ From 1cdac9385eb76dd1e20bec0cc63404bf183328db Mon Sep 17 00:00:00 2001 From: Davide Colleoni Date: Thu, 9 Feb 2023 13:47:34 +0100 Subject: [PATCH 11/19] fix and increase test coverage --- ifrs17/Import/ImportScopeCalculation.ipynb | 16 +- ifrs17/Test/TechnicalMarginTest.ipynb | 403 +++++++++++++++++---- 2 files changed, 348 insertions(+), 71 deletions(-) diff --git a/ifrs17/Import/ImportScopeCalculation.ipynb b/ifrs17/Import/ImportScopeCalculation.ipynb index 5ea716a5..f0f40ba7 100644 --- a/ifrs17/Import/ImportScopeCalculation.ipynb +++ b/ifrs17/Import/ImportScopeCalculation.ipynb @@ -1869,7 +1869,7 @@ "\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 && x.Identity.AocType == AocTypes.CL)", "\n .WithApplicability(x => x.Identity.IsReinsurance, ", "\n p => p.ForMember(s => s.ComputedEstimateType)", "\n .ForMember(s => s.HasSwitch))", @@ -1881,11 +1881,10 @@ "\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 //Allocate", "\n [NotVisible] string EstimateType => GetContext();", "\n ", "\n double Value => (HasSwitch, EstimateType == ComputedEstimateType) switch {", @@ -1914,14 +1913,14 @@ "\n", "\npublic interface AllocateTechnicalMarginForReinsurance : AllocateTechnicalMargin", "\n{ ", - "\n //TODO add Reinsurance Coverage Update (RCU, Novelty=I) AocStep", + "\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 GetScope(Identity with {DataNode = gic}).Value);", "\n ", "\n private double weightedUnderlyingAggregatedTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", - "\n GetScope(Identity with {DataNode = gic}).AggregatedTechnicalMargin);", + "\n GetScope(Identity with {DataNode = gic}).AggregatedValue);", "\n ", "\n private string ComputeReinsuranceEstimateType(double aggregatedFcf) => aggregatedFcf > Precision ? EstimateTypes.LR : EstimateTypes.C;", "\n ", @@ -1935,10 +1934,10 @@ "\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 GetScope(Identity with {DataNode = gic}).Value);", "\n ", "\n private double weightedUnderlyingAggregatedTM => underlyingGic.Sum(gic => GetStorage().GetReinsuranceCoverage(Identity, gic) * ", - "\n GetScope(Identity with {DataNode = gic}).AggregatedTechnicalMargin);", + "\n GetScope(Identity with {DataNode = gic}).AggregatedValue);", "\n private string ComputeReinsuranceEstimateType(double aggregatedFcf) => aggregatedFcf > Precision ? EstimateTypes.LR : EstimateTypes.C;", "\n ", "\n string AllocateTechnicalMargin.ComputedEstimateType => ComputeReinsuranceEstimateType(weightedUnderlyingAggregatedTM + weightedUnderlyingTM);", @@ -1970,7 +1969,6 @@ "\n : (double)default; });", "\n", "\n [NotVisible] bool AllocateTechnicalMargin.HasSwitch => Math.Abs(balancingValue) > Precision;", - "\n ", "\n [NotVisible] double AllocateTechnicalMargin.AggregatedTechnicalMargin => balancingValue;", "\n}", "\n", diff --git a/ifrs17/Test/TechnicalMarginTest.ipynb b/ifrs17/Test/TechnicalMarginTest.ipynb index acc59124..cb036eba 100644 --- a/ifrs17/Test/TechnicalMarginTest.ipynb +++ b/ifrs17/Test/TechnicalMarginTest.ipynb @@ -121,7 +121,17 @@ { "cell_type": "markdown", "source": [ - "# Test" + "# Test Runner" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Error logger", + "\nIt compares the result of a calculation of a single Group of Contract against benchmarks and logs the errors." ], "metadata": {}, "execution_count": 0, @@ -130,37 +140,11 @@ { "cell_type": "code", "source": [ - "public async Task CheckSwitchLogicAsync(IEnumerable inputDataSet, Dictionary csmLcSwitchBenchmark)", + "public async Task> ErrorLoggerAsync(IEnumerable csm, ", + "\n IEnumerable loss, ", + "\n Dictionary csmBenchmark, ", + "\n Dictionary lossBenchmark)", "\n{", - "\n Activity.Start();", - "\n var primaryDataNode = inputDataSet.Any(x => x.DataNode == groupOfReinsuranceContracts) ? groupOfReinsuranceContracts : groupOfInsuranceContracts;", - "\n var partitionId = inputDataSet.First().Partition;", - "\n", - "\n //Clean Workspace and Save test input data", - "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync());", - "\n await Workspace.UpdateAsync(inputDataSet);", - "\n ", - "\n //Set up import storage and test universe", - "\n var partition = (await Workspace.Query().ToArrayAsync()).Single(x => x.Id == partitionId);", - "\n var args = new ImportArgs(partition.ReportingNode, partition.Year, partition.Month, Periodicity.Quarterly, partition.Scenario, ImportFormats.Actual);", - "\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 == primaryDataNode)).SelectMany(s => s.Identities);", - "\n var csm = testUniverse.GetScopes(identities, o => o.WithContext(EstimateTypes.C)).Where(x => Math.Abs(x.Value) > Precision);", - "\n IEnumerable loss = Enumerable.Empty();", - "\n if (primaryDataNode == groupOfInsuranceContracts) loss = testUniverse.GetScopes(identities, o => o.WithContext(EstimateTypes.L)).Where(x => Math.Abs(x.Value) > Precision);", - "\n if (primaryDataNode == groupOfReinsuranceContracts) loss = testUniverse.GetScopes(identities, o => o.WithContext(EstimateTypes.LR)).Where(x => Math.Abs(x.Value) > Precision);", - "\n ", - "\n //Clean up Workspace", - "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync());", - "\n await Workspace.DeleteAsync(inputDataSet);", - "\n ", - "\n var csmBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueCsm) > Precision).ToDictionary(x => x.Key, x => x.Value);", - "\n var lossBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueLoss) > Precision).ToDictionary(x => x.Key, x => x.Value);", - "\n ", - "\n ", "\n var errors = new List();", "\n if(csm.Count() > csmBenchmark.Count()) ", "\n {", @@ -201,10 +185,108 @@ "\n }", "\n ", "\n if(Math.Abs(scopeSwitch.Value - kvp.Value.valueLoss) > Precision) ", - "\n errors.Add( $\"Values not matching for AocType {kvp.Key.AocType} and Novelty {kvp.Key.Novelty}. Scope: Lc/LoReCo {scopeSwitch.Value}; Benchmark: Lc {kvp.Value.valueLoss}.\" );", + "\n errors.Add( $\"Values not matching for AocType {kvp.Key.AocType} and Novelty {kvp.Key.Novelty}. Scope: Lc/LoReCo {scopeSwitch.Value}; Benchmark: Lc/LoReCo {kvp.Value.valueLoss}.\" );", "\n }", "\n ", - "\n if(errors.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"\\n\", errors));", + "\n return errors;", + "\n}" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Computation runner" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "public async Task<(IEnumerable,IEnumerable)> ComputeScopesAsync (IEnumerable inputDataSet,", + "\n Guid partitionId, ", + "\n string primaryDataNode)", + "\n{", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync());", + "\n await Workspace.UpdateAsync(inputDataSet);", + "\n", + "\n var partition = (await Workspace.Query().ToArrayAsync()).Single(x => x.Id == partitionId);", + "\n var args = new ImportArgs(partition.ReportingNode, partition.Year, partition.Month, Periodicity.Quarterly, partition.Scenario, ImportFormats.Actual);", + "\n var testStorage = new ImportStorage(args, DataSource, Workspace);", + "\n await testStorage.InitializeAsync();", + "\n var testUniverse = Scopes.ForStorage(testStorage).ToScope();", + "\n var identities = testUniverse.GetScopes(testStorage.DataNodesByImportScope[ImportScope.Primary].Where(dn => dn == primaryDataNode)).SelectMany(s => s.Identities);", + "\n var csm = testUniverse.GetScopes(identities, o => o.WithContext(EstimateTypes.C)).Where(x => Math.Abs(x.Value) > Precision);", + "\n IEnumerable loss = Enumerable.Empty();", + "\n if (primaryDataNode == groupOfInsuranceContracts) loss = testUniverse.GetScopes(identities, o => o.WithContext(EstimateTypes.L)).Where(x => Math.Abs(x.Value) > Precision);", + "\n if (primaryDataNode == groupOfReinsuranceContracts) loss = testUniverse.GetScopes(identities, o => o.WithContext(EstimateTypes.LR)).Where(x => Math.Abs(x.Value) > Precision);", + "\n ", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync());", + "\n", + "\n return (csm, loss);", + "\n}" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Test runner ", + "\nprovided inputs and benchmarks computes the results and calls the error logger routine." + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "public async Task CheckSwitchLogicAsync(IEnumerable inputDataSet, ", + "\n Dictionary csmLcSwitchBenchmark,", + "\n Dictionary reinsuranceCsmLcSwitchBenchmark = null)", + "\n{", + "\n Activity.Start();", + "\n //SET UP COMPUTATION", + "\n var gross = (await DataSource.Query().ToArrayAsync()).Select(x => x.SystemName);", + "\n var dn = inputDataSet.Select(x => x.DataNode).ToHashSet();", + "\n var dnByType = dn.ToDictionary(x => gross.Contains(x) ? nameof(GroupOfInsuranceContract) : nameof(GroupOfReinsuranceContract), x => x);", + "\n var partitionId = inputDataSet.First().Partition;", + "\n ", + "\n //Gross", + "\n var errorsGross = new List();", + "\n if(dnByType.TryGetValue(nameof(GroupOfInsuranceContract), out var primaryDataNode)){", + "\n //set up bm", + "\n var csmBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueCsm) > Precision).ToDictionary(x => x.Key, x => x.Value);", + "\n var lossBenchmark = csmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueLoss) > Precision).ToDictionary(x => x.Key, x => x.Value);", + "\n //Set up import storage and test universe", + "\n var (csm, loss) = await ComputeScopesAsync(inputDataSet, partitionId, primaryDataNode);", + "\n errorsGross = await ErrorLoggerAsync(csm, loss, csmBenchmark, lossBenchmark);", + "\n }", + "\n", + "\n //Reinsurance ", + "\n var errorsReins = new List();", + "\n if(dnByType.TryGetValue(nameof(GroupOfReinsuranceContract), out primaryDataNode)){", + "\n //set up bm", + "\n var csmBenchmark = reinsuranceCsmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueCsm) > Precision).ToDictionary(x => x.Key, x => x.Value);", + "\n var lossBenchmark = reinsuranceCsmLcSwitchBenchmark.Where(x => Math.Abs(x.Value.valueLoss) > Precision).ToDictionary(x => x.Key, x => x.Value);", + "\n //Set up import storage and test universe", + "\n var (csm, loss) = await ComputeScopesAsync(inputDataSet, partitionId, primaryDataNode);", + "\n errorsReins = await ErrorLoggerAsync(csm, loss, csmBenchmark, lossBenchmark);", + "\n }", + "\n", + "\n //Clean up Workspace", + "\n await Workspace.DeleteAsync(await Workspace.Query().ToArrayAsync());", + "\n //await Workspace.DeleteAsync(inputDataSet);", + "\n ", + "\n if(errorsGross.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"Gross Errors: \\n\", errorsGross));", + "\n if(errorsReins.Any()) ApplicationMessage.Log(Error.Generic, string.Join(\"Reinsurance Errors : \\n\", errorsReins));", + "\n ", "\n return Activity.Finish();", "\n}" ], @@ -212,6 +294,24 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "markdown", + "source": [ + "# Use cases" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Gross, no switch " + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, { "cell_type": "code", "source": [ @@ -252,6 +352,15 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "markdown", + "source": [ + "## Gross switch at CL" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, { "cell_type": "code", "source": [ @@ -292,6 +401,15 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "markdown", + "source": [ + "## Gross with switch without CL" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, { "cell_type": "code", "source": [ @@ -328,6 +446,17 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "markdown", + "source": [ + "## Gross : multiple switch", + "\n", + "\nSwitch in the in force compenent, opposite switch in the new business component. CL AoC Step to correct the allocation of the combined section." + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, { "cell_type": "code", "source": [ @@ -380,7 +509,7 @@ { "cell_type": "markdown", "source": [ - "# Reinsurance" + "## Reinsurance no LoReCo with Gross no switch" ], "metadata": {}, "execution_count": 0, @@ -389,14 +518,20 @@ { "cell_type": "code", "source": [ - "var basicIfrsVariable = new IfrsVariable{Partition = previousPeriodPartition.Id, DataNode = groupOfInsuranceContracts, AccidentYear = null, AmountType = \"Cl\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "var reinsBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfReinsuranceContracts, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar grossBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfInsuranceContracts, AccidentYear = null, AmountType = \"Cl\", 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 grossBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = -100.0},", + "\n grossBasicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = 10.0},", + "\n grossBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -15.0},", + "\n grossBasicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = -100.0},", + "\n grossBasicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = +100.0},", + "\n grossBasicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n", + "\n reinsBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n reinsBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -10.0},", + "\n reinsBasicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -30.0},", + "\n reinsBasicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", "\n };", "\n", "\nvar csmLcSwitch_benchmark = new Dictionary()", @@ -409,8 +544,84 @@ "\n {new AocStep(\"EOP\",\"C\"),(57.5, 0d)},", "\n };", "\n", - "\nvar activity = await CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);", - "\nactivity" + "\nvar reinsCsmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"),(-100d, 0d)},", + "\n {new AocStep(\"IA\",\"N\"),(+10d, 0d)},", + "\n {new AocStep(\"CL\",\"C\"), (+30d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), (+30d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(-30d, 0d)},", + "\n };", + "\n" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var activity = await CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark, reinsCsmLcSwitch_benchmark);", + "\n activity" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "activity.Status.Should().Be(ActivityLogStatus.Succeeded);" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Reinsurance with Gross from [one switch](#gross-with-switch-without-cl) use case" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var reinsBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfReinsuranceContracts, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar grossBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfInsuranceContracts, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar basicIfrsVariable = new IfrsVariable{Partition = previousPeriodPartition.Id, DataNode = groupOfInsuranceContracts, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n grossBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n grossBasicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = -10.0},", + "\n grossBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -150.0}, ", + "\n grossBasicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n", + "\n reinsBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = -100.0},", + "\n reinsBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -10.0},", + "\n reinsBasicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -30.0},", + "\n reinsBasicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\n//Gross CSM-LC", + "\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", + "\nvar reinsCsmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"),(0d, -100d)},", + "\n {new AocStep(\"IA\",\"N\"),(110d, 100d)},", + "\n {new AocStep(\"CL\",\"C\"), (+30d, 0d)},", + "\n {new AocStep(\"AM\",\"C\"), (-70d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(+70d, 0d)},", + "\n };" ], "metadata": {}, "execution_count": 0, @@ -419,7 +630,8 @@ { "cell_type": "code", "source": [ - "DataSource.Query()" + "var activity = await CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark, reinsCsmLcSwitch_benchmark);", + "\n activity" ], "metadata": {}, "execution_count": 0, @@ -428,7 +640,16 @@ { "cell_type": "code", "source": [ - "partition" + "activity.Status.Should().Be(ActivityLogStatus.Succeeded);" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Reinsurance with Gross all LC" ], "metadata": {}, "execution_count": 0, @@ -437,7 +658,36 @@ { "cell_type": "code", "source": [ - "DataSource.Query().Single(x => x.Id == partition.Id)" + "var reinsBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfReinsuranceContracts, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar grossBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfInsuranceContracts, AccidentYear = null, AmountType = \"Cl\", EstimateType = \"BE\", EconomicBasis = \"L\"};", + "\nvar inputDataSet = new IfrsVariable[]{", + "\n grossBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n grossBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -50.0}, ", + "\n grossBasicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n", + "\n reinsBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = -100.0},", + "\n reinsBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -10.0},", + "\n reinsBasicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -30.0},", + "\n reinsBasicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", + "\n };", + "\n", + "\n//Gross CSM-LC", + "\nvar csmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"), (0d, 100d)},", + "\n {new AocStep(\"IA\",\"N\"), (0d, -50d)}, //IA of the gross has opposite sign wrt the others (triggers switching)", + "\n {new AocStep(\"AM\",\"C\"), (0d, -25d)},", + "\n {new AocStep(\"EOP\",\"C\"),(0d, 25d)},", + "\n };", + "\n", + "\nvar reinsCsmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"),(0d, -100d)},", + "\n {new AocStep(\"IA\",\"N\"),(0d, -10d)},", + "\n {new AocStep(\"CL\",\"C\"), (0d, -30d)},", + "\n {new AocStep(\"AM\",\"C\"), (0d, 70d)},", + "\n {new AocStep(\"EOP\",\"C\"),(0d, -70d)},", + "\n };" ], "metadata": {}, "execution_count": 0, @@ -446,7 +696,26 @@ { "cell_type": "code", "source": [ - "previousArgs" + "var activity = await CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark, reinsCsmLcSwitch_benchmark);", + "\nactivity" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "activity.Status.Should().Be(ActivityLogStatus.Succeeded);" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Reinsurance with Gross with CL balancing item" ], "metadata": {}, "execution_count": 0, @@ -458,28 +727,38 @@ "var reinsBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfReinsuranceContracts, AccidentYear = null, AmountType = \"PR\", EstimateType = \"BE\", EconomicBasis = \"L\"};", "\nvar grossBasicIfrsVariable = new IfrsVariable{Partition = partition.Id, DataNode = groupOfInsuranceContracts, AccidentYear = null, AmountType = \"Cl\", EstimateType = \"BE\", EconomicBasis = \"L\"};", "\nvar inputDataSet = new IfrsVariable[]{", - "\n grossBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = -100.0},", - "\n grossBasicIfrsVariable with {AocType = \"CF\", Novelty = \"N\", Value = 10.0},", - "\n grossBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -15.0},", - "\n grossBasicIfrsVariable with {AocType = \"EV\", Novelty = \"N\", Value = -100.0},", - "\n grossBasicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = +100.0},", + "\n grossBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"I\", Value = 100.0, EstimateType = \"C\", AmountType = null},", + "\n grossBasicIfrsVariable with {AocType = \"IA\", Novelty = \"I\", Value = 10.0}, ", + "\n grossBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 50.0},", + "\n grossBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -10.0}, ", "\n grossBasicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", "\n", - "\n reinsBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = 100.0},", + "\n reinsBasicIfrsVariable with {AocType = \"BOP\", Novelty = \"N\", Value = -100.0},", "\n reinsBasicIfrsVariable with {AocType = \"IA\", Novelty = \"N\", Value = -10.0},", "\n reinsBasicIfrsVariable with {AocType = \"CL\", Novelty = \"C\", Value = -30.0},", "\n reinsBasicIfrsVariable with {AocType = \"AM\", Novelty = \"C\", Value = 0.5, EstimateType = \"F\", AmountType = null},", "\n };", "\n", + "\n//Gross CSM-LC", "\nvar csmLcSwitch_benchmark = new Dictionary()", "\n {", - "\n {new AocStep(\"BOP\",\"N\"),(-100d, 0d)},", - "\n {new AocStep(\"IA\",\"N\"),(+10d, 0d)},", - "\n {new AocStep(\"CL\",\"C\"), (+30d, 0d)},", - "\n {new AocStep(\"AM\",\"C\"), (+30d, 0d)},", - "\n {new AocStep(\"EOP\",\"C\"),(-30d, 0d)},", + "\n {new AocStep(\"BOP\",\"I\"), (100d, 0d)},", + "\n {new AocStep(\"IA\",\"I\"), (0.049962543d, 0d)},", + "\n {new AocStep(\"BOP\",\"N\"), (0d, 50d)},", + "\n {new AocStep(\"IA\",\"N\"), (0d, -10d)},", + "\n {new AocStep(\"CL\",\"C\"), (-40d, -40d)},", + "\n {new AocStep(\"AM\",\"C\"), (-30.024981271d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(30.024981271d, 0d)},", "\n };", - "\n" + "\n", + "\nvar reinsCsmLcSwitch_benchmark = new Dictionary()", + "\n {", + "\n {new AocStep(\"BOP\",\"N\"),(0d, -100d)},", + "\n {new AocStep(\"IA\",\"N\"), (0d, -10d)},", + "\n {new AocStep(\"CL\",\"C\"), (140d, 110d)},", + "\n {new AocStep(\"AM\",\"C\"), (-70d, 0d)},", + "\n {new AocStep(\"EOP\",\"C\"),(70d, 0d)},", + "\n };" ], "metadata": {}, "execution_count": 0, @@ -488,8 +767,8 @@ { "cell_type": "code", "source": [ - "var activity = await CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark);", - "\n activity" + "var activity = await CheckSwitchLogicAsync(inputDataSet, csmLcSwitch_benchmark, reinsCsmLcSwitch_benchmark);", + "\nactivity" ], "metadata": {}, "execution_count": 0, @@ -498,7 +777,7 @@ { "cell_type": "code", "source": [ - "" + "activity.Status.Should().Be(ActivityLogStatus.Succeeded);" ], "metadata": {}, "execution_count": 0, From 6efa96c7f658e15def1d7825d43ac4dcffbb2255 Mon Sep 17 00:00:00 2001 From: Davide Colleoni Date: Thu, 9 Feb 2023 16:25:49 +0100 Subject: [PATCH 12/19] clean up --- .../Import/DebugCalculation/DebugScopes.ipynb | 247 ------------------ 1 file changed, 247 deletions(-) delete mode 100644 ifrs17-template/Import/DebugCalculation/DebugScopes.ipynb diff --git a/ifrs17-template/Import/DebugCalculation/DebugScopes.ipynb b/ifrs17-template/Import/DebugCalculation/DebugScopes.ipynb deleted file mode 100644 index 5e547ab9..00000000 --- a/ifrs17-template/Import/DebugCalculation/DebugScopes.ipynb +++ /dev/null @@ -1,247 +0,0 @@ -{ - "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": [ - "

Debug Import Scope Calculation

" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "#!eval-notebook \"../CloseImportTemplate\"" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "# Args" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "var reportingNode = \"CH\";", - "\nvar year = 2020;", - "\nvar month = 12;", - "\nvar importFormat = ImportFormats.Cashflow;", - "\nvar scenario = (string)null;", - "\n", - "\nImportArgs args = new ImportArgs(reportingNode, year, month, default(Periodicity), scenario, importFormat);", - "\nargs" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "Workspace.Initialize(x => x.FromSource(DataSource).DisableInitialization().DisableInitialization());" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "# EstimateType to load" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "var estimateTypes = (await DataSource.Query().ToArrayAsync());" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "var estimateTypesByImportFormat = new Dictionary>(); ", - "\nestimateTypesByImportFormat[ImportFormats.Actual] = estimateTypes.Where(et => (et.InputSource == (InputSource)2 || et.InputSource == (InputSource)3) && ", - "\n et.SystemName != EstimateTypes.APA)", - "\n .Select(x => x.SystemName);", - "\nestimateTypesByImportFormat[ImportFormats.Cashflow] = estimateTypes.Where(et => et.InputSource == (InputSource)4 && ", - "\n et.SystemName != EstimateTypes.BEPA && et.SystemName != EstimateTypes.F)", - "\n .Select(x => x.SystemName);", - "\nestimateTypesByImportFormat[ImportFormats.Opening] = estimateTypes.Where(et => (et.InputSource == (InputSource)3 || et.InputSource == (InputSource)7) && ", - "\n et.SystemName != \"PL\")", - "\n .Select(x => x.SystemName);", - "\n", - "\nestimateTypesByImportFormat" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "# Load variables to workspace" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "DataSource.Partition.GetCurrent()" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "await DataSource.Partition.SetAsync(args);", - "\nawait Workspace.Partition.SetAsync(args);" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "switch (args.ImportFormat)", - "\n{ ", - "\n case ImportFormats.Actual : ", - "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => estimateTypesByImportFormat[ImportFormats.Actual].Contains(x.EstimateType)).ToArrayAsync());", - "\n break;", - "\n case ImportFormats.Cashflow : ", - "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => estimateTypesByImportFormat[ImportFormats.Cashflow].Contains(x.EstimateType)).ToArrayAsync());", - "\n break;", - "\n default : ", - "\n await Workspace.UpdateAsync(await DataSource.Query().Where(x => estimateTypesByImportFormat[ImportFormats.Opening].Contains(x.EstimateType)).ToArrayAsync());", - "\n break;", - "\n}" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "# Set up copy of DataSource" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "var customDataSource = Workspace.CreateNew();" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "customDataSource.Initialize(x => x.FromSource(DataSource).DisableInitialization().DisableInitialization());" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "# Construct ImportStorage" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "var storage = new ImportStorage(args, customDataSource, Workspace);", - "\nawait storage.InitializeAsync();" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "# Create universe and Identities" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "var universe = Scopes.ForStorage(storage).ToScope();", - "\nvar identities = universe.GetScopes(storage.DataNodesByImportScope[ImportScope.Primary]).SelectMany(s => s.Identities);" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "var pvLocked = universe.GetScopes(identities)", - "\n .SelectMany(x => x.PresentValues)", - "\n .Select(x => new {Value= x.Value, ", - "\n Id = x.Identity.Id, ", - "\n AmoutType = x.Identity.AmountType,", - "\n EstimateType = x.Identity.EstimateType,", - "\n AccidentYear = x.Identity.AccidentYear});", - "\npvLocked" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "" - ], - "metadata": {}, - "execution_count": 0, - "outputs": [] - } - ] -} \ No newline at end of file From d17f4603d4d93279c9fefaa4ddb2e91fc0671786 Mon Sep 17 00:00:00 2001 From: Davide Colleoni Date: Fri, 10 Feb 2023 14:42:24 +0100 Subject: [PATCH 13/19] typos --- ifrs17/Test/TechnicalMarginTest.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ifrs17/Test/TechnicalMarginTest.ipynb b/ifrs17/Test/TechnicalMarginTest.ipynb index cb036eba..d40c3bfd 100644 --- a/ifrs17/Test/TechnicalMarginTest.ipynb +++ b/ifrs17/Test/TechnicalMarginTest.ipynb @@ -238,7 +238,7 @@ "cell_type": "markdown", "source": [ "## Test runner ", - "\nprovided inputs and benchmarks computes the results and calls the error logger routine." + "\nProvided inputs and benchmarks computes the results and calls the error logger routine." ], "metadata": {}, "execution_count": 0, @@ -451,7 +451,7 @@ "source": [ "## Gross : multiple switch", "\n", - "\nSwitch in the in force compenent, opposite switch in the new business component. CL AoC Step to correct the allocation of the combined section." + "\nSwitch in the in force component, opposite switch in the new business component. CL AoC Step to correct the allocation of the combined section." ], "metadata": {}, "execution_count": 0, From 7e4aa587890634b644bc5c33c0a804b758fbe1cd Mon Sep 17 00:00:00 2001 From: Davide Colleoni Date: Mon, 6 Mar 2023 14:12:46 +0100 Subject: [PATCH 14/19] update to v1.1.1 --- .../Constants/CalculationEngine.ipynb | 2 +- ifrs17-template/Export/MapTemplate.ipynb | 6 ++-- .../Import/CloseImportTemplate.ipynb | 8 ++--- ifrs17-template/InputFormatDescription.ipynb | 32 +++++++++---------- ifrs17-template/Report/ParameterReports.ipynb | 16 +++++----- ifrs17-template/Report/Reports.ipynb | 30 ++++++++--------- 6 files changed, 47 insertions(+), 47 deletions(-) diff --git a/ifrs17-template/Constants/CalculationEngine.ipynb b/ifrs17-template/Constants/CalculationEngine.ipynb index 3b0bef01..4ce89cf3 100644 --- a/ifrs17-template/Constants/CalculationEngine.ipynb +++ b/ifrs17-template/Constants/CalculationEngine.ipynb @@ -19,7 +19,7 @@ "cell_type": "code", "source": [ "var projectName = \"ifrs17\";", - "\nvar environmentName = \"v1.1.0\";", + "\nvar environmentName = \"v1.1.1\";", "\nvar notebookName = \"CalculationEngine\";", "\nvar calculationEngine = $\"#!import \\\"//{projectName}/{environmentName}/{notebookName}\\\"\";" ], diff --git a/ifrs17-template/Export/MapTemplate.ipynb b/ifrs17-template/Export/MapTemplate.ipynb index eb986486..f7801ae7 100644 --- a/ifrs17-template/Export/MapTemplate.ipynb +++ b/ifrs17-template/Export/MapTemplate.ipynb @@ -111,7 +111,7 @@ "source": [ "# Map Template: Data Node", "\n", - "\n[DataNodes](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#data-node) defines the properties of [Portfolios](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#group-of-contracts)." + "\n[DataNodes](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#data-node) defines the properties of [Portfolios](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#group-of-contracts)." ], "metadata": {}, "execution_count": 0, @@ -167,7 +167,7 @@ "source": [ "# Map Template: Data Node State", "\n", - "\n[Data Node State](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.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)." + "\n[Data Node State](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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, @@ -253,7 +253,7 @@ "source": [ "# Map Template: Data Node Parameter", "\n", - "\n[Data Node Parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#data-node-parameters) are defined at the Group of Contract level and are used during the import calculation. " + "\n[Data Node Parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#data-node-parameters) are defined at the Group of Contract level and are used during the import calculation. " ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17-template/Import/CloseImportTemplate.ipynb b/ifrs17-template/Import/CloseImportTemplate.ipynb index 4070701a..3f96d4b5 100644 --- a/ifrs17-template/Import/CloseImportTemplate.ipynb +++ b/ifrs17-template/Import/CloseImportTemplate.ipynb @@ -38,7 +38,7 @@ "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 ImportFormats can be found [here](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Constants/Consts#import-formats)", + "\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 ImportFormats can be found [here](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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" @@ -88,9 +88,9 @@ "\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.1.0/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#group-of-contracts)", - "\n- ImportFormats.DataNodeState : the [state of a data node](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.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.1.0/DataModel/DataStructure#data-node-parameters). For **Group of Insurance Contracts** a default [Premium Allocation factor](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Import/ImportScopeCalculation#experience-adjustment-on-premium) of 1 is applied if the parameter is not imported.", + "\n- ImportFormats.DataNode : [Portfolios](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#group-of-contracts)", + "\n- ImportFormats.DataNodeState : the [state of a data node](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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.1.1/DataModel/DataStructure#data-node-parameters). For **Group of Insurance Contracts** a default [Premium Allocation factor](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/Import/ImportScopeCalculation#experience-adjustment-on-premium) of 1 is applied if the parameter is not imported.", "\n" ], "metadata": {}, diff --git a/ifrs17-template/InputFormatDescription.ipynb b/ifrs17-template/InputFormatDescription.ipynb index 1087fa85..c0eb846c 100644 --- a/ifrs17-template/InputFormatDescription.ipynb +++ b/ifrs17-template/InputFormatDescription.ipynb @@ -39,17 +39,17 @@ "source": [ "A cash flow 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.systemorph.cloud/project/ifrs17/env/v1.1.0/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.systemorph.cloud/project/ifrs17/env/v1.1.1/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.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#estimate-type) : entered with its SystemName,", - "\n- [AocType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [Novelty](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#novelty) : entered with its SystemName,", + "\n- [DataNode](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [AocType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [Novelty](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", + "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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 length of cash flow. The Value0 corresponds to January of the Year entered in the **Main** section for every combination of AocType and Novelty. " ], "metadata": {}, @@ -74,13 +74,13 @@ "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.systemorph.cloud/project/ifrs17/env/v1.1.0/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.systemorph.cloud/project/ifrs17/env/v1.1.1/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.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AocType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [DataNode](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AocType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#estimate-type) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ], "metadata": {}, @@ -105,12 +105,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.systemorph.cloud/project/ifrs17/env/v1.1.0/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.systemorph.cloud/project/ifrs17/env/v1.1.1/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.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [DataNode](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#estimate-type) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ], "metadata": {}, diff --git a/ifrs17-template/Report/ParameterReports.ipynb b/ifrs17-template/Report/ParameterReports.ipynb index 8b1c6d9c..3e23a6bb 100644 --- a/ifrs17-template/Report/ParameterReports.ipynb +++ b/ifrs17-template/Report/ParameterReports.ipynb @@ -101,7 +101,7 @@ "# Retrieve data ", "\n", "\nThe parameters used for calculation of the provided period are here retrieved through queries.", - "\nThe queries and the data model of the reported objects can be foud in the [ParameterReportQueries](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Report/ParameterReportsQueries#queries)" + "\nThe queries and the data model of the reported objects can be foud in the [ParameterReportQueries](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/Report/ParameterReportsQueries#queries)" ], "metadata": {}, "execution_count": 0, @@ -183,7 +183,7 @@ "cell_type": "markdown", "source": [ "## Data node", - "\nProperties of the Group of Contracts and corresponding Portfolios are merged to provide a full description of the [Data Node](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructureDataStructure#data-node)" + "\nProperties of the Group of Contracts and corresponding Portfolios are merged to provide a full description of the [Data Node](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructureDataStructure#data-node)" ], "metadata": {}, "execution_count": 0, @@ -207,7 +207,7 @@ "source": [ "## Data node state", "\n", - "\nCurrent and previous period [data node state](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#data-node-state)." + "\nCurrent and previous period [data node state](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#data-node-state)." ], "metadata": {}, "execution_count": 0, @@ -232,7 +232,7 @@ "cell_type": "markdown", "source": [ "## Yield curve", - "\n[Yield Curve](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#yield-curve) used for locked-in discounting and current rating discouning (curret period and previous period) are shown." + "\n[Yield Curve](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#yield-curve) used for locked-in discounting and current rating discouning (curret period and previous period) are shown." ], "metadata": {}, "execution_count": 0, @@ -256,7 +256,7 @@ "cell_type": "markdown", "source": [ "## Single data node parameter", - "\n[Single data node parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#data-node-parameters) for current and previous period. " + "\n[Single data node parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#data-node-parameters) for current and previous period. " ], "metadata": {}, "execution_count": 0, @@ -280,7 +280,7 @@ "cell_type": "markdown", "source": [ "## Inter data node parameter", - "\n[Inter data node parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#data-node-parameters) for current and previous period. " + "\n[Inter data node parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#data-node-parameters) for current and previous period. " ], "metadata": {}, "execution_count": 0, @@ -304,7 +304,7 @@ "cell_type": "markdown", "source": [ "## Partner ratings", - "\n[Partner ratings](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#partner-rating) for current and previous period." + "\n[Partner ratings](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#partner-rating) for current and previous period." ], "metadata": {}, "execution_count": 0, @@ -328,7 +328,7 @@ "cell_type": "markdown", "source": [ "## Partner default rates", - "\n[Partner default rates](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/DataModel/DataStructure#credit-default-rate) for current and previous period." + "\n[Partner default rates](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/DataModel/DataStructure#credit-default-rate) for current and previous period." ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17-template/Report/Reports.ipynb b/ifrs17-template/Report/Reports.ipynb index d22f25e8..3eaadc9e 100644 --- a/ifrs17-template/Report/Reports.ipynb +++ b/ifrs17-template/Report/Reports.ipynb @@ -80,7 +80,7 @@ "source": [ "# Best Estimate", "\n", - "\nPresent values of the [best-estimate](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Report/ReportScopes#best-estimate) future cash flows are shown here in an Analysis of Change report.", + "\nPresent values of the [best-estimate](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/Report/ReportScopes#best-estimate) future cash flows 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.", @@ -111,7 +111,7 @@ "source": [ "# Risk Adjustment", "\n", - "\nPresent values of the [risk adjustment](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Report/ReportScopes#risk-adjustment) future cash flows are shown here.", + "\nPresent values of the [risk adjustment](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/Report/ReportScopes#risk-adjustment) future cash flows 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." ], @@ -138,7 +138,7 @@ "source": [ "# Written Actuals", "\n", - "\n[Written Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Report/ReportScopes#written-accrual-deferral) are shown here. ", + "\n[Written Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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. ", "\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\")}." @@ -166,8 +166,8 @@ "source": [ "## Advance, Overdue Actuals", "\n", - "\nActuals payed in [Advance](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Report/ReportScopes#written-accrual-deferral)", - "\nor [Overdue](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/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.1.1/Report/ReportScopes#written-accrual-deferral)", + "\nor [Overdue](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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. " ], @@ -194,7 +194,7 @@ "source": [ "## Deferrable Actuals", "\n", - "\n[Deferrable Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/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.1.1/Report/ReportScopes#written-accrual-deferral) are shown here. Amortization of the deferrable amount is computed using the Coverage Unit pattern. " ], "metadata": {}, "execution_count": 0, @@ -219,7 +219,7 @@ "source": [ "# Fulfilment Cash flow", "\n", - "\nPresent Value of the [Fulfilment Cash flow](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Report/ReportScopes#fulfillment-cash-flows) are shown here. ", + "\nPresent Value of the [Fulfilment Cash flow](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/Report/ReportScopes#fulfillment-cash-flows) 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\")}.", @@ -248,7 +248,7 @@ "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.1.0/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.1.1/Report/ReportScopes#experience-adjustment)." ], "metadata": {}, "execution_count": 0, @@ -273,7 +273,7 @@ "source": [ "# LRC Technical Margin", "\n", - "\nIn the [Technical Margin](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.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. ", + "\nIn the [Technical Margin](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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": {}, @@ -299,7 +299,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/ifrs17/env/v1.1.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. ", + "\nThe Contractual Service Margin (CSM) / Loss Component (LC) / Loss Recovery Component (LR) [report](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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. " ], @@ -326,7 +326,7 @@ "source": [ "# LRC Actuarial", "\n", - "\nThe [Actuarial Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Report/ReportScopes#lrc-actuarial-actuarial-liability-for-remaining-coverage) report shows figures from Fulfilment Cash flow discounted with current yield curve, and the allocated techinical margin. " + "\nThe [Actuarial Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/Report/ReportScopes#lrc-actuarial-actuarial-liability-for-remaining-coverage) report shows figures from Fulfilment Cash flow discounted with current yield curve, and the allocated techinical margin. " ], "metadata": {}, "execution_count": 0, @@ -351,7 +351,7 @@ "source": [ "# LRC", "\n", - "\nThe [Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.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. " + "\nThe [Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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, @@ -376,7 +376,7 @@ "source": [ "# LIC Actuarial", "\n", - "\nThe [Actuarial Liability of Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Report/ReportScopes#lic-actuarial-actuarial-liability-for-incurred-claims) report shows figures from Fulfilment Cash flow discounted with current yield curve. " + "\nThe [Actuarial Liability of Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/Report/ReportScopes#lic-actuarial-actuarial-liability-for-incurred-claims) report shows figures from Fulfilment Cash flow discounted with current yield curve. " ], "metadata": {}, "execution_count": 0, @@ -401,7 +401,7 @@ "source": [ "# LIC", "\n", - "\nThe [Liability for Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.0/Report/ReportScopes#lic-liability-for-incurred-claims) adds to the [Actuarial Liability for Incurred Claims](#lic-actuarial) the contribution of and accrual actuals." + "\nThe [Liability for Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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, @@ -426,7 +426,7 @@ "source": [ "# Financial Performance", "\n", - "\nThe [Financial Performance](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.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 cash flows (Premiums, Claims, Expenses, etc...) for the given period.", + "\nThe [Financial Performance](https://portal.systemorph.cloud/project/ifrs17/env/v1.1.1/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 cash flows (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." ], From f5974fcfe63d9a062f9d4dfb6bae1074ba673848 Mon Sep 17 00:00:00 2001 From: Nikos Nikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Wed, 21 Jun 2023 18:38:54 +0200 Subject: [PATCH 15/19] Log an Error for Invalid AY Types (#316) * Log an error for invalid AY types * Undo some changes in Importers * Undo * Feedback * Implement feedback * Optimize --- ifrs17/Constants/Validations.ipynb | 2 ++ ifrs17/Import/Importers.ipynb | 38 ++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/ifrs17/Constants/Validations.ipynb b/ifrs17/Constants/Validations.ipynb index 0152a7e0..c49884e8 100644 --- a/ifrs17/Constants/Validations.ipynb +++ b/ifrs17/Constants/Validations.ipynb @@ -66,6 +66,7 @@ "\n NoMainTab, IncompleteMainTab, ParsingScientificNotation, ValueTypeNotFound, ValueTypeNotValid, ", "\n ReportingNodeInMainNotFound, YearInMainNotFound, MonthInMainNotFound, ScenarioInMainNotAvailable,", "\n AocTypeNotValid, AocTypeCompulsoryNotFound, AocTypePositionNotSupported, AocConfigurationOrderNotUnique,", + "\n AccidentYearTypeNotValid,", "\n // Partition", "\n PartitionNotFound, ParsedPartitionNotFound, PartititionNameNotFound, PartitionTypeNotFound,", "\n // Dimensions", @@ -122,6 +123,7 @@ "\n (Error.AocTypeCompulsoryNotFound , _) => $\"Not all compulsory AoC Types have been imported.\",", "\n (Error.AocTypePositionNotSupported , 1) => $\"The position of the AoC Type {s[0]} is not supported.\",", "\n (Error.AocConfigurationOrderNotUnique , _) => $\"Two or more AoC Configurations have the same Order.\",", + "\n (Error.AccidentYearTypeNotValid , 1) => $\"The parsed AccidentYear {s[0]} is invalid. Expected Accident Year input of type int.\",", "\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 7e899cdb..7b063015 100644 --- a/ifrs17/Import/Importers.ipynb +++ b/ifrs17/Import/Importers.ipynb @@ -1369,15 +1369,21 @@ "\n if(values.Length == 0 && !parsingStorage.MandatoryAocSteps.Contains(new AocStep(aocType, novelty))) return null;", "\n }", "\n ", + "\n int? accidentYear = default;", + "\n if(hasAccidentYearColumn && datarow.Field(nameof(RawVariable.AccidentYear)) != null) {", + "\n if(!Int32.TryParse(datarow.Field(nameof(RawVariable.AccidentYear)), out var parsedAccidentYear)) { ", + "\n ApplicationMessage.Log(Error.AccidentYearTypeNotValid, datarow.Field(nameof(RawVariable.AccidentYear))); return null;", + "\n }", + "\n else accidentYear = (int?)parsedAccidentYear;", + "\n }", + "\n ", "\n var item = new RawVariable {", "\n DataNode = dataNode,", "\n AocType = aocType,", "\n Novelty = novelty,", "\n AmountType = valueType.AmountType,", "\n EstimateType = valueType.EstimateType,", - "\n AccidentYear = hasAccidentYearColumn && Int32.TryParse((datarow.Field(nameof(RawVariable.AccidentYear))), out var accidentYear)", - "\n ? accidentYear", - "\n : (int?)null,", + "\n AccidentYear = accidentYear,", "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", "\n Values = Multiply(GetSign(ImportFormats.Cashflow, (aocType, valueType.AmountType, valueType.EstimateType, dataNodeData.IsReinsurance), parsingStorage.HierarchyCache), values)", "\n .Interpolate(parsingStorage.GetCashFlowPeriodicity(dataNode), parsingStorage.GetInterpolationMethod(dataNode))", @@ -1467,6 +1473,8 @@ "\n await parsingStorage.InitializeAsync();", "\n if(Activity.HasErrors()) return Activity.Finish();", "\n", + "\n var hasAccidentYearColumn = dataSet.Tables[ImportFormats.Actual].Columns.Any(x => x.ColumnName == nameof(IfrsVariable.AccidentYear));", + "\n", "\n var importLog = await Import.FromDataSet(dataSet)", "\n .WithType ( (dataset, datarow) => {", "\n var dataNode = datarow.Field(nameof(DataNode));", @@ -1487,11 +1495,20 @@ "\n var currentPeriodValue = GetSign(ImportFormats.Actual, ", "\n (aocType, valueType.AmountType, valueType.EstimateType, dataNodeData.IsReinsurance), ", "\n parsingStorage.HierarchyCache) * datarow.Field(\"Value\").CheckStringForExponentialAndConvertToDouble();", + "\n ", + "\n int? accidentYear = default;", + "\n if(hasAccidentYearColumn && datarow.Field(nameof(RawVariable.AccidentYear)) != null) {", + "\n if(!Int32.TryParse(datarow.Field(nameof(RawVariable.AccidentYear)), out var parsedAccidentYear)) { ", + "\n ApplicationMessage.Log(Error.AccidentYearTypeNotValid, datarow.Field(nameof(RawVariable.AccidentYear))); return null;", + "\n }", + "\n else accidentYear = (int?)parsedAccidentYear;", + "\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 AccidentYear = accidentYear,", "\n AmountType = valueType.AmountType,", "\n EstimateType = valueType.EstimateType,", "\n Partition = parsingStorage.TargetPartitionByReportingNodeAndPeriod.Id,", @@ -1574,6 +1591,8 @@ "\n await parsingStorage.InitializeAsync();", "\n if(Activity.HasErrors()) return Activity.Finish(); ", "\n", + "\n var hasAccidentYearColumn = dataSet.Tables[importFormat].Columns.Any(x => x.ColumnName == nameof(IfrsVariable.AccidentYear));", + "\n", "\n var importLog = await Import.FromDataSet(dataSet)", "\n .WithType ( (dataset, datarow) => {", "\n var dataNode = parsingStorage.ValidateDataNode(datarow.Field(nameof(DataNode)),importFormat);", @@ -1593,11 +1612,20 @@ "\n (aocStep.AocType, amountType, estimateType, parsingStorage.IsDataNodeReinsurance(dataNode)), ", "\n parsingStorage.HierarchyCache) * datarow.Field(\"Value\")", "\n .CheckStringForExponentialAndConvertToDouble();", + "\n", + "\n int? accidentYear = default;", + "\n if(hasAccidentYearColumn && datarow.Field(nameof(RawVariable.AccidentYear)) != null) {", + "\n if(!Int32.TryParse(datarow.Field(nameof(RawVariable.AccidentYear)), out var parsedAccidentYear)) { ", + "\n ApplicationMessage.Log(Error.AccidentYearTypeNotValid, datarow.Field(nameof(RawVariable.AccidentYear))); return null;", + "\n }", + "\n else accidentYear = (int?)parsedAccidentYear;", + "\n }", + "\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 AccidentYear = accidentYear,", "\n AmountType = amountType,", "\n EstimateType = estimateType,", "\n EconomicBasis = economicBasis,", From 16f1e3c8c7689822c06e7147604f9f7eaeb13bb6 Mon Sep 17 00:00:00 2001 From: Nikos Nikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Thu, 22 Jun 2023 14:21:44 +0200 Subject: [PATCH 16/19] Introduce Locked In CDR and Partner Rating for Technical Margin (#323) * First commit * Implement GetLockedNonPerformanceRiskRate * Improve and fix tests * Sketch ImportStorage Getter and add new CDR amount type * Implement GetAmountTypeDescendants in ImportStorage * Add EstimateType to the Identity of ValidAmountType scope * Add TM EstimateType and adjust TechnicalMargin scope * CDR Applicabilities should also apply for new CDR AmountType * Add TM EstimateType in Dimensions.csv * Feedback * Properly populate the locked-in dictionaries * Adjust the ParameterReportsQueries for locked-in Partner Rating and CreditDefaultRates * Feedback * Slicing in ParameterReports * Fix tests * All tests green * ParameterReports adjustments * Undo ParameterReports changes * Cleanup * Feedback: Refactor GetNonPerformanceRiskRate * Feedback * Revert EstimateType TM related changes * Adjust Dimensions.csv * Feedback * Filter out CDRI from Locked and Current BestEstimate in ReportScopes * Exclude CDR from BeAmountTypes in TechnicalMargin scope * Adapt BM for IfrsVariableTest * Adapt BM for ReportVariableTest * Fix PracticalCase-CompareReinsuranceTest * Fix diffs in ReportVariable BMs * Revert changes in ReportVariableBenchmarks_2020_12_CH__Contractual * Feedback in BM_CH_2020_12_MTUP10pct_BE * Feedback in README * Undo change in BM_CH_2020_12_MTUP10pct_BE * No need to compute and store CDRI for LIC * Adjust ParameterReports * Redo BMs for IfrsVariablesTest * Cleanup * Remove EstimateType TM from Consts * Feedback * Navigation MD in ImportScopeCalculation notebooks * Optimize GetNonPerformanceRiskRate * Feedback --- ifrs17-template/Files/Dimensions.csv | 1 + ifrs17-template/Report/ParameterReports.ipynb | 72 +++++++++- .../BM_CH_2020_12_MTUP10pct_BE.csv | 9 ++ .../BM_CH_2020_12__BE.csv | 44 ++++++ .../BM_CH_2021_3__BE.csv | 84 +++++++++++ .../BM_CH_2021_3__C.csv | 28 ++-- .../BM_CH_2021_3__LR.csv | 32 ++--- ...iableBenchmarks_2021_3_CH__Contractual.csv | 134 +++++++++--------- ...PracticalCase-CompareReinsuranceTest.ipynb | 2 +- ifrs17/Constants/Consts.ipynb | 27 ++-- ifrs17/Import/1ImportScope-Identities.ipynb | 15 +- ifrs17/Import/2ImportScope-PresentValue.ipynb | 30 ++-- ifrs17/Import/3ImportScope-Actuals.ipynb | 11 +- .../Import/4ImportScope-TechnicalMargin.ipynb | 14 +- ifrs17/Import/5ImportScope-ToIfrsVar.ipynb | 11 +- ifrs17/Import/6ImportScope-Compute.ipynb | 11 +- ifrs17/Import/ImportStorage.ipynb | 47 ++++-- ifrs17/README.md | 2 +- ...rameterReportMutableScopeInteractive.ipynb | 4 +- ifrs17/Report/ParameterReportsQueries.ipynb | 108 ++++++++++++-- ifrs17/Report/ReportScopes.ipynb | 4 +- 21 files changed, 528 insertions(+), 162 deletions(-) diff --git a/ifrs17-template/Files/Dimensions.csv b/ifrs17-template/Files/Dimensions.csv index 85a30f1d..1ffddd9c 100644 --- a/ifrs17-template/Files/Dimensions.csv +++ b/ifrs17-template/Files/Dimensions.csv @@ -5,6 +5,7 @@ CL,Claims,,20,EndOfPeriod,,,,,,, NIC,Non Investment Component,CL,30,EndOfPeriod,,,,,,, ICO,Investment Component,CL,40,EndOfPeriod,,,,,,, CDR,Credit Default Risk,CL,50,EndOfPeriod,,,,,,, +CDRI,Initial Credit Default Risk,CDR,60,EndOfPeriod,,,,,,, CE,Claim Expenses,CL,200,EndOfPeriod,,,,,,, ALE,Allocated Loss Adjustment Expenses,CE,210,EndOfPeriod,,,,,,, ULE,Unallocated Loss Adjustment Expenses,CE,220,EndOfPeriod,,,,,,, diff --git a/ifrs17-template/Report/ParameterReports.ipynb b/ifrs17-template/Report/ParameterReports.ipynb index 9154351b..0290b5ad 100644 --- a/ifrs17-template/Report/ParameterReports.ipynb +++ b/ifrs17-template/Report/ParameterReports.ipynb @@ -156,7 +156,7 @@ { "cell_type": "code", "source": [ - "var partnerRatings = await Workspace.GetPartnerRatingsReportParametersAsync(args);" + "var currentPartnerRatings = await Workspace.GetCurrentPartnerRatingsReportParametersAsync(args);" ], "metadata": {}, "execution_count": 0, @@ -165,7 +165,25 @@ { "cell_type": "code", "source": [ - "var partnerDefaultRates = await Workspace.GetCreditDefaultRatesReportParametersAsync(args);" + "var lockedPartnerRatings = await Workspace.GetLockedInPartnerRatingsReportParametersAsync(args);" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var currentPartnerDefaultRates = await Workspace.GetCurrentCreditDefaultRatesReportParametersAsync(args);" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "var lockedPartnerDefaultRates = await Workspace.GetLockedInCreditDefaultRatesReportParametersAsync(args);" ], "metadata": {}, "execution_count": 0, @@ -314,7 +332,7 @@ { "cell_type": "code", "source": [ - "await Report.ForObjects(partnerRatings)", + "await Report.ForObjects(currentPartnerRatings)", "\n .WithQuerySource(Workspace)", "\n .GroupRowsBy(x => x.Partner)", "\n .GroupColumnsBy(x => x.Period)", @@ -325,6 +343,29 @@ "execution_count": 0, "outputs": [] }, + { + "cell_type": "markdown", + "source": [ + "Locked in [partner ratings](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#partner-rating)." + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "await Report.ForObjects(lockedPartnerRatings)", + "\n .WithQuerySource(Workspace)", + "\n .GroupRowsBy(x => x.Partner)", + "\n .GroupColumnsBy(x => x.PartnerRatingType).GroupColumnsBy(x => \"Initial Year: \" + x.InitialYear.ToString())", + "\n .ToTable()", + "\n .ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, { "cell_type": "markdown", "source": [ @@ -338,7 +379,7 @@ { "cell_type": "code", "source": [ - "await Report.ForObjects(partnerDefaultRates)", + "await Report.ForObjects(currentPartnerDefaultRates)", "\n .WithQuerySource(Workspace)", "\n .GroupRowsBy(x => x.CreditRiskRating)", "\n .GroupColumnsBy(x => x.Period)", @@ -348,6 +389,29 @@ "metadata": {}, "execution_count": 0, "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Locked in [partner default rates](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#credit-default-rate)." + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "await Report.ForObjects(lockedPartnerDefaultRates)", + "\n .WithQuerySource(Workspace)", + "\n .GroupRowsBy(x => x.CreditRiskRating)", + "\n .GroupColumnsBy(x => x.CreditDefaultRatesType).GroupColumnsBy(x => \"Initial Year: \" + x.InitialYear)", + "\n .ToTable()", + "\n .ExecuteAsync()" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] } ] } \ No newline at end of file diff --git a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv index a8a477dd..4c962e34 100644 --- a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv +++ b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12_MTUP10pct_BE.csv @@ -28,6 +28,9 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,EOP,DTR1.1,C,BE,C,0.01057 ,CDR,BOP,DTR1.1,C,BE,N,0.04415 ,CDR,CF,DTR1.1,C,BE,N,-0.03368 +,CDRI,EOP,DTR1.1,C,BE,C,0.01057 +,CDRI,BOP,DTR1.1,C,BE,N,0.04415 +,CDRI,CF,DTR1.1,C,BE,N,-0.03368 ,NIC,EOP,DTR1.1,C,BE,C,-164.82155 ,NIC,BOP,DTR1.1,C,BE,N,-329.31412 ,NIC,CF,DTR1.1,C,BE,N,165 @@ -35,6 +38,9 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,EOP,DTR1.1,L,BE,C,0.01057 ,CDR,BOP,DTR1.1,L,BE,N,0.04415 ,CDR,CF,DTR1.1,L,BE,N,-0.03368 +,CDRI,EOP,DTR1.1,L,BE,C,0.01057 +,CDRI,BOP,DTR1.1,L,BE,N,0.04415 +,CDRI,CF,DTR1.1,L,BE,N,-0.03368 ,NIC,EOP,DTR1.1,L,BE,C,-164.82155 ,NIC,BOP,DTR1.1,L,BE,N,-329.31412 ,NIC,CF,DTR1.1,L,BE,N,165 @@ -42,6 +48,9 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,EOP,DTR1.1,N,BE,C,0.01059 ,CDR,BOP,DTR1.1,N,BE,N,0.04427 ,CDR,CF,DTR1.1,N,BE,N,-0.03368 +,CDRI,EOP,DTR1.1,N,BE,C,0.01059 +,CDRI,BOP,DTR1.1,N,BE,N,0.04427 +,CDRI,CF,DTR1.1,N,BE,N,-0.03368 ,NIC,EOP,DTR1.1,N,BE,C,-165 ,NIC,BOP,DTR1.1,N,BE,N,-330 ,NIC,CF,DTR1.1,N,BE,N,165 diff --git a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BE.csv b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BE.csv index 3f42dadd..bb27e5a3 100644 --- a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BE.csv +++ b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2020_12__BE.csv @@ -199,6 +199,10 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR1.1,C,BE,N,0.04013 ,CDR,CF,DTR1.1,C,BE,N,-0.03062 ,CDR,IA,DTR1.1,C,BE,N,0.0001 +,CDRI,EOP,DTR1.1,C,BE,C,0.00961 +,CDRI,BOP,DTR1.1,C,BE,N,0.04013 +,CDRI,CF,DTR1.1,C,BE,N,-0.03062 +,CDRI,IA,DTR1.1,C,BE,N,0.0001 ,NIC,EOP,DTR1.1,C,BE,C,-149.83777 ,NIC,BOP,DTR1.1,C,BE,N,-299.37647 ,NIC,CF,DTR1.1,C,BE,N,150 @@ -211,6 +215,10 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR1.1,L,BE,N,0.04013 ,CDR,CF,DTR1.1,L,BE,N,-0.03062 ,CDR,IA,DTR1.1,L,BE,N,0.0001 +,CDRI,EOP,DTR1.1,L,BE,C,0.00961 +,CDRI,BOP,DTR1.1,L,BE,N,0.04013 +,CDRI,CF,DTR1.1,L,BE,N,-0.03062 +,CDRI,IA,DTR1.1,L,BE,N,0.0001 ,NIC,EOP,DTR1.1,L,BE,C,-149.83777 ,NIC,BOP,DTR1.1,L,BE,N,-299.37647 ,NIC,CF,DTR1.1,L,BE,N,150 @@ -222,6 +230,9 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,EOP,DTR1.1,N,BE,C,0.00962 ,CDR,BOP,DTR1.1,N,BE,N,0.04024 ,CDR,CF,DTR1.1,N,BE,N,-0.03062 +,CDRI,EOP,DTR1.1,N,BE,C,0.00962 +,CDRI,BOP,DTR1.1,N,BE,N,0.04024 +,CDRI,CF,DTR1.1,N,BE,N,-0.03062 ,NIC,EOP,DTR1.1,N,BE,C,-150 ,NIC,BOP,DTR1.1,N,BE,N,-300 ,NIC,CF,DTR1.1,N,BE,N,150 @@ -254,6 +265,10 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR1.3,C,BE,N,0.04013 ,CDR,CF,DTR1.3,C,BE,N,-0.03062 ,CDR,IA,DTR1.3,C,BE,N,0.0001 +,CDRI,EOP,DTR1.3,C,BE,C,0.00961 +,CDRI,BOP,DTR1.3,C,BE,N,0.04013 +,CDRI,CF,DTR1.3,C,BE,N,-0.03062 +,CDRI,IA,DTR1.3,C,BE,N,0.0001 ,NIC,EOP,DTR1.3,C,BE,C,-149.83777 ,NIC,BOP,DTR1.3,C,BE,N,-299.37647 ,NIC,CF,DTR1.3,C,BE,N,150 @@ -266,6 +281,10 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR1.3,L,BE,N,0.04013 ,CDR,CF,DTR1.3,L,BE,N,-0.03062 ,CDR,IA,DTR1.3,L,BE,N,0.0001 +,CDRI,EOP,DTR1.3,L,BE,C,0.00961 +,CDRI,BOP,DTR1.3,L,BE,N,0.04013 +,CDRI,CF,DTR1.3,L,BE,N,-0.03062 +,CDRI,IA,DTR1.3,L,BE,N,0.0001 ,NIC,EOP,DTR1.3,L,BE,C,-149.83777 ,NIC,BOP,DTR1.3,L,BE,N,-299.37647 ,NIC,CF,DTR1.3,L,BE,N,150 @@ -277,6 +296,9 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,EOP,DTR1.3,N,BE,C,0.00962 ,CDR,BOP,DTR1.3,N,BE,N,0.04024 ,CDR,CF,DTR1.3,N,BE,N,-0.03062 +,CDRI,EOP,DTR1.3,N,BE,C,0.00962 +,CDRI,BOP,DTR1.3,N,BE,N,0.04024 +,CDRI,CF,DTR1.3,N,BE,N,-0.03062 ,NIC,EOP,DTR1.3,N,BE,C,-150 ,NIC,BOP,DTR1.3,N,BE,N,-300 ,NIC,CF,DTR1.3,N,BE,N,150 @@ -287,6 +309,10 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR1.4,C,BE,N,0.04013 ,CDR,CF,DTR1.4,C,BE,N,-0.03062 ,CDR,IA,DTR1.4,C,BE,N,0.0001 +,CDRI,EOP,DTR1.4,C,BE,C,0.00961 +,CDRI,BOP,DTR1.4,C,BE,N,0.04013 +,CDRI,CF,DTR1.4,C,BE,N,-0.03062 +,CDRI,IA,DTR1.4,C,BE,N,0.0001 ,NIC,EOP,DTR1.4,C,BE,C,-149.83777 ,NIC,BOP,DTR1.4,C,BE,N,-299.37647 ,NIC,CF,DTR1.4,C,BE,N,150 @@ -299,6 +325,10 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR1.4,L,BE,N,0.04013 ,CDR,CF,DTR1.4,L,BE,N,-0.03062 ,CDR,IA,DTR1.4,L,BE,N,0.0001 +,CDRI,EOP,DTR1.4,L,BE,C,0.00961 +,CDRI,BOP,DTR1.4,L,BE,N,0.04013 +,CDRI,CF,DTR1.4,L,BE,N,-0.03062 +,CDRI,IA,DTR1.4,L,BE,N,0.0001 ,NIC,EOP,DTR1.4,L,BE,C,-149.83777 ,NIC,BOP,DTR1.4,L,BE,N,-299.37647 ,NIC,CF,DTR1.4,L,BE,N,150 @@ -310,6 +340,9 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,EOP,DTR1.4,N,BE,C,0.00962 ,CDR,BOP,DTR1.4,N,BE,N,0.04024 ,CDR,CF,DTR1.4,N,BE,N,-0.03062 +,CDRI,EOP,DTR1.4,N,BE,C,0.00962 +,CDRI,BOP,DTR1.4,N,BE,N,0.04024 +,CDRI,CF,DTR1.4,N,BE,N,-0.03062 ,NIC,EOP,DTR1.4,N,BE,C,-150 ,NIC,BOP,DTR1.4,N,BE,N,-300 ,NIC,CF,DTR1.4,N,BE,N,150 @@ -320,6 +353,10 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR2.1,C,BE,N,0.04013 ,CDR,CF,DTR2.1,C,BE,N,-0.03062 ,CDR,IA,DTR2.1,C,BE,N,0.0001 +,CDRI,EOP,DTR2.1,C,BE,C,0.00961 +,CDRI,BOP,DTR2.1,C,BE,N,0.04013 +,CDRI,CF,DTR2.1,C,BE,N,-0.03062 +,CDRI,IA,DTR2.1,C,BE,N,0.0001 ,NIC,EOP,DTR2.1,C,BE,C,-149.83777 ,NIC,BOP,DTR2.1,C,BE,N,-299.37647 ,NIC,CF,DTR2.1,C,BE,N,150 @@ -332,6 +369,10 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR2.1,L,BE,N,0.04013 ,CDR,CF,DTR2.1,L,BE,N,-0.03062 ,CDR,IA,DTR2.1,L,BE,N,0.0001 +,CDRI,EOP,DTR2.1,L,BE,C,0.00961 +,CDRI,BOP,DTR2.1,L,BE,N,0.04013 +,CDRI,CF,DTR2.1,L,BE,N,-0.03062 +,CDRI,IA,DTR2.1,L,BE,N,0.0001 ,NIC,EOP,DTR2.1,L,BE,C,-149.83777 ,NIC,BOP,DTR2.1,L,BE,N,-299.37647 ,NIC,CF,DTR2.1,L,BE,N,150 @@ -343,6 +384,9 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,EOP,DTR2.1,N,BE,C,0.00962 ,CDR,BOP,DTR2.1,N,BE,N,0.04024 ,CDR,CF,DTR2.1,N,BE,N,-0.03062 +,CDRI,EOP,DTR2.1,N,BE,C,0.00962 +,CDRI,BOP,DTR2.1,N,BE,N,0.04024 +,CDRI,CF,DTR2.1,N,BE,N,-0.03062 ,NIC,EOP,DTR2.1,N,BE,C,-150 ,NIC,BOP,DTR2.1,N,BE,N,-300 ,NIC,CF,DTR2.1,N,BE,N,150 diff --git a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BE.csv b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BE.csv index e4a75992..282e2e75 100644 --- a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BE.csv +++ b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__BE.csv @@ -505,6 +505,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,CF,DTR1.1,C,BE,N,-0.01123 ,CDR,EV,DTR1.1,C,BE,N,0.01344 ,CDR,IA,DTR1.1,C,BE,N,5E-05 +,CDRI,EOP,DTR1.1,C,BE,C,0.00628 +,CDRI,BOP,DTR1.1,C,BE,I,0.00961 +,CDRI,CF,DTR1.1,C,BE,I,-0.0035 +,CDRI,MC,DTR1.1,C,BE,I,-0.00192 +,CDRI,BOP,DTR1.1,C,BE,N,0.00192 +,CDRI,CF,DTR1.1,C,BE,N,-0.00087 +,CDRI,EV,DTR1.1,C,BE,N,0.00105 ,NIC,EOP,DTR1.1,C,BE,C,-134.71982 ,NIC,BOP,DTR1.1,C,BE,I,-149.83777 ,NIC,CF,DTR1.1,C,BE,I,30 @@ -534,6 +541,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,CF,DTR1.1,L,BE,N,-0.01123 ,CDR,EV,DTR1.1,L,BE,N,0.01346 ,CDR,IA,DTR1.1,L,BE,N,2E-05 +,CDRI,EOP,DTR1.1,L,BE,C,0.00629 +,CDRI,BOP,DTR1.1,L,BE,I,0.00961 +,CDRI,CF,DTR1.1,L,BE,I,-0.0035 +,CDRI,MC,DTR1.1,L,BE,I,-0.00192 +,CDRI,BOP,DTR1.1,L,BE,N,0.00192 +,CDRI,CF,DTR1.1,L,BE,N,-0.00087 +,CDRI,EV,DTR1.1,L,BE,N,0.00105 ,NIC,EOP,DTR1.1,L,BE,C,-134.88767 ,NIC,BOP,DTR1.1,L,BE,I,-149.83777 ,NIC,CF,DTR1.1,L,BE,I,30 @@ -560,6 +574,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR1.1,N,BE,N,0.0247 ,CDR,CF,DTR1.1,N,BE,N,-0.01123 ,CDR,EV,DTR1.1,N,BE,N,0.01348 +,CDRI,EOP,DTR1.1,N,BE,C,0.0063 +,CDRI,BOP,DTR1.1,N,BE,I,0.00962 +,CDRI,CF,DTR1.1,N,BE,I,-0.0035 +,CDRI,MC,DTR1.1,N,BE,I,-0.00192 +,CDRI,BOP,DTR1.1,N,BE,N,0.00192 +,CDRI,CF,DTR1.1,N,BE,N,-0.00087 +,CDRI,EV,DTR1.1,N,BE,N,0.00105 ,NIC,EOP,DTR1.1,N,BE,C,-135 ,NIC,BOP,DTR1.1,N,BE,I,-150 ,NIC,CF,DTR1.1,N,BE,I,30 @@ -635,6 +656,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,CF,DTR1.3,C,BE,N,-0.01123 ,CDR,EV,DTR1.3,C,BE,N,0.01344 ,CDR,IA,DTR1.3,C,BE,N,5E-05 +,CDRI,EOP,DTR1.3,C,BE,C,0.00628 +,CDRI,BOP,DTR1.3,C,BE,I,0.00961 +,CDRI,CF,DTR1.3,C,BE,I,-0.0035 +,CDRI,MC,DTR1.3,C,BE,I,-0.00192 +,CDRI,BOP,DTR1.3,C,BE,N,0.00192 +,CDRI,CF,DTR1.3,C,BE,N,-0.00087 +,CDRI,EV,DTR1.3,C,BE,N,0.00105 ,NIC,EOP,DTR1.3,C,BE,C,-134.71982 ,NIC,BOP,DTR1.3,C,BE,I,-149.83777 ,NIC,CF,DTR1.3,C,BE,I,30 @@ -664,6 +692,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,CF,DTR1.3,L,BE,N,-0.01123 ,CDR,EV,DTR1.3,L,BE,N,0.01346 ,CDR,IA,DTR1.3,L,BE,N,2E-05 +,CDRI,EOP,DTR1.3,L,BE,C,0.00629 +,CDRI,BOP,DTR1.3,L,BE,I,0.00961 +,CDRI,CF,DTR1.3,L,BE,I,-0.0035 +,CDRI,MC,DTR1.3,L,BE,I,-0.00192 +,CDRI,BOP,DTR1.3,L,BE,N,0.00192 +,CDRI,CF,DTR1.3,L,BE,N,-0.00087 +,CDRI,EV,DTR1.3,L,BE,N,0.00105 ,NIC,EOP,DTR1.3,L,BE,C,-134.88767 ,NIC,BOP,DTR1.3,L,BE,I,-149.83777 ,NIC,CF,DTR1.3,L,BE,I,30 @@ -690,6 +725,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR1.3,N,BE,N,0.0247 ,CDR,CF,DTR1.3,N,BE,N,-0.01123 ,CDR,EV,DTR1.3,N,BE,N,0.01348 +,CDRI,EOP,DTR1.3,N,BE,C,0.0063 +,CDRI,BOP,DTR1.3,N,BE,I,0.00962 +,CDRI,CF,DTR1.3,N,BE,I,-0.0035 +,CDRI,MC,DTR1.3,N,BE,I,-0.00192 +,CDRI,BOP,DTR1.3,N,BE,N,0.00192 +,CDRI,CF,DTR1.3,N,BE,N,-0.00087 +,CDRI,EV,DTR1.3,N,BE,N,0.00105 ,NIC,EOP,DTR1.3,N,BE,C,-135 ,NIC,BOP,DTR1.3,N,BE,I,-150 ,NIC,CF,DTR1.3,N,BE,I,30 @@ -713,6 +755,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,CF,DTR1.4,C,BE,N,-0.01123 ,CDR,EV,DTR1.4,C,BE,N,0.01344 ,CDR,IA,DTR1.4,C,BE,N,5E-05 +,CDRI,EOP,DTR1.4,C,BE,C,0.00628 +,CDRI,BOP,DTR1.4,C,BE,I,0.00961 +,CDRI,CF,DTR1.4,C,BE,I,-0.0035 +,CDRI,MC,DTR1.4,C,BE,I,-0.00192 +,CDRI,BOP,DTR1.4,C,BE,N,0.00192 +,CDRI,CF,DTR1.4,C,BE,N,-0.00087 +,CDRI,EV,DTR1.4,C,BE,N,0.00105 ,NIC,EOP,DTR1.4,C,BE,C,-134.71982 ,NIC,BOP,DTR1.4,C,BE,I,-149.83777 ,NIC,CF,DTR1.4,C,BE,I,30 @@ -742,6 +791,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,CF,DTR1.4,L,BE,N,-0.01123 ,CDR,EV,DTR1.4,L,BE,N,0.01346 ,CDR,IA,DTR1.4,L,BE,N,2E-05 +,CDRI,EOP,DTR1.4,L,BE,C,0.00629 +,CDRI,BOP,DTR1.4,L,BE,I,0.00961 +,CDRI,CF,DTR1.4,L,BE,I,-0.0035 +,CDRI,MC,DTR1.4,L,BE,I,-0.00192 +,CDRI,BOP,DTR1.4,L,BE,N,0.00192 +,CDRI,CF,DTR1.4,L,BE,N,-0.00087 +,CDRI,EV,DTR1.4,L,BE,N,0.00105 ,NIC,EOP,DTR1.4,L,BE,C,-134.88767 ,NIC,BOP,DTR1.4,L,BE,I,-149.83777 ,NIC,CF,DTR1.4,L,BE,I,30 @@ -768,6 +824,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR1.4,N,BE,N,0.0247 ,CDR,CF,DTR1.4,N,BE,N,-0.01123 ,CDR,EV,DTR1.4,N,BE,N,0.01348 +,CDRI,EOP,DTR1.4,N,BE,C,0.0063 +,CDRI,BOP,DTR1.4,N,BE,I,0.00962 +,CDRI,CF,DTR1.4,N,BE,I,-0.0035 +,CDRI,MC,DTR1.4,N,BE,I,-0.00192 +,CDRI,BOP,DTR1.4,N,BE,N,0.00192 +,CDRI,CF,DTR1.4,N,BE,N,-0.00087 +,CDRI,EV,DTR1.4,N,BE,N,0.00105 ,NIC,EOP,DTR1.4,N,BE,C,-135 ,NIC,BOP,DTR1.4,N,BE,I,-150 ,NIC,CF,DTR1.4,N,BE,I,30 @@ -791,6 +854,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,CF,DTR2.1,C,BE,N,-0.01123 ,CDR,EV,DTR2.1,C,BE,N,0.01344 ,CDR,IA,DTR2.1,C,BE,N,5E-05 +,CDRI,EOP,DTR2.1,C,BE,C,0.00628 +,CDRI,BOP,DTR2.1,C,BE,I,0.00961 +,CDRI,CF,DTR2.1,C,BE,I,-0.0035 +,CDRI,MC,DTR2.1,C,BE,I,-0.00192 +,CDRI,BOP,DTR2.1,C,BE,N,0.00192 +,CDRI,CF,DTR2.1,C,BE,N,-0.00087 +,CDRI,EV,DTR2.1,C,BE,N,0.00105 ,NIC,EOP,DTR2.1,C,BE,C,-134.71982 ,NIC,BOP,DTR2.1,C,BE,I,-149.83777 ,NIC,CF,DTR2.1,C,BE,I,30 @@ -820,6 +890,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,CF,DTR2.1,L,BE,N,-0.01123 ,CDR,EV,DTR2.1,L,BE,N,0.01346 ,CDR,IA,DTR2.1,L,BE,N,2E-05 +,CDRI,EOP,DTR2.1,L,BE,C,0.00629 +,CDRI,BOP,DTR2.1,L,BE,I,0.00961 +,CDRI,CF,DTR2.1,L,BE,I,-0.0035 +,CDRI,MC,DTR2.1,L,BE,I,-0.00192 +,CDRI,BOP,DTR2.1,L,BE,N,0.00192 +,CDRI,CF,DTR2.1,L,BE,N,-0.00087 +,CDRI,EV,DTR2.1,L,BE,N,0.00105 ,NIC,EOP,DTR2.1,L,BE,C,-134.88767 ,NIC,BOP,DTR2.1,L,BE,I,-149.83777 ,NIC,CF,DTR2.1,L,BE,I,30 @@ -846,6 +923,13 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,CDR,BOP,DTR2.1,N,BE,N,0.0247 ,CDR,CF,DTR2.1,N,BE,N,-0.01123 ,CDR,EV,DTR2.1,N,BE,N,0.01348 +,CDRI,EOP,DTR2.1,N,BE,C,0.0063 +,CDRI,BOP,DTR2.1,N,BE,I,0.00962 +,CDRI,CF,DTR2.1,N,BE,I,-0.0035 +,CDRI,MC,DTR2.1,N,BE,I,-0.00192 +,CDRI,BOP,DTR2.1,N,BE,N,0.00192 +,CDRI,CF,DTR2.1,N,BE,N,-0.00087 +,CDRI,EV,DTR2.1,N,BE,N,0.00105 ,NIC,EOP,DTR2.1,N,BE,C,-135 ,NIC,BOP,DTR2.1,N,BE,I,-150 ,NIC,CF,DTR2.1,N,BE,I,30 diff --git a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__C.csv b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__C.csv index b4d9507b..5ae3fa58 100644 --- a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__C.csv +++ b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__C.csv @@ -52,31 +52,27 @@ AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Valu ,,BOP,DT4.1,,C,N,8.00465 ,,EV,DT4.1,,C,N,-1.49226 ,,IA,DT4.1,,C,N,0.00034 -,,AM,DTR1.1,,C,C,10.78121 -,,CL,DTR1.1,,C,C,43.67753 -,,EOP,DTR1.1,,C,C,-22.64964 +,,AM,DTR1.1,,C,C,10.75385 +,,CL,DTR1.1,,C,C,43.71271 +,,EOP,DTR1.1,,C,C,-22.59217 ,,BOP,DTR1.1,,C,I,-24.07616 -,,CRU,DTR1.1,,C,I,-0.04965 ,,IA,DTR1.1,,C,I,-0.03848 ,,MC,DTR1.1,,C,I,-52.94408 -,,AM,DTR1.3,,C,C,10.78121 -,,CL,DTR1.3,,C,C,43.67753 -,,EOP,DTR1.3,,C,C,-22.64964 +,,AM,DTR1.3,,C,C,10.75385 +,,CL,DTR1.3,,C,C,43.71271 +,,EOP,DTR1.3,,C,C,-22.59217 ,,BOP,DTR1.3,,C,I,-24.07616 -,,CRU,DTR1.3,,C,I,-0.04965 ,,IA,DTR1.3,,C,I,-0.03848 ,,MC,DTR1.3,,C,I,-52.94408 -,,AM,DTR1.4,,C,C,10.78121 -,,CL,DTR1.4,,C,C,43.67753 -,,EOP,DTR1.4,,C,C,-22.64964 +,,AM,DTR1.4,,C,C,10.75385 +,,CL,DTR1.4,,C,C,43.71271 +,,EOP,DTR1.4,,C,C,-22.59217 ,,BOP,DTR1.4,,C,I,-24.07616 -,,CRU,DTR1.4,,C,I,-0.04965 ,,IA,DTR1.4,,C,I,-0.03848 ,,MC,DTR1.4,,C,I,-52.94408 -,,AM,DTR2.1,,C,C,10.78121 -,,CL,DTR2.1,,C,C,43.67753 -,,EOP,DTR2.1,,C,C,-22.64964 +,,AM,DTR2.1,,C,C,10.75385 +,,CL,DTR2.1,,C,C,43.71271 +,,EOP,DTR2.1,,C,C,-22.59217 ,,BOP,DTR2.1,,C,I,-24.07616 -,,CRU,DTR2.1,,C,I,-0.04965 ,,IA,DTR2.1,,C,I,-0.03848 ,,MC,DTR2.1,,C,I,-52.94408 \ No newline at end of file diff --git a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__LR.csv b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__LR.csv index 96b9555c..8e0da436 100644 --- a/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__LR.csv +++ b/ifrs17-template/Test/Data/IfrsVariableBenchmarks/BM_CH_2021_3__LR.csv @@ -3,19 +3,19 @@ Month,ReportingNode,Scenario,Year 3,CH,,2021 @@LR AccidentYear,AmountType,AocType,DataNode,EconomicBasis,EstimateType,Novelty,Values0 -,,CL,DTR1.1,,LR,C,43.67753 -,,BOP,DTR1.1,,LR,N,-15.9547 -,,EV,DTR1.1,,LR,N,-27.7147 -,,IA,DTR1.1,,LR,N,-0.00813 -,,CL,DTR1.3,,LR,C,43.67753 -,,BOP,DTR1.3,,LR,N,-15.9547 -,,EV,DTR1.3,,LR,N,-27.7147 -,,IA,DTR1.3,,LR,N,-0.00813 -,,CL,DTR1.4,,LR,C,43.67753 -,,BOP,DTR1.4,,LR,N,-15.9547 -,,EV,DTR1.4,,LR,N,-27.7147 -,,IA,DTR1.4,,LR,N,-0.00813 -,,CL,DTR2.1,,LR,C,43.67753 -,,BOP,DTR2.1,,LR,N,-15.9547 -,,EV,DTR2.1,,LR,N,-27.7147 -,,IA,DTR2.1,,LR,N,-0.00813 \ No newline at end of file +,,CL,DTR1.1,,LR,C,43.71271 +,,BOP,DTR1.1,,LR,N,-15.97745 +,,EV,DTR1.1,,LR,N,-27.72711 +,,IA,DTR1.1,,LR,N,-0.00815 +,,CL,DTR1.3,,LR,C,43.71271 +,,BOP,DTR1.3,,LR,N,-15.97745 +,,EV,DTR1.3,,LR,N,-27.72711 +,,IA,DTR1.3,,LR,N,-0.00815 +,,CL,DTR1.4,,LR,C,43.71271 +,,BOP,DTR1.4,,LR,N,-15.97745 +,,EV,DTR1.4,,LR,N,-27.72711 +,,IA,DTR1.4,,LR,N,-0.00815 +,,CL,DTR2.1,,LR,C,43.71271 +,,BOP,DTR2.1,,LR,N,-15.97745 +,,EV,DTR2.1,,LR,N,-27.72711 +,,IA,DTR2.1,,LR,N,-0.00815 \ No newline at end of file diff --git a/ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv b/ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv index f326a535..88b02ed7 100644 --- a/ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv +++ b/ifrs17-template/Test/Data/ReportVariableBenchmarks/ReportVariableBenchmarks_2021_3_CH__Contractual.csv @@ -1,4 +1,4 @@ -@@ReportVariable,,,,,,,,,,,,,,,,,,,,,, +@@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,P0,CH,,BBA,-76,CF 2020,NIC,2020,USD,USD,,A,CHF,DT1.2,P,FALSE,LIC,ANN,C,Default,,DT1,P0,CH,,BBA,-76,ISE2 @@ -61,7 +61,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,P0,CH,,BBA,0.04559,IFIE2 2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,P0,CH,,BBA,30.19032,ISE12 2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,P0,CH,,BBA,-59.93511,MC -2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,P0,CH,,BBA,0,OCI2 +2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,C,,,DT2,P0,CH,,BBA,-0,OCI2 2020,NIC,2020,USD,USD,C,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,P0,CH,,BBA,-0.2238,YCU 2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,I,,,DT2,P0,CH,,BBA,299.67555,BOP 2020,NIC,2020,USD,USD,L,BE,CHF,DT2.2,P,FALSE,LIC,ANN,N,,,DT2,P0,CH,,BBA,59.93511,BOP @@ -103,7 +103,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,0.04957,CRU 2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08063,EOP 2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,0.01344,EV -2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,5.00E-05,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,5E-05,IA 2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.00192,MC 2020,CDR,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.07102,OCI2 2020,NIC,2020,USD,USD,C,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-149.83777,BOP @@ -124,7 +124,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,0.04965,CRU 2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08076,EOP 2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,0.01346,EV -2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,2.00E-05,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,2E-05,IA 2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.04967,IFIE2 2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.02148,ISE12 2020,CDR,2020,USD,USD,L,BE,CHF,DTR1.2,P,TRUE,LIC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.00192,MC @@ -173,7 +173,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,P0,CH,,BBA,0.04957,CRU 2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.08063,EOP 2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,P0,CH,,BBA,0.01344,EV -2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,P0,CH,,BBA,5.00E-05,IA +2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,P0,CH,,BBA,5E-05,IA 2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-0.04962,IFIE2 2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-0.0214,ISE12 2020,CDR,2020,USD,USD,C,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-0.00192,MC @@ -198,7 +198,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,P0,CH,,BBA,0.04965,CRU 2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.08076,EOP 2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,P0,CH,,BBA,0.01346,EV -2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,P0,CH,,BBA,2.00E-05,IA +2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,P0,CH,,BBA,2E-05,IA 2020,CDR,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-0.00192,MC 2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-149.83777,BOP 2020,NIC,2020,USD,USD,L,BE,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-29.96755,BOP @@ -220,7 +220,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.00114,IFIE2 2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-3.75827,ISE12 2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,P0,CH,,BBA,2.99676,MC -2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0,OCI2 +2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-0,OCI2 2020,,2020,USD,USD,C,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,P0,CH,,BBA,0.01119,YCU 2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-14.98378,BOP 2020,,2020,USD,USD,L,RA,CHF,DTR2.2,P,TRUE,LIC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-5.99351,BOP @@ -1084,7 +1084,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,0.04957,CRU 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08063,EOP 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,0.01344,EV -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,5.00E-05,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,5E-05,IA 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.00192,MC 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.07102,OCI1 0,NIC,2020,USD,USD,C,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-149.83777,BOP @@ -1116,7 +1116,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,0.04965,CRU 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08076,EOP 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,0.01346,EV -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,2.00E-05,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,2E-05,IA 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.04967,IFIE1 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.02148,ISE10 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.00192,MC @@ -1145,23 +1145,22 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,27.53161,ISE10 0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,19.9817,MC 0,PR,2020,USD,USD,L,BE,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-27.4318,OCI1 -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,10.78121,AM +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,10.75385,AM 0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-24.07616,BOP -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.67753,CL -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.04965,CRU -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-22.64964,EOP +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.71271,CL +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-22.59217,EOP 0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.03848,IA -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08813,IFIE1 -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,9.26655,ISE10 -0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-10.78121,ISE7 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.03848,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,9.23138,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-10.75385,ISE7 0,,2020,USD,USD,,C,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-52.94408,MC -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-15.9547,BOP -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.67753,CL +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-15.97745,BOP +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.71271,CL 0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0,EOP -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-27.7147,EV -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-0.00813,IA -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.00813,IFIE1 -0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.00813,ISE11 +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-27.72711,EV +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-0.00815,IA +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.00815,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR1.1,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.00815,ISE11 0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-14.98378,BOP 0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-5.98382,BOP 0,,2020,USD,USD,C,RA,CHF,DTR1.1,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,3,CF @@ -1204,7 +1203,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,0.04957,CRU 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08063,EOP 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,0.01344,EV -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,5.00E-05,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,5E-05,IA 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.00192,MC 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.07102,OCI1 0,NIC,2020,USD,USD,C,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-149.83777,BOP @@ -1236,7 +1235,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,0.04965,CRU 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08076,EOP 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,0.01346,EV -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,2.00E-05,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,2E-05,IA 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.04967,IFIE1 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.02148,ISE10 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.00192,MC @@ -1265,23 +1264,22 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,27.53161,ISE10 0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,19.9817,MC 0,PR,2020,USD,USD,L,BE,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-27.4318,OCI1 -0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,10.78121,AM +0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,10.75385,AM 0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-24.07616,BOP -0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.67753,CL -0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.04965,CRU -0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-22.64964,EOP +0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.71271,CL +0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-22.59217,EOP 0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.03848,IA -0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08813,IFIE1 -0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,9.26655,ISE10 -0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-10.78121,ISE7 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.03848,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,9.23138,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-10.75385,ISE7 0,,2020,USD,USD,,C,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-52.94408,MC -0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-15.9547,BOP -0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.67753,CL +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-15.97745,BOP +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.71271,CL 0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0,EOP -0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-27.7147,EV -0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-0.00813,IA -0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.00813,IFIE1 -0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.00813,ISE11 +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-27.72711,EV +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-0.00815,IA +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.00815,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.00815,ISE11 0,NIC,2020,USD,USD,,OA,CHF,DTR1.3,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-2.5,BOP 0,NIC,2020,USD,USD,,OA,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0,EOP 0,NIC,2020,USD,USD,,OA,CHF,DTR1.3,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-2.5,ISE2 @@ -1323,7 +1321,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,0.04957,CRU 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08063,EOP 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,0.01344,EV -0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,5.00E-05,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,5E-05,IA 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.00192,MC 0,CDR,2020,USD,USD,C,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.07102,OCI1 0,NIC,2020,USD,USD,C,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-149.83777,BOP @@ -1355,7 +1353,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,0.04965,CRU 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08076,EOP 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,0.01346,EV -0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,2.00E-05,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,2E-05,IA 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.04967,IFIE1 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.02148,ISE10 0,CDR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.00192,MC @@ -1384,23 +1382,22 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,27.53161,ISE10 0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,19.9817,MC 0,PR,2020,USD,USD,L,BE,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-27.4318,OCI1 -0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,10.78121,AM +0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,10.75385,AM 0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-24.07616,BOP -0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.67753,CL -0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.04965,CRU -0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-22.64964,EOP +0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.71271,CL +0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-22.59217,EOP 0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-0.03848,IA -0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.08813,IFIE1 -0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,9.26655,ISE10 -0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-10.78121,ISE7 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.03848,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,9.23138,ISE10 +0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-10.75385,ISE7 0,,2020,USD,USD,,C,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-52.94408,MC -0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-15.9547,BOP -0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.67753,CL +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-15.97745,BOP +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,43.71271,CL 0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0,EOP -0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-27.7147,EV -0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-0.00813,IA -0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.00813,IFIE1 -0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.00813,ISE11 +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-27.72711,EV +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,N,Default,PT1,DTR1,P0,CH,,BBA,-0.00815,IA +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0.00815,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-0.00815,ISE11 0,NIC,2020,USD,USD,,OA,CHF,DTR1.4,P,TRUE,LRC,ANN,I,Default,PT1,DTR1,P0,CH,,BBA,-10,BOP 0,NIC,2020,USD,USD,,OA,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,0,EOP 0,NIC,2020,USD,USD,,OA,CHF,DTR1.4,P,TRUE,LRC,ANN,C,Default,PT1,DTR1,P0,CH,,BBA,-10,ISE2 @@ -1439,7 +1436,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,0.04957,CRU 0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.08063,EOP 0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,0.01344,EV -0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,5.00E-05,IA +0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,5E-05,IA 0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-0.04962,IFIE1 0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-0.0214,ISE10 0,CDR,2020,USD,USD,C,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-0.00192,MC @@ -1477,7 +1474,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,0.04965,CRU 0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.08076,EOP 0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,0.01346,EV -0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,2.00E-05,IA +0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,2E-05,IA 0,CDR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-0.00192,MC 0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-149.83777,BOP 0,NIC,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-29.96755,BOP @@ -1497,23 +1494,22 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,0.0915,IA 0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,0.00832,IA 0,PR,2020,USD,USD,L,BE,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,19.9817,MC -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,10.78121,AM +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,10.75385,AM 0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-24.07616,BOP -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,43.67753,CL -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-0.04965,CRU -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-22.64964,EOP +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,43.71271,CL +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-22.59217,EOP 0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-0.03848,IA -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.08813,IFIE1 -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,9.26655,ISE10 -0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-10.78121,ISE7 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.03848,IFIE1 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,9.23138,ISE10 +0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-10.75385,ISE7 0,,2020,USD,USD,,C,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-52.94408,MC -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-15.9547,BOP -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,43.67753,CL +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-15.97745,BOP +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,43.71271,CL 0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0,EOP -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-27.7147,EV -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-0.00813,IA -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.00813,IFIE1 -0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-0.00813,ISE11 +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-27.72711,EV +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-0.00815,IA +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.00815,IFIE1 +0,,2020,USD,USD,,LR,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-0.00815,ISE11 0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-14.98378,BOP 0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-5.98382,BOP 0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,3,CF @@ -1525,7 +1521,7 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0.00114,IFIE1 0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-3.75827,ISE10 0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,2.99676,MC -0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,0,OCI1 +0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,C,,PT1,DTR2,P0,CH,,BBA,-0,OCI1 0,,2020,USD,USD,C,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,0.01119,YCU 0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-14.98378,BOP 0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-5.99351,BOP @@ -1535,4 +1531,4 @@ AccidentYear,AmountType,AnnualCohort,ContractualCurrency,Currency,EconomicBasis, 0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,2.24813,EV 0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,-0.00549,IA 0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,N,,PT1,DTR2,P0,CH,,BBA,-0.00274,IA -0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,2.99676,MC +0,,2020,USD,USD,L,RA,CHF,DTR2.1,P,TRUE,LRC,ANN,I,,PT1,DTR2,P0,CH,,BBA,2.99676,MC \ No newline at end of file diff --git a/ifrs17-template/Test/PracticalCase-CompareReinsuranceTest.ipynb b/ifrs17-template/Test/PracticalCase-CompareReinsuranceTest.ipynb index 0c658c79..01813e30 100644 --- a/ifrs17-template/Test/PracticalCase-CompareReinsuranceTest.ipynb +++ b/ifrs17-template/Test/PracticalCase-CompareReinsuranceTest.ipynb @@ -273,7 +273,7 @@ { "cell_type": "code", "source": [ - "csmAM.Where(x => x.Scenario == \"LR80\").Sum(x => x.Value).Should().BeApproximately(-55.01464, Precision);" + "csmAM.Where(x => x.Scenario == \"LR80\").Sum(x => x.Value).Should().BeApproximately(-55.01463, Precision);" ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17/Constants/Consts.ipynb b/ifrs17/Constants/Consts.ipynb index 24be6fab..4d03faba 100644 --- a/ifrs17/Constants/Consts.ipynb +++ b/ifrs17/Constants/Consts.ipynb @@ -363,19 +363,20 @@ "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 ULE = nameof(ULE); // Unallocated Loss Adjustment 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 CDRI = nameof(CDRI); // Initial Credit Default Risk, i.e. the CDR value when the GIC state is set to active", + "\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 ULE = nameof(ULE); // Unallocated Loss Adjustment Expenses", "\n}" ], "metadata": {}, diff --git a/ifrs17/Import/1ImportScope-Identities.ipynb b/ifrs17/Import/1ImportScope-Identities.ipynb index 74ca3428..f0432d13 100644 --- a/ifrs17/Import/1ImportScope-Identities.ipynb +++ b/ifrs17/Import/1ImportScope-Identities.ipynb @@ -33,6 +33,15 @@ "This notebook contains the logic used to perform calculations upon import of data (actuals and cash flows). 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. Scopes are used to define and perform data handling in a structured and easy-to-read-through fashion.", "\n", "\n

", + "\nImport scopes are divided in several notebooks:", + "\n- Calculation of Identities", + "\n- [Calculation of Present Values](../Import/2ImportScope-PresentValue)", + "\n- [Calculation of Actuals](../Import/3ImportScope-Actuals)", + "\n- [Calculation of Technical Margin](../Import/4ImportScope-TechnicalMargin)", + "\n- [Creation of Ifrs Variables](../Import/5ImportScope-ToIfrsVar)", + "\n- [Calculation of Ifrs Variables](../Import/6ImportScope-Compute)", + "\n", + "\n

", "\nIn this notebook the focus is on the defintion of the Identities and on the AoC Step structure and relations required for the computations. ", "\n" ], @@ -235,8 +244,10 @@ "\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 .Concat(GetStorage().DataNodeDataBySystemName[Identity].IsReinsurance ", + "\n ? GetStorage().DataNodeDataBySystemName[Identity].LiabilityType == LiabilityTypes.LIC ", + "\n ? new []{AmountTypes.CDR} : new []{AmountTypes.CDRI, AmountTypes.CDR} ", + "\n : Enumerable.Empty()).ToHashSet();", "\n ", "\n ", "\n IEnumerable ActualAmountTypes => GetStorage().GetIfrsVariables(Identity)", diff --git a/ifrs17/Import/2ImportScope-PresentValue.ipynb b/ifrs17/Import/2ImportScope-PresentValue.ipynb index 333a2587..3bf1b601 100644 --- a/ifrs17/Import/2ImportScope-PresentValue.ipynb +++ b/ifrs17/Import/2ImportScope-PresentValue.ipynb @@ -29,7 +29,16 @@ { "cell_type": "markdown", "source": [ - "In this notebook the focus is on the calculation of present values. " + "Import scopes are divided in several notebooks:", + "\n- [Calculation of Identities](../Import/1ImportScope-Identities)", + "\n- Calculation of Present Values", + "\n- [Calculation of Actuals](../Import/3ImportScope-Actuals)", + "\n- [Calculation of Technical Margin](../Import/4ImportScope-TechnicalMargin)", + "\n- [Creation of Ifrs Variables](../Import/5ImportScope-ToIfrsVar)", + "\n- [Calculation of Ifrs Variables](../Import/6ImportScope-Compute)", + "\n", + "\n

", + "\nIn this notebook the focus is on the calculation of present values." ], "metadata": {}, "execution_count": 0, @@ -155,8 +164,8 @@ "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 builder.ForScope(s => s.WithApplicability(x => x.GetStorage().GetCdr().Contains(x.Identity.AmountType) && x.Identity.Id.AocType == AocTypes.CF)", + "\n .WithApplicability(x => x.GetStorage().GetCdr().Contains(x.Identity.AmountType))", "\n .WithApplicability(x => x.GetStorage().GetShift(x.Identity.Id.ProjectionPeriod) >= MonthInAYear && x.Identity.Id.AocType == AocTypes.BOP && x.Identity.Id.Novelty == Novelties.I));", "\n", "\n AocStep referenceAocStep => GetScope(Identity.Id).Value;", @@ -169,7 +178,8 @@ "\n .Select(claim => GetStorage().GetValues(Identity.Id with {AocType = referenceAocStep.AocType, Novelty = referenceAocStep.Novelty}, claim, Identity.EstimateType, Identity.AccidentYear))", "\n .AggregateDoubleArray();", "\n ", - "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", + "\n private string cdrBasis => Identity.AmountType == AmountTypes.CDR ? EconomicBases.C : EconomicBases.L;", + "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id, cdrBasis);", "\n ", "\n private double[] PvCdrDecumulated { get {", "\n var ret = new double[NominalClaimsCashflow.Length];", @@ -276,7 +286,7 @@ "\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));", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.Id.IsReinsurance && x.GetStorage().GetCdr().Contains(x.Identity.AmountType)));", "\n", "\n [NotVisible]", "\n string EconomicBasis => GetContext();", @@ -292,7 +302,8 @@ "\n", "\npublic interface DiscountedCreditRiskCashflow : DiscountedCashflow", "\n{ ", - "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id);", + "\n private string cdrBasis => Identity.AmountType == AmountTypes.CDR ? EconomicBases.C : EconomicBases.L;", + "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id, cdrBasis);", "\n ", "\n double[] DiscountedCashflow.Values => Multiply(-1d, NominalValues.ComputeDiscountAndCumulateWithCreditDefaultRisk(MonthlyDiscounting, nonPerformanceRiskRate)); // we need to flip the sign to create a reserve view", "\n}" @@ -455,7 +466,8 @@ "\n private double[] nominalClaimsCashflow => GetScope(Identity).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 private string cdrBasis => Identity.AmountType == AmountTypes.CDR ? EconomicBases.C : EconomicBases.L;", + "\n private double nonPerformanceRiskRate => GetStorage().GetNonPerformanceRiskRate(Identity.Id, cdrBasis);", "\n ", "\n double[] GetInterestAccretion() ", "\n {", @@ -516,7 +528,7 @@ "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.CF)", "\n .WithApplicability(x => x.Identity.Id.AocType == AocTypes.IA)", "\n .WithApplicability(x => ComputationHelper.AocTypeWithNoPv.Contains(x.Identity.Id.AocType) ||", - "\n (x.Identity.Id.AocType == AocTypes.CRU && x.Identity.AmountType != AmountTypes.CDR) )", + "\n (x.Identity.Id.AocType == AocTypes.CRU && !x.GetStorage().GetCdr().Contains(x.Identity.AmountType)) ) ", "\n );", "\n ", "\n [NotVisible][IdentityProperty][Dimension(typeof(EconomicBasis))]", @@ -543,7 +555,7 @@ "\n", "\npublic interface PresentValueWithInterestAccretion : PresentValue, IWithInterestAccretion {", "\n static ApplicabilityBuilder ScopeApplicabilityBuilder(ApplicabilityBuilder builder) =>", - "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.Id.IsReinsurance && x.Identity.AmountType == AmountTypes.CDR)); ", + "\n builder.ForScope(s => s.WithApplicability(x => x.Identity.Id.IsReinsurance && x.GetStorage().GetCdr().Contains(x.Identity.AmountType))); ", "\n [NotVisible] double[] PresentValue.Values => GetInterestAccretion();", "\n}", "\n", diff --git a/ifrs17/Import/3ImportScope-Actuals.ipynb b/ifrs17/Import/3ImportScope-Actuals.ipynb index 35c5d9d3..6810805f 100644 --- a/ifrs17/Import/3ImportScope-Actuals.ipynb +++ b/ifrs17/Import/3ImportScope-Actuals.ipynb @@ -29,7 +29,16 @@ { "cell_type": "markdown", "source": [ - "In this notebook the focus is on the calculation of actuals values. " + "Import scopes are divided in several notebooks:", + "\n- [Calculation of Identities](../Import/1ImportScope-Identities)", + "\n- [Calculation of Present Values](../Import/2ImportScope-PresentValue)", + "\n- Calculation of Actuals", + "\n- [Calculation of Technical Margin](../Import/4ImportScope-TechnicalMargin)", + "\n- [Creation of Ifrs Variables](../Import/5ImportScope-ToIfrsVar)", + "\n- [Calculation of Ifrs Variables](../Import/6ImportScope-Compute)", + "\n", + "\n

", + "\nIn this notebook the focus is on the calculation of actuals values." ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17/Import/4ImportScope-TechnicalMargin.ipynb b/ifrs17/Import/4ImportScope-TechnicalMargin.ipynb index af618f2a..971435b4 100644 --- a/ifrs17/Import/4ImportScope-TechnicalMargin.ipynb +++ b/ifrs17/Import/4ImportScope-TechnicalMargin.ipynb @@ -29,7 +29,17 @@ { "cell_type": "markdown", "source": [ - "In this notebook the focus is on the calculation of Contractual Service Margin, Loss Component and Loss Recovery Component. ", + "Import scopes are divided in several notebooks:", + "\n- [Calculation of Identities](../Import/1ImportScope-Identities)", + "\n- [Calculation of Present Values](../Import/2ImportScope-PresentValue)", + "\n- [Calculation of Actuals](../Import/3ImportScope-Actuals)", + "\n- Calculation of Technical Margin", + "\n- [Creation of Ifrs Variables](../Import/5ImportScope-ToIfrsVar)", + "\n- [Calculation of Ifrs Variables](../Import/6ImportScope-Compute)", + "\n", + "\n

", + "\nIn this notebook the focus is on the calculation of Contractual Service Margin, Loss Component and Loss Recovery Component.", + "\n", "\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." ], @@ -234,7 +244,7 @@ "\n [NotVisible] string EconomicBasis => EconomicBases.L;", "\n ", "\n double Value => GetScope(Identity.DataNode).BeAmountTypes", - "\n .Except(GetStorage().GetNonAttributableAmountType())", + "\n .Except(GetStorage().GetNonAttributableAmountType().Concat(AmountTypes.CDR.RepeatOnce()))", "\n .Sum(at => GetScope((Identity, at, EstimateTypes.BE, (int?)null), o => o.WithContext(EconomicBasis)).Value) +", "\n GetScope(Identity).Value;", "\n ", diff --git a/ifrs17/Import/5ImportScope-ToIfrsVar.ipynb b/ifrs17/Import/5ImportScope-ToIfrsVar.ipynb index 0fec8b4d..c421859b 100644 --- a/ifrs17/Import/5ImportScope-ToIfrsVar.ipynb +++ b/ifrs17/Import/5ImportScope-ToIfrsVar.ipynb @@ -29,7 +29,16 @@ { "cell_type": "markdown", "source": [ - "In this notebook the focus is on the creation of Ifrs Variable from the Scopes. " + "Import scopes are divided in several notebooks:", + "\n- [Calculation of Identities](../Import/1ImportScope-Identities)", + "\n- [Calculation of Present Values](../Import/2ImportScope-PresentValue)", + "\n- [Calculation of Actuals](../Import/3ImportScope-Actuals)", + "\n- [Calculation of Technical Margin](../Import/4ImportScope-TechnicalMargin)", + "\n- Creation of Ifrs Variables", + "\n- [Calculation of Ifrs Variables](../Import/6ImportScope-Compute)", + "\n", + "\n

", + "\nIn this notebook the focus is on the creation of Ifrs Variable from the Scopes." ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17/Import/6ImportScope-Compute.ipynb b/ifrs17/Import/6ImportScope-Compute.ipynb index a3b94c0f..68c6b320 100644 --- a/ifrs17/Import/6ImportScope-Compute.ipynb +++ b/ifrs17/Import/6ImportScope-Compute.ipynb @@ -29,7 +29,16 @@ { "cell_type": "markdown", "source": [ - "In this notebook the focus is on the calculation of the minimal set of Ifrs Variable given the import Format. " + "Import scopes are divided in several notebooks:", + "\n- [Calculation of Identities](../Import/1ImportScope-Identities)", + "\n- [Calculation of Present Values](../Import/2ImportScope-PresentValue)", + "\n- [Calculation of Actuals](../Import/3ImportScope-Actuals)", + "\n- [Calculation of Technical Margin](../Import/4ImportScope-TechnicalMargin)", + "\n- [Creation of Ifrs Variables](../Import/5ImportScope-ToIfrsVar)", + "\n- Calculation of Ifrs Variables", + "\n", + "\n

", + "\nIn this notebook the focus is on the calculation of the minimal set of Ifrs Variable given the import Format." ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17/Import/ImportStorage.ipynb b/ifrs17/Import/ImportStorage.ipynb index f566d2c0..514e0680 100644 --- a/ifrs17/Import/ImportStorage.ipynb +++ b/ifrs17/Import/ImportStorage.ipynb @@ -115,8 +115,10 @@ "\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> LockedInPartnerRating { get; private set; }", + "\n public Dictionary> CurrentPartnerRating { get; private set; }", + "\n public Dictionary> LockedInCreditDefaultRates { get; private set; }", + "\n public Dictionary> CurrentCreditDefaultRates { get; private set; }", "\n public Dictionary> SingleDataNodeParametersByGoc { get; private set; }", "\n public Dictionary>> InterDataNodeParametersByGoc { get; private set; }", "\n public Dictionary AocConfigurationByAocStep { get; private set; }", @@ -218,8 +220,16 @@ "\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 CurrentPartnerRating = await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Partner);", + "\n CurrentCreditDefaultRates = await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.CreditRiskRating);", + "\n var initialYears = DataNodeDataBySystemName.Values.Select(dn => dn.Year).ToHashSet();", + "\n LockedInPartnerRating = new Dictionary>();", + "\n LockedInCreditDefaultRates = new Dictionary>();", + "\n foreach (var year in initialYears)", + "\n {", + "\n LockedInPartnerRating[year] = await workspace.LoadCurrentParameterAsync(args with { Year = year, Month = args.Year == year ? args.Month : MonthInAYear }, x => x.Partner);", + "\n LockedInCreditDefaultRates[year] = await workspace.LoadCurrentParameterAsync(args with { Year = year, Month = args.Year == year ? args.Month : MonthInAYear }, x => x.CreditRiskRating);", + "\n }", "\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", @@ -360,16 +370,28 @@ "\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 //Parameters", + "\n public double GetNonPerformanceRiskRate (ImportIdentity identity, string cdrBasis)", + "\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 Math.Pow(1d + rate[period].Values[0], 1d / 12d) - 1d;", + "\n ", + "\n double rate;", + "\n if(cdrBasis == EconomicBases.C)", + "\n { ", + "\n var period = GetCreditDefaultRiskPeriod(identity) == PeriodType.BeginningOfPeriod ? PreviousPeriod : CurrentPeriod;", + "\n // if Partner == Internal then return 0;", + "\n if(!CurrentPartnerRating.TryGetValue(dataNodeData.Partner, out var currentRating)) ApplicationMessage.Log(Error.RatingNotFound, dataNodeData.Partner);", + "\n if(!CurrentCreditDefaultRates.TryGetValue(currentRating[period].CreditRiskRating, out var currentRate)) ApplicationMessage.Log(Error.CreditDefaultRateNotFound, currentRating[period].CreditRiskRating);", + "\n rate = currentRate[period].Values[0];", + "\n }", + "\n else", + "\n {", + "\n if(!LockedInPartnerRating[dataNodeData.Year].TryGetValue(dataNodeData.Partner, out var lockedRating)) ApplicationMessage.Log(Error.RatingNotFound, dataNodeData.Partner);", + "\n if(!LockedInCreditDefaultRates[dataNodeData.Year].TryGetValue(lockedRating.CreditRiskRating, out var lockedRate)) ApplicationMessage.Log(Error.CreditDefaultRateNotFound, lockedRating.CreditRiskRating);", + "\n rate = lockedRate.Values[0];", + "\n }", + "\n return Math.Pow(1d + rate, 1d / 12d) - 1d;", "\n }", "\n ", "\n public double GetPremiumAllocationFactor(ImportIdentity id) => SingleDataNodeParametersByGoc.TryGetValue(id.DataNode, out var singleDataNodeParameter) ", @@ -399,6 +421,7 @@ "\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 public IEnumerable GetCdr() => hierarchyCache.Get(AmountTypes.CDR).Descendants(includeSelf: true).Select(x => x.SystemName);", "\n}" ], "metadata": {}, diff --git a/ifrs17/README.md b/ifrs17/README.md index f3229e57..f2d16ff3 100644 --- a/ifrs17/README.md +++ b/ifrs17/README.md @@ -18,7 +18,7 @@ Open our [**IFRS 17 Template**](https://portal.systemorph.cloud/project/ifrs17-t If you want to know more about the Calculation Engine than just its standard technical use, you are recommended to look at [Overview Calculation Engine](./OverviewCalculationEngine) notebook. You will be introduced to: - [DataModel](./DataModel/DataStructure) with links to detailed description of individual data types, dimensions and partitions employed -- [Import Calculation](./Import/ImportScopeCalculation) with in detail description using mathematical formulas and links to supporting material +- [Import Calculation](./Import/1ImportScope-Identities) with in detail description using mathematical formulas and links to supporting material

IFRS 17 Solution Overview diff --git a/ifrs17/Report/ParameterReportMutableScopeInteractive.ipynb b/ifrs17/Report/ParameterReportMutableScopeInteractive.ipynb index 199e3776..6f252599 100644 --- a/ifrs17/Report/ParameterReportMutableScopeInteractive.ipynb +++ b/ifrs17/Report/ParameterReportMutableScopeInteractive.ipynb @@ -154,7 +154,7 @@ "\n async Task GetPartnerRatingReport()", "\n {", "\n await GetStorage().InitializeAsync((Year, Month), ReportingNode, Scenario, CurrencyType);", - "\n var data = await workspace.GetPartnerRatingsReportParametersAsync(GetArgs());", + "\n var data = await workspace.GetCurrentPartnerRatingsReportParametersAsync(GetArgs());", "\n return await report.ForObjects(data)", "\n .WithQuerySource(workspace)", "\n .GroupRowsBy(x => x.Partner)", @@ -166,7 +166,7 @@ "\n async Task GetDefaultRatesReport()", "\n {", "\n await GetStorage().InitializeAsync((Year, Month), ReportingNode, Scenario, CurrencyType);", - "\n var data = await workspace.GetCreditDefaultRatesReportParametersAsync(GetArgs());", + "\n var data = await workspace.GetCurrentCreditDefaultRatesReportParametersAsync(GetArgs());", "\n return await report.ForObjects(data)", "\n .WithQuerySource(workspace)", "\n .GroupRowsBy(x => x.CreditRiskRating)", diff --git a/ifrs17/Report/ParameterReportsQueries.ipynb b/ifrs17/Report/ParameterReportsQueries.ipynb index 13a2b8cb..81f6690a 100644 --- a/ifrs17/Report/ParameterReportsQueries.ipynb +++ b/ifrs17/Report/ParameterReportsQueries.ipynb @@ -163,6 +163,16 @@ "source": [ "public record PartnerRatingsReportParameter : ReportParameter {", "\n [IdentityProperty]", + "\n [NotAggregated]", + "\n [Dimension(typeof(int), nameof(InitialYear))]", + "\n [NotVisible]", + "\n public int InitialYear { get; init; }", + "\n", + "\n [IdentityProperty]", + "\n [NotVisible]", + "\n public string PartnerRatingType { get; init; }", + "\n", + "\n [IdentityProperty]", "\n [NotVisible]", "\n [Dimension(typeof(Partner))]", "\n public string Partner { get; init; }", @@ -172,6 +182,16 @@ "\n}", "\npublic record CreditDefaultRatesReportParameter : ReportParameter {", "\n [IdentityProperty]", + "\n [NotAggregated]", + "\n [Dimension(typeof(int), nameof(InitialYear))]", + "\n [NotVisible]", + "\n public int InitialYear { get; init; }", + "\n ", + "\n [IdentityProperty]", + "\n [NotVisible]", + "\n public string CreditDefaultRatesType { get; init; }", + "\n", + "\n [IdentityProperty]", "\n [Dimension(typeof(CreditRiskRating))]", "\n [NotVisible]", "\n public string CreditRiskRating { get; init; }", @@ -367,8 +387,8 @@ { "cell_type": "code", "source": [ - "public static async Task GetPartnerRatingsReportParametersAsync(this IWorkspace workspace, ImportArgs args) =>", - "\n (await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Partner))", + "public static async Task GetCurrentPartnerRatingsReportParametersAsync(this IWorkspace workspace, ImportArgs args) {", + "\n var currentPartnerRating = (await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.Partner))", "\n .Values", "\n .SelectMany(x => x.Select(y => ", "\n new PartnerRatingsReportParameter { ", @@ -380,7 +400,39 @@ "\n CreditRiskRating = y.Value.CreditRiskRating", "\n }", "\n ))", - "\n .ToArray();" + "\n .ToArray();", + "\n ", + "\n return currentPartnerRating;", + "\n}" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "public static async Task GetLockedInPartnerRatingsReportParametersAsync(this IWorkspace workspace, ImportArgs args) {", + "\n var initialYears = (await workspace.LoadDataNodesAsync(args)).Values.Select(dn => dn.Year).ToHashSet();", + "\n var lockedPartnerRating = Enumerable.Empty();", + "\n foreach (var y in initialYears) { ", + "\n var loadedPartnerRatingData = await workspace.LoadCurrentParameterAsync(args with { Year = y, Month = args.Year == y ? args.Month : MonthInAYear }, y => y.Partner);", + "\n lockedPartnerRating = lockedPartnerRating.Concat(loadedPartnerRatingData.Select(x => ", + "\n new PartnerRatingsReportParameter {", + "\n InitialYear = y,", + "\n PartnerRatingType = \"Locked-In Rating\",", + "\n Partner = x.Value.Partner,", + "\n Year = x.Value.Year,", + "\n Month = x.Value.Month,", + "\n Scenario = x.Value.Scenario,", + "\n CreditRiskRating = x.Value.CreditRiskRating", + "\n }", + "\n ));", + "\n ", + "\n }", + "\n ", + "\n return lockedPartnerRating.ToArray();", + "\n}" ], "metadata": {}, "execution_count": 0, @@ -389,22 +441,22 @@ { "cell_type": "code", "source": [ - "public static async Task GetCreditDefaultRatesReportParametersAsync(this IWorkspace workspace, ImportArgs args) {", - "\n var partnerRatings = await workspace.GetPartnerRatingsReportParametersAsync(args);", + "public static async Task GetCurrentCreditDefaultRatesReportParametersAsync(this IWorkspace workspace, ImportArgs args) {", + "\n var partnerRatings = await workspace.GetCurrentPartnerRatingsReportParametersAsync(args);", "\n ", - "\n var creditDefaultRates = (await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.CreditRiskRating))", + "\n var currentCreditDefaultRates = (await workspace.LoadCurrentAndPreviousParameterAsync(args, x => x.CreditRiskRating))", "\n .Values", "\n .SelectMany(x => x.Select(y =>", - "\n new {", + "\n new CreditDefaultRatesReportParameter{", "\n Period = ((Period)y.Key),", "\n CreditRiskRating = y.Value.CreditRiskRating,", "\n Year = y.Value.Year,", "\n Month = y.Value.Month,", "\n Scenario = y.Value.Scenario}", - "\n ));", - "\n ", + "\n )).ToArray();", + "\n", "\n var partnerDefaultRates = partnerRatings.Join(", - "\n creditDefaultRates,", + "\n currentCreditDefaultRates,", "\n pr => new {pr.Period, pr.CreditRiskRating},", "\n cdr => new {cdr.Period, cdr.CreditRiskRating},", "\n (pr, cdr) => ", @@ -424,6 +476,42 @@ "metadata": {}, "execution_count": 0, "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "public static async Task GetLockedInCreditDefaultRatesReportParametersAsync(this IWorkspace workspace, ImportArgs args) {", + "\n var initialYears = (await workspace.LoadDataNodesAsync(args)).Values.Select(dn => dn.Year).ToHashSet();", + "\n var lockedCreditDefaultRate = Enumerable.Empty();", + "\n foreach (var y in initialYears) { ", + "\n var loadedCreditDefaultRateData = await workspace.LoadCurrentParameterAsync(args with { Year = y, Month = args.Year == y ? args.Month : MonthInAYear }, y => y.CreditRiskRating);", + "\n lockedCreditDefaultRate = lockedCreditDefaultRate.Concat(loadedCreditDefaultRateData.Select(x => ", + "\n new CreditDefaultRatesReportParameter {", + "\n InitialYear = y,", + "\n CreditDefaultRatesType = \"Locked-In Rates\",", + "\n CreditRiskRating = x.Value.CreditRiskRating,", + "\n Year = x.Value.Year,", + "\n Month = x.Value.Month,", + "\n Scenario = x.Value.Scenario}", + "\n ));", + "\n ", + "\n }", + "\n", + "\n return lockedCreditDefaultRate.ToArray();", + "\n}" + ], + "metadata": {}, + "execution_count": 0, + "outputs": [] + }, + { + "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 6d4c0434..45db589a 100644 --- a/ifrs17/Report/ReportScopes.ipynb +++ b/ifrs17/Report/ReportScopes.ipynb @@ -275,12 +275,12 @@ "\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 .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.L), (\"AmountType\", \"!CDRI\"));", "\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 .Filter((\"LiabilityType\", Identity.Id.LiabilityType), (\"EconomicBasis\", EconomicBases.C), (\"AmountType\", \"!CDRI\"));", "\n}" ], "metadata": {}, From b78ad4142ff6f0365b45de8fab3d1d881b3c7460 Mon Sep 17 00:00:00 2001 From: Nikos Nikolopoulos <114566025+nnikolopoulos@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:38:07 +0200 Subject: [PATCH 17/19] Update to v1.3.1 (#326) Replace v1.3.0 with v1.3.1 --- .../Constants/CalculationEngine.ipynb | 2 +- ifrs17-template/Export/MapTemplate.ipynb | 6 ++-- .../Import/CloseImportTemplate.ipynb | 8 ++--- ifrs17-template/InputFormatDescription.ipynb | 32 +++++++++---------- ifrs17-template/Report/ParameterReports.ipynb | 20 ++++++------ ifrs17-template/Report/Reports.ipynb | 30 ++++++++--------- 6 files changed, 49 insertions(+), 49 deletions(-) diff --git a/ifrs17-template/Constants/CalculationEngine.ipynb b/ifrs17-template/Constants/CalculationEngine.ipynb index 721e117b..944705fa 100644 --- a/ifrs17-template/Constants/CalculationEngine.ipynb +++ b/ifrs17-template/Constants/CalculationEngine.ipynb @@ -20,7 +20,7 @@ "cell_type": "code", "source": [ "var projectName = \"ifrs17\";", - "\nvar environmentName = \"v1.3.0\";", + "\nvar environmentName = \"v1.3.1\";", "\nvar notebookName = \"CalculationEngine\";", "\nvar calculationEngine = $\"#!import \\\"//{projectName}/{environmentName}/{notebookName}\\\"\";" ], diff --git a/ifrs17-template/Export/MapTemplate.ipynb b/ifrs17-template/Export/MapTemplate.ipynb index 038a44e1..3eb3eeed 100644 --- a/ifrs17-template/Export/MapTemplate.ipynb +++ b/ifrs17-template/Export/MapTemplate.ipynb @@ -110,7 +110,7 @@ "source": [ "# Map Template: Data Node", "\n", - "\n[DataNodes](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#data-node) defines the properties of [Portfolios](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#group-of-contracts)." + "\n[DataNodes](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#data-node) defines the properties of [Portfolios](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#group-of-contracts)." ], "metadata": {}, "execution_count": 0, @@ -166,7 +166,7 @@ "source": [ "# Map Template: Data Node State", "\n", - "\n[Data Node State](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.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)." + "\n[Data Node State](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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, @@ -252,7 +252,7 @@ "source": [ "# Map Template: Data Node Parameter", "\n", - "\n[Data Node Parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#data-node-parameters) are defined at the Group of Contract level and are used during the import calculation. " + "\n[Data Node Parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#data-node-parameters) are defined at the Group of Contract level and are used during the import calculation. " ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17-template/Import/CloseImportTemplate.ipynb b/ifrs17-template/Import/CloseImportTemplate.ipynb index d6c33af3..c025e7fe 100644 --- a/ifrs17-template/Import/CloseImportTemplate.ipynb +++ b/ifrs17-template/Import/CloseImportTemplate.ipynb @@ -39,7 +39,7 @@ "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 ImportFormats can be found [here](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Constants/Consts#import-formats)", + "\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 ImportFormats can be found [here](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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" @@ -89,9 +89,9 @@ "\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.3.0/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#group-of-contracts)", - "\n- ImportFormats.DataNodeState : the [state of a data node](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.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.3.0/DataModel/DataStructure#data-node-parameters). For **Group of Insurance Contracts** a default [Premium Allocation factor](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Import/4ImportScope-TechnicalMargin#experience-adjustment-on-premium) of 1 is applied if the parameter is not imported.", + "\n- ImportFormats.DataNode : [Portfolios](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#portfolios) and [Group of Contracts](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#group-of-contracts)", + "\n- ImportFormats.DataNodeState : the [state of a data node](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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.3.1/DataModel/DataStructure#data-node-parameters). For **Group of Insurance Contracts** a default [Premium Allocation factor](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/Import/4ImportScope-TechnicalMargin#experience-adjustment-on-premium) of 1 is applied if the parameter is not imported.", "\n" ], "metadata": {}, diff --git a/ifrs17-template/InputFormatDescription.ipynb b/ifrs17-template/InputFormatDescription.ipynb index ebab2279..e61afe41 100644 --- a/ifrs17-template/InputFormatDescription.ipynb +++ b/ifrs17-template/InputFormatDescription.ipynb @@ -38,17 +38,17 @@ "source": [ "A cash flow 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.systemorph.cloud/project/ifrs17/env/v1.3.0/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.systemorph.cloud/project/ifrs17/env/v1.3.1/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.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#estimate-type) : entered with its SystemName,", - "\n- [AocType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [Novelty](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#novelty) : entered with its SystemName,", + "\n- [DataNode](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [AocType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [Novelty](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#aoc-configuration) with DataType Optional or Mandatory.", + "\nAll valid combinations of AocType and Novelty can be found in [AocConfiguration](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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 length of cash flow. The Value0 corresponds to January of the Year entered in the **Main** section for every combination of AocType and Novelty. " ], "metadata": {}, @@ -73,13 +73,13 @@ "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.systemorph.cloud/project/ifrs17/env/v1.3.0/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.systemorph.cloud/project/ifrs17/env/v1.3.1/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.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AocType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#aoc-type) : entered with its SystemName,", - "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [DataNode](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AocType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#aoc-type) : entered with its SystemName,", + "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#estimate-type) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ], "metadata": {}, @@ -104,12 +104,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.systemorph.cloud/project/ifrs17/env/v1.3.0/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.systemorph.cloud/project/ifrs17/env/v1.3.1/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.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", - "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#amount-type) : entered with its SystemName,", - "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#estimate-type) : entered with its SystemName,", + "\n- [DataNode](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#group-of-contracts) : lowest granularity of the Data Node, it is entered with its SystemName,", + "\n- [AmountType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#amount-type) : entered with its SystemName,", + "\n- [EstimateType](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#estimate-type) : entered with its SystemName,", "\n- AccidentYear : relevant for Data Node with Liability Type: Liability for Incurred Claims." ], "metadata": {}, diff --git a/ifrs17-template/Report/ParameterReports.ipynb b/ifrs17-template/Report/ParameterReports.ipynb index 0290b5ad..e2702fee 100644 --- a/ifrs17-template/Report/ParameterReports.ipynb +++ b/ifrs17-template/Report/ParameterReports.ipynb @@ -102,7 +102,7 @@ "# Retrieve data ", "\n", "\nThe parameters used for calculation of the provided period are here retrieved through queries.", - "\nThe queries and the data model of the reported objects can be foud in the [ParameterReportQueries](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Report/ParameterReportsQueries#queries)" + "\nThe queries and the data model of the reported objects can be foud in the [ParameterReportQueries](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/Report/ParameterReportsQueries#queries)" ], "metadata": {}, "execution_count": 0, @@ -202,7 +202,7 @@ "cell_type": "markdown", "source": [ "## Data node", - "\nProperties of the Group of Contracts and corresponding Portfolios are merged to provide a full description of the [Data Node](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructureDataStructure#data-node)" + "\nProperties of the Group of Contracts and corresponding Portfolios are merged to provide a full description of the [Data Node](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructureDataStructure#data-node)" ], "metadata": {}, "execution_count": 0, @@ -226,7 +226,7 @@ "source": [ "## Data node state", "\n", - "\nCurrent and previous period [data node state](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#data-node-state)." + "\nCurrent and previous period [data node state](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#data-node-state)." ], "metadata": {}, "execution_count": 0, @@ -251,7 +251,7 @@ "cell_type": "markdown", "source": [ "## Yield curve", - "\n[Yield Curve](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#yield-curve) used for locked-in discounting and current rating discouning (curret period and previous period) are shown." + "\n[Yield Curve](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#yield-curve) used for locked-in discounting and current rating discouning (curret period and previous period) are shown." ], "metadata": {}, "execution_count": 0, @@ -275,7 +275,7 @@ "cell_type": "markdown", "source": [ "## Single data node parameter", - "\n[Single data node parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#data-node-parameters) for current and previous period. " + "\n[Single data node parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#data-node-parameters) for current and previous period. " ], "metadata": {}, "execution_count": 0, @@ -299,7 +299,7 @@ "cell_type": "markdown", "source": [ "## Inter data node parameter", - "\n[Inter data node parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#data-node-parameters) for current and previous period. " + "\n[Inter data node parameters](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#data-node-parameters) for current and previous period. " ], "metadata": {}, "execution_count": 0, @@ -323,7 +323,7 @@ "cell_type": "markdown", "source": [ "## Partner ratings", - "\n[Partner ratings](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#partner-rating) for current and previous period." + "\n[Partner ratings](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#partner-rating) for current and previous period." ], "metadata": {}, "execution_count": 0, @@ -346,7 +346,7 @@ { "cell_type": "markdown", "source": [ - "Locked in [partner ratings](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#partner-rating)." + "Locked in [partner ratings](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#partner-rating)." ], "metadata": {}, "execution_count": 0, @@ -370,7 +370,7 @@ "cell_type": "markdown", "source": [ "## Partner default rates", - "\n[Partner default rates](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#credit-default-rate) for current and previous period." + "\n[Partner default rates](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#credit-default-rate) for current and previous period." ], "metadata": {}, "execution_count": 0, @@ -393,7 +393,7 @@ { "cell_type": "markdown", "source": [ - "Locked in [partner default rates](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/DataModel/DataStructure#credit-default-rate)." + "Locked in [partner default rates](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/DataModel/DataStructure#credit-default-rate)." ], "metadata": {}, "execution_count": 0, diff --git a/ifrs17-template/Report/Reports.ipynb b/ifrs17-template/Report/Reports.ipynb index c87e0012..bff99792 100644 --- a/ifrs17-template/Report/Reports.ipynb +++ b/ifrs17-template/Report/Reports.ipynb @@ -79,7 +79,7 @@ "source": [ "# Best Estimate", "\n", - "\nPresent values of the [best-estimate](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Report/ReportScopes#best-estimate) future cash flows are shown here in an Analysis of Change report.", + "\nPresent values of the [best-estimate](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/Report/ReportScopes#best-estimate) future cash flows 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.", @@ -113,7 +113,7 @@ "source": [ "# Risk Adjustment", "\n", - "\nPresent values of the [risk adjustment](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Report/ReportScopes#risk-adjustment) future cash flows are shown here.", + "\nPresent values of the [risk adjustment](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/Report/ReportScopes#risk-adjustment) future cash flows 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." ], @@ -140,7 +140,7 @@ "source": [ "# Written Actuals", "\n", - "\n[Written Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Report/ReportScopes#written-accrual-deferral) are shown here. ", + "\n[Written Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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. ", "\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\")}." @@ -168,8 +168,8 @@ "source": [ "## Advance, Overdue Actuals", "\n", - "\nActuals payed in [Advance](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Report/ReportScopes#written-accrual-deferral)", - "\nor [Overdue](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/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.3.1/Report/ReportScopes#written-accrual-deferral)", + "\nor [Overdue](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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. " ], @@ -196,7 +196,7 @@ "source": [ "## Deferrable Actuals", "\n", - "\n[Deferrable Actuals](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/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.3.1/Report/ReportScopes#written-accrual-deferral) are shown here. Amortization of the deferrable amount is computed using the Coverage Unit pattern. " ], "metadata": {}, "execution_count": 0, @@ -221,7 +221,7 @@ "source": [ "# Fulfilment Cash flow", "\n", - "\nPresent Value of the [Fulfilment Cash flow](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Report/ReportScopes#fulfillment-cash-flows) are shown here. ", + "\nPresent Value of the [Fulfilment Cash flow](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/Report/ReportScopes#fulfillment-cash-flows) 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\")}.", @@ -250,7 +250,7 @@ "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.3.0/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.3.1/Report/ReportScopes#experience-adjustment)." ], "metadata": {}, "execution_count": 0, @@ -275,7 +275,7 @@ "source": [ "# LRC Technical Margin", "\n", - "\nIn the [Technical Margin](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.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. ", + "\nIn the [Technical Margin](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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": {}, @@ -301,7 +301,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/ifrs17/env/v1.3.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. ", + "\nThe Contractual Service Margin (CSM) / Loss Component (LC) / Loss Recovery Component (LR) [report](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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. " ], @@ -328,7 +328,7 @@ "source": [ "# LRC Actuarial", "\n", - "\nThe [Actuarial Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Report/ReportScopes#lrc-actuarial-actuarial-liability-for-remaining-coverage) report shows figures from Fulfilment Cash flow discounted with current yield curve, and the allocated techinical margin. " + "\nThe [Actuarial Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/Report/ReportScopes#lrc-actuarial-actuarial-liability-for-remaining-coverage) report shows figures from Fulfilment Cash flow discounted with current yield curve, and the allocated techinical margin. " ], "metadata": {}, "execution_count": 0, @@ -353,7 +353,7 @@ "source": [ "# LRC", "\n", - "\nThe [Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.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. " + "\nThe [Liability for Remaining Coverage](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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, @@ -378,7 +378,7 @@ "source": [ "# LIC Actuarial", "\n", - "\nThe [Actuarial Liability of Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Report/ReportScopes#lic-actuarial-actuarial-liability-for-incurred-claims) report shows figures from Fulfilment Cash flow discounted with current yield curve. " + "\nThe [Actuarial Liability of Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/Report/ReportScopes#lic-actuarial-actuarial-liability-for-incurred-claims) report shows figures from Fulfilment Cash flow discounted with current yield curve. " ], "metadata": {}, "execution_count": 0, @@ -403,7 +403,7 @@ "source": [ "# LIC", "\n", - "\nThe [Liability for Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.0/Report/ReportScopes#lic-liability-for-incurred-claims) adds to the [Actuarial Liability for Incurred Claims](#lic-actuarial) the contribution of and accrual actuals." + "\nThe [Liability for Incurred Claims](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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, @@ -428,7 +428,7 @@ "source": [ "# Financial Performance", "\n", - "\nThe [Financial Performance](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.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 cash flows (Premiums, Claims, Expenses, etc...) for the given period.", + "\nThe [Financial Performance](https://portal.systemorph.cloud/project/ifrs17/env/v1.3.1/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 cash flows (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." ], From 0a80629f548f92588353c1c1c73c7d516ed28ddf Mon Sep 17 00:00:00 2001 From: nnikolopoulos Date: Fri, 23 Jun 2023 17:34:29 +0200 Subject: [PATCH 18/19] Fix Lambda in LoadCurrentParameterAsync --- ifrs17/Utils/Queries.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ifrs17/Utils/Queries.ipynb b/ifrs17/Utils/Queries.ipynb index ec0643a4..979ad478 100644 --- a/ifrs17/Utils/Queries.ipynb +++ b/ifrs17/Utils/Queries.ipynb @@ -122,7 +122,7 @@ "\n{", "\n return (await querySource.LoadParameterAsync(args.Year, args.Month, filterExpression))", "\n .Where(x => x.Scenario == args.Scenario || x.Scenario == null)", - "\n .GroupBy(x => identityExpression)", + "\n .GroupBy(identityExpression)", "\n .Select(x => x.OrderByDescending(y => y.Year)", "\n .ThenByDescending(y => y.Month)", "\n .ThenByDescending(y => y.Scenario)", From 9e16d36e3210d75af7d940ae13d4d6aa73c08b36 Mon Sep 17 00:00:00 2001 From: nnikolopoulos Date: Mon, 26 Jun 2023 15:40:03 +0200 Subject: [PATCH 19/19] Md RAM augment --- ifrs17/Test/Tests.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ifrs17/Test/Tests.ipynb b/ifrs17/Test/Tests.ipynb index 5cb3f2c1..1692e5d0 100644 --- a/ifrs17/Test/Tests.ipynb +++ b/ifrs17/Test/Tests.ipynb @@ -21,7 +21,7 @@ "source": [ "

Tests

", "\n", - "\n
Execute this Notebook using at least 12Gb RAM." + "\n
Execute this Notebook using at least 14Gb RAM." ], "metadata": {}, "execution_count": 0,