2.4.7. Limit Profiles

Prerequisites: Examples use build and qd, and basic Aggregate output.

All exposure variables can be vectors. This feature makes it easy to express a limit profile. All exposure related elements (claim count, premium, loss, loss ratio) are broadcast against one-another.

Example:

agg Eg1                                  \
[1000 2000 4000 1000] premium at 0.65 lr \
[1000 2000 5000 4000] xs [0 0 0 1000]    \
sev lognorm 500 cv 1.25                  \
mixed gamma 0.6

expresses a limit profile with 1000 of premium at 1000 xs 0; 2000 at 2000 xs 0, 4000 at 5000 xs 0, and 1000 at 4000 xs 1000. In this case all the loss ratios are the same, but they could vary too.

A (mixed) compound Poisson aggregate with a mixed severity is a sum of aggregates, with the mixture weights applied to the expected claim count. This is analogous to the fact that \(\exp(a+b)=\exp(a)\exp(b)\). In terms of a compound Poisson,

\[\mathsf{CP}(\lambda, \sum w_iF_i)=_d \sum_i \mathsf{CP}(w_i \lambda, F_i)\]

where \(=_d\) indcates the two sides have the same distribution. For Poisson frequency, the components on the right are independent; for mixed frequencies they are not.

In this case, we have selected a mixed frequency, using a gamma CV 0.6 mixing distribution. All of the limits share the same mixing variable. The effect of this is shown in the report_df, comparing the independent and mixed columns. The former adds the mixture components independently whereas the latter uses the common mixing variable. The increase in aggregate CV is quite marked.

In [1]: from aggregate import build, qd

In [2]: a10 = build('agg DecL:10 '
   ...:             '[1000 2000 4000 1000] premium at 0.65 lr '
   ...:             '[1000 2000 5000 4000] xs [0 0 0 1000] '
   ...:             'sev lognorm 500 cv 1.25 '
   ...:             'mixed gamma 0.6')
   ...: 

In [3]: qd(a10)

       E[X] Est E[X]    Err E[X]   CV(X) Est CV(X)  Skew(X) Est Skew(X)
X                                                                      
Freq 10.473                      0.67489             1.2083            
Sev  496.51   496.51 -8.8063e-09  1.1061    1.1061   3.1179      3.1179
Agg    5200     5200 -8.9414e-09 0.75651   0.75651   1.3155      1.3155
log2 = 16, bandwidth = 1, validation: not unreasonable.

In [4]: qd(a10.report_df.iloc[:, :-2])

view              0        1        2        3 independent    mixed
statistic                                                          
name        DecL:10  DecL:10  DecL:10  DecL:10     DecL:10  DecL:10
limit          1000     2000     5000     4000      3518.1   3518.1
attachment        0        0        0     1000      83.724   83.724
el              650     1300     2600      650        5200     5200
freq_m       1.5833     2.77    5.243  0.87685      10.473   10.473
freq_cv     0.99579  0.84913  0.74211   1.2249     0.47078  0.67489
freq_skew    1.3573   1.2731   1.2272   1.5188     0.80136   1.2083
sev_m        410.54   469.32    495.9   741.29      496.51   496.51
sev_cv      0.74534  0.96384   1.1639   1.1443      1.1061   1.1061
sev_skew    0.77863   1.8007   3.4165    2.019      3.1179   3.1179
agg_m           650     1300     2600      650        5200     5200
agg_cv       1.1587   1.0278  0.89949   1.7302      0.5797  0.75651
agg_skew     1.6154   1.5795   1.5449   2.5962       1.019   1.3155