Esempio n. 1
0
def test_mcl_rollforward():
    mcl = cl.load_sample("mcl")
    mcl_prior = mcl[mcl.valuation < mcl.valuation_date]
    munich = cl.MunichAdjustment(
        paid_to_incurred=[("paid", "incurred")]).fit(mcl_prior)
    new = munich.transform(mcl)
    cl.Chainladder().fit(new).ultimate_
Esempio n. 2
0
def test_pipeline():
    tri = cl.load_sample('clrd').groupby('LOB').sum()[[
        'CumPaidLoss', 'IncurLoss', 'EarnedPremDIR'
    ]]
    tri['CaseIncurredLoss'] = tri['IncurLoss'] - tri['CumPaidLoss']

    X = tri[['CumPaidLoss', 'CaseIncurredLoss']]
    sample_weight = tri['EarnedPremDIR'].latest_diagonal

    dev = [
        cl.Development(),
        cl.ClarkLDF(),
        cl.Trend(),
        cl.IncrementalAdditive(),
        cl.MunichAdjustment(paid_to_incurred=('CumPaidLoss',
                                              'CaseIncurredLoss')),
        cl.CaseOutstanding(paid_to_incurred=('CumPaidLoss',
                                             'CaseIncurredLoss'))
    ]
    tail = [cl.TailCurve(), cl.TailConstant(), cl.TailBondy(), cl.TailClark()]
    ibnr = [
        cl.Chainladder(),
        cl.BornhuetterFerguson(),
        cl.Benktander(n_iters=2),
        cl.CapeCod()
    ]

    for model in list(itertools.product(dev, tail, ibnr)):
        print(model)
        cl.Pipeline(
            steps=[('dev',
                    model[0]), ('tail',
                                model[1]), ('ibnr', model[2])]).fit_predict(
                                    X, sample_weight=sample_weight).ibnr_.sum(
                                        'origin').sum('columns').sum()
Esempio n. 3
0
def test_mcl_ult():
    mcl = cl.load_sample("mcl")
    dev = cl.Development().fit_transform(mcl)
    cl_traditional = cl.Chainladder().fit(dev).ultimate_
    dev_munich = cl.MunichAdjustment(
        paid_to_incurred=[("paid", "incurred")]).fit_transform(dev)
    cl_munich = cl.Chainladder().fit(dev_munich).ultimate_
Esempio n. 4
0
def test_mcl_paid():
    df = r("MunichChainLadder(MCLpaid, MCLincurred)").rx("MCLPaid")
    p = cl.MunichAdjustment(paid_to_incurred=("paid", "incurred")).fit(
        cl.Development(sigma_interpolation="mack").fit_transform(
            cl.load_sample("mcl")))
    xp = p.ldf_.get_array_module()
    arr = xp.array(df[0])
    assert xp.allclose(arr, p.munich_full_triangle_[0, 0, 0, :, :], atol=1e-5)
def test_mcl_paid():
    df = r('MunichChainLadder(MCLpaid, MCLincurred)').rx('MCLPaid')
    p = cl.MunichAdjustment(paid_to_incurred=('paid', 'incurred')).fit(
        cl.Development(sigma_interpolation='mack').fit_transform(
            cl.load_sample('mcl'))).munich_full_triangle_[0, 0, 0, :, :]
    xp = cp.get_array_module(p)
    arr = xp.array(df[0])
    xp.testing.assert_allclose(arr, p, atol=1e-5)
Esempio n. 6
0
def test_mcl_paid():
    df = r('MunichChainLadder(MCLpaid, MCLincurred)').rx('MCLPaid')
    p = cl.MunichAdjustment(paid_to_incurred={
        'paid': 'incurred'
    }).fit(
        cl.Development(sigma_interpolation='mack').fit_transform(
            cl.load_dataset('mcl'))).munich_full_triangle_[0, 0, 0, :, :]
    arr = np.array(df[0])
    assert_allclose(arr, p, atol=1e-5)
"""
====================================
Munich Chainladder Correlation Plots
====================================

This example demonstrates how to recreate the the residual correlation plots
of the Munich Chainladder paper.
"""
import chainladder as cl
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Fit Munich Model
mcl = cl.load_sample('mcl')
model = cl.MunichAdjustment([('paid', 'incurred')]).fit(mcl)

# Plot Data
fig, ((ax0, ax1)) = plt.subplots(ncols=2, figsize=(15, 5))

# Paid lambda line
pd.DataFrame({
    '(P/I)': np.linspace(-2, 2, 2),
    'P': np.linspace(-2, 2, 2) * model.lambda_.loc['paid']
}).plot(x='(P/I)', y='P', legend=False, ax=ax0)

# Paid scatter
paid_plot = pd.concat(
    (model.resids_['paid'].melt(value_name='P')['P'],
     model.q_resids_['paid'].melt(value_name='(P/I)')['(P/I)']),
    axis=1).plot(kind='scatter',
Esempio n. 8
0
def test_mcl_incurred():
    df = r('MunichChainLadder(MCLpaid, MCLincurred)').rx('MCLIncurred')
    p = cl.MunichAdjustment(paid_to_incurred=[('paid','incurred')]).fit(cl.Development(sigma_interpolation='mack').fit_transform(cl.load_sample('mcl')))
    xp = p.ldf_.get_array_module()
    arr = xp.array(df[0])
    assert xp.allclose(arr, p.munich_full_triangle_[1,0,0,:,:], atol=1e-5)
Esempio n. 9
0
def test_json_df():
    x = cl.MunichAdjustment(paid_to_incurred=('paid',
                                              'incurred')).fit_transform(
                                                  cl.load_sample('mcl'))
    assert abs(cl.read_json(x.to_json()).lambda_ - x.lambda_).sum() < 1e-5
            sample_weight=medmal_prem,
        ).ibnr_.sum())


@pytest.fixture
def tri(clrd):
    tri = clrd.groupby('LOB').sum()[[
        'CumPaidLoss', 'IncurLoss', 'EarnedPremDIR'
    ]]
    tri['CaseIncurredLoss'] = tri['IncurLoss'] - tri['CumPaidLoss']
    return tri


dev = [
    cl.Development, cl.ClarkLDF, cl.Trend, cl.IncrementalAdditive,
    lambda: cl.MunichAdjustment(paid_to_incurred=(
        'CumPaidLoss', 'CaseIncurredLoss')), lambda: cl.CaseOutstanding(
            paid_to_incurred=('CumPaidLoss', 'CaseIncurredLoss'))
]
tail = [cl.TailCurve, cl.TailConstant, cl.TailBondy, cl.TailClark]
ibnr = [
    cl.Chainladder, cl.BornhuetterFerguson, lambda: cl.Benktander(n_iters=2),
    cl.CapeCod
]


@pytest.mark.parametrize('dev', dev)
@pytest.mark.parametrize('tail', tail)
@pytest.mark.parametrize('ibnr', ibnr)
def test_pipeline(tri, dev, tail, ibnr):
    X = tri[['CumPaidLoss', 'CaseIncurredLoss']]
    sample_weight = tri['EarnedPremDIR'].latest_diagonal
Esempio n. 11
0
import chainladder as cl
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('whitegrid')
sns.set_palette('muted')

# Load data
mcl = cl.load_dataset('mcl')
# Volume weighted (default) LDFs
dev = cl.Development().fit_transform(mcl)
# Traditional Chainladder
cl_traditional = cl.Chainladder().fit(dev)
# Munich Adjustment
dev_munich = cl.MunichAdjustment(paid_to_incurred={
    'paid': 'incurred'
}).fit_transform(dev)
cl_munich = cl.Chainladder().fit(dev_munich)

# Plot data
fig, (ax, ax2) = plt.subplots(ncols=2, sharex=True, figsize=(10, 5))
plot1_data = cl_munich.ultimate_['paid'].to_frame()
plot1_data.columns = ['Paid Ultimate']
plot1_data['Incurred Ultimate'] = cl_munich.ultimate_['incurred'].to_frame()
plot2_data = (cl_munich.ultimate_['paid'] /
              cl_munich.ultimate_['incurred']).to_frame()
plot2_data.columns = ['Munich']
plot2_data['Traditional'] = (cl_traditional.ultimate_['paid'] /
                             cl_traditional.ultimate_['incurred']).to_frame()
plot1_data.plot(kind='bar', ax=ax)
ax.set_ylabel('Ultimate')