diff --git a/docs/friedland/chapter_13.ipynb b/docs/friedland/chapter_13.ipynb new file mode 100644 index 00000000..f5179a8e --- /dev/null +++ b/docs/friedland/chapter_13.ipynb @@ -0,0 +1,9559 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 13 - Berquist-Sherman Techniques\n" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "4f167abb", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import chainladder as cl\n", + "import matplotlib.pyplot as plt\n", + "from IPython.display import display\n" + ] + }, + { + "cell_type": "markdown", + "id": "14d81d85", + "metadata": {}, + "source": [ + "## P294 (Exhibit I Sheet 1)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "6e3881d3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19692897000.05160000.010714000.015228000.016611000.020899000.022892000.023506000.0
19704828000.010707000.016907000.022840000.026211000.031970000.032216000.0NaN
19715455000.011941000.020733000.030928000.042395000.048377000.0NaNNaN
19728732000.018633000.032143000.057196000.061163000.0NaNNaNNaN
197311228000.019967000.050143000.073733000.0NaNNaNNaNNaN
19748706000.033459000.063477000.0NaNNaNNaNNaNNaN
197512928000.048904000.0NaNNaNNaNNaNNaNNaN
197615791000.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 \\\n", + "1969 2897000.0 5160000.0 10714000.0 15228000.0 16611000.0 20899000.0 \n", + "1970 4828000.0 10707000.0 16907000.0 22840000.0 26211000.0 31970000.0 \n", + "1971 5455000.0 11941000.0 20733000.0 30928000.0 42395000.0 48377000.0 \n", + "1972 8732000.0 18633000.0 32143000.0 57196000.0 61163000.0 NaN \n", + "1973 11228000.0 19967000.0 50143000.0 73733000.0 NaN NaN \n", + "1974 8706000.0 33459000.0 63477000.0 NaN NaN NaN \n", + "1975 12928000.0 48904000.0 NaN NaN NaN NaN \n", + "1976 15791000.0 NaN NaN NaN NaN NaN \n", + "\n", + " 84 96 \n", + "1969 22892000.0 23506000.0 \n", + "1970 32216000.0 NaN \n", + "1971 NaN NaN \n", + "1972 NaN NaN \n", + "1973 NaN NaN \n", + "1974 NaN NaN \n", + "1975 NaN NaN \n", + "1976 NaN NaN " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
19691.7812.0761.4211.0911.2581.0951.027
19702.2181.5791.3511.1481.2201.008NaN
19712.1891.7361.4921.3711.141NaNNaN
19722.1341.7251.7791.069NaNNaNNaN
19731.7782.5111.470NaNNaNNaNNaN
19743.8431.897NaNNaNNaNNaNNaN
19753.783NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "1969 1.781 2.076 1.421 1.091 1.258 1.095 1.027\n", + "1970 2.218 1.579 1.351 1.148 1.220 1.008 NaN\n", + "1971 2.189 1.736 1.492 1.371 1.141 NaN NaN\n", + "1972 2.134 1.725 1.779 1.069 NaN NaN NaN\n", + "1973 1.778 2.511 1.470 NaN NaN NaN NaN\n", + "1974 3.843 1.897 NaN NaN NaN NaN NaN\n", + "1975 3.783 NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
(All)2.5321.9211.5031.171.2061.0521.027
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "(All) 2.532 1.921 1.503 1.17 1.206 1.052 1.027" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-9696-108
Selected2.5321.9211.5031.1701.2061.0521.0271.0
CDF to Ultimate11.1454.4022.2911.5241.3031.0801.0271.0
Percent Reported0.0900.2270.4360.6560.7670.9260.9741.0
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108\n", + "Selected 2.532 1.921 1.503 1.170 1.206 1.052 1.027 1.0\n", + "CDF to Ultimate 11.145 4.402 2.291 1.524 1.303 1.080 1.027 1.0\n", + "Percent Reported 0.090 0.227 0.436 0.656 0.767 0.926 0.974 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mm = cl.load_sample(\"friedland_med_mal\")\n", + "reported = mm[\"Reported Claims\"]\n", + "\n", + "# Part 1\n", + "exhibit_i_s1_tri = reported.to_frame(origin_as_datetime=False)\n", + "display(exhibit_i_s1_tri)\n", + "\n", + "# Part 2 \n", + "display(np.round(reported.link_ratio.to_frame(origin_as_datetime=False), 3))\n", + "\n", + "# Part 3\n", + "dev_reported = cl.Development(average=\"simple\").fit(reported)\n", + "display(np.round(dev_reported.ldf_.to_frame(), 3))\n", + "\n", + "# Part 4\n", + "selected_ldf = {\n", + " 12: 2.532,\n", + " 24: 1.921,\n", + " 36: 1.503,\n", + " 48: 1.170,\n", + " 60: 1.206,\n", + " 72: 1.052,\n", + " 84: 1.027,\n", + " 96: 1.000,\n", + "}\n", + "# or this\n", + "avg_ldf = np.round(dev_reported.ldf_.to_frame().values.flatten(), 3)\n", + "selected_ldf = dict(zip([12, 24, 36, 48, 60, 72, 84, 96], [*avg_ldf, 1.000]))\n", + "\n", + "reported_dev = cl.DevelopmentConstant(patterns=selected_ldf, style=\"ldf\").fit(reported)\n", + "cdf = np.round(reported_dev.cdf_.to_frame().values.flatten(), 3) # it's unclear why the text shows different CDFs here, not reconciling using rounded nor unroudned values\n", + "pct_reported = np.round(1.0 / cdf, 3)\n", + "\n", + "exhibit_i_s1_sel = pd.DataFrame(\n", + " {\n", + " \"Selected\": list(selected_ldf.values()),\n", + " \"CDF to Ultimate\": cdf,\n", + " \"Percent Reported\": pct_reported,\n", + " },\n", + " index=[\"12-24\", \"24-36\", \"36-48\", \"48-60\", \"60-72\", \"72-84\", \"84-96\", \"96-108\"],\n", + ")\n", + "display(exhibit_i_s1_sel.T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "8fa7d637", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 1 — reconcile to Friedland PDF p294\n", + "exhibit_i_s1_ata = np.round(reported.link_ratio.to_frame(origin_as_datetime=False), 3)\n", + "assert np.allclose(\n", + " exhibit_i_s1_ata,\n", + " [\n", + " [1.781, 2.076, 1.421, 1.091, 1.258, 1.095, 1.027],\n", + " [2.218, 1.579, 1.351, 1.148, 1.220, 1.008, np.nan],\n", + " [2.189, 1.736, 1.492, 1.371, 1.141, np.nan, np.nan],\n", + " [2.134, 1.725, 1.779, 1.069, np.nan, np.nan, np.nan],\n", + " [1.778, 2.511, 1.470, np.nan, np.nan, np.nan, np.nan],\n", + " [3.843, 1.897, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [3.783, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n", + "assert np.allclose(\n", + " np.round(dev_reported.ldf_.to_frame().values.flatten(), 3),\n", + " [2.532, 1.921, 1.503, 1.170, 1.206, 1.052, 1.027],\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s1_sel[\"CDF to Ultimate\"],\n", + " [11.145, 4.402, 2.291, 1.524, 1.303, 1.080, 1.027, 1.000],\n", + " atol=0.01,\n", + ")\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "1dfc56ba", + "metadata": {}, + "source": [ + "## P295 (Exhibit I Sheet 2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "afa3b53e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
1969125000.0406000.01443000.02986000.04467000.08179000.012638000.015815000.0
197043000.0529000.02016000.03641000.07523000.014295000.018983000.0NaN
1971295000.01147000.02479000.05071000.011399000.017707000.0NaNNaN
197250000.0786000.03810000.09771000.018518000.0NaNNaNNaN
1973213000.0833000.03599000.011292000.0NaNNaNNaNNaN
1974172000.01587000.06267000.0NaNNaNNaNNaNNaN
1975210000.01565000.0NaNNaNNaNNaNNaNNaN
1976209000.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 \\\n", + "1969 125000.0 406000.0 1443000.0 2986000.0 4467000.0 8179000.0 \n", + "1970 43000.0 529000.0 2016000.0 3641000.0 7523000.0 14295000.0 \n", + "1971 295000.0 1147000.0 2479000.0 5071000.0 11399000.0 17707000.0 \n", + "1972 50000.0 786000.0 3810000.0 9771000.0 18518000.0 NaN \n", + "1973 213000.0 833000.0 3599000.0 11292000.0 NaN NaN \n", + "1974 172000.0 1587000.0 6267000.0 NaN NaN NaN \n", + "1975 210000.0 1565000.0 NaN NaN NaN NaN \n", + "1976 209000.0 NaN NaN NaN NaN NaN \n", + "\n", + " 84 96 \n", + "1969 12638000.0 15815000.0 \n", + "1970 18983000.0 NaN \n", + "1971 NaN NaN \n", + "1972 NaN NaN \n", + "1973 NaN NaN \n", + "1974 NaN NaN \n", + "1975 NaN NaN \n", + "1976 NaN NaN " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
19693.2483.5542.0691.4961.8311.5451.251
197012.3023.8111.8062.0661.9001.328NaN
19713.8882.1612.0462.2481.553NaNNaN
197215.7204.8472.5651.895NaNNaNNaN
19733.9114.3213.138NaNNaNNaNNaN
19749.2273.949NaNNaNNaNNaNNaN
19757.452NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "1969 3.248 3.554 2.069 1.496 1.831 1.545 1.251\n", + "1970 12.302 3.811 1.806 2.066 1.900 1.328 NaN\n", + "1971 3.888 2.161 2.046 2.248 1.553 NaN NaN\n", + "1972 15.720 4.847 2.565 1.895 NaN NaN NaN\n", + "1973 3.911 4.321 3.138 NaN NaN NaN NaN\n", + "1974 9.227 3.949 NaN NaN NaN NaN NaN\n", + "1975 7.452 NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
(All)6.1853.7092.4551.9521.7181.4071.251
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "(All) 6.185 3.709 2.455 1.952 1.718 1.407 1.251" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-9696-108
Selected6.1853.7092.4551.9521.7181.4071.2511.486
CDF to Ultimate493.99379.87021.5348.7714.4942.6161.8591.486
Percent Paid0.0020.0130.0460.1140.2230.3820.5380.673
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108\n", + "Selected 6.185 3.709 2.455 1.952 1.718 1.407 1.251 1.486\n", + "CDF to Ultimate 493.993 79.870 21.534 8.771 4.494 2.616 1.859 1.486\n", + "Percent Paid 0.002 0.013 0.046 0.114 0.223 0.382 0.538 0.673" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "paid = mm[\"Paid Claims\"]\n", + "\n", + "# Part 1\n", + "exhibit_i_s2_tri = paid.to_frame(origin_as_datetime=False)\n", + "display(exhibit_i_s2_tri)\n", + "\n", + "# Part 2\n", + "display(np.round(paid.link_ratio.to_frame(origin_as_datetime=False), decimals=3))\n", + "\n", + "# Part 3\n", + "dev_paid = cl.Development(average=\"volume\").fit(paid)\n", + "avg_ldf = np.round(dev_paid.ldf_.to_frame(origin_as_datetime=False).values.flatten(), 3)\n", + "display(np.round(dev_paid.ldf_.to_frame(), 3))\n", + "\n", + "# Part 4\n", + "selected_ldf = {\n", + " 12: 6.185,\n", + " 24: 3.709,\n", + " 36: 2.455,\n", + " 48: 1.952,\n", + " 60: 1.718,\n", + " 72: 1.407,\n", + " 84: 1.251,\n", + " 96: 1.486,\n", + "}\n", + "# or this\n", + "selected_ldf = dict(zip([12, 24, 36, 48, 60, 72, 84, 96], [*avg_ldf, 1.486]))\n", + "\n", + "paid_dev = cl.DevelopmentConstant(patterns=selected_ldf, style=\"ldf\").fit(paid)\n", + "cdf = np.round(paid_dev.cdf_.to_frame(origin_as_datetime=False).values.flatten(), 3)\n", + "pct_paid = np.round(1.0 / cdf, 3)\n", + "\n", + "exhibit_i_s2_sel = pd.DataFrame(\n", + " {\n", + " \"Selected\": list(selected_ldf.values()),\n", + " \"CDF to Ultimate\": cdf,\n", + " \"Percent Paid\": pct_paid,\n", + " },\n", + " index=[\"12-24\", \"24-36\", \"36-48\", \"48-60\", \"60-72\", \"72-84\", \"84-96\", \"96-108\"],\n", + ")\n", + "display(exhibit_i_s2_sel.T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "7b39a8cb", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 2 — reconcile to Friedland PDF p295\n", + "assert np.allclose(\n", + " np.round(dev_paid.ldf_.to_frame().values.flatten(), 3),\n", + " [6.185, 3.709, 2.455, 1.952, 1.718, 1.407, 1.251],\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s2_sel[\"CDF to Ultimate\"],\n", + " [494.097, 79.886, 21.538, 8.773, 4.495, 2.616, 1.859, 1.486],\n", + " atol=0.12,\n", + ")\n", + "assert np.isclose(exhibit_i_s2_tri.iloc[0, 0], 125000, atol=1)\n", + "assert np.isclose(exhibit_i_s2_tri.iloc[-1, 0], 209000, atol=1)\n" + ] + }, + { + "cell_type": "markdown", + "id": "5854053a", + "metadata": {}, + "source": [ + "## P296 (Exhibit I Sheet 3)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "945ba5a7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Age (2)Reported (3)Paid (4)CDF Reported (5)CDF Paid (6)Ult Reported (7)Ult Paid (8)
origin
19699623506000.015815000.01.0001.48623506000.023501090.0
19708432216000.018983000.01.0271.85933085832.035289397.0
19717248377000.017707000.01.0802.61652247160.046321512.0
19726061163000.018518000.01.3034.49479695389.083219892.0
19734873733000.011292000.01.5248.771112369092.099042132.0
19743663477000.06267000.02.29121.534145425807.0134953578.0
19752448904000.01565000.04.40279.870215275408.0124996550.0
19761215791000.0209000.011.145493.993175990695.0103244537.0
\n", + "
" + ], + "text/plain": [ + " Age (2) Reported (3) Paid (4) CDF Reported (5) CDF Paid (6) \\\n", + "origin \n", + "1969 96 23506000.0 15815000.0 1.000 1.486 \n", + "1970 84 32216000.0 18983000.0 1.027 1.859 \n", + "1971 72 48377000.0 17707000.0 1.080 2.616 \n", + "1972 60 61163000.0 18518000.0 1.303 4.494 \n", + "1973 48 73733000.0 11292000.0 1.524 8.771 \n", + "1974 36 63477000.0 6267000.0 2.291 21.534 \n", + "1975 24 48904000.0 1565000.0 4.402 79.870 \n", + "1976 12 15791000.0 209000.0 11.145 493.993 \n", + "\n", + " Ult Reported (7) Ult Paid (8) \n", + "origin \n", + "1969 23506000.0 23501090.0 \n", + "1970 33085832.0 35289397.0 \n", + "1971 52247160.0 46321512.0 \n", + "1972 79695389.0 83219892.0 \n", + "1973 112369092.0 99042132.0 \n", + "1974 145425807.0 134953578.0 \n", + "1975 215275408.0 124996550.0 \n", + "1976 175990695.0 103244537.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Reported (3)Paid (4)Ult Reported (7)Ult Paid (8)
Total367167000.090356000.0837595383.0650568688.0
\n", + "
" + ], + "text/plain": [ + " Reported (3) Paid (4) Ult Reported (7) Ult Paid (8)\n", + "Total 367167000.0 90356000.0 837595383.0 650568688.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cl_reported = cl.Chainladder().fit(\n", + " cl.DevelopmentConstant(\n", + " patterns=dict(zip(reported.development, exhibit_i_s1_sel[\"CDF to Ultimate\"])),\n", + " style=\"cdf\",\n", + " ).fit_transform(reported)\n", + ")\n", + "cl_paid = cl.Chainladder().fit(\n", + " cl.DevelopmentConstant(\n", + " patterns=dict(zip(paid.development, exhibit_i_s2_sel[\"CDF to Ultimate\"])),\n", + " style=\"cdf\",\n", + " ).fit_transform(paid)\n", + ")\n", + "\n", + "md_reported = cl.model_diagnostics(cl_reported).to_frame(origin_as_datetime=False).T\n", + "md_paid = cl.model_diagnostics(cl_paid).to_frame(origin_as_datetime=False).T\n", + "\n", + "ages = sorted(reported.development, reverse=True)\n", + "reported_latest = md_reported[\"Latest\"]\n", + "paid_latest = md_paid[\"Latest\"]\n", + "ult_reported = md_reported[\"Ultimate\"]\n", + "ult_paid = md_paid[\"Ultimate\"]\n", + "\n", + "exhibit_i_s3 = pd.DataFrame(\n", + " {\n", + " \"Age (2)\": ages,\n", + " \"Reported (3)\": md_reported[\"Latest\"].values,\n", + " \"Paid (4)\": md_paid[\"Latest\"].values,\n", + " \"CDF Reported (5)\": md_reported[\"CDF\"].values,\n", + " \"CDF Paid (6)\": md_paid[\"CDF\"].values,\n", + " \"Ult Reported (7)\": md_reported[\"Ultimate\"].values,\n", + " \"Ult Paid (8)\": md_paid[\"Ultimate\"].values,\n", + " },\n", + " index=md_reported.index,\n", + ")\n", + "display(exhibit_i_s3)\n", + "display(exhibit_i_s3[[\"Reported (3)\", \"Paid (4)\", \"Ult Reported (7)\", \"Ult Paid (8)\"]].sum().to_frame(\"Total\").T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "b3fe7af5", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 3 — reconcile to Friedland PDF p296\n", + "assert np.allclose(\n", + " exhibit_i_s3[\"Ult Reported (7)\"],\n", + " [23506000, 33085832, 52247160, 79695389, 112369092, 145425807, 215275408, 175990695],\n", + " atol=5,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s3[\"Ult Paid (8)\"],\n", + " [23501090, 35289397, 46321512, 83238410, 99064716, 134978646, 125021590, 103266273],\n", + " rtol=0.0003,\n", + ")\n", + "assert np.isclose(exhibit_i_s3[\"Reported (3)\"].sum(), 367167000, atol=1)\n", + "assert np.isclose(exhibit_i_s3[\"Paid (4)\"].sum(), 90356000, atol=1)\n", + "assert np.isclose(exhibit_i_s3[\"Ult Reported (7)\"].sum(), 837595383, atol=50)\n", + "assert np.isclose(exhibit_i_s3[\"Ult Paid (8)\"].sum(), 650681634, rtol=0.0003)\n" + ] + }, + { + "cell_type": "markdown", + "id": "4f3ebe1e", + "metadata": {}, + "source": [ + "## P297 (Exhibit I Sheet 4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "5029fbc5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19692772000.04754000.09271000.012242000.012144000.012720000.010254000.07691000.0
19704785000.010178000.014891000.019199000.018688000.017675000.013233000.0NaN
19715160000.010794000.018254000.025857000.030996000.030670000.0NaNNaN
19728682000.017847000.028333000.047425000.042645000.0NaNNaNNaN
197311015000.019134000.046544000.062441000.0NaNNaNNaNNaN
19748534000.031872000.057210000.0NaNNaNNaNNaNNaN
197512718000.047339000.0NaNNaNNaNNaNNaNNaN
197615582000.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 \\\n", + "1969 2772000.0 4754000.0 9271000.0 12242000.0 12144000.0 12720000.0 \n", + "1970 4785000.0 10178000.0 14891000.0 19199000.0 18688000.0 17675000.0 \n", + "1971 5160000.0 10794000.0 18254000.0 25857000.0 30996000.0 30670000.0 \n", + "1972 8682000.0 17847000.0 28333000.0 47425000.0 42645000.0 NaN \n", + "1973 11015000.0 19134000.0 46544000.0 62441000.0 NaN NaN \n", + "1974 8534000.0 31872000.0 57210000.0 NaN NaN NaN \n", + "1975 12718000.0 47339000.0 NaN NaN NaN NaN \n", + "1976 15582000.0 NaN NaN NaN NaN NaN \n", + "\n", + " 84 96 \n", + "1969 10254000.0 7691000.0 \n", + "1970 13233000.0 NaN \n", + "1971 NaN NaN \n", + "1972 NaN NaN \n", + "1973 NaN NaN \n", + "1974 NaN NaN \n", + "1975 NaN NaN \n", + "1976 NaN NaN " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
1969749.0840.01001.01206.01034.0765.0533.0359.0
1970660.0957.01149.01350.01095.0755.0539.0NaN
1971878.01329.01720.01799.01428.01056.0NaNNaN
19721043.01561.01828.01894.01522.0NaNNaNNaN
19731088.01388.01540.01877.0NaNNaNNaNNaN
19741033.01418.01663.0NaNNaNNaNNaNNaN
19751138.01472.0NaNNaNNaNNaNNaNNaN
19761196.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 749.0 840.0 1001.0 1206.0 1034.0 765.0 533.0 359.0\n", + "1970 660.0 957.0 1149.0 1350.0 1095.0 755.0 539.0 NaN\n", + "1971 878.0 1329.0 1720.0 1799.0 1428.0 1056.0 NaN NaN\n", + "1972 1043.0 1561.0 1828.0 1894.0 1522.0 NaN NaN NaN\n", + "1973 1088.0 1388.0 1540.0 1877.0 NaN NaN NaN NaN\n", + "1974 1033.0 1418.0 1663.0 NaN NaN NaN NaN NaN\n", + "1975 1138.0 1472.0 NaN NaN NaN NaN NaN NaN\n", + "1976 1196.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19693701.05660.09262.010151.011745.016627.019238.021423.0
19707250.010635.012960.014221.017067.023411.024551.0NaN
19715877.08122.010613.014373.021706.029044.0NaNNaN
19728324.011433.015499.025040.028019.0NaNNaNNaN
197310124.013785.030223.033266.0NaNNaNNaNNaN
19748261.022477.034402.0NaNNaNNaNNaNNaN
197511176.032160.0NaNNaNNaNNaNNaNNaN
197613028.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 3701.0 5660.0 9262.0 10151.0 11745.0 16627.0 19238.0 21423.0\n", + "1970 7250.0 10635.0 12960.0 14221.0 17067.0 23411.0 24551.0 NaN\n", + "1971 5877.0 8122.0 10613.0 14373.0 21706.0 29044.0 NaN NaN\n", + "1972 8324.0 11433.0 15499.0 25040.0 28019.0 NaN NaN NaN\n", + "1973 10124.0 13785.0 30223.0 33266.0 NaN NaN NaN NaN\n", + "1974 8261.0 22477.0 34402.0 NaN NaN NaN NaN NaN\n", + "1975 11176.0 32160.0 NaN NaN NaN NaN NaN NaN\n", + "1976 13028.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
development12243648607284
Annual Change0.1560.2950.3110.3420.3300.3220.276
R-Squared0.8000.8950.8580.9410.9890.9831.000
\n", + "
" + ], + "text/plain": [ + "development 12 24 36 48 60 72 84\n", + "Annual Change 0.156 0.295 0.311 0.342 0.330 0.322 0.276\n", + "R-Squared 0.800 0.895 0.858 0.941 0.989 0.983 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "case = mm[\"Case Outstanding\"]\n", + "open_counts = mm[\"Open Claim Counts\"]\n", + "\n", + "exhibit_i_s4_case = case.to_frame(origin_as_datetime=False)\n", + "display(exhibit_i_s4_case)\n", + "\n", + "exhibit_i_s4_open = open_counts.to_frame(origin_as_datetime=False)\n", + "display(exhibit_i_s4_open)\n", + "\n", + "avg_case = case / open_counts\n", + "exhibit_i_s4_avg = np.round(avg_case.to_frame(origin_as_datetime=False))\n", + "display(exhibit_i_s4_avg)\n", + "\n", + "def exp_trend(tri):\n", + " fit_tri = tri[tri.development < tri.development.max()]\n", + " reg = cl.WeightedRegression(\n", + " axis=2, thru_orig=False, xp=fit_tri.get_array_module()\n", + " ).fit(\n", + " np.ones(fit_tri.shape) * fit_tri.origin.year.values[None, None, :, None],\n", + " np.log(fit_tri.values),\n", + " cl.TriangleWeight().fit(fit_tri).w_.values,\n", + " )\n", + " return np.round(\n", + " pd.DataFrame(\n", + " [np.exp(reg.slope_).flatten() - 1, reg.rsq_.flatten()],\n", + " index=[\"Annual Change\", \"R-Squared\"],\n", + " columns=fit_tri.development,\n", + " ),\n", + " 3,\n", + " )\n", + "\n", + "\n", + "exhibit_i_s4_trend = exp_trend(avg_case)\n", + "display(exhibit_i_s4_trend)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "7f90df09", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 4 — reconcile to Friedland PDF p297\n", + "assert np.allclose(\n", + " exhibit_i_s4_trend.loc[\"Annual Change\"],\n", + " [0.156, 0.295, 0.311, 0.342, 0.330, 0.322, 0.276],\n", + " atol=0.002,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s4_trend.loc[\"R-Squared\"],\n", + " [0.800, 0.895, 0.858, 0.941, 0.989, 0.983, 1.000],\n", + " atol=0.002,\n", + ")\n", + "assert np.isclose(exhibit_i_s4_avg.iloc[0, 0], 3701, atol=1)\n", + "assert np.isclose(exhibit_i_s4_avg.iloc[-1, 0], 13028, atol=1)\n" + ] + }, + { + "cell_type": "markdown", + "id": "8963e40d", + "metadata": {}, + "source": [ + "## P298 (Exhibit I Sheet 5)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "35f65eed", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
1969125000.0406000.01443000.02986000.04467000.08179000.012638000.015815000.0
197043000.0529000.02016000.03641000.07523000.014295000.018983000.0NaN
1971295000.01147000.02479000.05071000.011399000.017707000.0NaNNaN
197250000.0786000.03810000.09771000.018518000.0NaNNaNNaN
1973213000.0833000.03599000.011292000.0NaNNaNNaNNaN
1974172000.01587000.06267000.0NaNNaNNaNNaNNaN
1975210000.01565000.0NaNNaNNaNNaNNaNNaN
1976209000.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 \\\n", + "1969 125000.0 406000.0 1443000.0 2986000.0 4467000.0 8179000.0 \n", + "1970 43000.0 529000.0 2016000.0 3641000.0 7523000.0 14295000.0 \n", + "1971 295000.0 1147000.0 2479000.0 5071000.0 11399000.0 17707000.0 \n", + "1972 50000.0 786000.0 3810000.0 9771000.0 18518000.0 NaN \n", + "1973 213000.0 833000.0 3599000.0 11292000.0 NaN NaN \n", + "1974 172000.0 1587000.0 6267000.0 NaN NaN NaN \n", + "1975 210000.0 1565000.0 NaN NaN NaN NaN \n", + "1976 209000.0 NaN NaN NaN NaN NaN \n", + "\n", + " 84 96 \n", + "1969 12638000.0 15815000.0 \n", + "1970 18983000.0 NaN \n", + "1971 NaN NaN \n", + "1972 NaN NaN \n", + "1973 NaN NaN \n", + "1974 NaN NaN \n", + "1975 NaN NaN \n", + "1976 NaN NaN " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19690.0430.0790.1350.1960.2690.3910.5520.673
19700.0090.0490.1190.1590.2870.4470.589NaN
19710.0540.0960.1200.1640.2690.366NaNNaN
19720.0060.0420.1190.1710.303NaNNaNNaN
19730.0190.0420.0720.153NaNNaNNaNNaN
19740.0200.0470.099NaNNaNNaNNaNNaN
19750.0160.032NaNNaNNaNNaNNaNNaN
19760.013NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 0.043 0.079 0.135 0.196 0.269 0.391 0.552 0.673\n", + "1970 0.009 0.049 0.119 0.159 0.287 0.447 0.589 NaN\n", + "1971 0.054 0.096 0.120 0.164 0.269 0.366 NaN NaN\n", + "1972 0.006 0.042 0.119 0.171 0.303 NaN NaN NaN\n", + "1973 0.019 0.042 0.072 0.153 NaN NaN NaN NaN\n", + "1974 0.020 0.047 0.099 NaN NaN NaN NaN NaN\n", + "1975 0.016 0.032 NaN NaN NaN NaN NaN NaN\n", + "1976 0.013 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
1969402.0539.02971.08620.09199.012669.017084.016634.0
1970110.0919.05487.09129.012403.018452.019533.0NaN
1971706.01115.05644.04928.012994.014948.0NaNNaN
1972161.0862.05782.09477.014085.0NaNNaNNaN
1973724.0541.04003.011709.0NaNNaNNaNNaN
1974518.01394.07635.0NaNNaNNaNNaNNaN
1975517.01494.0NaNNaNNaNNaNNaNNaN
1976525.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 402.0 539.0 2971.0 8620.0 9199.0 12669.0 17084.0 16634.0\n", + "1970 110.0 919.0 5487.0 9129.0 12403.0 18452.0 19533.0 NaN\n", + "1971 706.0 1115.0 5644.0 4928.0 12994.0 14948.0 NaN NaN\n", + "1972 161.0 862.0 5782.0 9477.0 14085.0 NaN NaN NaN\n", + "1973 724.0 541.0 4003.0 11709.0 NaN NaN NaN NaN\n", + "1974 518.0 1394.0 7635.0 NaN NaN NaN NaN NaN\n", + "1975 517.0 1494.0 NaN NaN NaN NaN NaN NaN\n", + "1976 525.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/kennethhsu/Documents/GitHub/chainladder-python/chainladder/core/triangle.py:581: UserWarning: \n", + " The cumulative property of your triangle is not set. This may result in\n", + " undesirable behavior. In a future release this will result in an error.\n", + " \n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
development12243648607284
Annual Change0.1290.1200.1150.0670.1420.0860.143
R-Squared0.1830.3530.3790.1010.8460.1931.000
\n", + "
" + ], + "text/plain": [ + "development 12 24 36 48 60 72 84\n", + "Annual Change 0.129 0.120 0.115 0.067 0.142 0.086 0.143\n", + "R-Squared 0.183 0.353 0.379 0.101 0.846 0.193 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "exhibit_i_s5_paid = paid.to_frame(origin_as_datetime=False)\n", + "display(exhibit_i_s5_paid)\n", + "\n", + "exhibit_i_s5_ratio = np.round((paid / reported).to_frame(origin_as_datetime=False), 3)\n", + "display(exhibit_i_s5_ratio)\n", + "\n", + "# I don't know where this is from, but I did find these same numbers from another text: \n", + "# Loss Reserve Adequacy Testing: A Comprehensive Systematic Approach\n", + "# https://www.casact.org/abstract/loss-reserve-adequacy-testing-comprehensive-systematic-approach\n", + "# These values are not used anywhere else, besides calcuating the trend below on this same sheet\n", + "exhibit_i_s5_avg = pd.DataFrame(\n", + " [\n", + " [402, 539, 2971, 8620, 9199, 12669, 17084, 16634],\n", + " [110, 919, 5487, 9129, 12403, 18452, 19533, np.nan],\n", + " [706, 1115, 5644, 4928, 12994, 14948, np.nan, np.nan],\n", + " [161, 862, 5782, 9477, 14085, np.nan, np.nan, np.nan],\n", + " [724, 541, 4003, 11709, np.nan, np.nan, np.nan, np.nan],\n", + " [518, 1394, 7635, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [517, 1494, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [525, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " index=range(1969, 1977),\n", + " columns=[12, 24, 36, 48, 60, 72, 84, 96],\n", + " dtype=float,\n", + ")\n", + "display(exhibit_i_s5_avg)\n", + "\n", + "exhibit_i_s5_avg_tri = cl.Triangle(\n", + " exhibit_i_s5_avg.stack(future_stack=True).dropna().rename(\"values\").reset_index(),\n", + " origin=\"level_0\",\n", + " development=\"level_1\",\n", + " columns=\"values\",\n", + ")\n", + "exhibit_i_s5_trend = exp_trend(exhibit_i_s5_avg_tri)\n", + "display(exhibit_i_s5_trend)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "99b32fcd", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 5 — reconcile to Friedland PDF p298\n", + "assert np.allclose(\n", + " exhibit_i_s5_trend.loc[\"Annual Change\"],\n", + " [0.129, 0.120, 0.115, 0.067, 0.142, 0.086, 0.143],\n", + " atol=0.002,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s5_trend.loc[\"R-Squared\"],\n", + " [0.183, 0.353, 0.379, 0.101, 0.846, 0.193, 1.000],\n", + " atol=0.002,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "cfe6f03c", + "metadata": {}, + "source": [ + "## P299 (Exhibit I Sheet 6)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "df461dcf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19694898.013904.017104.019020.018423.021961.021349.021423.0
19705633.015989.019669.021873.021186.025255.024551.0NaN
19716477.018387.022620.025154.024364.029044.0NaNNaN
19727449.021145.026013.028927.028019.0NaNNaNNaN
19738566.024317.029915.033266.0NaNNaNNaNNaN
19749851.027965.034402.0NaNNaNNaNNaNNaN
197511329.032160.0NaNNaNNaNNaNNaNNaN
197613028.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 4898.0 13904.0 17104.0 19020.0 18423.0 21961.0 21349.0 21423.0\n", + "1970 5633.0 15989.0 19669.0 21873.0 21186.0 25255.0 24551.0 NaN\n", + "1971 6477.0 18387.0 22620.0 25154.0 24364.0 29044.0 NaN NaN\n", + "1972 7449.0 21145.0 26013.0 28927.0 28019.0 NaN NaN NaN\n", + "1973 8566.0 24317.0 29915.0 33266.0 NaN NaN NaN NaN\n", + "1974 9851.0 27965.0 34402.0 NaN NaN NaN NaN NaN\n", + "1975 11329.0 32160.0 NaN NaN NaN NaN NaN NaN\n", + "1976 13028.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected Annual Severity Trend Rate 15%\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19693793504.012084942.018563821.025924316.023516364.024979245.024016864.023506000.0
19703760482.015830500.024615996.033169802.030722141.033362729.032216000.0NaN
19715982185.025583831.041384825.050323342.046191356.048377000.0NaNNaN
19727819355.033794110.051361061.064559286.061163000.0NaNNaNNaN
19739533246.034585431.049667342.073733000.0NaNNaNNaNNaN
197410348458.041241243.063477000.0NaNNaNNaNNaNNaN
197513102479.048904000.0NaNNaNNaNNaNNaNNaN
197615791000.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 \\\n", + "1969 3793504.0 12084942.0 18563821.0 25924316.0 23516364.0 24979245.0 \n", + "1970 3760482.0 15830500.0 24615996.0 33169802.0 30722141.0 33362729.0 \n", + "1971 5982185.0 25583831.0 41384825.0 50323342.0 46191356.0 48377000.0 \n", + "1972 7819355.0 33794110.0 51361061.0 64559286.0 61163000.0 NaN \n", + "1973 9533246.0 34585431.0 49667342.0 73733000.0 NaN NaN \n", + "1974 10348458.0 41241243.0 63477000.0 NaN NaN NaN \n", + "1975 13102479.0 48904000.0 NaN NaN NaN NaN \n", + "1976 15791000.0 NaN NaN NaN NaN NaN \n", + "\n", + " 84 96 \n", + "1969 24016864.0 23506000.0 \n", + "1970 32216000.0 NaN \n", + "1971 NaN NaN \n", + "1972 NaN NaN \n", + "1973 NaN NaN \n", + "1974 NaN NaN \n", + "1975 NaN NaN \n", + "1976 NaN NaN " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "med_mal = cl.load_sample(\"berqsherm\").loc[\"MedMal\"]\n", + "bs = cl.BerquistSherman(\n", + " paid_amount=\"Paid\",\n", + " incurred_amount=\"Incurred\",\n", + " reported_count=\"Reported\",\n", + " closed_count=\"Closed\",\n", + " trend=0.15,\n", + ").fit(med_mal)\n", + "\n", + "adj_reported = bs.adjusted_triangle_[\"Incurred\"]\n", + "adj_avg_case = (adj_reported - med_mal[\"Paid\"]) / (med_mal[\"Reported\"] - med_mal[\"Closed\"])\n", + "exhibit_i_s6_avg = np.round(adj_avg_case.to_frame(origin_as_datetime=False))\n", + "display(exhibit_i_s6_avg)\n", + "\n", + "print(f\"Selected Annual Severity Trend Rate {bs.trend:.0%}\")\n", + "\n", + "exhibit_i_s6_reported = np.round(adj_reported.to_frame(origin_as_datetime=False))\n", + "display(exhibit_i_s6_reported)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "884f0d40", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 6 — reconcile to Friedland PDF p299\n", + "assert np.allclose(\n", + " exhibit_i_s6_avg,\n", + " [\n", + " [4898, 13904, 17104, 19020, 18423, 21961, 21349, 21423],\n", + " [5633, 15989, 19669, 21873, 21186, 25255, 24551, np.nan],\n", + " [6477, 18387, 22620, 25154, 24364, 29044, np.nan, np.nan],\n", + " [7449, 21145, 26013, 28927, 28019, np.nan, np.nan, np.nan],\n", + " [8566, 24317, 29915, 33266, np.nan, np.nan, np.nan, np.nan],\n", + " [9851, 27965, 34402, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [11329, 32160, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [13028, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s6_reported,\n", + " [\n", + " [3793504, 12084942, 18563821, 25924316, 23516364, 24979245, 24016864, 23506000],\n", + " [3760482, 15830500, 24615996, 33169802, 30722141, 33362729, 32216000, np.nan],\n", + " [5982185, 25583831, 41384825, 50323342, 46191356, 48377000, np.nan, np.nan],\n", + " [7819355, 33794110, 51361061, 64559286, 61163000, np.nan, np.nan, np.nan],\n", + " [9533246, 34585431, 49667342, 73733000, np.nan, np.nan, np.nan, np.nan],\n", + " [10348458, 41241243, 63477000, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [13102479, 48904000, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [15791000, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "84deb2d5", + "metadata": {}, + "source": [ + "## P300 (Exhibit I Sheet 7)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "16e59d49", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19693.793504e+061.208494e+071.856382e+072.592432e+072.351636e+072.497924e+072.401686e+0723506000.0
19703.760482e+061.583050e+072.461600e+073.316980e+073.072214e+073.336273e+073.221600e+07NaN
19715.982185e+062.558383e+074.138482e+075.032334e+074.619136e+074.837700e+07NaNNaN
19727.819355e+063.379411e+075.136106e+076.455929e+076.116300e+07NaNNaNNaN
19739.533246e+063.458543e+074.966734e+077.373300e+07NaNNaNNaNNaN
19741.034846e+074.124124e+076.347700e+07NaNNaNNaNNaNNaN
19751.310248e+074.890400e+07NaNNaNNaNNaNNaNNaN
19761.579100e+07NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 \\\n", + "1969 3.793504e+06 1.208494e+07 1.856382e+07 2.592432e+07 2.351636e+07 \n", + "1970 3.760482e+06 1.583050e+07 2.461600e+07 3.316980e+07 3.072214e+07 \n", + "1971 5.982185e+06 2.558383e+07 4.138482e+07 5.032334e+07 4.619136e+07 \n", + "1972 7.819355e+06 3.379411e+07 5.136106e+07 6.455929e+07 6.116300e+07 \n", + "1973 9.533246e+06 3.458543e+07 4.966734e+07 7.373300e+07 NaN \n", + "1974 1.034846e+07 4.124124e+07 6.347700e+07 NaN NaN \n", + "1975 1.310248e+07 4.890400e+07 NaN NaN NaN \n", + "1976 1.579100e+07 NaN NaN NaN NaN \n", + "\n", + " 72 84 96 \n", + "1969 2.497924e+07 2.401686e+07 23506000.0 \n", + "1970 3.336273e+07 3.221600e+07 NaN \n", + "1971 4.837700e+07 NaN NaN \n", + "1972 NaN NaN NaN \n", + "1973 NaN NaN NaN \n", + "1974 NaN NaN NaN \n", + "1975 NaN NaN NaN \n", + "1976 NaN NaN NaN " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
19693.1861.5361.3960.9071.0620.9610.979
19704.2101.5551.3470.9261.0860.966NaN
19714.2771.6181.2160.9181.047NaNNaN
19724.3221.5201.2570.947NaNNaNNaN
19733.6281.4361.485NaNNaNNaNNaN
19743.9851.539NaNNaNNaNNaNNaN
19753.732NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "1969 3.186 1.536 1.396 0.907 1.062 0.961 0.979\n", + "1970 4.210 1.555 1.347 0.926 1.086 0.966 NaN\n", + "1971 4.277 1.618 1.216 0.918 1.047 NaN NaN\n", + "1972 4.322 1.520 1.257 0.947 NaN NaN NaN\n", + "1973 3.628 1.436 1.485 NaN NaN NaN NaN\n", + "1974 3.985 1.539 NaN NaN NaN NaN NaN\n", + "1975 3.732 NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
(All)3.9061.5341.340.9251.0650.9640.979
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "(All) 3.906 1.534 1.34 0.925 1.065 0.964 0.979" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-9696-108
Unadj Selected2.5321.9211.5031.1701.2061.0521.0271.0
Adj Selected3.9061.5341.3400.9251.0650.9640.9791.0
CDF to Ultimate7.4651.9111.2460.9301.0050.9440.9791.0
Percent Reported0.1340.5230.8031.0750.9951.0591.0211.0
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108\n", + "Unadj Selected 2.532 1.921 1.503 1.170 1.206 1.052 1.027 1.0\n", + "Adj Selected 3.906 1.534 1.340 0.925 1.065 0.964 0.979 1.0\n", + "CDF to Ultimate 7.465 1.911 1.246 0.930 1.005 0.944 0.979 1.0\n", + "Percent Reported 0.134 0.523 0.803 1.075 0.995 1.059 1.021 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Part 1: Data Triangle\n", + "exhibit_i_s7_tri = adj_reported.to_frame(origin_as_datetime=False)\n", + "display(exhibit_i_s7_tri)\n", + "\n", + "# Part 2: Age-to-age factors\n", + "display(np.round(adj_reported.link_ratio.to_frame(origin_as_datetime=False), decimals=3))\n", + "\n", + "dev_adj_reported = cl.Development(average=\"simple\").fit(adj_reported)\n", + "avg_ldf = np.round(\n", + " dev_adj_reported.ldf_.to_frame(origin_as_datetime=False).values.flatten(), 3\n", + ")\n", + "display(np.round(dev_adj_reported.ldf_.to_frame(), 3))\n", + "\n", + "selected_ldf = {\n", + " 12: 3.906,\n", + " 24: 1.534,\n", + " 36: 1.340,\n", + " 48: 0.925,\n", + " 60: 1.065,\n", + " 72: 0.964,\n", + " 84: 0.979,\n", + " 96: 1.000,\n", + "}\n", + "# or this\n", + "selected_ldf = dict(zip([12, 24, 36, 48, 60, 72, 84, 96], [*avg_ldf, 1.000]))\n", + "\n", + "# Part 4: Selected age-to-age factors\n", + "adj_reported_dev = cl.DevelopmentConstant(patterns=selected_ldf, style=\"ldf\").fit(\n", + " adj_reported\n", + ")\n", + "cdf = np.round(adj_reported_dev.cdf_.to_frame(origin_as_datetime=False).values.flatten(), 3)\n", + "pct_reported = np.round(1.0 / cdf, 3)\n", + "\n", + "exhibit_i_s7_sel = pd.DataFrame(\n", + " {\n", + " \"Unadj Selected\": list(exhibit_i_s1_sel[\"Selected\"]),\n", + " \"Adj Selected\": list(selected_ldf.values()),\n", + " \"CDF to Ultimate\": cdf,\n", + " \"Percent Reported\": pct_reported,\n", + " },\n", + " index=[\"12-24\", \"24-36\", \"36-48\", \"48-60\", \"60-72\", \"72-84\", \"84-96\", \"96-108\"],\n", + ")\n", + "display(exhibit_i_s7_sel.T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "12567b2a", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 7 — reconcile to Friedland PDF p300\n", + "assert np.allclose(\n", + " np.round(dev_adj_reported.ldf_.to_frame().values.flatten(), 3),\n", + " [3.906, 1.534, 1.340, 0.925, 1.065, 0.964, 0.979],\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s7_sel[\"CDF to Ultimate\"],\n", + " [7.465, 1.911, 1.246, 0.930, 1.005, 0.944, 0.979, 1.000],\n", + " atol=0.01,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5245a6f", + "metadata": {}, + "source": [ + "## P301 (Exhibit I Sheet 8)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "ea20b113", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Age (2)Reported (3)Paid (4)Adj Reported (5)CDF Reported (6)CDF Paid (7)CDF Adj Reported (8)Ult Reported (9)Ult Paid (10)Ult Adj Reported (11)
origin
19699623506000.015815000.023506000.01.0001.4861.00023506000.023501090.023506000.0
19708432216000.018983000.032216000.01.0271.8590.97933085832.035289397.031539464.0
19717248377000.017707000.048377000.01.0802.6160.94452247160.046321512.045667888.0
19726061163000.018518000.061163000.01.3034.4941.00579695389.083219892.061468815.0
19734873733000.011292000.073733000.01.5248.7710.930112369092.099042132.068571690.0
19743663477000.06267000.063477000.02.29121.5341.246145425807.0134953578.079092342.0
19752448904000.01565000.048904000.04.40279.8701.911215275408.0124996550.093455544.0
19761215791000.0209000.015791000.011.145493.9937.465175990695.0103244537.0117879815.0
\n", + "
" + ], + "text/plain": [ + " Age (2) Reported (3) Paid (4) Adj Reported (5) CDF Reported (6) \\\n", + "origin \n", + "1969 96 23506000.0 15815000.0 23506000.0 1.000 \n", + "1970 84 32216000.0 18983000.0 32216000.0 1.027 \n", + "1971 72 48377000.0 17707000.0 48377000.0 1.080 \n", + "1972 60 61163000.0 18518000.0 61163000.0 1.303 \n", + "1973 48 73733000.0 11292000.0 73733000.0 1.524 \n", + "1974 36 63477000.0 6267000.0 63477000.0 2.291 \n", + "1975 24 48904000.0 1565000.0 48904000.0 4.402 \n", + "1976 12 15791000.0 209000.0 15791000.0 11.145 \n", + "\n", + " CDF Paid (7) CDF Adj Reported (8) Ult Reported (9) Ult Paid (10) \\\n", + "origin \n", + "1969 1.486 1.000 23506000.0 23501090.0 \n", + "1970 1.859 0.979 33085832.0 35289397.0 \n", + "1971 2.616 0.944 52247160.0 46321512.0 \n", + "1972 4.494 1.005 79695389.0 83219892.0 \n", + "1973 8.771 0.930 112369092.0 99042132.0 \n", + "1974 21.534 1.246 145425807.0 134953578.0 \n", + "1975 79.870 1.911 215275408.0 124996550.0 \n", + "1976 493.993 7.465 175990695.0 103244537.0 \n", + "\n", + " Ult Adj Reported (11) \n", + "origin \n", + "1969 23506000.0 \n", + "1970 31539464.0 \n", + "1971 45667888.0 \n", + "1972 61468815.0 \n", + "1973 68571690.0 \n", + "1974 79092342.0 \n", + "1975 93455544.0 \n", + "1976 117879815.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Reported (3)Paid (4)Adj Reported (5)Ult Reported (9)Ult Paid (10)Ult Adj Reported (11)
Total367167000.090356000.0367167000.0837595383.0650568688.0521181558.0
\n", + "
" + ], + "text/plain": [ + " Reported (3) Paid (4) Adj Reported (5) Ult Reported (9) \\\n", + "Total 367167000.0 90356000.0 367167000.0 837595383.0 \n", + "\n", + " Ult Paid (10) Ult Adj Reported (11) \n", + "Total 650568688.0 521181558.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cl_adj_reported = cl.Chainladder().fit(\n", + " cl.DevelopmentConstant(\n", + " patterns=dict(zip(adj_reported.development, exhibit_i_s7_sel[\"CDF to Ultimate\"])),\n", + " style=\"cdf\",\n", + " ).fit_transform(adj_reported)\n", + ")\n", + "md_adj_reported = cl.model_diagnostics(cl_adj_reported).to_frame(origin_as_datetime=False).T\n", + "\n", + "exhibit_i_s8 = pd.DataFrame(\n", + " {\n", + " \"Age (2)\": ages,\n", + " \"Reported (3)\": md_reported[\"Latest\"].values,\n", + " \"Paid (4)\": md_paid[\"Latest\"].values,\n", + " \"Adj Reported (5)\": md_adj_reported[\"Latest\"].values,\n", + " \"CDF Reported (6)\": md_reported[\"CDF\"].values,\n", + " \"CDF Paid (7)\": md_paid[\"CDF\"].values,\n", + " \"CDF Adj Reported (8)\": md_adj_reported[\"CDF\"].values,\n", + " \"Ult Reported (9)\": md_reported[\"Ultimate\"].values,\n", + " \"Ult Paid (10)\": md_paid[\"Ultimate\"].values,\n", + " \"Ult Adj Reported (11)\": md_adj_reported[\"Ultimate\"].values,\n", + " },\n", + " index=md_reported.index,\n", + ")\n", + "display(exhibit_i_s8)\n", + "display(\n", + " exhibit_i_s8[\n", + " [\"Reported (3)\", \"Paid (4)\", \"Adj Reported (5)\", \"Ult Reported (9)\", \"Ult Paid (10)\", \"Ult Adj Reported (11)\"]\n", + " ]\n", + " .sum()\n", + " .to_frame(\"Total\")\n", + " .T\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "e7f8f690", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 8 — reconcile to Friedland PDF p301\n", + "assert np.allclose(\n", + " exhibit_i_s8[\"Ult Reported (9)\"],\n", + " [23506000, 33085832, 52247160, 79695389, 112369092, 145425807, 215275408, 175990695],\n", + " atol=5,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s8[\"Ult Paid (10)\"],\n", + " [23501090, 35289397, 46321512, 83238410, 99064716, 134978646, 125021590, 103266273],\n", + " rtol=0.0003,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s8[\"Ult Adj Reported (11)\"],\n", + " [23506000, 31539464, 45667888, 61468815, 68571690, 79092342, 93455544, 117879815],\n", + " atol=50,\n", + ")\n", + "assert np.isclose(exhibit_i_s8[\"Reported (3)\"].sum(), 367167000, atol=1)\n", + "assert np.isclose(exhibit_i_s8[\"Paid (4)\"].sum(), 90356000, atol=1)\n", + "assert np.isclose(exhibit_i_s8[\"Adj Reported (5)\"].sum(), 367167000, atol=1)\n", + "assert np.isclose(exhibit_i_s8[\"Ult Reported (9)\"].sum(), 837595383, atol=50)\n", + "assert np.isclose(exhibit_i_s8[\"Ult Paid (10)\"].sum(), 650681634, rtol=0.0003)\n", + "assert np.isclose(exhibit_i_s8[\"Ult Adj Reported (11)\"].sum(), 521181558, atol=50)\n" + ] + }, + { + "cell_type": "markdown", + "id": "66737c74", + "metadata": {}, + "source": [ + "## P302 (Exhibit I Sheet 9)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "14a84ae0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Reported (2)Paid (3)Ult Reported (4)Ult Paid (5)Ult Adj Reported (6)Case Outstanding (7)IBNR Reported (8)IBNR Paid (9)IBNR Adj Reported (10)Total Unpaid Reported (11)Total Unpaid Paid (12)Total Unpaid Adj Reported (13)
origin
196923506000.015815000.023506000.023501090.023506000.07691000.00.0-4910.00.07691000.07686090.07691000.0
197032216000.018983000.033085832.035289397.031539464.013233000.0869832.03073397.0-676536.014102832.016306397.012556464.0
197148377000.017707000.052247160.046321512.045667888.030670000.03870160.0-2055488.0-2709112.034540160.028614512.027960888.0
197261163000.018518000.079695389.083219892.061468815.042645000.018532389.022056892.0305815.061177389.064701892.042950815.0
197373733000.011292000.0112369092.099042132.068571690.062441000.038636092.025309132.0-5161310.0101077092.087750132.057279690.0
197463477000.06267000.0145425807.0134953578.079092342.057210000.081948807.071476578.015615342.0139158807.0128686578.072825342.0
197548904000.01565000.0215275408.0124996550.093455544.047339000.0166371408.076092550.044551544.0213710408.0123431550.091890544.0
197615791000.0209000.0175990695.0103244537.0117879815.015582000.0160199695.087453537.0102088815.0175781695.0103035537.0117670815.0
\n", + "
" + ], + "text/plain": [ + " Reported (2) Paid (3) Ult Reported (4) Ult Paid (5) \\\n", + "origin \n", + "1969 23506000.0 15815000.0 23506000.0 23501090.0 \n", + "1970 32216000.0 18983000.0 33085832.0 35289397.0 \n", + "1971 48377000.0 17707000.0 52247160.0 46321512.0 \n", + "1972 61163000.0 18518000.0 79695389.0 83219892.0 \n", + "1973 73733000.0 11292000.0 112369092.0 99042132.0 \n", + "1974 63477000.0 6267000.0 145425807.0 134953578.0 \n", + "1975 48904000.0 1565000.0 215275408.0 124996550.0 \n", + "1976 15791000.0 209000.0 175990695.0 103244537.0 \n", + "\n", + " Ult Adj Reported (6) Case Outstanding (7) IBNR Reported (8) \\\n", + "origin \n", + "1969 23506000.0 7691000.0 0.0 \n", + "1970 31539464.0 13233000.0 869832.0 \n", + "1971 45667888.0 30670000.0 3870160.0 \n", + "1972 61468815.0 42645000.0 18532389.0 \n", + "1973 68571690.0 62441000.0 38636092.0 \n", + "1974 79092342.0 57210000.0 81948807.0 \n", + "1975 93455544.0 47339000.0 166371408.0 \n", + "1976 117879815.0 15582000.0 160199695.0 \n", + "\n", + " IBNR Paid (9) IBNR Adj Reported (10) Total Unpaid Reported (11) \\\n", + "origin \n", + "1969 -4910.0 0.0 7691000.0 \n", + "1970 3073397.0 -676536.0 14102832.0 \n", + "1971 -2055488.0 -2709112.0 34540160.0 \n", + "1972 22056892.0 305815.0 61177389.0 \n", + "1973 25309132.0 -5161310.0 101077092.0 \n", + "1974 71476578.0 15615342.0 139158807.0 \n", + "1975 76092550.0 44551544.0 213710408.0 \n", + "1976 87453537.0 102088815.0 175781695.0 \n", + "\n", + " Total Unpaid Paid (12) Total Unpaid Adj Reported (13) \n", + "origin \n", + "1969 7686090.0 7691000.0 \n", + "1970 16306397.0 12556464.0 \n", + "1971 28614512.0 27960888.0 \n", + "1972 64701892.0 42950815.0 \n", + "1973 87750132.0 57279690.0 \n", + "1974 128686578.0 72825342.0 \n", + "1975 123431550.0 91890544.0 \n", + "1976 103035537.0 117670815.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Reported (2)Paid (3)Ult Reported (4)Ult Paid (5)Ult Adj Reported (6)Case Outstanding (7)IBNR Reported (8)IBNR Paid (9)IBNR Adj Reported (10)Total Unpaid Reported (11)Total Unpaid Paid (12)Total Unpaid Adj Reported (13)
Total367167000.090356000.0837595383.0650568688.0521181558.0276811000.0470428383.0283401688.0154014558.0747239383.0560212688.0430825558.0
\n", + "
" + ], + "text/plain": [ + " Reported (2) Paid (3) Ult Reported (4) Ult Paid (5) \\\n", + "Total 367167000.0 90356000.0 837595383.0 650568688.0 \n", + "\n", + " Ult Adj Reported (6) Case Outstanding (7) IBNR Reported (8) \\\n", + "Total 521181558.0 276811000.0 470428383.0 \n", + "\n", + " IBNR Paid (9) IBNR Adj Reported (10) Total Unpaid Reported (11) \\\n", + "Total 283401688.0 154014558.0 747239383.0 \n", + "\n", + " Total Unpaid Paid (12) Total Unpaid Adj Reported (13) \n", + "Total 560212688.0 430825558.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "case_latest = case.latest_diagonal.to_frame(origin_as_datetime=False).iloc[:, 0]\n", + "\n", + "exhibit_i_s9 = pd.DataFrame(\n", + " {\n", + " \"Reported (2)\": exhibit_i_s8[\"Reported (3)\"],\n", + " \"Paid (3)\": exhibit_i_s8[\"Paid (4)\"],\n", + " \"Ult Reported (4)\": exhibit_i_s8[\"Ult Reported (9)\"],\n", + " \"Ult Paid (5)\": exhibit_i_s8[\"Ult Paid (10)\"],\n", + " \"Ult Adj Reported (6)\": exhibit_i_s8[\"Ult Adj Reported (11)\"],\n", + " \"Case Outstanding (7)\": case_latest.values,\n", + " # While the next three columns are strictly about IBNRs, the `.ibnr_`` from the package actually meant unemerged\n", + " \"IBNR Reported (8)\": np.nan_to_num(\n", + " cl_reported.ibnr_.to_frame(origin_as_datetime=False).iloc[:, 0].values\n", + " ),\n", + " # See the comment above, we'll need to take out case outstanding for column 9.\n", + " \"IBNR Paid (9)\": cl_paid.ibnr_.to_frame(origin_as_datetime=False).iloc[:, 0].values - case_latest.values,\n", + " \"IBNR Adj Reported (10)\": np.nan_to_num(\n", + " cl_adj_reported.ibnr_.to_frame(origin_as_datetime=False).iloc[:, 0].values\n", + " ),\n", + " },\n", + " index=exhibit_i_s8.index,\n", + ")\n", + "exhibit_i_s9[\"Total Unpaid Reported (11)\"] = (\n", + " exhibit_i_s9[\"Case Outstanding (7)\"] + exhibit_i_s9[\"IBNR Reported (8)\"]\n", + ")\n", + "exhibit_i_s9[\"Total Unpaid Paid (12)\"] = (\n", + " exhibit_i_s9[\"Case Outstanding (7)\"] + exhibit_i_s9[\"IBNR Paid (9)\"]\n", + ")\n", + "exhibit_i_s9[\"Total Unpaid Adj Reported (13)\"] = (\n", + " exhibit_i_s9[\"Case Outstanding (7)\"] + exhibit_i_s9[\"IBNR Adj Reported (10)\"]\n", + ")\n", + "display(exhibit_i_s9)\n", + "display(exhibit_i_s9.sum().to_frame(\"Total\").T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "95899307", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 9 — reconcile to Friedland PDF p302\n", + "assert np.allclose(\n", + " exhibit_i_s9[\"Case Outstanding (7)\"],\n", + " [7691000, 13233000, 30670000, 42645000, 62441000, 57210000, 47339000, 15582000],\n", + " atol=1,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s9[\"IBNR Reported (8)\"],\n", + " [0, 869832, 3870160, 18532389, 38636092, 81948807, 166371408, 160199695],\n", + " atol=50,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s9[\"IBNR Paid (9)\"],\n", + " [-4910, 3073397, -2055488, 22075410, 25331716, 71501646, 76117590, 87475273],\n", + " atol=26000,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s9[\"IBNR Adj Reported (10)\"],\n", + " [0, -676536, -2709112, 305815, -5161310, 15615342, 44551544, 102088815],\n", + " atol=50,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s9[\"Total Unpaid Reported (11)\"],\n", + " [7691000, 14102832, 34540160, 61177389, 101077092, 139158807, 213710408, 175781695],\n", + " atol=50,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s9[\"Total Unpaid Paid (12)\"],\n", + " [7686090, 16306397, 28614512, 64720410, 87772716, 128711646, 123456590, 103057273],\n", + " atol=26000,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_i_s9[\"Total Unpaid Adj Reported (13)\"],\n", + " [7691000, 12556464, 27960888, 42950815, 57279690, 72825342, 91890544, 117670815],\n", + " atol=50,\n", + ")\n", + "assert np.isclose(exhibit_i_s9[\"Case Outstanding (7)\"].sum(), 276811000, atol=1)\n", + "assert np.isclose(exhibit_i_s9[\"IBNR Reported (8)\"].sum(), 470428383, atol=50)\n", + "assert np.isclose(exhibit_i_s9[\"IBNR Paid (9)\"].sum(), 283514634, atol=150000)\n", + "assert np.isclose(exhibit_i_s9[\"IBNR Adj Reported (10)\"].sum(), 154014558, atol=50)\n", + "assert np.isclose(exhibit_i_s9[\"Total Unpaid Reported (11)\"].sum(), 747239383, atol=50)\n", + "assert np.isclose(exhibit_i_s9[\"Total Unpaid Paid (12)\"].sum(), 560325634, atol=150000)\n", + "assert np.isclose(exhibit_i_s9[\"Total Unpaid Adj Reported (13)\"].sum(), 430825558, atol=50)\n" + ] + }, + { + "cell_type": "markdown", + "id": "3b6c7aa2", + "metadata": {}, + "source": [ + "## P303 (Exhibit I Sheet 10)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "abf85017", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ECWyTAgqTpw4IevXr5dVq1ZpsNKmTZsg/CuIiIiIiEIPtMGtIxXWDvto0aKFzsCiWrVqMnToUKlbt66P+zBaMX78eOnXr5/Url1ba+zOnTtXbt68aRvZOHXqlA7XTJ8+XZc6L126tPz000+yYMECfRwREREREdkrU6aMtqtNyBz68OGDduqXL19ewly52UuXLsnt27c1/ckUL148DSB27doln332mf6P9KfChQvbHoPHR4wYUUc4nAUs8ObNG72Ynj17Fsh/DRERERFRyIAAApO39+/fL2/fvpWePXtqBhBGLHbs2BH2Jm8jqIBkyZLZ3Y7r5n34P2nSpHb3R44cWRImTGh7jDMjRozQIMW85MyZM1D+BiIiIiKikCZ37txy9uxZzfZBZhBSo+rVqyeHDh2STJkyhb0Ri8DUp08f6datm+36jRs3GFwQERERUbgRL1486du3b4A+Z4gdsUiePLn+f+fOHbvbcd28D//fvXvX7v7379/rMI75GGcwKQVVpMxLnDhxAuVvICIiIiIKaWbNmiWLFy/2cTtumzNnTtgLLDJkyKDBwcaNG223PX36VOdOlChRQq/j/8ePH8uBAwdsj/n333918gnmYhARERERkc9pAYkTJ3a4VXSKwfDhwyVUpkJhvQksJW6dsH348GGdI5E2bVrp0qWLVo1CTV0EGv3799c1L+rUqaOPz5Ejh1StWlW++uorLUn77t07+frrr3ViNx5HRERERET2sDAe2taO0qVLp/eFysACM9GtJa3MeQ/NmzeX2bNn6wx1TCbBuhQYmcAEE5SXjR49uu135s2bp8EEZrajGlT9+vV17QsiIiIiIhKnIxNHjx6V9OnT291+5MgRSZQokXgqgoEFI8K569evS5o0aeTatWs+ViAkIiIiovAhvLQJe/XqJQsXLtS5FmXLltXbtmzZIi1btpRPP/1UfvzxR4+eN1xWhSIiIiIiCq+GDBkily9f1owfLNUAmKPcrFmz0DvHgoiIiIiIgg6SlbDeG6YdYC4z5jfHiBFD8uTJo3MsvMHAgoiIiIgoHAUWmTNn1pW2USAJl4ASYsvNEhERERFRwEKxIwQTDx48COBnZmBBRERERBSujBw5Unr06CHHjx8P0OdlKhQRERERUTjSrFkzefnypeTLl0+iRo2qcyysHj586NHzMrAgIiIiIgpHxo8fHyjPy8CC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xUHVLexPnKNxPUKECMa6dev0fh7fQbe/eXwHjnARWAC+XPBlhPxcTNrevXu33f0IMpBfisneVoMGDTISJkxoZM+eXQMN8htK96ZIkUL3Myb54bpjLi73tec2bdqkjVvHC/LFzZKz/fv317lBCKYrVqyotbsdHTt2zMicObNdvXpM3kRDA8E0ctaRk0p+73M0wDDRHeuBoAwqziGo+e/YacF97hpn+xkXrLVgQpCMgAAlI1FKFhOJ0Rh2hAnHONfjuDa9ePFC5xzFiRNHPxtYyyg8829/o6ADggh8B+J8gnMGCp84W+uG+9s1LVu21PMEviNx3sBxaAYVwOM76PY3j+/AEQH/BMTIBxERERERhV9hfo4FEREREREFPgYWRERERETkNQYWRERERETkNQYWRERERETkNQYWRERERETkNQYWRERERETkNQYWRERERETkNQYWRERERETkNQYWREQhyOzZsyV+/PgSWoX27ffP5cuXJUKECHL48OHg3hQiohCHgQURhQu7du2SSJEiSY0aNSS027Jli1SoUEESJkwoMWPGlCxZskjz5s3l7du3wb1p0qhRIzl79qzt+vfffy/58+f36jm//PJLbcz7dkmfPn0AbDkREXmLgQURhQszZsyQTp06ydatW+XmzZsSWp08eVKqVq0qhQsX1r/l2LFj8tNPP0nUqFHlv//+C9Zte/funcSIEUOSJk0aoM87YcIEuXXrlu0Cs2bNsl3ft2+f3eNDQoBFRBQeMbAgojDv+fPnsnDhQmnfvr2OWCBdx2rz5s3a871x40ZtsGMUoGTJknLmzBkfPe+//fab9pDHixdPPvvsM3n27JntMbh9/Pjxds+N38HvmsaOHSt58uSRWLFiSZo0aaRDhw66fa5at26dJE+eXEaNGiW5c+eWTJkyaaAxbdo0bdSbtm/fLmXKlNHb8DrffPONvHjxQu/77rvvpFixYj6eO1++fDJ48GDb9enTp0uOHDkkevTokj17dvnll198pARhv5YrV04fM2/ePLtUKPw8aNAgOXLkiG10Abe1bNlSPvnkEx9BCQISBICOsK/xN5sXwGuY14sUKSJDhgyRZs2aSdy4caVNmzb+7gPz/Ro+fLhuT5w4cSRt2rQydepUu9feu3evFChQQP8+HBuHDh1y+b0iIgpvGFgQUZi3aNEibRhny5ZNPv/8c5k5c6YYhuHjcX379pUxY8bI/v37JXLkyNrgtLpw4YIsX75cVq1apRekJI0cOdKtbYkYMaJMnDhRTpw4IXPmzJF///1Xevbs6fLvoyGNXnqMVvgG24lgo379+nL06FFt/KOR/fXXX+v9TZs21QYzHmfC9uCxTZo00esIEgYMGCDDhg2TU6dOaQO8f//+us1WvXv3ls6dO+tjqlSp4iMtqnv37pIrVy7b6AJua926taxdu9Y2+gDYny9fvtT7PfHjjz9qYISGP7bTv31gwvttBgwI8hB8mgElAj4EQDlz5pQDBw5ogPjtt996tH1EROGCQUQUxpUsWdIYP368/vzu3TsjceLExqZNm2z342ecDjds2GC77e+//9bbXr16pdcHDhxoxIwZ03j69KntMT169DCKFStmu54uXTpj3Lhxdq+dL18+/V3fLF682EiUKJHt+qxZs4x48eL5+vj3798bX375pW5b8uTJjTp16hg//fST8eTJE9tjWrVqZbRp08bu97Zt22ZEjBjR9vdguwYPHmy7v0+fPnZ/S6ZMmYz58+fbPceQIUOMEiVK6M+XLl3SbTD3q2/bj78dr+UoZ86cxg8//GC7XrNmTf27XIHXXbZsmd1+x36wcmUf4Pc+//xz2/0fPnwwkiZNakyePFmvT5kyRd8b8/GA+/D6hw4dcmlbiYjCE45YEFGYht5n9M43btxYr2MkAr3izlJu8ubNa/s5RYoU+v/du3ftUmeQMmN9jPV+V2zYsEEqVqwoqVKl0uf64osv5MGDB9pb7wpMQMf8guvXr2s6FJ4HownmqAAg9QgpR7Fjx7ZdMJrw4cMHuXTpkm3UYv78+foz2up//PGH3gZIF0KPf6tWreyeY+jQoXajHIDefk9g1AJ/B9y5c0fWrFnjY4TIHY7b4co+cHzPkaqFESHzPcUoDO5HGpSpRIkSHm8jEVFYFzm4N4CIKDAhgHj//r2kTJnSdhsa0tGiRZOff/5Z8/dNUaJEsWtkAhqizu43H2O9H2lOjilWmDtgnZeA1Bqk2yDFCFWdkJ6DBjwmHGNuh6sQUCAowQXzC7JmzSq//vqrzmlACk/btm11ToEjzCMABFq9evWSgwcPyqtXr+TatWu2NCRzzgfmbTjOxUBgY4W5Ip7AfAikUaFa186dOyVDhgw6H8JTjtvhyj5w5T0lIiLXMbAgojALAcXcuXM1j75y5cp299WpU0d76du1axdgr5ckSRK7eQNPnz616x1Hnj4ardgeBCHm/A9vJUiQQEdPzInJBQsW1OpRmTNn9vV3UqdOrZOuMZcCgcXHH39sq+aULFkyDcQuXrxoG8XwlG/VqhIlSqTvAUYtEFy0aNFCApIr+8A/mLiOyfqvX7+2jVrs3r07ALeSiChsYWBBRGEWJgQ/evRIRwSsIxOASb0YzQjIwAJrSyD9pmbNmlq1CJOfrT38aORiBAPlYfGYHTt26CiDO6ZMmaKLs9WtW1crQqHRi+AJk6/xvICRiOLFi+tEZaQcoTcfjez169frKI0JQcPAgQN1tGTcuHF2r4ORD/T2Y79hEvSbN290Ujv2Z7du3VzeXqSPIbjCNiOYQfoXRosA24YRHAQeWIcjILm6D/yCieyY0P/VV19Jnz59dMQJk8SJiMg5zrEgojALgUOlSpV8BBVmYIGGMioGBRQ0PjEKgMYyytqiRx6NfxOqFqHc7A8//KClYjFaMGLECLdeo2jRoprmg4AI8yrweuhFR7Uq/AyYF4CKVVioDulFKJeKIMeaDgaffvqpbX4HttUKjXGUm8WIAsrj4rkRNCFlyR3YzwhMypcvryM6GCUy4b3BSAvmPjhum7dc3Qd+wbyMlStX6loh+H0EGXjviIjIuQiYwe3LfURERIEGARLmiiB4qVevHvc0EVEox1QoIiIKUphncv/+fZ1rgpSxWrVq8R0gIgoDGFgQEVGQunr1qqZUYc4F0qtQApiIiEI/pkIREREREZHXOHmbiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIi8xsCCiIiIiIgYWBARERERUfDjiAUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQUREREREXmNgQVRMBsyRCRixP/9H5p8//33kixZMokQIYIsX75cQss258+f39frRI4Mw5A2bdpIwoQJ9Vg/fPhwiN1JX375pdSpU8fX60REgY2BBVEwQjAxYAAaL//7P7CDCzQ00DgyL4kSJZKqVavK0aNH3XqeU6dOyaBBg2TKlCly69YtqVatmgSHXbt2SaRIkaRGjRoe/f63334rGzduDLDt+eijj6RLly4SUoSawOnqVZGDB32/4P5gOo7Wrl0rs2fPllWrVumxnjt37iALpv/44w/dro4dO3r0+xMmTNBtDyjp06eX8ePHS0jBwIko5GFgQRTMQYVVUAQXCCTQQMIFjerIkSPLJ5984tZzXLhwQf+vXbu2JE+eXKJFi+bRtrx79068MWPGDOnUqZNs3bpVbt686fbvx44dW4MrCkYIGrJlEylUyPcL7g/E4MKv4wjHeooUKaRkyZJ6rOPzElD8O/6xXT179tQA4/Xr124/f7x48SR+/PhebCERkZsMIgpygwdjjML3C+4PDM2bNzdq165td9u2bdsMnAru3r1ru+3q1atGgwYNjHjx4hkJEiQwatWqZVy6dEnvGzhwoD7eeoH//vvPGDRokJEqVSojatSoRr58+Yw1a9bYnhO/j8cuWLDAKFu2rBEtWjRj1qxZet+0adOM7Nmz623ZsmUzJk2a5O/f8uzZMyN27NjG6dOnjUaNGhnDhg3z8ZgRI0YYSZMm1ce1bNnS6NWrl26XCX+L9Xq5cuWMzp072z0H9hf2mwnbljlzZt1WPHf9+vVt+9Zxv+Bv3rRpk/68du1aI3/+/Eb06NGN8uXLG3fu3DFWr16tf3ecOHGMxo0bGy9evLC9Dvbn8OHDjfTp0+vv5M2b11i8eLHtfvN5N2zYYBQqVMiIESOGUaJECd0fgH3ruD3m/g5RDhzw+8NgXvC4QODXceT4nqZLl04vjreZli9fbhQoUECPjQwZMhjff/+98e7dO9v9ePwvv/xi1KxZ04gZM6Yef765ePGivqePHz82ihUrZsybN8/u/vfv3xtdu3bVz2jChAmNHj16GM2aNbP7fDt+3rGt48aNs3seHP/mdnz48EF/TpMmjX6GU6RIYXTq1Mn22XD2uccxhW1YuXKlkTVrVt1mfCZwLM+ePVtfM378+Po82GbT69evje7duxspU6bUfVG0aFE9pk3m8+Jzg89IrFixjCpVqhg3b9709Txk/X0iCh4MLIhCWFARmMGFY0MDjaq2bdtqQxkNWXj79q2RI0cObYgfPXrUOHnypNGkSRNt8L9580Z/x2y03rp1Sy8wduxYI27cuMYff/yhjbSePXsaUaJEMc6ePWsXWKCh/Oeff2rDCY2E33//XRsw5m34Hw0lNEr8MmPGDKNw4cL6Mxo1mTJl0oaRaeHChdrAmz59um5P3759tQHvTWCxb98+I1KkSMb8+fONy5cvGwcPHjQmTJig96EBiIb9V199ZdsvaEiZAUDx4sWN7du36+9gf+O1KleurNe3bt1qJEqUyBg5cqTtdYcOHaoNKjSsLly4oPscf8/mzZv1fvN50ejEbSdOnDDKlCljlCxZUu9/+fKlNtxy5cpl2x7cFuIEc2Dh13GE93Tw4MFG6tSpdf8h+MbFDNLM2wDvIY5/HLd4v9atW6fHOoILE34PwejMmTP1MVeuXPF1u/r37298+umn+vNPP/1kVKhQwe7+H374QYN+fF7wGW3VqpUe394EFghc8Tcg4MW27dmzx5g6dare9+DBA90P2B/Wzz32Az7nH3/8sR7LW7Zs0WMZx3bDhg31uMR+RaCCTgVT69at9VjFfjt//rwxevRoPb7N84X5vJUqVdLP3YEDB/S8hHMR4DyE569atapte3B+IqLgxcCCKAQGFYEVXKChgYYxev9wQUMHjXp8aZt+++03DSKsjXR8YaMn8p9//tHry5Yts/VYmtDz6DhqUKRIEaNDhw52gcX48ePtHoOGHBrqVkOGDNFGul/QKDGfC73CiRMntuuxxO+br21CI9ybwAKNODS8nj596nSbnP2+dWTBOpKC29C4NCHAQ4+s2ZuLXtydO3faPRcajxjZ8O15//77b73t1atXTv++ECmYAwv/jiM0xK2jEoB9jM+AVcWKFXWEyQqfJXy+rL/XpUsXf7cJQT5GDTACAvfu3dOGOQJvE5531KhRtuvYdjT8vQksxowZo6MO6Fxwxtnvm50MCA6sxzKOXzT+TTi2cTsgaMF56MaNGz72YZ8+fXx9XowWJkuWzNe/j4iCH+dYEAWhgQMD9/GuKF++vFa2wWXv3r1SpUoVnXx95coVvf/IkSNy/vx5iRMnjs5BwAUVcZDjbc6tcPT06VPNTS9VqpTd7biOid5WhQsXtv384sULfc5WrVrZXguXoUOH+vpacObMGd32xo0b63XkvTdq1Ehz0k143WLFitn9XokSJcQbH3/8saRLl04yZswoX3zxhcybN09evnzp0u/mzZvX9jOqacWMGVOfx3rb3bt39WfsfzwvXs+6X+bOnetjv1ifF3MBwHwe8psrx5Gr8LkZPHiw3fv11Vdf6Vwm6zFiPf59s379ev1sVK9eXa8nTpxYj4WZM2fq9SdPnujzWo9vbLsrz+2XBg0ayKtXr/S4xLYvW7ZM3r9/7+/v4VjOlCmT3bGMid7YB9bbzOPy2LFj8t9//0nWrFnt9teWLVvsjm/H58XxzWObKGQLuFloROSvQYN8Ttj27/EBLVasWJI5c2bb9enTp+skz2nTpmmD/vnz51KoUCFtNDtKkiRJgLy+Ca8FeG3HIADVcHyDhh8aPClTprTdhg5hTCL/+eef9e/xRMSIEfV5fJtgi2Dr4MGDsnnzZlm3bp0MGDBAKy/t27fP30myUaJEsf2MqkLW6+ZtHz58sNsvf//9t6RKlcrucY4T5R2fF8znIb8F5HGE9wyV0urVq+fjvujRozs9/v3arocPH0qMGDFst+E9RfU2vIan/Du+06RJo8HWhg0bNLjp0KGDjB49Whv8jserlbNj2b/jG5/vAwcO+PicW4MRZ8/huP1EFLIwsCAKQv37/+9/V4KLwYP/7/GBCV/WaHCgpxIKFiwoCxculKRJk0rcuHFdeg48Do2zHTt2SLly5Wy343rRokV9/T30YuL3Ll68KE2bNnXptdAQRM/9mDFjpHLlynb3oWY/Kui0a9dOcuTIIXv27JFmzZrZ7t+9e7efz43ACT3BJvSqHj9+XEd5rD3DlSpV0svAgQM1oPj333+1QRk1alT9HW/lzJlTG7dXr16125/uCqjtCYtcPY6cQYPXcb/ic4NGuTVo98SDBw/kr7/+kgULFkiuXLlst+P1SpcurQEtKruh9x7Hd9myZW1/Dxrq2A5Xj2+MNF66dMnuMQhmatasqReUuc2ePbuOMOB5A+p4KlCggD4PRh/KlCnj8fPw+CYKeRhYEIXA4CIwg4o3b97I7du39edHjx5pzyx6ENGQADTw0UuJUrJI7UidOrWmSS1dulRLX+K6Mz169NCGNlIXsHbCrFmzNN3K2ciHFXpgv/nmG+0dRoMJ27d//37dtm7duvl4PNYTwH1In3LsUa5fv7729qJB2LlzZ61zj/QQpGRhO06cOGGXfuSoQoUK+poYKcDfMXbsWHn8+LHdayMIQmMuQYIEsnr1au2FzYZyqP+/zj8ae5cvX7alkHkCIyNYY6Nr1676/GhQIv0FgRqCuObNm7v0PNgeNBzxPuB9w/N6Who4rHH1OPJtv6JUM44r7E8cCxi9QtnmtGnTyqeffqrBOtKjEJhiJNBVv/32m5ZAbtiwoW0EyoTUKGwXPic4vkeOHClZsmTRxr/jserb8Y11LfBZR0CMbbaOGOA+NPgxeog0pN9//10DDaT/mX83SvJ+9tln+ncjRcsTSIHCeQZBPwI7BBr37t3TfYrUPlfXpcH2/PPPPxrQYZ/hffRrZIWIAh/nWBAFAwQNCB6CY6QCC36htxMXNCCQxrN48WJd3A3QoEDjAQ0k9MKj5x+NL8yx8GsEA8EBGuXdu3eXPHny6OusWLFCGz5+ad26taZjIRDB76GHHg2cDBkyOH08GlYYLXCWpoIGIYISpIwgV75///4aDCG1C8FR+/bt/dyWli1baqMdDR5sB4IQ62gFGmMIsNBAw3759ddftWfb7FlGMICGGkYc0DuMEQdPDRkyRLd/xIgR+lpoTCLg8W2/OIP9gd/D34DtwbaGOGicWlKFnML9HjZifePqceQMGsNIFULqEBrFgLlKCFYwolCkSBEpXry4jBs3ztYodxXmUdStW9dHUGFuFz5T9+/f188Z5vngeMXcIQSN+D2/9OnTR49rBEBovGNkxjqHAcc30hIRMKGBj5SolStX2tZ6QUcDgmb8jrdpkfi843OGvwOBObYF5yKcd1yFeSD4XXQeYHsQeBNR8IqAGdzBvA1E4ZbjInlBlf5E/9fQ2rZtm2zfvp27JDghALt/3/f7EVS40eCk/8GkdAS6GHkgIgoKTIUiCkZmEIHqT5iTyaAiaKA/BSlNSL0we5wpGCFoYOAQYDDf4uzZs7Jr1y5p27ZtwD0xEZE/OGJBROEOctExcRwpK5h74W66ClFIhjk1JUuW1BQ4jFZgDggRUVBgYEFERERERF7j5G0iIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIvIaAwsiIiIiIhJv/T/CGn24EubswgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# This work is not really part of the package\n", + "# but I'm including it for completeness, it shows the sensitivity of the unpaid claim estimate \n", + "# to the assumed annual severity trend\n", + "\n", + "def unpaid(tri):\n", + " # Selected LDFs: all-year simple average, rounded like the exhibit\n", + " ldf = np.round(\n", + " cl.Development(average=\"simple\").fit(tri).ldf_.to_frame(origin_as_datetime=False).values.flatten(),\n", + " 3,\n", + " )\n", + " developed = cl.DevelopmentConstant(\n", + " patterns=dict(zip([12, 24, 36, 48, 60, 72, 84, 96], [*ldf, 1.0])),\n", + " style=\"ldf\",\n", + " ).fit_transform(tri)\n", + " ult = cl.Chainladder().fit(developed).ultimate_.to_frame(origin_as_datetime=False).iloc[:, 0]\n", + " # Total unpaid = case outstanding + IBNR, with IBNR = ultimate − reported\n", + " return (case_latest.values + ult.values - reported_latest.values).sum()\n", + "\n", + "\n", + "# unadjusted reported unpaid from Sheet 9\n", + "unadj_unpaid = exhibit_i_s9[\"Total Unpaid Reported (11)\"].sum()\n", + "selected_trend = 0.15 # trend used on Sheet 6\n", + "trends = np.arange(0, 36, 5) / 100\n", + "\n", + "# Re-run Berquist-Sherman and develop at each trend step\n", + "adj_unpaid = np.array(\n", + " [\n", + " unpaid(\n", + " cl.BerquistSherman(\n", + " paid_amount=\"Paid\",\n", + " incurred_amount=\"Incurred\",\n", + " reported_count=\"Reported\",\n", + " closed_count=\"Closed\",\n", + " trend=trend,\n", + " )\n", + " .fit(med_mal)\n", + " .adjusted_triangle_[\"Incurred\"]\n", + " )\n", + " for trend in trends\n", + " ]\n", + ") / 1e6\n", + "\n", + "# trend where the adjusted estimate equals the unadjusted \n", + "crossing_trend = np.interp(unadj_unpaid / 1e6, adj_unpaid, trends)\n", + "\n", + "fig, ax = plt.subplots(figsize=(8, 5))\n", + "ax.plot(trends, adj_unpaid, color=\"black\", linewidth=1.5) # sensitivity curve\n", + "\n", + "# blue diamond: unadjusted unpaid\n", + "ax.plot(\n", + " crossing_trend,\n", + " unadj_unpaid / 1e6,\n", + " linestyle=\"None\",\n", + " marker=\"D\",\n", + " color=\"blue\",\n", + " label=\"Before Adjustment\",\n", + ")\n", + "\n", + "# red square: adjusted unpaid at the 15% selected trend\n", + "ax.plot(\n", + " selected_trend,\n", + " adj_unpaid[trends == selected_trend][0],\n", + " linestyle=\"None\",\n", + " marker=\"s\",\n", + " color=\"red\",\n", + " label=\"After Adjustment\",\n", + ")\n", + "\n", + "# titles and labels\n", + "ax.set_xlabel(\"Annual Severity Trend\")\n", + "ax.set_ylabel(\"Unpaid Claim Estimate ($ Millions)\")\n", + "ax.set_xlim(0, 0.35)\n", + "ax.set_ylim(0, 900)\n", + "ax.set_xticks(trends)\n", + "ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f\"{x:.0%}\"))\n", + "ax2 = ax.twinx()\n", + "ax2.set_ylabel(\"Percent of Unadjusted Unpaid Claim Estimate\")\n", + "ax2.set_ylim(*(np.array(ax.get_ylim()) * 1e6 / unadj_unpaid))\n", + "ax2.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f\"{x:.0%}\"))\n", + "ax2.axhline(1.0, color=\"gray\", linestyle=\"--\", linewidth=0.8)\n", + "ax.legend(loc=\"upper center\", bbox_to_anchor=(0.5, -0.22), ncol=2, frameon=False)\n", + "ax.set_title(\"Sensitivity of Unpaid Claim Estimate to Assumed Annual Severity Trend\")\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "9a869561", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit I Sheet 10 — reconcile to Friedland PDF p303\n", + "# Omitted, not reconciling graphs" + ] + }, + { + "cell_type": "markdown", + "id": "aed810f0", + "metadata": {}, + "source": [ + "## P304 (Exhibit II Sheet 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "a411a304", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19691904.05398.07496.08882.09712.010071.010199.010256.0
19702235.06261.08691.010443.011346.011754.012031.0NaN
19712441.07348.010662.012655.013748.014235.0NaNNaN
19722503.08173.011810.014176.015383.0NaNNaNNaN
19732838.08712.012728.015278.0NaNNaNNaNNaN
19742405.07858.011771.0NaNNaNNaNNaNNaN
19752759.09182.0NaNNaNNaNNaNNaNNaN
19762801.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 1904.0 5398.0 7496.0 8882.0 9712.0 10071.0 10199.0 10256.0\n", + "1970 2235.0 6261.0 8691.0 10443.0 11346.0 11754.0 12031.0 NaN\n", + "1971 2441.0 7348.0 10662.0 12655.0 13748.0 14235.0 NaN NaN\n", + "1972 2503.0 8173.0 11810.0 14176.0 15383.0 NaN NaN NaN\n", + "1973 2838.0 8712.0 12728.0 15278.0 NaN NaN NaN NaN\n", + "1974 2405.0 7858.0 11771.0 NaN NaN NaN NaN NaN\n", + "1975 2759.0 9182.0 NaN NaN NaN NaN NaN NaN\n", + "1976 2801.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
19692.8351.3891.1851.0931.0371.0131.006
19702.8011.3881.2021.0861.0361.024NaN
19713.0101.4511.1871.0861.035NaNNaN
19723.2651.4451.2001.085NaNNaNNaN
19733.0701.4611.200NaNNaNNaNNaN
19743.2671.498NaNNaNNaNNaNNaN
19753.328NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "1969 2.835 1.389 1.185 1.093 1.037 1.013 1.006\n", + "1970 2.801 1.388 1.202 1.086 1.036 1.024 NaN\n", + "1971 3.010 1.451 1.187 1.086 1.035 NaN NaN\n", + "1972 3.265 1.445 1.200 1.085 NaN NaN NaN\n", + "1973 3.070 1.461 1.200 NaN NaN NaN NaN\n", + "1974 3.267 1.498 NaN NaN NaN NaN NaN\n", + "1975 3.328 NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
Simple All Years3.0821.4391.1951.0881.0361.0181.006
Simple Latest 43.2331.4641.1971.0881.0361.0181.006
Volume All Years3.0981.4441.1961.0871.0361.0191.006
Volume Latest 43.2291.4641.1971.0871.0361.0191.006
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "Simple All Years 3.082 1.439 1.195 1.088 1.036 1.018 1.006\n", + "Simple Latest 4 3.233 1.464 1.197 1.088 1.036 1.018 1.006\n", + "Volume All Years 3.098 1.444 1.196 1.087 1.036 1.019 1.006\n", + "Volume Latest 4 3.229 1.464 1.197 1.087 1.036 1.019 1.006" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-9696-108
Selected3.0981.4441.1961.0871.0361.0191.0061.0
CDF to Ultimate6.1761.9941.3811.1541.0621.0251.0061.0
Percent Paid0.1620.5020.7240.8670.9420.9760.9941.0
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108\n", + "Selected 3.098 1.444 1.196 1.087 1.036 1.019 1.006 1.0\n", + "CDF to Ultimate 6.176 1.994 1.381 1.154 1.062 1.025 1.006 1.0\n", + "Percent Paid 0.162 0.502 0.724 0.867 0.942 0.976 0.994 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "auto = cl.load_sample(\"friedland_berq_sher_auto\")\n", + "paid_auto = auto[\"Paid Claims\"]\n", + "\n", + "# Part 1\n", + "display(paid_auto.to_frame(origin_as_datetime=False))\n", + "\n", + "# Part 2\n", + "display(np.round(paid_auto.link_ratio.to_frame(origin_as_datetime=False), 3))\n", + "\n", + "# Part 3\n", + "avg_params = {\n", + " \"Simple All Years\": {\"average\": \"simple\"},\n", + " \"Simple Latest 4\": {\"average\": \"simple\", \"n_periods\": 4},\n", + " \"Volume All Years\": {\"average\": \"volume\"},\n", + " \"Volume Latest 4\": {\"average\": \"volume\", \"n_periods\": 4},\n", + "}\n", + "devs = {k: cl.Development(**v).fit(paid_auto) for k, v in avg_params.items()}\n", + "display(\n", + " np.round(\n", + " pd.concat(\n", + " [v.ldf_.to_frame().rename(index={\"(All)\": k}) for k, v in devs.items()]\n", + " ),\n", + " 3,\n", + " )\n", + ")\n", + "dev_paid_auto = devs[\"Volume All Years\"]\n", + "\n", + "# Part 4\n", + "selected_ldf = {\n", + " 12: 3.098,\n", + " 24: 1.444,\n", + " 36: 1.196,\n", + " 48: 1.087,\n", + " 60: 1.036,\n", + " 72: 1.019,\n", + " 84: 1.006,\n", + " 96: 1.000,\n", + "}\n", + "# or this\n", + "avg_ldf = np.round(dev_paid_auto.ldf_.to_frame().values.flatten(), 3)\n", + "selected_ldf = dict(zip([12, 24, 36, 48, 60, 72, 84, 96], [*avg_ldf, 1.000]))\n", + "\n", + "paid_auto_dev = cl.DevelopmentConstant(patterns=selected_ldf, style=\"ldf\").fit(paid_auto)\n", + "cdf = np.round(paid_auto_dev.cdf_.to_frame().values.flatten(), 3)\n", + "pct_paid = np.round(1.0 / cdf, 3)\n", + "\n", + "exhibit_ii_s1_sel = pd.DataFrame(\n", + " {\n", + " \"Selected\": list(selected_ldf.values()),\n", + " \"CDF to Ultimate\": cdf,\n", + " \"Percent Paid\": pct_paid,\n", + " },\n", + " index=[\"12-24\", \"24-36\", \"36-48\", \"48-60\", \"60-72\", \"72-84\", \"84-96\", \"96-108\"],\n", + ")\n", + "display(exhibit_ii_s1_sel.T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "76c7661f", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 1 — reconcile to Friedland PDF p304\n", + "exhibit_ii_s1_tri = paid_auto.to_frame(origin_as_datetime=False)\n", + "assert np.allclose(\n", + " exhibit_ii_s1_tri,\n", + " [\n", + " [1904, 5398, 7496, 8882, 9712, 10071, 10199, 10256],\n", + " [2235, 6261, 8691, 10443, 11346, 11754, 12031, np.nan],\n", + " [2441, 7348, 10662, 12655, 13748, 14235, np.nan, np.nan],\n", + " [2503, 8173, 11810, 14176, 15383, np.nan, np.nan, np.nan],\n", + " [2838, 8712, 12728, 15278, np.nan, np.nan, np.nan, np.nan],\n", + " [2405, 7858, 11771, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [2759, 9182, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [2801, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n", + "exhibit_ii_s1_ata = np.round(paid_auto.link_ratio.to_frame(origin_as_datetime=False), 3)\n", + "assert np.allclose(\n", + " exhibit_ii_s1_ata,\n", + " [\n", + " [2.835, 1.389, 1.185, 1.093, 1.037, 1.013, 1.006],\n", + " [2.801, 1.388, 1.202, 1.086, 1.036, 1.024, np.nan],\n", + " [3.010, 1.451, 1.187, 1.086, 1.035, np.nan, np.nan],\n", + " [3.265, 1.445, 1.200, 1.085, np.nan, np.nan, np.nan],\n", + " [3.070, 1.461, 1.200, np.nan, np.nan, np.nan, np.nan],\n", + " [3.267, 1.498, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [3.328, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n", + "assert np.allclose(\n", + " np.round(devs[\"Simple All Years\"].ldf_.to_frame().values.flatten(), 3),\n", + " [3.082, 1.439, 1.195, 1.088, 1.036, 1.018, 1.006],\n", + ")\n", + "assert np.allclose(\n", + " np.round(devs[\"Simple Latest 4\"].ldf_.to_frame().values.flatten(), 3),\n", + " [3.233, 1.464, 1.197, 1.088, 1.036, 1.018, 1.006],\n", + ")\n", + "assert np.allclose(\n", + " np.round(devs[\"Volume All Years\"].ldf_.to_frame().values.flatten(), 3),\n", + " [3.098, 1.444, 1.196, 1.087, 1.036, 1.019, 1.006],\n", + ")\n", + "assert np.allclose(\n", + " np.round(devs[\"Volume Latest 4\"].ldf_.to_frame().values.flatten(), 3),\n", + " [3.229, 1.464, 1.197, 1.087, 1.036, 1.019, 1.006],\n", + ")\n", + "assert np.allclose(\n", + " exhibit_ii_s1_sel[\"CDF to Ultimate\"],\n", + " [6.170, 1.991, 1.379, 1.154, 1.061, 1.024, 1.006, 1.000],\n", + " atol=0.006,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_ii_s1_sel[\"Percent Paid\"],\n", + " [0.162, 0.502, 0.724, 0.867, 0.942, 0.976, 0.994, 1.000],\n", + " atol=0.001,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "42f5b236", + "metadata": {}, + "source": [ + "## P305 (Exhibit II Sheet 2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "a0dc3dc1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19694079.06616.07192.07494.07670.07749.07792.07806.0
19704429.07230.07899.08291.08494.08606.08647.0NaN
19714914.08174.09068.09518.09761.09855.0NaNNaN
19724497.07842.08747.09254.09469.0NaNNaNNaN
19734419.07665.08659.09093.0NaNNaNNaNNaN
19743486.06214.06916.0NaNNaNNaNNaNNaN
19753516.06226.0NaNNaNNaNNaNNaNNaN
19763230.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 4079.0 6616.0 7192.0 7494.0 7670.0 7749.0 7792.0 7806.0\n", + "1970 4429.0 7230.0 7899.0 8291.0 8494.0 8606.0 8647.0 NaN\n", + "1971 4914.0 8174.0 9068.0 9518.0 9761.0 9855.0 NaN NaN\n", + "1972 4497.0 7842.0 8747.0 9254.0 9469.0 NaN NaN NaN\n", + "1973 4419.0 7665.0 8659.0 9093.0 NaN NaN NaN NaN\n", + "1974 3486.0 6214.0 6916.0 NaN NaN NaN NaN NaN\n", + "1975 3516.0 6226.0 NaN NaN NaN NaN NaN NaN\n", + "1976 3230.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19696553.07696.07770.07799.07814.07819.07820.07821.0
19707277.08537.08615.08661.08675.08679.08682.0NaN
19718259.09765.09884.09926.09940.09945.0NaNNaN
19727858.09474.09615.09664.09680.0NaNNaNNaN
19737808.09376.09513.09562.0NaNNaNNaNNaN
19746278.07614.07741.0NaNNaNNaNNaNNaN
19756446.07884.0NaNNaNNaNNaNNaNNaN
19766115.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 6553.0 7696.0 7770.0 7799.0 7814.0 7819.0 7820.0 7821.0\n", + "1970 7277.0 8537.0 8615.0 8661.0 8675.0 8679.0 8682.0 NaN\n", + "1971 8259.0 9765.0 9884.0 9926.0 9940.0 9945.0 NaN NaN\n", + "1972 7858.0 9474.0 9615.0 9664.0 9680.0 NaN NaN NaN\n", + "1973 7808.0 9376.0 9513.0 9562.0 NaN NaN NaN NaN\n", + "1974 6278.0 7614.0 7741.0 NaN NaN NaN NaN NaN\n", + "1975 6446.0 7884.0 NaN NaN NaN NaN NaN NaN\n", + "1976 6115.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19690.6220.8600.9260.9610.9820.9910.9960.998
19700.6090.8470.9170.9570.9790.9920.996NaN
19710.5950.8370.9170.9590.9820.991NaNNaN
19720.5720.8280.9100.9580.978NaNNaNNaN
19730.5660.8180.9100.951NaNNaNNaNNaN
19740.5550.8160.893NaNNaNNaNNaNNaN
19750.5450.790NaNNaNNaNNaNNaNNaN
19760.528NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 0.622 0.860 0.926 0.961 0.982 0.991 0.996 0.998\n", + "1970 0.609 0.847 0.917 0.957 0.979 0.992 0.996 NaN\n", + "1971 0.595 0.837 0.917 0.959 0.982 0.991 NaN NaN\n", + "1972 0.572 0.828 0.910 0.958 0.978 NaN NaN NaN\n", + "1973 0.566 0.818 0.910 0.951 NaN NaN NaN NaN\n", + "1974 0.555 0.816 0.893 NaN NaN NaN NaN NaN\n", + "1975 0.545 0.790 NaN NaN NaN NaN NaN NaN\n", + "1976 0.528 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "closed_auto = auto[\"Closed Claim Counts\"]\n", + "reported_cnt_auto = auto[\"Reported Claim Counts\"]\n", + "\n", + "display(closed_auto.to_frame(origin_as_datetime=False))\n", + "display(reported_cnt_auto.to_frame(origin_as_datetime=False))\n", + "display(\n", + " np.round(\n", + " (closed_auto / reported_cnt_auto).to_frame(origin_as_datetime=False),\n", + " 3,\n", + " )\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "f4dd731b", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 2 — reconcile to Friedland PDF p305\n", + "assert np.allclose(\n", + " closed_auto.to_frame(),\n", + " [\n", + " [4079, 6616, 7192, 7494, 7670, 7749, 7792, 7806],\n", + " [4429, 7230, 7899, 8291, 8494, 8606, 8647, np.nan],\n", + " [4914, 8174, 9068, 9518, 9761, 9855, np.nan, np.nan],\n", + " [4497, 7842, 8747, 9254, 9469, np.nan, np.nan, np.nan],\n", + " [4419, 7665, 8659, 9093, np.nan, np.nan, np.nan, np.nan],\n", + " [3486, 6214, 6916, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [3516, 6226, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [3230, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n", + "assert np.allclose(\n", + " reported_cnt_auto.to_frame(),\n", + " [\n", + " [6553, 7696, 7770, 7799, 7814, 7819, 7820, 7821],\n", + " [7277, 8537, 8615, 8661, 8675, 8679, 8682, np.nan],\n", + " [8259, 9765, 9884, 9926, 9940, 9945, np.nan, np.nan],\n", + " [7858, 9474, 9615, 9664, 9680, np.nan, np.nan, np.nan],\n", + " [7808, 9376, 9513, 9562, np.nan, np.nan, np.nan, np.nan],\n", + " [6278, 7614, 7741, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [6446, 7884, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [6115, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n", + "assert np.allclose(\n", + " np.round((closed_auto / reported_cnt_auto).to_frame(), 3),\n", + " [\n", + " [0.622, 0.860, 0.926, 0.961, 0.982, 0.991, 0.996, 0.998],\n", + " [0.609, 0.847, 0.917, 0.957, 0.979, 0.992, 0.996, np.nan],\n", + " [0.595, 0.837, 0.917, 0.959, 0.982, 0.991, np.nan, np.nan],\n", + " [0.572, 0.828, 0.910, 0.958, 0.978, np.nan, np.nan, np.nan],\n", + " [0.566, 0.818, 0.910, 0.951, np.nan, np.nan, np.nan, np.nan],\n", + " [0.555, 0.816, 0.893, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [0.545, 0.790, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [0.528, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "7c7daa41", + "metadata": {}, + "source": [ + "## P306 (Exhibit II Sheet 3)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "9d5da07d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19696553.07696.07770.07799.07814.07819.07820.07821.0
19707277.08537.08615.08661.08675.08679.08682.0NaN
19718259.09765.09884.09926.09940.09945.0NaNNaN
19727858.09474.09615.09664.09680.0NaNNaNNaN
19737808.09376.09513.09562.0NaNNaNNaNNaN
19746278.07614.07741.0NaNNaNNaNNaNNaN
19756446.07884.0NaNNaNNaNNaNNaNNaN
19766115.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 6553.0 7696.0 7770.0 7799.0 7814.0 7819.0 7820.0 7821.0\n", + "1970 7277.0 8537.0 8615.0 8661.0 8675.0 8679.0 8682.0 NaN\n", + "1971 8259.0 9765.0 9884.0 9926.0 9940.0 9945.0 NaN NaN\n", + "1972 7858.0 9474.0 9615.0 9664.0 9680.0 NaN NaN NaN\n", + "1973 7808.0 9376.0 9513.0 9562.0 NaN NaN NaN NaN\n", + "1974 6278.0 7614.0 7741.0 NaN NaN NaN NaN NaN\n", + "1975 6446.0 7884.0 NaN NaN NaN NaN NaN NaN\n", + "1976 6115.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
19691.1741.0101.0041.0021.0011.01.0
19701.1731.0091.0051.0021.0001.0NaN
19711.1821.0121.0041.0011.001NaNNaN
19721.2061.0151.0051.002NaNNaNNaN
19731.2011.0151.005NaNNaNNaNNaN
19741.2131.017NaNNaNNaNNaNNaN
19751.223NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "1969 1.174 1.010 1.004 1.002 1.001 1.0 1.0\n", + "1970 1.173 1.009 1.005 1.002 1.000 1.0 NaN\n", + "1971 1.182 1.012 1.004 1.001 1.001 NaN NaN\n", + "1972 1.206 1.015 1.005 1.002 NaN NaN NaN\n", + "1973 1.201 1.015 1.005 NaN NaN NaN NaN\n", + "1974 1.213 1.017 NaN NaN NaN NaN NaN\n", + "1975 1.223 NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
Simple All Years1.1961.0131.0051.0021.0011.01.0
Simple Latest 41.2111.0151.0051.0021.0011.01.0
Volume All Years1.1951.0131.0051.0021.0011.01.0
Volume Latest 41.2101.0141.0051.0021.0011.01.0
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "Simple All Years 1.196 1.013 1.005 1.002 1.001 1.0 1.0\n", + "Simple Latest 4 1.211 1.015 1.005 1.002 1.001 1.0 1.0\n", + "Volume All Years 1.195 1.013 1.005 1.002 1.001 1.0 1.0\n", + "Volume Latest 4 1.210 1.014 1.005 1.002 1.001 1.0 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-9696-108
Selected1.1961.0131.0051.0021.0011.01.01.0
CDF to Ultimate1.2211.0211.0081.0031.0011.01.01.0
Percent Reported0.8190.9790.9920.9970.9991.01.01.0
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108\n", + "Selected 1.196 1.013 1.005 1.002 1.001 1.0 1.0 1.0\n", + "CDF to Ultimate 1.221 1.021 1.008 1.003 1.001 1.0 1.0 1.0\n", + "Percent Reported 0.819 0.979 0.992 0.997 0.999 1.0 1.0 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Part 1\n", + "display(reported_cnt_auto.to_frame(origin_as_datetime=False))\n", + "\n", + "# Part 2\n", + "display(np.round(reported_cnt_auto.link_ratio.to_frame(origin_as_datetime=False), 3))\n", + "\n", + "# Part 3\n", + "avg_params = {\n", + " \"Simple All Years\": {\"average\": \"simple\"},\n", + " \"Simple Latest 4\": {\"average\": \"simple\", \"n_periods\": 4},\n", + " \"Volume All Years\": {\"average\": \"volume\"},\n", + " \"Volume Latest 4\": {\"average\": \"volume\", \"n_periods\": 4},\n", + "}\n", + "devs = {k: cl.Development(**v).fit(reported_cnt_auto) for k, v in avg_params.items()}\n", + "display(\n", + " np.round(\n", + " pd.concat(\n", + " [v.ldf_.to_frame().rename(index={\"(All)\": k}) for k, v in devs.items()]\n", + " ),\n", + " 3,\n", + " )\n", + ")\n", + "dev_reported_cnt_auto = devs[\"Simple All Years\"]\n", + "\n", + "# Part 4\n", + "selected_ldf = {\n", + " 12: 1.196,\n", + " 24: 1.013,\n", + " 36: 1.005,\n", + " 48: 1.002,\n", + " 60: 1.001,\n", + " 72: 1.000,\n", + " 84: 1.000,\n", + " 96: 1.000,\n", + "}\n", + "# or this\n", + "avg_ldf = np.round(dev_reported_cnt_auto.ldf_.to_frame().values.flatten(), 3)\n", + "selected_ldf = dict(zip([12, 24, 36, 48, 60, 72, 84, 96], [*avg_ldf, 1.000]))\n", + "\n", + "reported_cnt_auto_dev = cl.DevelopmentConstant(patterns=selected_ldf, style=\"ldf\").fit(\n", + " reported_cnt_auto\n", + ")\n", + "cdf = np.round(reported_cnt_auto_dev.cdf_.to_frame().values.flatten(), 3)\n", + "pct_reported = np.round(1.0 / cdf, 3)\n", + "\n", + "exhibit_ii_s3_sel = pd.DataFrame(\n", + " {\n", + " \"Selected\": list(selected_ldf.values()),\n", + " \"CDF to Ultimate\": cdf,\n", + " \"Percent Reported\": pct_reported,\n", + " },\n", + " index=[\"12-24\", \"24-36\", \"36-48\", \"48-60\", \"60-72\", \"72-84\", \"84-96\", \"96-108\"],\n", + ")\n", + "display(exhibit_ii_s3_sel.T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "b03c53fc", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 3 — reconcile to Friedland PDF p306\n", + "exhibit_ii_s3_tri = reported_cnt_auto.to_frame(origin_as_datetime=False)\n", + "assert np.allclose(\n", + " exhibit_ii_s3_tri,\n", + " [\n", + " [6553, 7696, 7770, 7799, 7814, 7819, 7820, 7821],\n", + " [7277, 8537, 8615, 8661, 8675, 8679, 8682, np.nan],\n", + " [8259, 9765, 9884, 9926, 9940, 9945, np.nan, np.nan],\n", + " [7858, 9474, 9615, 9664, 9680, np.nan, np.nan, np.nan],\n", + " [7808, 9376, 9513, 9562, np.nan, np.nan, np.nan, np.nan],\n", + " [6278, 7614, 7741, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [6446, 7884, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [6115, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n", + "exhibit_ii_s3_ata = np.round(\n", + " reported_cnt_auto.link_ratio.to_frame(origin_as_datetime=False), 3\n", + ")\n", + "assert np.allclose(\n", + " exhibit_ii_s3_ata,\n", + " [\n", + " [1.174, 1.010, 1.004, 1.002, 1.001, 1.000, 1.000],\n", + " [1.173, 1.009, 1.005, 1.002, 1.000, 1.000, np.nan],\n", + " [1.182, 1.012, 1.004, 1.001, 1.001, np.nan, np.nan],\n", + " [1.206, 1.015, 1.005, 1.002, np.nan, np.nan, np.nan],\n", + " [1.201, 1.015, 1.005, np.nan, np.nan, np.nan, np.nan],\n", + " [1.213, 1.017, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [1.223, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + ")\n", + "assert np.allclose(\n", + " np.round(devs[\"Simple All Years\"].ldf_.to_frame().values.flatten(), 3),\n", + " [1.196, 1.013, 1.005, 1.002, 1.001, 1.000, 1.000],\n", + ")\n", + "assert np.allclose(\n", + " exhibit_ii_s3_sel[\"CDF to Ultimate\"],\n", + " [1.221, 1.021, 1.008, 1.003, 1.001, 1.000, 1.000, 1.000],\n", + " atol=0.001,\n", + ")\n", + "assert np.allclose(\n", + " exhibit_ii_s3_sel[\"Percent Reported\"],\n", + " [0.819, 0.979, 0.992, 0.997, 0.999, 1.000, 1.000, 1.000],\n", + " atol=0.001,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "e57edea4", + "metadata": {}, + "source": [ + "## P307 (Exhibit II Sheet 4)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "f24f1adb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
originAge (2)Reported (3)CDF to Ultimate(4)Projected Ultimate CLaim Counts (5)
01969967821.01.0007821.000
11970848682.01.0008682.000
21971729945.01.0009945.000
31972609680.01.0019689.680
41973489562.01.0039590.686
51974367741.01.0087802.928
61975247884.01.0218049.564
71976126115.01.2217466.415
\n", + "
" + ], + "text/plain": [ + " origin Age (2) Reported (3) CDF to Ultimate(4) \\\n", + "0 1969 96 7821.0 1.000 \n", + "1 1970 84 8682.0 1.000 \n", + "2 1971 72 9945.0 1.000 \n", + "3 1972 60 9680.0 1.001 \n", + "4 1973 48 9562.0 1.003 \n", + "5 1974 36 7741.0 1.008 \n", + "6 1975 24 7884.0 1.021 \n", + "7 1976 12 6115.0 1.221 \n", + "\n", + " Projected Ultimate CLaim Counts (5) \n", + "0 7821.000 \n", + "1 8682.000 \n", + "2 9945.000 \n", + "3 9689.680 \n", + "4 9590.686 \n", + "5 7802.928 \n", + "6 8049.564 \n", + "7 7466.415 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Reported (3)Projected Ultimate CLaim Counts (5)
Total67430.069047.273
\n", + "
" + ], + "text/plain": [ + " Reported (3) Projected Ultimate CLaim Counts (5)\n", + "Total 67430.0 69047.273" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cl_reported_cnt_auto = cl.Chainladder().fit(\n", + " reported_cnt_auto_dev.transform(reported_cnt_auto)\n", + ")\n", + "md_reported_cnt = (\n", + " cl.model_diagnostics(cl_reported_cnt_auto).to_frame(origin_as_datetime=False).T\n", + ")\n", + "ages = reported_cnt_auto.latest_diagonal.to_frame(\n", + " keepdims=True, implicit_axis=True, origin_as_datetime=False\n", + ")[\"development\"].values\n", + "age_to_cdf_reported_cnt = dict(\n", + " zip(reported_cnt_auto.development, np.round(md_reported_cnt[\"CDF\"].values, 3)[::-1])\n", + ")\n", + "cl_reported_cnt_auto = cl.Chainladder().fit(\n", + " cl.DevelopmentConstant(patterns=age_to_cdf_reported_cnt, style=\"cdf\").fit_transform(\n", + " reported_cnt_auto\n", + " )\n", + ")\n", + "md_reported_cnt = (\n", + " cl.model_diagnostics(cl_reported_cnt_auto).to_frame(origin_as_datetime=False).T\n", + ")\n", + "\n", + "exhibit_ii_s4 = pd.DataFrame(\n", + " {\n", + " \"Age (2)\": ages,\n", + " \"Reported (3)\": md_reported_cnt[\"Latest\"].values,\n", + " \"CDF to Ultimate(4)\": md_reported_cnt[\"CDF\"].values,\n", + " \"Projected Ultimate CLaim Counts (5)\": md_reported_cnt[\"Ultimate\"].values,\n", + " },\n", + " index=md_reported_cnt.index,\n", + ").reset_index()\n", + "display(exhibit_ii_s4)\n", + "display(exhibit_ii_s4[[\"Reported (3)\", \"Projected Ultimate CLaim Counts (5)\"]].sum().to_frame(\"Total\").T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b89d6a0", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 4 — reconcile to Friedland PDF p307\n", + "assert np.allclose(\n", + " exhibit_ii_s4[\"Ult (5)\"],\n", + " [7821, 8682, 9945, 9690, 9591, 7803, 8050, 7466],\n", + " atol=2,\n", + ")\n", + "assert np.isclose(exhibit_ii_s4[\"Reported (3)\"].sum(), 67430, atol=1)\n", + "assert np.isclose(exhibit_ii_s4[\"Ult (5)\"].sum(), 69047, atol=2)\n" + ] + }, + { + "cell_type": "markdown", + "id": "528afc31", + "metadata": {}, + "source": [ + "## P308 (Exhibit II Sheet 5)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "72465e11", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496Ult
19690.5220.8460.9200.9580.9810.9910.9960.9987821.000
19700.5100.8330.9100.9550.9780.9910.996NaN8682.000
19710.4940.8220.9120.9570.9810.991NaNNaN9945.000
19720.4640.8090.9030.9550.977NaNNaNNaN9689.680
19730.4610.7990.9030.948NaNNaNNaNNaN9590.686
19740.4470.7960.886NaNNaNNaNNaNNaN7802.928
19750.4370.773NaNNaNNaNNaNNaNNaN8049.564
19760.433NaNNaNNaNNaNNaNNaNNaN7466.415
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 Ult\n", + "1969 0.522 0.846 0.920 0.958 0.981 0.991 0.996 0.998 7821.000\n", + "1970 0.510 0.833 0.910 0.955 0.978 0.991 0.996 NaN 8682.000\n", + "1971 0.494 0.822 0.912 0.957 0.981 0.991 NaN NaN 9945.000\n", + "1972 0.464 0.809 0.903 0.955 0.977 NaN NaN NaN 9689.680\n", + "1973 0.461 0.799 0.903 0.948 NaN NaN NaN NaN 9590.686\n", + "1974 0.447 0.796 0.886 NaN NaN NaN NaN NaN 7802.928\n", + "1975 0.437 0.773 NaN NaN NaN NaN NaN NaN 8049.564\n", + "1976 0.433 NaN NaN NaN NaN NaN NaN NaN 7466.415" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19690.4330.7730.8860.9480.9770.9910.9960.998
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 0.433 0.773 0.886 0.948 0.977 0.991 0.996 0.998" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19693383.06049.06932.07415.07643.07750.07789.07806.0
19703756.06715.07695.08231.08484.08603.08647.0NaN
19714302.07692.08815.09429.09719.09855.0NaNNaN
19724192.07495.08588.09187.09469.0NaNNaNNaN
19734149.07418.08501.09093.0NaNNaNNaNNaN
19743376.06035.06916.0NaNNaNNaNNaNNaN
19753482.06226.0NaNNaNNaNNaNNaNNaN
19763230.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 3383.0 6049.0 6932.0 7415.0 7643.0 7750.0 7789.0 7806.0\n", + "1970 3756.0 6715.0 7695.0 8231.0 8484.0 8603.0 8647.0 NaN\n", + "1971 4302.0 7692.0 8815.0 9429.0 9719.0 9855.0 NaN NaN\n", + "1972 4192.0 7495.0 8588.0 9187.0 9469.0 NaN NaN NaN\n", + "1973 4149.0 7418.0 8501.0 9093.0 NaN NaN NaN NaN\n", + "1974 3376.0 6035.0 6916.0 NaN NaN NaN NaN NaN\n", + "1975 3482.0 6226.0 NaN NaN NaN NaN NaN NaN\n", + "1976 3230.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bs_auto = cl.BerquistSherman(\n", + " paid_amount=\"Paid Claims\",\n", + " incurred_amount=\"Paid Claims\", # actual incurred data is not available, using paid only as a placeholder, it's not used for the closed-count adjustment\n", + " reported_count=\"Reported Claim Counts\",\n", + " closed_count=\"Closed Claim Counts\",\n", + " reported_count_estimator=cl.Pipeline(\n", + " [\n", + " (\n", + " \"dev\",\n", + " cl.DevelopmentConstant(\n", + " patterns=age_to_cdf_reported_cnt, style=\"cdf\"\n", + " ),\n", + " ),\n", + " (\"cl\", cl.Chainladder()),\n", + " ]\n", + " ),\n", + ").fit(auto)\n", + "\n", + "exhibit_ii_s5_disp = np.round(\n", + " bs_auto.disposal_rate_.to_frame(origin_as_datetime=False), 3\n", + ")\n", + "exhibit_ii_s5_disp[\"Ult\"] = exhibit_ii_s4[\"Projected Ultimate CLaim Counts (5)\"].values\n", + "display(exhibit_ii_s5_disp)\n", + "\n", + "sel_disp = bs_auto.disposal_rate_\n", + "display(\n", + " np.round(\n", + " sel_disp[sel_disp.valuation == auto.valuation_date]\n", + " .mean(\"origin\")\n", + " .to_frame(origin_as_datetime=False),\n", + " 3,\n", + " )\n", + ")\n", + "\n", + "adj_closed_auto = bs_auto.adjusted_triangle_[\"Closed Claim Counts\"]\n", + "display(np.round(adj_closed_auto.to_frame(origin_as_datetime=False)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ffa976f", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 5 — reconcile to Friedland PDF p308\n", + "adj_closed = np.round(adj_closed_auto.to_frame(origin_as_datetime=False))\n", + "assert np.allclose(\n", + " adj_closed,\n", + " [\n", + " [3383, 6049, 6932, 7415, 7643, 7750, 7789, 7806],\n", + " [3756, 6715, 7695, 8231, 8484, 8603, 8647, np.nan],\n", + " [4302, 7692, 8815, 9429, 9719, 9855, np.nan, np.nan],\n", + " [4192, 7495, 8588, 9187, 9469, np.nan, np.nan, np.nan],\n", + " [4149, 7418, 8501, 9093, np.nan, np.nan, np.nan, np.nan],\n", + " [3376, 6035, 6916, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [3482, 6226, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " [3230, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],\n", + " ],\n", + " equal_nan=True,\n", + " atol=2,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "d57ea938", + "metadata": {}, + "source": [ + "## P309 (Exhibit II Sheet 6)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16fdc050", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
196919701971
Closed (X)Paid (Y)PredictedClosed (X)Paid (Y)PredictedClosed (X)Paid (Y)Predicted
124079.01904.01850.04429.02235.02184.04914.02441.02404.0
246616.05398.05885.07230.06261.06715.08174.07348.07722.0
367192.07496.07653.07899.08691.08781.09068.010662.010634.0
487494.08882.08783.08291.010443.010275.09518.012655.012493.0
607670.09712.09518.08494.011346.011147.09761.013748.013628.0
727749.010071.09867.08606.011754.011659.09855.014235.014095.0
847792.010199.010062.08647.012031.011852.0NaNNaNNaN
967806.010256.010127.0NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 1969 1970 1971 \\\n", + " Closed (X) Paid (Y) Predicted Closed (X) Paid (Y) Predicted Closed (X) \n", + "12 4079.0 1904.0 1850.0 4429.0 2235.0 2184.0 4914.0 \n", + "24 6616.0 5398.0 5885.0 7230.0 6261.0 6715.0 8174.0 \n", + "36 7192.0 7496.0 7653.0 7899.0 8691.0 8781.0 9068.0 \n", + "48 7494.0 8882.0 8783.0 8291.0 10443.0 10275.0 9518.0 \n", + "60 7670.0 9712.0 9518.0 8494.0 11346.0 11147.0 9761.0 \n", + "72 7749.0 10071.0 9867.0 8606.0 11754.0 11659.0 9855.0 \n", + "84 7792.0 10199.0 10062.0 8647.0 12031.0 11852.0 NaN \n", + "96 7806.0 10256.0 10127.0 NaN NaN NaN NaN \n", + "\n", + " \n", + " Paid (Y) Predicted \n", + "12 2441.0 2404.0 \n", + "24 7348.0 7722.0 \n", + "36 10662.0 10634.0 \n", + "48 12655.0 12493.0 \n", + "60 13748.0 13628.0 \n", + "72 14235.0 14095.0 \n", + "84 NaN NaN \n", + "96 NaN NaN " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
196919701971
R Squared0.9957300.9970900.998660
a287.742000369.685000413.901000
b0.0004560.0004010.000358
\n", + "
" + ], + "text/plain": [ + " 1969 1970 1971\n", + "R Squared 0.995730 0.997090 0.998660\n", + "a 287.742000 369.685000 413.901000\n", + "b 0.000456 0.000401 0.000358" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# This calculation falls outside of the scope of this package\n", + "from scipy.stats import linregress\n", + "\n", + "closed_df = closed_auto.to_frame(origin_as_datetime=False)\n", + "paid_df = paid_auto.to_frame(origin_as_datetime=False)\n", + "closed_df.index = [int(getattr(i, \"year\", i)) for i in closed_df.index]\n", + "paid_df.index = [int(getattr(i, \"year\", i)) for i in paid_df.index]\n", + "\n", + "parts = {}\n", + "params = {\"R Squared\": {}, \"a\": {}, \"b\": {}}\n", + "for ay in [1969, 1970, 1971]:\n", + " x = closed_df.loc[ay]\n", + " y = paid_df.loc[ay]\n", + " m = x.notna() & y.notna()\n", + " fit = linregress(x[m].astype(float), np.log(y[m].astype(float)))\n", + " a = np.exp(fit.intercept)\n", + " b = fit.slope\n", + " parts[ay] = pd.DataFrame(\n", + " {\n", + " \"Closed (X)\": x,\n", + " \"Paid (Y)\": y,\n", + " \"Predicted\": np.round(a * np.exp(b * x)),\n", + " }\n", + " )\n", + " params[\"R Squared\"][ay] = np.round(fit.rvalue ** 2, 5)\n", + " params[\"a\"][ay] = np.round(a, 3)\n", + " params[\"b\"][ay] = np.round(b, 6)\n", + "\n", + "display(pd.concat(parts, axis=1))\n", + "display(pd.DataFrame(params).T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "08e9f938", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 6 — reconcile to Friedland PDF p309\n", + "params_df = pd.DataFrame(params).T\n", + "assert np.allclose(params_df.loc[\"R Squared\"], [0.99573, 0.99709, 0.99866], atol=0.0005)\n", + "assert np.allclose(params_df.loc[\"a\"], [287.742, 369.685, 413.901], atol=0.5)\n", + "assert np.allclose(params_df.loc[\"b\"], [0.000456, 0.000401, 0.000358], atol=1e-6)\n" + ] + }, + { + "cell_type": "markdown", + "id": "6786ca64", + "metadata": {}, + "source": [ + "## P310 (Exhibit II Sheet 7)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5baf25e0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19694079.06616.07192.07494.07670.07749.07792.07806.0
19704429.07230.07899.08291.08494.08606.08647.0NaN
19714914.08174.09068.09518.09761.09855.0NaNNaN
19724497.07842.08747.09254.09469.0NaNNaNNaN
19734419.07665.08659.09093.0NaNNaNNaNNaN
19743486.06214.06916.0NaNNaNNaNNaNNaN
19753516.06226.0NaNNaNNaNNaNNaNNaN
19763230.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 4079.0 6616.0 7192.0 7494.0 7670.0 7749.0 7792.0 7806.0\n", + "1970 4429.0 7230.0 7899.0 8291.0 8494.0 8606.0 8647.0 NaN\n", + "1971 4914.0 8174.0 9068.0 9518.0 9761.0 9855.0 NaN NaN\n", + "1972 4497.0 7842.0 8747.0 9254.0 9469.0 NaN NaN NaN\n", + "1973 4419.0 7665.0 8659.0 9093.0 NaN NaN NaN NaN\n", + "1974 3486.0 6214.0 6916.0 NaN NaN NaN NaN NaN\n", + "1975 3516.0 6226.0 NaN NaN NaN NaN NaN NaN\n", + "1976 3230.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19691904.05398.07496.08882.09712.010071.010199.010256.0
19702235.06261.08691.010443.011346.011754.012031.0NaN
19712441.07348.010662.012655.013748.014235.0NaNNaN
19722503.08173.011810.014176.015383.0NaNNaNNaN
19732838.08712.012728.015278.0NaNNaNNaNNaN
19742405.07858.011771.0NaNNaNNaNNaNNaN
19752759.09182.0NaNNaNNaNNaNNaNNaN
19762801.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 1904.0 5398.0 7496.0 8882.0 9712.0 10071.0 10199.0 10256.0\n", + "1970 2235.0 6261.0 8691.0 10443.0 11346.0 11754.0 12031.0 NaN\n", + "1971 2441.0 7348.0 10662.0 12655.0 13748.0 14235.0 NaN NaN\n", + "1972 2503.0 8173.0 11810.0 14176.0 15383.0 NaN NaN NaN\n", + "1973 2838.0 8712.0 12728.0 15278.0 NaN NaN NaN NaN\n", + "1974 2405.0 7858.0 11771.0 NaN NaN NaN NaN NaN\n", + "1975 2759.0 9182.0 NaN NaN NaN NaN NaN NaN\n", + "1976 2801.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12243648607284
1969356.0124.0132.0198.0286.01034.0459.0
1970438.0181.0215.0353.0778.088.0NaN
1971464.0244.0337.0493.0370.0NaNNaN
1972510.0337.0506.0421.0NaNNaNNaN
1973616.0468.0333.0NaNNaNNaNNaN
1974530.0220.0NaNNaNNaNNaNNaN
1975580.0NaNNaNNaNNaNNaNNaN
1976NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84\n", + "1969 356.0 124.0 132.0 198.0 286.0 1034.0 459.0\n", + "1970 438.0 181.0 215.0 353.0 778.0 88.0 NaN\n", + "1971 464.0 244.0 337.0 493.0 370.0 NaN NaN\n", + "1972 510.0 337.0 506.0 421.0 NaN NaN NaN\n", + "1973 616.0 468.0 333.0 NaN NaN NaN NaN\n", + "1974 530.0 220.0 NaN NaN NaN NaN NaN\n", + "1975 580.0 NaN NaN NaN NaN NaN NaN\n", + "1976 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12243648607284
19690.0004110.0005700.0005620.0005080.0004590.0002940.000398
19700.0003680.0004900.0004680.0004090.0003150.000568NaN
19710.0003380.0004160.0003810.0003410.000370NaNNaN
19720.0003540.0004070.0003600.000380NaNNaNNaN
19730.0003460.0003810.000421NaNNaNNaNNaN
19740.0004340.000576NaNNaNNaNNaNNaN
19750.000444NaNNaNNaNNaNNaNNaN
1976NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84\n", + "1969 0.000411 0.000570 0.000562 0.000508 0.000459 0.000294 0.000398\n", + "1970 0.000368 0.000490 0.000468 0.000409 0.000315 0.000568 NaN\n", + "1971 0.000338 0.000416 0.000381 0.000341 0.000370 NaN NaN\n", + "1972 0.000354 0.000407 0.000360 0.000380 NaN NaN NaN\n", + "1973 0.000346 0.000381 0.000421 NaN NaN NaN NaN\n", + "1974 0.000434 0.000576 NaN NaN NaN NaN NaN\n", + "1975 0.000444 NaN NaN NaN NaN NaN NaN\n", + "1976 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19693383.06049.06932.07415.07643.07750.07789.07806.0
19703756.06715.07695.08231.08484.08603.08647.0NaN
19714302.07692.08815.09429.09719.09855.0NaNNaN
19724192.07495.08588.09187.09469.0NaNNaNNaN
19734149.07418.08501.09093.0NaNNaNNaNNaN
19743376.06035.06916.0NaNNaNNaNNaNNaN
19753482.06226.0NaNNaNNaNNaNNaNNaN
19763230.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 3383.0 6049.0 6932.0 7415.0 7643.0 7750.0 7789.0 7806.0\n", + "1970 3756.0 6715.0 7695.0 8231.0 8484.0 8603.0 8647.0 NaN\n", + "1971 4302.0 7692.0 8815.0 9429.0 9719.0 9855.0 NaN NaN\n", + "1972 4192.0 7495.0 8588.0 9187.0 9469.0 NaN NaN NaN\n", + "1973 4149.0 7418.0 8501.0 9093.0 NaN NaN NaN NaN\n", + "1974 3376.0 6035.0 6916.0 NaN NaN NaN NaN NaN\n", + "1975 3482.0 6226.0 NaN NaN NaN NaN NaN NaN\n", + "1976 3230.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19691904.05398.07496.08882.09712.010071.010199.010256.0
19702235.06261.08691.010443.011346.011754.012031.0NaN
19712441.07348.010662.012655.013748.014235.0NaNNaN
19722503.08173.011810.014176.015383.0NaNNaNNaN
19732838.08712.012728.015278.0NaNNaNNaNNaN
19742405.07858.011771.0NaNNaNNaNNaNNaN
19752759.09182.0NaNNaNNaNNaNNaNNaN
19762801.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 1904.0 5398.0 7496.0 8882.0 9712.0 10071.0 10199.0 10256.0\n", + "1970 2235.0 6261.0 8691.0 10443.0 11346.0 11754.0 12031.0 NaN\n", + "1971 2441.0 7348.0 10662.0 12655.0 13748.0 14235.0 NaN NaN\n", + "1972 2503.0 8173.0 11810.0 14176.0 15383.0 NaN NaN NaN\n", + "1973 2838.0 8712.0 12728.0 15278.0 NaN NaN NaN NaN\n", + "1974 2405.0 7858.0 11771.0 NaN NaN NaN NaN NaN\n", + "1975 2759.0 9182.0 NaN NaN NaN NaN NaN NaN\n", + "1976 2801.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "adj_paid_auto = bs_auto.adjusted_triangle_[\"Paid Claims\"]\n", + "\n", + "display(closed_auto.to_frame(origin_as_datetime=False))\n", + "display(paid_auto.to_frame(origin_as_datetime=False))\n", + "\n", + "# Two-point exponential a, b between consecutive ages (same formulas as BerquistSherman).\n", + "# The estimator then looks these up onto adjusted closed counts; a_ and b_ are those looked-up values.\n", + "x = closed_auto.to_frame(origin_as_datetime=False)\n", + "y = paid_auto.to_frame(origin_as_datetime=False)\n", + "x0, x1 = x.values[:, :-1], x.values[:, 1:]\n", + "y0, y1 = np.log(y.values[:, :-1]), np.log(y.values[:, 1:])\n", + "\n", + "b = ((x0 * y0 + x1 * y1) / 2 - (x0 + x1) / 2 * (y0 + y1) / 2) / (\n", + " (x0 ** 2 + x1 ** 2) / 2 - ((x0 + x1) / 2) ** 2\n", + ")\n", + "a = np.exp((y0 + y1) / 2 - b * (x0 + x1) / 2)\n", + "\n", + "pair_ages = list(x.columns[:-1])\n", + "\n", + "display(pd.DataFrame(np.round(a), index=x.index, columns=pair_ages))\n", + "display(pd.DataFrame(np.round(b, 6), index=x.index, columns=pair_ages))\n", + "\n", + "display(np.round(adj_closed_auto.to_frame(origin_as_datetime=False)))\n", + "display(np.round(adj_paid_auto.to_frame(origin_as_datetime=False)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18337f71", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 7 — reconcile to Friedland PDF p310\n", + "# Two-point a is stored on the earlier age of each pair (12 for the 12-24 fit).\n", + "assert np.isclose(np.round(a)[0, 0], 356, atol=1)\n", + "assert np.isclose(np.round(b, 6)[0, 0], 0.000411, atol=1e-6)\n", + "assert np.isclose(np.round(a)[1, 2], 215, atol=1)\n", + "assert np.isclose(np.round(b, 6)[1, 2], 0.000468, atol=1e-6)\n", + "assert np.allclose(\n", + " np.round(adj_closed_auto.to_frame(origin_as_datetime=False)).iloc[0].astype(float),\n", + " [3383, 6049, 6932, 7415, 7643, 7750, 7789, 7806],\n", + " atol=2,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "347ba2e6", + "metadata": {}, + "source": [ + "## P311 (Exhibit II Sheet 8)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2b71c0e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496
19691431.04277.06463.08497.09579.010075.010191.010256.0
19701745.05181.07865.010156.011301.011744.012031.0NaN
19711985.06243.09594.012233.013550.014235.0NaNNaN
19722247.07228.011072.013837.015383.0NaNNaNNaN
19732585.07999.011982.015278.0NaNNaNNaNNaN
19742292.07271.011771.0NaNNaNNaNNaNNaN
19752718.09182.0NaNNaNNaNNaNNaNNaN
19762801.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96\n", + "1969 1431.0 4277.0 6463.0 8497.0 9579.0 10075.0 10191.0 10256.0\n", + "1970 1745.0 5181.0 7865.0 10156.0 11301.0 11744.0 12031.0 NaN\n", + "1971 1985.0 6243.0 9594.0 12233.0 13550.0 14235.0 NaN NaN\n", + "1972 2247.0 7228.0 11072.0 13837.0 15383.0 NaN NaN NaN\n", + "1973 2585.0 7999.0 11982.0 15278.0 NaN NaN NaN NaN\n", + "1974 2292.0 7271.0 11771.0 NaN NaN NaN NaN NaN\n", + "1975 2718.0 9182.0 NaN NaN NaN NaN NaN NaN\n", + "1976 2801.0 NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
19692.9891.5111.3151.1271.0521.0121.006
19702.9691.5181.2911.1131.0391.024NaN
19713.1451.5371.2751.1081.051NaNNaN
19723.2171.5321.2501.112NaNNaNNaN
19733.0941.4981.275NaNNaNNaNNaN
19743.1721.619NaNNaNNaNNaNNaN
19753.378NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "1969 2.989 1.511 1.315 1.127 1.052 1.012 1.006\n", + "1970 2.969 1.518 1.291 1.113 1.039 1.024 NaN\n", + "1971 3.145 1.537 1.275 1.108 1.051 NaN NaN\n", + "1972 3.217 1.532 1.250 1.112 NaN NaN NaN\n", + "1973 3.094 1.498 1.275 NaN NaN NaN NaN\n", + "1974 3.172 1.619 NaN NaN NaN NaN NaN\n", + "1975 3.378 NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
Simple All Years3.1381.5361.2811.1151.0471.0181.006
Simple Latest 43.2151.5461.2731.1151.0471.0181.006
Volume All Years3.1581.5381.2771.1141.0471.0181.006
Volume Latest 43.2191.5451.2711.1141.0471.0181.006
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "Simple All Years 3.138 1.536 1.281 1.115 1.047 1.018 1.006\n", + "Simple Latest 4 3.215 1.546 1.273 1.115 1.047 1.018 1.006\n", + "Volume All Years 3.158 1.538 1.277 1.114 1.047 1.018 1.006\n", + "Volume Latest 4 3.219 1.545 1.271 1.114 1.047 1.018 1.006" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-9696-108
Unadj Selected3.0981.4441.1961.0871.0361.0191.0061.0
Adj Selected3.1581.5381.2771.1141.0471.0181.0061.0
CDF to Ultimate7.4092.3461.5251.1941.0721.0241.0061.0
Percent Paid0.1350.4260.6560.8380.9330.9770.9941.0
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108\n", + "Unadj Selected 3.098 1.444 1.196 1.087 1.036 1.019 1.006 1.0\n", + "Adj Selected 3.158 1.538 1.277 1.114 1.047 1.018 1.006 1.0\n", + "CDF to Ultimate 7.409 2.346 1.525 1.194 1.072 1.024 1.006 1.0\n", + "Percent Paid 0.135 0.426 0.656 0.838 0.933 0.977 0.994 1.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "adj_paid_auto = (\n", + " adj_closed_auto * 0 + np.exp(adj_closed_auto.values * bs_auto.b_) * bs_auto.a_\n", + ")\n", + "adj_paid_auto = (\n", + " paid_auto[paid_auto.valuation == paid_auto.valuation_date]\n", + " + adj_paid_auto[adj_paid_auto.valuation < adj_paid_auto.valuation_date]\n", + ")\n", + "\n", + "# Part 1: Data Triangle\n", + "display(np.round(adj_paid_auto.to_frame(origin_as_datetime=False)))\n", + "\n", + "# Part 2: Age-to-age factors\n", + "display(np.round(adj_paid_auto.link_ratio.to_frame(origin_as_datetime=False), 3))\n", + "\n", + "# Part 3\n", + "avg_params = {\n", + " \"Simple All Years\": {\"average\": \"simple\"},\n", + " \"Simple Latest 4\": {\"average\": \"simple\", \"n_periods\": 4},\n", + " \"Volume All Years\": {\"average\": \"volume\"},\n", + " \"Volume Latest 4\": {\"average\": \"volume\", \"n_periods\": 4},\n", + "}\n", + "devs = {k: cl.Development(**v).fit(adj_paid_auto) for k, v in avg_params.items()}\n", + "display(\n", + " np.round(\n", + " pd.concat(\n", + " [v.ldf_.to_frame().rename(index={\"(All)\": k}) for k, v in devs.items()]\n", + " ),\n", + " 3,\n", + " )\n", + ")\n", + "dev_adj_paid_auto = devs[\"Volume All Years\"]\n", + "\n", + "# Part 4\n", + "selected_ldf = {\n", + " 12: 3.158,\n", + " 24: 1.538,\n", + " 36: 1.277,\n", + " 48: 1.114,\n", + " 60: 1.047,\n", + " 72: 1.018,\n", + " 84: 1.006,\n", + " 96: 1.000,\n", + "}\n", + "# or this\n", + "avg_ldf = np.round(dev_adj_paid_auto.ldf_.to_frame().values.flatten(), 3)\n", + "selected_ldf = dict(zip([12, 24, 36, 48, 60, 72, 84, 96], [*avg_ldf, 1.000]))\n", + "\n", + "adj_paid_auto_dev = cl.DevelopmentConstant(patterns=selected_ldf, style=\"ldf\").fit(\n", + " adj_paid_auto\n", + ")\n", + "cdf = np.round(adj_paid_auto_dev.cdf_.to_frame().values.flatten(), 3)\n", + "pct_paid = np.round(1.0 / cdf, 3)\n", + "\n", + "exhibit_ii_s8_sel = pd.DataFrame(\n", + " {\n", + " \"Unadj Selected\": list(exhibit_ii_s1_sel[\"Selected\"]),\n", + " \"Adj Selected\": list(selected_ldf.values()),\n", + " \"CDF to Ultimate\": cdf,\n", + " \"Percent Paid\": pct_paid,\n", + " },\n", + " index=[\"12-24\", \"24-36\", \"36-48\", \"48-60\", \"60-72\", \"72-84\", \"84-96\", \"96-108\"],\n", + ")\n", + "display(exhibit_ii_s8_sel.T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32dd0a9e", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 8 — reconcile to Friedland PDF p311\n", + "assert np.allclose(\n", + " np.round(adj_paid_auto.to_frame(origin_as_datetime=False)).iloc[0, :3].astype(float),\n", + " [1431, 4277, 6463],\n", + " atol=2,\n", + ")\n", + "assert np.allclose(\n", + " np.round(devs[\"Simple All Years\"].ldf_.to_frame().values.flatten(), 3),\n", + " [3.138, 1.536, 1.281, 1.115, 1.047, 1.018, 1.006],\n", + ")\n", + "assert np.allclose(\n", + " np.round(devs[\"Simple Latest 4\"].ldf_.to_frame().values.flatten(), 3),\n", + " [3.215, 1.546, 1.273, 1.115, 1.047, 1.018, 1.006],\n", + ")\n", + "assert np.allclose(\n", + " np.round(devs[\"Volume All Years\"].ldf_.to_frame().values.flatten(), 3),\n", + " [3.158, 1.538, 1.277, 1.114, 1.047, 1.018, 1.006],\n", + ")\n", + "assert np.allclose(\n", + " np.round(devs[\"Volume Latest 4\"].ldf_.to_frame().values.flatten(), 3),\n", + " [3.219, 1.545, 1.271, 1.114, 1.047, 1.018, 1.006],\n", + ")\n", + "assert np.allclose(\n", + " exhibit_ii_s8_sel[\"Unadj Selected\"],\n", + " exhibit_ii_s1_sel[\"Selected\"],\n", + ")\n", + "assert np.allclose(\n", + " exhibit_ii_s8_sel[\"CDF to Ultimate\"],\n", + " [7.416, 2.348, 1.527, 1.195, 1.073, 1.025, 1.006, 1.000],\n", + " atol=0.01,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "f4a06aad", + "metadata": {}, + "source": [ + "## P312 (Exhibit II Sheet 9)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22434607", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
19692.9891.5111.3151.1271.0521.0121.006
19702.9691.5181.2911.1131.0391.024NaN
19713.1451.5371.2751.1081.051NaNNaN
19723.2171.5321.2501.112NaNNaNNaN
19733.0941.4981.275NaNNaNNaNNaN
19743.1721.619NaNNaNNaNNaNNaN
19753.378NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "1969 2.989 1.511 1.315 1.127 1.052 1.012 1.006\n", + "1970 2.969 1.518 1.291 1.113 1.039 1.024 NaN\n", + "1971 3.145 1.537 1.275 1.108 1.051 NaN NaN\n", + "1972 3.217 1.532 1.250 1.112 NaN NaN NaN\n", + "1973 3.094 1.498 1.275 NaN NaN NaN NaN\n", + "1974 3.172 1.619 NaN NaN NaN NaN NaN\n", + "1975 3.378 NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-72
Intercept-104.0100-25.080025.050011.36002.2100
Slope0.05430.0135-0.0121-0.0052-0.0006
R-Squared0.70300.34400.63700.61000.0070
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72\n", + "Intercept -104.0100 -25.0800 25.0500 11.3600 2.2100\n", + "Slope 0.0543 0.0135 -0.0121 -0.0052 -0.0006\n", + "R-Squared 0.7030 0.3440 0.6370 0.6100 0.0070" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96To UltCDF to Ultimate
19692.9891.5111.3151.1271.0521.0121.0061.01.000
19702.9691.5181.2911.1131.0391.0241.0061.01.006
19713.1451.5371.2751.1081.0511.0181.0061.01.024
19723.2171.5321.2501.1121.0471.0181.0061.01.072
19733.0941.4981.2751.1021.0471.0181.0061.01.181
19743.1721.6191.2451.0971.0471.0181.0061.01.464
19753.3781.5831.2331.0911.0471.0181.0061.02.284
19763.3551.5961.2211.0861.0471.0181.0061.07.617
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 To Ult CDF to Ultimate\n", + "1969 2.989 1.511 1.315 1.127 1.052 1.012 1.006 1.0 1.000\n", + "1970 2.969 1.518 1.291 1.113 1.039 1.024 1.006 1.0 1.006\n", + "1971 3.145 1.537 1.275 1.108 1.051 1.018 1.006 1.0 1.024\n", + "1972 3.217 1.532 1.250 1.112 1.047 1.018 1.006 1.0 1.072\n", + "1973 3.094 1.498 1.275 1.102 1.047 1.018 1.006 1.0 1.181\n", + "1974 3.172 1.619 1.245 1.097 1.047 1.018 1.006 1.0 1.464\n", + "1975 3.378 1.583 1.233 1.091 1.047 1.018 1.006 1.0 2.284\n", + "1976 3.355 1.596 1.221 1.086 1.047 1.018 1.006 1.0 7.617" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from scipy.stats import linregress\n", + "\n", + "ata = adj_paid_auto.link_ratio.to_frame(origin_as_datetime=False)\n", + "ata.index = [int(getattr(i, \"year\", i)) for i in ata.index]\n", + "display(np.round(ata, 3))\n", + "\n", + "fits = {}\n", + "for col in ata.columns:\n", + " s = ata[col].dropna()\n", + " if len(s) < 3:\n", + " continue\n", + " fits[col] = linregress(s.index.astype(float), s.astype(float))\n", + "\n", + "exhibit_ii_s9_fit = pd.DataFrame(\n", + " {\n", + " col: {\n", + " \"Intercept\": np.round(fit.intercept, 2),\n", + " \"Slope\": np.round(fit.slope, 4),\n", + " \"R-Squared\": np.round(fit.rvalue ** 2, 3),\n", + " }\n", + " for col, fit in fits.items()\n", + " }\n", + ")\n", + "display(exhibit_ii_s9_fit)\n", + "\n", + "years = list(range(ata.index.min(), ata.index.max() + 2))\n", + "completed = ata.reindex(years)\n", + "vol_sel = exhibit_ii_s8_sel[\"Adj Selected\"]\n", + "for col in completed.columns:\n", + " for yr in years:\n", + " if pd.isna(completed.loc[yr, col]):\n", + " if col in fits and ata[col].notna().sum() >= 4:\n", + " completed.loc[yr, col] = fits[col].intercept + fits[col].slope * yr\n", + " else:\n", + " completed.loc[yr, col] = vol_sel[col]\n", + "\n", + "completed[\"To Ult\"] = 1.000\n", + "n_orig = len(years)\n", + "completed[\"CDF to Ultimate\"] = [\n", + " completed.loc[yr].iloc[(n_orig - 1 - i) :].prod() for i, yr in enumerate(years)\n", + "]\n", + "display(np.round(completed, 3))\n", + "exhibit_ii_s9 = completed\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6411d7e8", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 9 — reconcile to Friedland PDF p312\n", + "assert np.allclose(exhibit_ii_s9_fit.loc[\"Intercept\"], [-104.01, -25.08, 25.05, 11.36, 2.21], atol=0.05)\n", + "assert np.allclose(exhibit_ii_s9_fit.loc[\"Slope\"], [0.0543, 0.0135, -0.0121, -0.0052, -0.0006], atol=0.0002)\n", + "assert np.allclose(exhibit_ii_s9_fit.loc[\"R-Squared\"], [0.703, 0.344, 0.637, 0.610, 0.007], atol=0.005)\n", + "assert np.allclose(\n", + " np.round(exhibit_ii_s9[\"CDF to Ultimate\"], 3),\n", + " [1.000, 1.006, 1.024, 1.073, 1.182, 1.465, 2.285, 7.621],\n", + " atol=0.01,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "e40487ad", + "metadata": {}, + "source": [ + "## P313 (Exhibit II Sheet 10)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8833d7a2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96
19692.9891.5111.3151.1271.0521.0121.006
19702.9691.5181.2911.1131.0391.024NaN
19713.1451.5371.2751.1081.051NaNNaN
19723.2171.5321.2501.112NaNNaNNaN
19733.0941.4981.275NaNNaNNaNNaN
19743.1721.619NaNNaNNaNNaNNaN
19753.378NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96\n", + "1969 2.989 1.511 1.315 1.127 1.052 1.012 1.006\n", + "1970 2.969 1.518 1.291 1.113 1.039 1.024 NaN\n", + "1971 3.145 1.537 1.275 1.108 1.051 NaN NaN\n", + "1972 3.217 1.532 1.250 1.112 NaN NaN NaN\n", + "1973 3.094 1.498 1.275 NaN NaN NaN NaN\n", + "1974 3.172 1.619 NaN NaN NaN NaN NaN\n", + "1975 3.378 NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-72
Constant0.00000.00001.354837e+0810606.00003.0000
Growth1.01741.00869.907000e-010.99540.9994
R-Squared0.70600.34006.330000e-010.61000.0070
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72\n", + "Constant 0.0000 0.0000 1.354837e+08 10606.0000 3.0000\n", + "Growth 1.0174 1.0086 9.907000e-01 0.9954 0.9994\n", + "R-Squared 0.7060 0.3400 6.330000e-01 0.6100 0.0070" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12-2424-3636-4848-6060-7272-8484-96To UltCDF to Ultimate
19692.9891.5111.3151.1271.0521.0121.0061.01.000
19702.9691.5181.2911.1131.0391.0241.0061.01.006
19713.1451.5371.2751.1081.0511.0181.0061.01.024
19723.2171.5321.2501.1121.0471.0181.0061.01.072
19733.0941.4981.2751.1021.0471.0181.0061.01.182
19743.1721.6191.2451.0971.0471.0181.0061.01.465
19753.3781.5821.2341.0921.0471.0181.0061.02.285
19763.3591.5961.2221.0871.0471.0181.0061.07.634
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 To Ult CDF to Ultimate\n", + "1969 2.989 1.511 1.315 1.127 1.052 1.012 1.006 1.0 1.000\n", + "1970 2.969 1.518 1.291 1.113 1.039 1.024 1.006 1.0 1.006\n", + "1971 3.145 1.537 1.275 1.108 1.051 1.018 1.006 1.0 1.024\n", + "1972 3.217 1.532 1.250 1.112 1.047 1.018 1.006 1.0 1.072\n", + "1973 3.094 1.498 1.275 1.102 1.047 1.018 1.006 1.0 1.182\n", + "1974 3.172 1.619 1.245 1.097 1.047 1.018 1.006 1.0 1.465\n", + "1975 3.378 1.582 1.234 1.092 1.047 1.018 1.006 1.0 2.285\n", + "1976 3.359 1.596 1.222 1.087 1.047 1.018 1.006 1.0 7.634" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from scipy.stats import linregress\n", + "\n", + "ata = adj_paid_auto.link_ratio.to_frame(origin_as_datetime=False)\n", + "ata.index = [int(getattr(i, \"year\", i)) for i in ata.index]\n", + "display(np.round(ata, 3))\n", + "\n", + "fits = {}\n", + "for col in ata.columns:\n", + " s = ata[col].dropna()\n", + " if len(s) < 3:\n", + " continue\n", + " fits[col] = linregress(s.index.astype(float), np.log(s.astype(float)))\n", + "\n", + "exhibit_ii_s10_fit = pd.DataFrame(\n", + " {\n", + " col: {\n", + " \"Constant\": 0 if np.exp(fit.intercept) < 1 else int(np.round(np.exp(fit.intercept))),\n", + " \"Growth\": np.round(np.exp(fit.slope), 4),\n", + " \"R-Squared\": np.round(fit.rvalue ** 2, 3),\n", + " }\n", + " for col, fit in fits.items()\n", + " }\n", + ")\n", + "display(exhibit_ii_s10_fit)\n", + "\n", + "years = list(range(ata.index.min(), ata.index.max() + 2))\n", + "completed = ata.reindex(years)\n", + "vol_sel = exhibit_ii_s8_sel[\"Adj Selected\"]\n", + "for col in completed.columns:\n", + " for yr in years:\n", + " if pd.isna(completed.loc[yr, col]):\n", + " if col in fits and ata[col].notna().sum() >= 4:\n", + " completed.loc[yr, col] = np.exp(fits[col].intercept + fits[col].slope * yr)\n", + " else:\n", + " completed.loc[yr, col] = vol_sel[col]\n", + "\n", + "completed[\"To Ult\"] = 1.000\n", + "n_orig = len(years)\n", + "completed[\"CDF to Ultimate\"] = [\n", + " completed.loc[yr].iloc[(n_orig - 1 - i) :].prod() for i, yr in enumerate(years)\n", + "]\n", + "display(np.round(completed, 3))\n", + "exhibit_ii_s10 = completed\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "562d99fe", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 10 — reconcile to Friedland PDF p313\n", + "assert np.allclose(exhibit_ii_s10_fit.loc[\"Growth\"], [1.0174, 1.0086, 0.9907, 0.9954, 0.9994], atol=0.0002)\n", + "assert np.allclose(exhibit_ii_s10_fit.loc[\"R-Squared\"], [0.706, 0.340, 0.633, 0.610, 0.007], atol=0.005)\n", + "assert np.allclose(\n", + " np.round(exhibit_ii_s10[\"CDF to Ultimate\"], 3),\n", + " [1.000, 1.006, 1.024, 1.073, 1.182, 1.466, 2.286, 7.638],\n", + " atol=0.01,\n", + ")\n", + "assert np.isclose(np.round(exhibit_ii_s10.loc[1976, \"12-24\"], 3), 3.359, atol=0.002)\n" + ] + }, + { + "cell_type": "markdown", + "id": "70ccbc9e", + "metadata": {}, + "source": [ + "## P314 (Exhibit II Sheet 11)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7096dce3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Age (2)Adj Paid (3)CDF Unadj (4)CDF Volume (5)CDF Linear (6)CDF Exponential (7)Ult Unadj (8)Ult Volume (9)Ult Linear (10)Ult Exponential (11)
19699610256.01.0001.0001.0001.00010256.00010256.00010256.00010256.000
19708412031.01.0061.0061.0061.00612103.18612103.18612103.18612103.186
19717214235.01.0251.0241.0241.02414590.87514576.64014576.64014576.640
19726015383.01.0621.0721.0721.07216336.74616490.57616490.57616490.576
19734815278.01.1541.1941.1811.18217630.81218241.93218043.31818058.596
19743611771.01.3811.5251.4641.46516255.75117950.77517232.74417244.515
1975249182.01.9942.3462.2842.28518308.90821540.97220971.68820980.870
1976122801.06.1767.4097.6177.63417298.97620752.60921335.21721382.834
\n", + "
" + ], + "text/plain": [ + " Age (2) Adj Paid (3) CDF Unadj (4) CDF Volume (5) CDF Linear (6) \\\n", + "1969 96 10256.0 1.000 1.000 1.000 \n", + "1970 84 12031.0 1.006 1.006 1.006 \n", + "1971 72 14235.0 1.025 1.024 1.024 \n", + "1972 60 15383.0 1.062 1.072 1.072 \n", + "1973 48 15278.0 1.154 1.194 1.181 \n", + "1974 36 11771.0 1.381 1.525 1.464 \n", + "1975 24 9182.0 1.994 2.346 2.284 \n", + "1976 12 2801.0 6.176 7.409 7.617 \n", + "\n", + " CDF Exponential (7) Ult Unadj (8) Ult Volume (9) Ult Linear (10) \\\n", + "1969 1.000 10256.000 10256.000 10256.000 \n", + "1970 1.006 12103.186 12103.186 12103.186 \n", + "1971 1.024 14590.875 14576.640 14576.640 \n", + "1972 1.072 16336.746 16490.576 16490.576 \n", + "1973 1.182 17630.812 18241.932 18043.318 \n", + "1974 1.465 16255.751 17950.775 17232.744 \n", + "1975 2.285 18308.908 21540.972 20971.688 \n", + "1976 7.634 17298.976 20752.609 21335.217 \n", + "\n", + " Ult Exponential (11) \n", + "1969 10256.000 \n", + "1970 12103.186 \n", + "1971 14576.640 \n", + "1972 16490.576 \n", + "1973 18058.596 \n", + "1974 17244.515 \n", + "1975 20980.870 \n", + "1976 21382.834 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Adj Paid (3)Ult Unadj (8)Ult Volume (9)Ult Linear (10)Ult Exponential (11)
Total90937.0122781.254131912.69131009.369131093.217
\n", + "
" + ], + "text/plain": [ + " Adj Paid (3) Ult Unadj (8) Ult Volume (9) Ult Linear (10) \\\n", + "Total 90937.0 122781.254 131912.69 131009.369 \n", + "\n", + " Ult Exponential (11) \n", + "Total 131093.217 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "paid_latest = adj_paid_auto.latest_diagonal.to_frame(origin_as_datetime=False).iloc[:, 0]\n", + "paid_latest.index = [int(getattr(i, \"year\", i)) for i in paid_latest.index]\n", + "ages = sorted(paid_auto.development, reverse=True)\n", + "\n", + "age_to_cdf_unadj = dict(\n", + " zip([12, 24, 36, 48, 60, 72, 84, 96], exhibit_ii_s1_sel[\"CDF to Ultimate\"])\n", + ")\n", + "age_to_cdf_vol = dict(\n", + " zip([12, 24, 36, 48, 60, 72, 84, 96], exhibit_ii_s8_sel[\"CDF to Ultimate\"])\n", + ")\n", + "\n", + "cl_unadj_paid_auto = cl.Chainladder().fit(\n", + " cl.DevelopmentConstant(patterns=age_to_cdf_unadj, style=\"cdf\").fit_transform(paid_auto)\n", + ")\n", + "cl_vol_adj_paid_auto = cl.Chainladder().fit(\n", + " cl.DevelopmentConstant(patterns=age_to_cdf_vol, style=\"cdf\").fit_transform(\n", + " adj_paid_auto\n", + " )\n", + ")\n", + "\n", + "cdf_lin = np.round(exhibit_ii_s9[\"CDF to Ultimate\"], 3)\n", + "cdf_exp = np.round(exhibit_ii_s10[\"CDF to Ultimate\"], 3)\n", + "\n", + "exhibit_ii_s11 = pd.DataFrame(\n", + " {\n", + " \"Age (2)\": ages,\n", + " \"Adj Paid (3)\": paid_latest.values,\n", + " \"CDF Unadj (4)\": [age_to_cdf_unadj[a] for a in ages],\n", + " \"CDF Volume (5)\": [age_to_cdf_vol[a] for a in ages],\n", + " \"CDF Linear (6)\": cdf_lin.values,\n", + " \"CDF Exponential (7)\": cdf_exp.values,\n", + " \"Ult Unadj (8)\": cl_unadj_paid_auto.ultimate_.to_frame(origin_as_datetime=False)\n", + " .iloc[:, 0]\n", + " .values,\n", + " \"Ult Volume (9)\": cl_vol_adj_paid_auto.ultimate_.to_frame(origin_as_datetime=False)\n", + " .iloc[:, 0]\n", + " .values,\n", + " \"Ult Linear (10)\": paid_latest.values * cdf_lin.values,\n", + " \"Ult Exponential (11)\": paid_latest.values * cdf_exp.values,\n", + " },\n", + " index=paid_latest.index,\n", + ")\n", + "display(exhibit_ii_s11)\n", + "display(\n", + " exhibit_ii_s11[\n", + " [\"Adj Paid (3)\", \"Ult Unadj (8)\", \"Ult Volume (9)\", \"Ult Linear (10)\", \"Ult Exponential (11)\"]\n", + " ]\n", + " .sum()\n", + " .to_frame(\"Total\")\n", + " .T\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6757644c", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 11 — reconcile to Friedland PDF p314\n", + "assert np.allclose(exhibit_ii_s11[\"Adj Paid (3)\"], [10256, 12031, 14235, 15383, 15278, 11771, 9182, 2801], atol=1)\n", + "assert np.isclose(exhibit_ii_s11[\"Adj Paid (3)\"].sum(), 90937, atol=1)\n", + "assert np.isclose(exhibit_ii_s11[\"Ult Unadj (8)\"].sum(), 122684, atol=150)\n", + "assert np.isclose(exhibit_ii_s11[\"Ult Volume (9)\"].sum(), 132019, atol=150)\n", + "assert np.isclose(exhibit_ii_s11[\"Ult Linear (10)\"].sum(), 131079, atol=150)\n", + "assert np.isclose(exhibit_ii_s11[\"Ult Exponential (11)\"].sum(), 131147, atol=150)\n" + ] + }, + { + "cell_type": "markdown", + "id": "7ca7a894", + "metadata": {}, + "source": [ + "## P315 (Exhibit II Sheet 12)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "77eb1d8d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Paid (2)Ult Unadj (3)Ult Volume (4)Ult Linear (5)Ult Exponential (6)Unpaid Unadj (7)Unpaid Volume (8)Unpaid Linear (9)Unpaid Exponential (10)
196910256.010256.00010256.00010256.00010256.000NaNNaN0.0000.000
197012031.012103.18612103.18612103.18612103.18672.18672.18672.18672.186
197114235.014590.87514576.64014576.64014576.640355.875341.640341.640341.640
197215383.016336.74616490.57616490.57616490.576953.7461107.5761107.5761107.576
197315278.017630.81218241.93218043.31818058.5962352.8122963.9322765.3182780.596
197411771.016255.75117950.77517232.74417244.5154484.7516179.7755461.7445473.515
19759182.018308.90821540.97220971.68820980.8709126.90812358.97211789.68811798.870
19762801.017298.97620752.60921335.21721382.83414497.97617951.60918534.21718581.834
\n", + "
" + ], + "text/plain": [ + " Paid (2) Ult Unadj (3) Ult Volume (4) Ult Linear (5) \\\n", + "1969 10256.0 10256.000 10256.000 10256.000 \n", + "1970 12031.0 12103.186 12103.186 12103.186 \n", + "1971 14235.0 14590.875 14576.640 14576.640 \n", + "1972 15383.0 16336.746 16490.576 16490.576 \n", + "1973 15278.0 17630.812 18241.932 18043.318 \n", + "1974 11771.0 16255.751 17950.775 17232.744 \n", + "1975 9182.0 18308.908 21540.972 20971.688 \n", + "1976 2801.0 17298.976 20752.609 21335.217 \n", + "\n", + " Ult Exponential (6) Unpaid Unadj (7) Unpaid Volume (8) \\\n", + "1969 10256.000 NaN NaN \n", + "1970 12103.186 72.186 72.186 \n", + "1971 14576.640 355.875 341.640 \n", + "1972 16490.576 953.746 1107.576 \n", + "1973 18058.596 2352.812 2963.932 \n", + "1974 17244.515 4484.751 6179.775 \n", + "1975 20980.870 9126.908 12358.972 \n", + "1976 21382.834 14497.976 17951.609 \n", + "\n", + " Unpaid Linear (9) Unpaid Exponential (10) \n", + "1969 0.000 0.000 \n", + "1970 72.186 72.186 \n", + "1971 341.640 341.640 \n", + "1972 1107.576 1107.576 \n", + "1973 2765.318 2780.596 \n", + "1974 5461.744 5473.515 \n", + "1975 11789.688 11798.870 \n", + "1976 18534.217 18581.834 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Paid (2)Ult Unadj (3)Ult Volume (4)Ult Linear (5)Ult Exponential (6)Unpaid Unadj (7)Unpaid Volume (8)Unpaid Linear (9)Unpaid Exponential (10)
Total90937.0122781.254131912.69131009.369131093.21731844.25440975.6940072.36940156.217
\n", + "
" + ], + "text/plain": [ + " Paid (2) Ult Unadj (3) Ult Volume (4) Ult Linear (5) \\\n", + "Total 90937.0 122781.254 131912.69 131009.369 \n", + "\n", + " Ult Exponential (6) Unpaid Unadj (7) Unpaid Volume (8) \\\n", + "Total 131093.217 31844.254 40975.69 \n", + "\n", + " Unpaid Linear (9) Unpaid Exponential (10) \n", + "Total 40072.369 40156.217 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "exhibit_ii_s12 = pd.DataFrame(\n", + " {\n", + " \"Paid (2)\": exhibit_ii_s11[\"Adj Paid (3)\"],\n", + " \"Ult Unadj (3)\": exhibit_ii_s11[\"Ult Unadj (8)\"],\n", + " \"Ult Volume (4)\": exhibit_ii_s11[\"Ult Volume (9)\"],\n", + " \"Ult Linear (5)\": exhibit_ii_s11[\"Ult Linear (10)\"],\n", + " \"Ult Exponential (6)\": exhibit_ii_s11[\"Ult Exponential (11)\"],\n", + " \"Unpaid Unadj (7)\": cl_unadj_paid_auto.ibnr_.to_frame(origin_as_datetime=False)\n", + " .iloc[:, 0]\n", + " .values,\n", + " \"Unpaid Volume (8)\": cl_vol_adj_paid_auto.ibnr_.to_frame(origin_as_datetime=False)\n", + " .iloc[:, 0]\n", + " .values,\n", + " \"Unpaid Linear (9)\": exhibit_ii_s11[\"Ult Linear (10)\"]\n", + " - exhibit_ii_s11[\"Adj Paid (3)\"],\n", + " \"Unpaid Exponential (10)\": exhibit_ii_s11[\"Ult Exponential (11)\"]\n", + " - exhibit_ii_s11[\"Adj Paid (3)\"],\n", + " },\n", + " index=exhibit_ii_s11.index,\n", + ")\n", + "display(exhibit_ii_s12)\n", + "display(exhibit_ii_s12.sum().to_frame(\"Total\").T)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f8f75fd", + "metadata": {}, + "outputs": [], + "source": [ + "# Exhibit II Sheet 12 — reconcile to Friedland PDF p315\n", + "assert np.isclose(exhibit_ii_s12[\"Paid (2)\"].sum(), 90937, atol=1)\n", + "assert np.isclose(exhibit_ii_s12[\"Ult Unadj (3)\"].sum(), 122684, atol=150)\n", + "assert np.isclose(exhibit_ii_s12[\"Unpaid Unadj (7)\"].sum(), 31747, atol=150)\n", + "assert np.isclose(exhibit_ii_s12[\"Unpaid Volume (8)\"].sum(), 41082, atol=150)\n", + "assert np.isclose(exhibit_ii_s12[\"Unpaid Linear (9)\"].sum(), 40142, atol=150)\n", + "assert np.isclose(exhibit_ii_s12[\"Unpaid Exponential (10)\"].sum(), 40210, atol=150)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}