Пример #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_
Пример #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()
Пример #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_
Пример #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)
Пример #5
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'))).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)
Пример #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',
Пример #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)
Пример #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
Пример #10
0
            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
Пример #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')