Quota Share Financial Modelling Step-By-Step

This step-by-step guide illustrates how a Quota Share contract type is modelled in Graphene. It assumes a vanilla Quota Share contract with a limit, upfront premium income and brokerage fee expense. This example does not take multiple currencies or currency exchange rates into account.

There may be more than one way to express a Quota Share contract model in Graphene and this illustrates only one way. There may also exist slight variations in how Graphene users may want to model specific aspects of a Quota Share for their own purposes and this guide should illustrate how those customizations can be easily achieved using Graphene template capabilities.

Objective

For this guide, the objective is to model a vanilla Quota Share with the following terms:

Term

Value

Limit

30,000 USD

Share

20%

Upfront Premium

3,000 USD

Upfront Brokerage

10%

Inception Date

2019-01-01T00:00:00Z

Expiry Date

2020-01-01T00:00:00Z

We express this contract definition in Graphene’s business model network as a node with the following definition:

{
    "_schema": "QuotaShare_1.0",
    "inception_date": 1546300800,
    "expiration_date": 1577836800,
    "limit_value": 30000.0,
    "premium_value": 3000.0,
    "brokerage": 0.1,
    "share": 0.2
}

We then use templates to generate the financial model graph for this Quota Share definition. This graph is finally evaluation by the Graphene financial engine.

digraph G { graph [ fontname="Courier", fontsize=12]; node [ shape=rect, fontname="Courier", fontcolor=blue, fontsize=10, margin=0.1]; edge [ fontname="Courier", fontcolor=blue, fontsize=8]; premium [label="_schema: Record_1.0\ltype: \"Premium\"\ltime: 1546300800\lvalue: 3000\l"]; brokerage [label="_schema: Record_1.0\ltype: \"BrokerageFee\"\ltime: 1546300800\lvalue: -300\l"]; input [ label="", shape=circle, style=filled, color=darkgreen, width=0.2]; time_before [label="_schema: TimeFilter_1.0\lop: \"LESS_THAN_EQUAL\"\lvalue: 1577836800\l"]; time_after [label="_schema: TimeFilter_1.0\lop: \"GREATER_THAN_EQUAL\"\lvalue: 1546300800\l"]; loss_filter [label="_schema: RecordTypeFilter_1.0\lop: \"EQUAL\"\lvalue: \"Loss\"\l"]; limit [label="_schema: OccurrenceLimit_1.0\llimit: 30000\l"]; non_loss_filter [label="_schema: RecordTypeFilter_1.0\lop: \"NOT_EQUAL\"\lvalue: \"Loss\"\l"]; share [label="_schema: Scale_1.0\lfactor:0.2\l"]; output [ label="", shape=circle, style=filled, color=red, width=0.2]; input -> time_before -> time_after; time_after -> non_loss_filter -> share; time_after -> loss_filter -> limit -> share; premium -> share; brokerage -> share; share -> output; }

Step-By-Step Breakdown

In order to better understand the individual elements of the financial model graph illustrated above, let’s decompose the graph into separate components.

Layering of Loss Claims

The primary layering of loss claims is performed in this subgraph:

digraph G { graph [ fontname="Courier", fontsize=12]; node [ shape=rect, fontname="Courier", fontcolor=blue, fontsize=10, margin=0.1]; edge [ fontname="Courier", fontcolor=blue, fontsize=8]; input [ label="", shape=circle, style=filled, color=darkgreen, width=0.2]; time_before [label="_schema: TimeFilter_1.0\lop: \"LESS_THAN_EQUAL\"\lvalue: 1577836800\l", xlabel="(1)"]; time_after [label="_schema: TimeFilter_1.0\lop: \"GREATER_THAN_EQUAL\"\lvalue: 1546300800\l", xlabel="(2)"]; loss_filter [label="_schema: RecordTypeFilter_1.0\lop: \"EQUAL\"\lvalue: \"Loss\"\l", xlabel="(3)"]; non_loss_filter [label="_schema: RecordTypeFilter_1.0\lop: \"NOT_EQUAL\"\lvalue: \"Loss\"\l", xlabel="(4)"]; limit [label="_schema: OccurrenceLimit_1.0\llimit: 30000\l", xlabel="(5)"]; share [label="_schema: Scale_1.0\lfactor:0.2\l", xlabel="(6)"]; input -> time_before -> time_after -> loss_filter -> limit -> share; time_after -> non_loss_filter -> share; output [ label="", shape=circle, style=filled, color=red, width=0.2]; share -> output; }

The graph consists of a number of core operations that are applied to the input Ledger in sequential order:

  1. Do not consider records past the expiry date. Only keep records before the expiry date.

  2. Do not consider records before the inception date. Only keep records on or after the inception date.

  3. Apply layering terms only to “Loss” records.

  4. Other types of records, such as “ReinstatementPremium” from source structures are not subject to the layering terms.

  5. Apply an occurrence limit of 30,000. The limit is applied to the sum of values of all records with identical Trial, Time, and occurrence key values. Once the limit is applied, the result is proportionally allocated to all records included in the group.

  6. Finally we apply the share using a simple scaling function.

Upfront Premium and Brokerage Fees

The Quota Share contract pays an upfront premium income and the insurer must pay a 10% brokerage fee on the premium to the broker.

digraph G { graph [ fontname="Courier", fontsize=12]; node [ shape=rect, fontname="Courier", fontcolor=blue, fontsize=10, margin=0.1]; edge [ fontname="Courier", fontcolor=blue, fontsize=8]; premium [label="_schema: Record_1.0\ltype: \"Premium\"\ltime: 1546300800\lvalue: 3000\l", xlabel="(6)"]; brokerage [label="_schema: Record_1.0\ltype: \"BrokerageFee\"\ltime: 1546300800\lvalue: -300\l", xlabel="(7)"]; share [label="_schema: Scale_1.0\lfactor:0.2\l"]; premium -> share; brokerage -> share; output [ label="", shape=circle, style=filled, color=red, width=0.2]; share -> output; }

  1. The upfront premium is simply a record that is created in the Ledger at the time of contract inception with a value equal to the premium amount and a type of Premium.

  2. Similarly, the brokerage fee on the upfront premium is a record created in the Ledger at the time of contract inception with a negative value equal to 10% of the upfront premium. The value is negative to indicate an expense to the insurer.

Putting it back together

In order to model the complete Quota Share contract, all components are combined together and collectively produce a single Ledger that contains:

  • A single upfront premium income record on inception of the contract

  • A single brokerage fee expense record on inception of the contract

  • Any loss records that represent a loss expense to the contract

Core operations

The entire Quota Share contract structure consists of five types of core operations:

TimeFilter

RecordTypeFilter

OccurrenceLimit

Scale

Record

Templates

Using Graphene template capabilities, we can build out the appropriate templates to generate the financial model shown above from the initial JSON definition:

{
    "_schema": "QuotaShare",
    "inception_date": 1546300800,
    "expiration_date": 1577836800,
    "limit_value": 30000.0,
    "premium_value": 3000.0,
    "brokerage": 0.1,
    "share": 0.2
}

The entire Quota Share structure can be modelled using a single template of the following form:

{
    vertices: [
        # Vertex 0
        {
            _schema: "TimeFilter_1.0",
            op: "LESS_THAN_EQUAL",
            value: .expiration_date
        },
        # Vertex 1
        {
            _schema: "TimeFilter_1.0",
            op: "GREATER_THAN_EQUAL",
            value: .inception_date
        },
        # Vertex 2
        {
            _schema: "RecordTypeFilter_1.0",
            op: "EQUAL",
            value: "Loss"
        },
        # Vertex 3
        {
            _schema: "OccurrenceLimit_1.0",
            limit: .limit_value
        },
        # Vertex 4
        {
            _schema: "RecordTypeFilter_1.0",
            op: "NOT_EQUAL",
            value: "Loss"
        },
        # Vertex 5
        {
            _schema: "Record_1.0",
            _internal_terminal: true,
            time: .inception_date,
            type: "BrokerageFee",
            value: (.premium_value * .brokerage * -1.0)
        },
        # Vertex 6
        {
            _schema: "Record_1.0",
            _internal_terminal: true,
            time: .inception_date,
            type: "Premium",
            value: .premium_value
        },
        # Vertex 7
        {
            _schema: "Scale_1.0",
            factor: .share
        }
    ],
    edges: [
        {
            from: 0,
            to: 1
        },
        {
            from: 1,
            to: 2
        },
        {
            from: 2,
            to: 3
        },
        {
            from: 3,
            to: 7
        },
        {
            from: 1,
            to: 4
        },
        {
            from: 4,
            to: 7
        },
        {
            from: 5,
            to: 7
        },
        {
            from: 6,
            to: 7
        }
    ]
}