diff --git a/docs/_toc.yml b/docs/_toc.yml index 14c63ae7..6a6e068b 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -35,6 +35,9 @@ parts: sections: - file: friedland/chapter_6.rst - file: friedland/chapter_7.rst + title: Chapter 7 - Part I + - file: friedland/chapter_7_part_2.ipynb + title: Chapter 7 - Part II - file: friedland/chapter_8.ipynb - file: friedland/chapter_9.ipynb - file: friedland/chapter_10.ipynb diff --git a/docs/friedland/chapter_7_part_2.ipynb b/docs/friedland/chapter_7_part_2.ipynb new file mode 100644 index 00000000..76cf4259 --- /dev/null +++ b/docs/friedland/chapter_7_part_2.ipynb @@ -0,0 +1,10985 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e74a94cb", + "metadata": {}, + "source": [ + "# Chapter 7 — Part II\n", + "\n", + "This second part concludes Chapter 7 of Friedland by generating Exhibits III and IV." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f42e0344", + "metadata": {}, + "outputs": [], + "source": [ + "import chainladder as cl\n", + "from IPython.display import display, HTML, Markdown\n", + "import json\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "pd.set_option(\"display.max_columns\", None)\n", + "pd.set_option(\"display.width\", 1000)\n", + "\n", + "import warnings\n", + "\n", + "warnings.filterwarnings(\n", + " \"ignore\",\n", + " message=r\"Some exclusions have been ignored\\..*link ratio\\(s\\) is required.*\",\n", + " category=UserWarning,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "7a9e5a4a", + "metadata": {}, + "source": [ + "## Exhibit III — U.S. Industry P.P. Auto (Impact of Changing Conditions)\n", + "\n", + "In order to illustrate the assumptions and corresponding limitations of the Development method, Exhibit III applies the method to the **U.S. Private Passenger Industry Auto** (USPP Auto) example under four different scenarios:\n", + "\n", + "1. stable claim ratios and no change in case outstanding strength (steady state);\n", + "1. increasing claim ratios but no change in case outstanding strength;\n", + "1. stable claim ratios but increasing case outstanding strength; and\n", + "1. increasing claim ratios and increasing case outstanding strength.\n", + "\n", + "The key assumptions of this study are as follows:\n", + "\n", + "- the earned premium for the first year (1999) is assumed to be $1 million with a 5% annual premium trend;\n", + "- (discuss assumed claim ratios)\n", + "\n", + "Since the USPP Auto dataset is contained in the `chainladder` package, we simply load it into a triangle as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5595108e", + "metadata": {}, + "outputs": [], + "source": [ + "triangles = cl.load_sample(\"friedland_uspp\")" + ] + }, + { + "cell_type": "markdown", + "id": "6118594f", + "metadata": {}, + "source": [ + "For the sheets depicting the claim triangles and age-to-age factors, we reuse the function `dev_exhibit` used in Part I:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "79e5ac39", + "metadata": {}, + "outputs": [], + "source": [ + "def dev_exhibit(tri: cl.Triangle, avg_params: dict[str,int], selected_avg: str, tail: float) -> dict[cl.Triangle()]:\n", + " display('')\n", + " display(HTML(\"\"\"\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " \"\"\"))\n", + " display(tri)\n", + " display(HTML(\"\"\"\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " \"\"\"))\n", + " age_to_age_df = tri.age_to_age.to_frame(origin_as_datetime=False)\n", + " display(\n", + " age_to_age_df.style.format(precision=3, na_rep=\"\")\n", + " )\n", + " devs = {}\n", + " display(HTML(\"\"\"\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " \"\"\"))\n", + " for k,v in avg_params.items():\n", + " devs[k] = cl.Development(**v).fit_transform(tri)\n", + " def print_ldfs(ldf_dict:dict[cl.Triangle()]):\n", + " with pd.option_context(\"display.float_format\", \"{:.3f}\".format):\n", + " display(pd.concat([v.to_frame().rename(index={'(All)':k}) for k,v in ldf_dict.items()]))\n", + " return None\n", + " print_ldfs({k:v.ldf_.round(decimals=3) for k,v in devs.items()})\n", + " devs[\"Selected\"] = cl.TailConstant(tail = tail, projection_period = 0).fit_transform(devs[selected_avg])\n", + " selected = {}\n", + " selected['CDF to Ultimate'] = devs[\"Selected\"].ldf_.round(decimals=3).incr_to_cum().round(decimals=3)\n", + " selected['Percent Reported'] = (1/selected['CDF to Ultimate']).round(decimals=3)\n", + " display(HTML(\"\"\"\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " \"\"\"))\n", + " print_ldfs({'Selected':devs['Selected'].ldf_.round(decimals=3)})\n", + " print_ldfs(selected)\n", + " return devs" + ] + }, + { + "cell_type": "markdown", + "id": "796caf1c", + "metadata": {}, + "source": [ + "We also define a special formatting function `ex_sht1` in order to create Sheet 1 of Exhibit III, which has its own unique layout:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "99de7a11", + "metadata": {}, + "outputs": [], + "source": [ + "def ex3sht1(\n", + " tri: cl.Triangle,\n", + " dev_input: dict,\n", + " tail_input: dict\n", + ") -> tuple:\n", + " \n", + " def format_col(x, reverse = False):\n", + " if reverse is True:\n", + " return x.to_frame().squeeze()[::-1].reset_index(drop=True)\n", + " return x.to_frame().squeeze().reset_index(drop=True)\n", + "\n", + " def col_diff(x, y):\n", + " return x.squeeze() - y.squeeze()\n", + "\n", + " def col_div(x, y):\n", + " return x.squeeze() / y.squeeze()\n", + "\n", + " def col_mult(x, y):\n", + " return x.squeeze() * y.squeeze()\n", + "\n", + " title = (\"Exhibit III, Sheet 1, Summary of Earned Premium and Claim Ratio Assumptions and Actual IBNR\")\n", + " #scenario = \"Steady State\"\n", + "\n", + " dev = cl.Development(**dev_input).fit(tri)\n", + " model = cl.Chainladder().fit(dev.transform(tri))\n", + " tail = cl.TailConstant(**tail_input).fit_transform(dev.transform(tri))\n", + " ult = model.ultimate_\n", + " ibnr = model.ibnr_\n", + "\n", + " col1 = pd.DataFrame({\"Accident Year\" : format_col(tri.origin.astype(str))})\n", + " col2 = pd.DataFrame({\"Earned Premium\" : format_col(tri.latest_diagonal.loc[\"Steady State\", \"Earned Premium\"])})\n", + " col4 = pd.DataFrame({\"Ult. Claims\" : format_col(ult.loc[\"Steady State\", \"Reported Claims\"])})\n", + " col3 = pd.DataFrame({\"Ult. Claim Ratio\" : col_div(col4, col2)})\n", + " col5 = pd.DataFrame({\"Rep. Claims 12/31/08\" : format_col(tri.latest_diagonal.loc[\"Steady State\", \"Reported Claims\"])})\n", + " col6 = pd.DataFrame({\"Actual IBNR\" : col_diff(col4, col5)})\n", + " col8 = pd.DataFrame({\"Ult. Claims\" : format_col(ult.loc[\"Increasing Claim\", \"Reported Claims\"])})\n", + " col9 = pd.DataFrame({\"Rep. Claims 12/31/08\" : format_col(tri.latest_diagonal.loc[\"Increasing Claim\", \"Reported Claims\"])})\n", + " col7 = pd.DataFrame({\"Ult. Claim Ratio\" : col_div(col8, col2)})\n", + " col10 = pd.DataFrame({\"Actual IBNR\" : col_diff(col8, col9)})\n", + " col11 = pd.DataFrame({\"Accident Year\" : format_col(tri.origin.astype(str))})\n", + " col12 = pd.DataFrame({\"Earned Premium\" : format_col(tri.latest_diagonal.loc[\"Steady State\", \"Earned Premium\"])})\n", + " col14 = pd.DataFrame({\"Ult. Claims\" : format_col(ult.loc[\"Steady State\", \"Reported Claims\"])})\n", + " col13 = pd.DataFrame({\"Ult. Claim Ratio\" : col_div(col14, col12)})\n", + " col15 = pd.DataFrame({\"Rep. Claims 12/31/08\" : format_col(tri.latest_diagonal.loc[\"Increasing Case\", \"Reported Claims\"])})\n", + " col16 = pd.DataFrame({\"Actual IBNR\" : col_diff(col14, col15)})\n", + " col18 = pd.DataFrame({\"Ult. Claims\" : format_col(ult.loc[\"Increasing Claim\", \"Reported Claims\"])})\n", + " col17 = pd.DataFrame({\"Ult. Claim Ratio\" : col_div(col18, col12)})\n", + " col19 = pd.DataFrame({\"Rep. Claims 12/31/08\" : format_col(tri.latest_diagonal.loc[\"Increasing Claim Case\", \"Reported Claims\"])})\n", + " col20 = pd.DataFrame({\"Actual IBNR\" : col_diff(col18, col19)})\n", + "\n", + " cols = [col1, col2, col3, col4, col5, col6]\n", + " df1 = pd.concat([col1, col2], axis=1)\n", + " df2 = pd.concat([col3, col4, col5, col6], axis=1)\n", + " df3 = pd.concat([col7, col8, col9, col10], axis=1)\n", + " df4 = pd.concat([col11, col12], axis=1)\n", + " df5 = pd.concat([col13, col14, col15, col16], axis=1)\n", + " df6 = pd.concat([col17, col18, col19, col20], axis=1)\n", + "\n", + " dfs_upper = [df1, df2, df3]\n", + " dfs_lower = [df4, df5, df6]\n", + "\n", + " results_upper = pd.concat(dfs_upper, axis=1, keys=[\"\", \"Steady State\", \"Increasing Claim Ratios\"])\n", + " results_upper = results_upper.set_index((\"\", \"Accident Year\")) #since its multi-index, I needed to use the tuple to designate the index col\n", + " results_upper.index.name = \"Accident Year\" \n", + " results_upper.loc[\"Total\"] = results_upper.sum()\n", + "\n", + " #remove the totals from the ratio columns (where totals do not make sense)\n", + " results_upper.loc[\"Total\", (\"Steady State\", \"Ult. Claim Ratio\")] = np.nan\n", + " results_upper.loc[\"Total\", (\"Increasing Claim Ratios\", \"Ult. Claim Ratio\")] = np.nan\n", + "\n", + " results_lower = pd.concat(dfs_lower, axis=1, keys=[\"\", \"Increasing Case Outstanding Strength\", \"Increasing Claim Ratios and Case Outstanding Strength\"])\n", + " results_lower = results_lower.set_index((\"\", \"Accident Year\")) #since its multi-index, I needed to use the tuple to designate the index col\n", + " results_lower.index.name = \"Accident Year\" \n", + " results_lower.loc[\"Total\"] = results_lower.sum()\n", + "\n", + " #remove the totals from the ratio columns (where totals do not make sense)\n", + " results_lower.loc[\"Total\", (\"Increasing Case Outstanding Strength\", \"Ult. Claim Ratio\")] = np.nan\n", + " results_lower.loc[\"Total\", (\"Increasing Claim Ratios and Case Outstanding Strength\", \"Ult. Claim Ratio\")] = np.nan\n", + "\n", + " display(HTML(\"\"\"\n", + "

\n", + " Exhibit III Sheet 1: Summary of Earned Premium and Claim Ratio Assumptions and Actual IBNR\n", + "

\n", + " \"\"\"))\n", + " \n", + " upper_formats = {\n", + " (\"Steady State\", \"Ult. Claim Ratio\"): \"{:.1%}\",\n", + " (\"Steady State\", \"Ult. Claims\"): \"{:,.0f}\",\n", + " (\"Steady State\", \"Rep. Claims 12/31/08\"): \"{:,.0f}\",\n", + " (\"Steady State\", \"Actual IBNR\"): \"{:,.0f}\",\n", + "\n", + " (\"Increasing Claim Ratios\", \"Ult. Claim Ratio\"): \"{:.1%}\",\n", + " (\"Increasing Claim Ratios\", \"Ult. Claims\"): \"{:,.0f}\",\n", + " (\"Increasing Claim Ratios\", \"Rep. Claims 12/31/08\"): \"{:,.0f}\",\n", + " (\"Increasing Claim Ratios\", \"Actual IBNR\"): \"{:,.0f}\",\n", + "\n", + " (\"\", \"Earned Premium\"): \"{:,.0f}\",\n", + " }\n", + "\n", + " display(\n", + " results_upper.style.format(\n", + " upper_formats,\n", + " na_rep=\"\"\n", + " )\n", + " )\n", + " \n", + " lower_formats = {\n", + " (\"Increasing Case Outstanding Strength\", \"Ult. Claim Ratio\"): \"{:.1%}\",\n", + " (\"Increasing Case Outstanding Strength\", \"Ult. Claims\"): \"{:,.0f}\",\n", + " (\"Increasing Case Outstanding Strength\", \"Rep. Claims 12/31/08\"): \"{:,.0f}\",\n", + " (\"Increasing Case Outstanding Strength\", \"Actual IBNR\"): \"{:,.0f}\",\n", + "\n", + " (\n", + " \"Increasing Claim Ratios and Case Outstanding Strength\",\n", + " \"Ult. Claim Ratio\",\n", + " ): \"{:.1%}\",\n", + " (\n", + " \"Increasing Claim Ratios and Case Outstanding Strength\",\n", + " \"Ult. Claims\",\n", + " ): \"{:,.0f}\",\n", + " (\n", + " \"Increasing Claim Ratios and Case Outstanding Strength\",\n", + " \"Rep. Claims 12/31/08\",\n", + " ): \"{:,.0f}\",\n", + " (\n", + " \"Increasing Claim Ratios and Case Outstanding Strength\",\n", + " \"Actual IBNR\",\n", + " ): \"{:,.0f}\",\n", + "\n", + " (\"\", \"Earned Premium\"): \"{:,.0f}\",\n", + " }\n", + "\n", + " display(\n", + " results_lower.style.format(\n", + " lower_formats,\n", + " na_rep=\"\"\n", + " )\n", + " )\n", + "\n", + " return (results_upper, results_lower)" + ] + }, + { + "cell_type": "markdown", + "id": "e64c791b", + "metadata": {}, + "source": [ + "### Exhibit III Sheet 1: Summary of Earned Premium and Claim Ratio Assumptions and Actual IBNR" + ] + }, + { + "cell_type": "markdown", + "id": "6250f087", + "metadata": {}, + "source": [ + "We begin by generating Exhibit III, Sheet 1:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "06a03be7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "

\n", + " Exhibit III Sheet 1: Summary of Earned Premium and Claim Ratio Assumptions and Actual IBNR\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 Steady StateIncreasing Claim Ratios
 Earned PremiumUlt. Claim RatioUlt. ClaimsRep. Claims 12/31/08Actual IBNRUlt. Claim RatioUlt. ClaimsRep. Claims 12/31/08Actual IBNR
Accident Year         
19991,000,00070.0%700,000700,000070.0%700,000700,0000
20001,050,00070.0%735,000735,000070.0%735,000735,0000
20011,102,50070.0%771,750771,750070.0%771,750771,7500
20021,157,62570.0%810,338810,338070.0%810,338810,3380
20031,215,50670.0%850,855842,3468,50970.0%850,855842,3468,509
20041,276,28270.0%893,397884,4638,93480.0%1,021,0251,010,81510,210
20051,340,09670.0%938,068919,30618,76285.0%1,139,0821,116,30022,782
20061,407,10070.0%984,970935,72249,24890.0%1,266,3911,203,07163,320
20071,477,45570.0%1,034,219930,797103,42295.0%1,403,5821,263,224140,358
20081,551,32870.0%1,085,930836,166249,764100.0%1,551,3281,194,523356,805
Total12,577,8938,804,5278,365,888438,63910,249,3519,647,367601,984
\n" + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 Increasing Case Outstanding StrengthIncreasing Claim Ratios and Case Outstanding Strength
 Earned PremiumUlt. Claim RatioUlt. ClaimsRep. Claims 12/31/08Actual IBNRUlt. Claim RatioUlt. ClaimsRep. Claims 12/31/08Actual IBNR
Accident Year         
19991,000,00070.0%700,000700,000070.0%700,000700,0000
20001,050,00070.0%735,000735,000070.0%735,000735,0000
20011,102,50070.0%771,750771,750070.0%771,750771,7500
20021,157,62570.0%810,338810,338070.0%810,338810,3380
20031,215,50670.0%850,855842,3468,50970.0%850,855842,3468,509
20041,276,28270.0%893,397884,4638,93480.0%1,021,0251,010,81510,210
20051,340,09670.0%938,068933,3774,69185.0%1,139,0821,133,3865,696
20061,407,10070.0%984,970962,80822,16290.0%1,266,3911,237,89728,494
20071,477,45570.0%1,034,219979,92254,29795.0%1,403,5821,329,89573,687
20081,551,32870.0%1,085,930931,185154,745100.0%1,551,3281,330,264221,064
Total12,577,8938,804,5278,551,189253,33810,249,3519,901,691347,660
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dev_input = {\n", + " \"average\" : \"volume\",\n", + " \"n_periods\" : 5\n", + "}\n", + "\n", + "tail_input = {\n", + " \"tail\" : 1.0,\n", + " \"projection_period\" : -1\n", + "}\n", + "\n", + "res_up, res_low = ex3sht1(\n", + " triangles,\n", + " dev_input,\n", + " tail_input,\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8f547560", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " res_up.loc[\n", + " res_up.index != \"Total\",\n", + " (\"Steady State\", [\"Ult. Claims\", \"Actual IBNR\"]),\n", + " ].values,\n", + " np.array([\n", + " [700000, 0],\n", + " [735000, 0],\n", + " [771750, 0],\n", + " [810338, 0],\n", + " [850854, 8509],\n", + " [893397, 8934],\n", + " [938067, 18761],\n", + " [984970, 49249],\n", + " [1034219, 103422],\n", + " [1085930, 249764],\n", + " ]),\n", + " atol=1,\n", + " rtol=0,\n", + ")\n", + "\n", + "assert np.allclose(\n", + " res_up.loc[\n", + " res_up.index != \"Total\",\n", + " (\"Increasing Claim Ratios\", [\"Ult. Claims\", \"Actual IBNR\"]),\n", + " ].values,\n", + " np.array([\n", + " [700000, 0],\n", + " [735000, 0],\n", + " [771750, 0],\n", + " [810338, 0],\n", + " [850854, 8509],\n", + " [1021025, 10210],\n", + " [1139081, 22782],\n", + " [1266390, 63320],\n", + " [1403583, 140358],\n", + " [1551328, 356805],\n", + " ]),\n", + " atol=1,\n", + " rtol=0,\n", + ")\n", + "\n", + "assert np.allclose(\n", + " res_low.loc[\n", + " res_low.index != \"Total\",\n", + " (\"Increasing Case Outstanding Strength\", [\"Ult. Claims\", \"Actual IBNR\"]),\n", + " ].values,\n", + " np.array([\n", + " [700000, 0],\n", + " [735000, 0],\n", + " [771750, 0],\n", + " [810338, 0],\n", + " [850854, 8509],\n", + " [893397, 8934],\n", + " [938067, 4690],\n", + " [984970, 22162],\n", + " [1034219, 54296],\n", + " [1085930, 154745],\n", + " ]),\n", + " atol=2,\n", + " rtol=0,\n", + ")\n", + "\n", + "assert np.allclose(\n", + " res_low.loc[\n", + " res_low.index != \"Total\",\n", + " (\n", + " \"Increasing Claim Ratios and Case Outstanding Strength\",\n", + " [\"Ult. Claims\", \"Actual IBNR\"],\n", + " ),\n", + " ].values,\n", + " np.array([\n", + " [700000, 0],\n", + " [735000, 0],\n", + " [771750, 0],\n", + " [810338, 0],\n", + " [850854, 8509],\n", + " [1021025, 10210],\n", + " [1139081, 5695],\n", + " [1266390, 28494],\n", + " [1403583, 73688],\n", + " [1551328, 221064],\n", + " ]),\n", + " atol=1,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "e8023233", + "metadata": {}, + "source": [ + "### Exhibit III, Sheet 2 - Sheet 2: USPP Auto Steady-State - Reported Claims\n", + "\n", + "We then generate Sheet 2, Parts 1-4 which contain the data triangle and age-to-age factors for USPP reported claims under the steady-state scenario (p. 115)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "3f94ce14", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999539,000630,000665,000686,000693,000693,000700,000700,000700,000700,000
2000565,950661,500698,250720,300727,650727,650735,000735,000735,000
2001594,248694,575733,163756,315764,033764,033771,750771,750
2002623,960729,304769,821794,131802,234802,234810,338
2003655,158765,769808,312833,837842,346842,346
2004687,916804,057848,727875,529884,463
2005722,312844,260891,164919,306
2006758,427886,473935,722
2007796,348930,797
2008836,166
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 539000.0 630000.0 665000.0 686000.0 693000.0 693000.0 700000.0 700000.0 700000.0 700000.0\n", + "2000 565950.0 661500.0 698250.0 720300.0 727650.0 727650.0 735000.0 735000.0 735000.0 NaN\n", + "2001 594248.0 694575.0 733163.0 756315.0 764033.0 764033.0 771750.0 771750.0 NaN NaN\n", + "2002 623960.0 729304.0 769821.0 794131.0 802234.0 802234.0 810338.0 NaN NaN NaN\n", + "2003 655158.0 765769.0 808312.0 833837.0 842346.0 842346.0 NaN NaN NaN NaN\n", + "2004 687916.0 804057.0 848727.0 875529.0 884463.0 NaN NaN NaN NaN NaN\n", + "2005 722312.0 844260.0 891164.0 919306.0 NaN NaN NaN NaN NaN NaN\n", + "2006 758427.0 886473.0 935722.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 796348.0 930797.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 836166.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.1691.0561.0321.0101.0001.0101.0001.0001.000
20001.1691.0561.0321.0101.0001.0101.0001.000
20011.1691.0561.0321.0101.0001.0101.000
20021.1691.0561.0321.0101.0001.010
20031.1691.0561.0321.0101.000
20041.1691.0561.0321.010
20051.1691.0561.032
20061.1691.056
20071.169
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.1691.0561.0321.0101.0001.0101.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.169 1.056 1.032 1.010 1.000 1.010 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.1691.0561.0321.0101.0001.0101.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.169 1.056 1.032 1.010 1.000 1.010 1.000 1.000 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate1.3001.1121.0531.0201.0101.0101.0001.0001.0001.000
Percent Reported0.7690.8990.9500.9800.9900.9901.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 1.300 1.112 1.053 1.020 1.010 1.010 1.000 1.000 1.000 1.000\n", + "Percent Reported 0.769 0.899 0.950 0.980 0.990 0.990 1.000 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " triangles.loc[\"Steady State\", \"Reported Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "81e510ee", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.169, 1.056, 1.032, 1.010, 1.000,\n", + " 1.010, 1.000, 1.000, 1.000, 1.000,\n", + " ]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "582c31f3", + "metadata": {}, + "source": [ + "### Exhibit III, Sheet 3: USPP Auto Steady-State - Paid Claims\n", + "\n", + "We then generate Sheet 3, Parts 1-4 which contain the data triangle and age-to-age factors for USPP paid claims under the steady-state scenario (p. 116)." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "80dde7e9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999294,000497,000588,000644,000672,000686,000693,000693,000700,000700,000
2000308,700521,850617,400676,200705,600720,300727,650727,650735,000
2001324,135547,943648,270710,010740,880756,315764,033764,033
2002340,342575,340680,684745,511777,924794,131802,234
2003357,359604,107714,718782,786816,820833,837
2004375,227634,312750,454821,925857,661
2005393,988666,028787,976863,022
2006413,688699,329827,375
2007434,372734,295
2008456,090
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 294000.0 497000.0 588000.0 644000.0 672000.0 686000.0 693000.0 693000.0 700000.0 700000.0\n", + "2000 308700.0 521850.0 617400.0 676200.0 705600.0 720300.0 727650.0 727650.0 735000.0 NaN\n", + "2001 324135.0 547943.0 648270.0 710010.0 740880.0 756315.0 764033.0 764033.0 NaN NaN\n", + "2002 340342.0 575340.0 680684.0 745511.0 777924.0 794131.0 802234.0 NaN NaN NaN\n", + "2003 357359.0 604107.0 714718.0 782786.0 816820.0 833837.0 NaN NaN NaN NaN\n", + "2004 375227.0 634312.0 750454.0 821925.0 857661.0 NaN NaN NaN NaN NaN\n", + "2005 393988.0 666028.0 787976.0 863022.0 NaN NaN NaN NaN NaN NaN\n", + "2006 413688.0 699329.0 827375.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 434372.0 734295.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 456090.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.6901.1831.0951.0431.0211.0101.0001.0101.000
20001.6901.1831.0951.0431.0211.0101.0001.010
20011.6901.1831.0951.0431.0211.0101.000
20021.6901.1831.0951.0431.0211.010
20031.6901.1831.0951.0431.021
20041.6901.1831.0951.043
20051.6901.1831.095
20061.6901.183
20071.690
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.6901.1831.0951.0431.0211.0101.0001.0101.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.690 1.183 1.095 1.043 1.021 1.010 1.000 1.010 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.6901.1831.0951.0431.0211.0101.0001.0101.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.690 1.183 1.095 1.043 1.021 1.010 1.000 1.010 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate2.3781.4071.1901.0861.0421.0201.0101.0101.0001.000
Percent Reported0.4210.7110.8400.9210.9600.9800.9900.9901.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 2.378 1.407 1.190 1.086 1.042 1.020 1.010 1.010 1.000 1.000\n", + "Percent Reported 0.421 0.711 0.840 0.921 0.960 0.980 0.990 0.990 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " triangles.loc[\"Steady State\", \"Paid Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "025358aa", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.690, 1.183, 1.095, 1.043, 1.021,\n", + " 1.010, 1.000, 1.010, 1.000, 1.000,\n", + " ]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "31ba3995", + "metadata": {}, + "source": [ + "### Exhibit III, Sheet 4: USPP Auto Increasing Claim Ratios - Reported Claims\n", + "\n", + "We then generate Sheet 4, Parts 1-4 which contain the data triangle and age-to-age factors for USPP reported claims under the increasing claim ratio scenario (p. 117)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "35744cce", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999539,000630,000665,000686,000693,000693,000700,000700,000700,000700,000
2000565,950661,500698,250720,300727,650727,650735,000735,000735,000
2001594,248694,575733,163756,315764,033764,033771,750771,750
2002623,960729,304769,821794,131802,234802,234810,338
2003655,158765,769808,312833,837842,346842,346
2004786,189918,923969,9741,000,6051,010,815
2005877,0931,025,1731,082,1271,116,300
2006975,1211,139,7511,203,071
20071,080,7591,263,224
20081,194,523
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 539000.0 630000.0 665000.0 686000.0 693000.0 693000.0 700000.0 700000.0 700000.0 700000.0\n", + "2000 565950.0 661500.0 698250.0 720300.0 727650.0 727650.0 735000.0 735000.0 735000.0 NaN\n", + "2001 594248.0 694575.0 733163.0 756315.0 764033.0 764033.0 771750.0 771750.0 NaN NaN\n", + "2002 623960.0 729304.0 769821.0 794131.0 802234.0 802234.0 810338.0 NaN NaN NaN\n", + "2003 655158.0 765769.0 808312.0 833837.0 842346.0 842346.0 NaN NaN NaN NaN\n", + "2004 786189.0 918923.0 969974.0 1000605.0 1010815.0 NaN NaN NaN NaN NaN\n", + "2005 877093.0 1025173.0 1082127.0 1116300.0 NaN NaN NaN NaN NaN NaN\n", + "2006 975121.0 1139751.0 1203071.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 1080759.0 1263224.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 1194523.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.1691.0561.0321.0101.0001.0101.0001.0001.000
20001.1691.0561.0321.0101.0001.0101.0001.000
20011.1691.0561.0321.0101.0001.0101.000
20021.1691.0561.0321.0101.0001.010
20031.1691.0561.0321.0101.000
20041.1691.0561.0321.010
20051.1691.0561.032
20061.1691.056
20071.169
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.1691.0561.0321.0101.0001.0101.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.169 1.056 1.032 1.010 1.000 1.010 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.1691.0561.0321.0101.0001.0101.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.169 1.056 1.032 1.010 1.000 1.010 1.000 1.000 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate1.3001.1121.0531.0201.0101.0101.0001.0001.0001.000
Percent Reported0.7690.8990.9500.9800.9900.9901.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 1.300 1.112 1.053 1.020 1.010 1.010 1.000 1.000 1.000 1.000\n", + "Percent Reported 0.769 0.899 0.950 0.980 0.990 0.990 1.000 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " triangles.loc[\"Increasing Claim\", \"Reported Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "7cc96844", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.169, 1.056, 1.032, 1.010, 1.000,\n", + " 1.010, 1.000, 1.000, 1.000, 1.000,\n", + " ]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd087aa9", + "metadata": {}, + "source": [ + "### Exhibit III, Sheet 5: USPP Auto Increasing Claim Ratios - Paid Claims\n", + "\n", + "We then generate Sheet 5, Parts 1-4 which contain the data triangle and age-to-age factors for USPP paid claims under the increasing claim ratio scenario (p. 118)." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8d9a4359", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999294,000497,000588,000644,000672,000686,000693,000693,000700,000700,000
2000308,700521,850617,400676,200705,600720,300727,650727,650735,000
2001324,135547,943648,270710,010740,880756,315764,033764,033
2002340,342575,340680,684745,511777,924794,131802,234
2003357,359604,107714,718782,786816,820833,837
2004428,831724,928857,661939,343980,184
2005478,414808,748956,8281,047,955
2006531,884899,1371,063,768
2007589,505996,544
2008651,558
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 294000.0 497000.0 588000.0 644000.0 672000.0 686000.0 693000.0 693000.0 700000.0 700000.0\n", + "2000 308700.0 521850.0 617400.0 676200.0 705600.0 720300.0 727650.0 727650.0 735000.0 NaN\n", + "2001 324135.0 547943.0 648270.0 710010.0 740880.0 756315.0 764033.0 764033.0 NaN NaN\n", + "2002 340342.0 575340.0 680684.0 745511.0 777924.0 794131.0 802234.0 NaN NaN NaN\n", + "2003 357359.0 604107.0 714718.0 782786.0 816820.0 833837.0 NaN NaN NaN NaN\n", + "2004 428831.0 724928.0 857661.0 939343.0 980184.0 NaN NaN NaN NaN NaN\n", + "2005 478414.0 808748.0 956828.0 1047955.0 NaN NaN NaN NaN NaN NaN\n", + "2006 531884.0 899137.0 1063768.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 589505.0 996544.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 651558.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.6901.1831.0951.0431.0211.0101.0001.0101.000
20001.6901.1831.0951.0431.0211.0101.0001.010
20011.6901.1831.0951.0431.0211.0101.000
20021.6901.1831.0951.0431.0211.010
20031.6901.1831.0951.0431.021
20041.6901.1831.0951.043
20051.6901.1831.095
20061.6901.183
20071.690
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.6901.1831.0951.0431.0211.0101.0001.0101.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.690 1.183 1.095 1.043 1.021 1.010 1.000 1.010 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.6901.1831.0951.0431.0211.0101.0001.0101.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.690 1.183 1.095 1.043 1.021 1.010 1.000 1.010 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate2.3781.4071.1901.0861.0421.0201.0101.0101.0001.000
Percent Reported0.4210.7110.8400.9210.9600.9800.9900.9901.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 2.378 1.407 1.190 1.086 1.042 1.020 1.010 1.010 1.000 1.000\n", + "Percent Reported 0.421 0.711 0.840 0.921 0.960 0.980 0.990 0.990 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " triangles.loc[\"Increasing Claim\", \"Paid Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "b5a6558d", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.690, 1.183, 1.095, 1.043, 1.021,\n", + " 1.010, 1.000, 1.010, 1.000, 1.000,\n", + " ]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c12b6661", + "metadata": {}, + "source": [ + "### Exhibit III, Sheet 6: USPP Auto Increasing Case Outstanding Strength - Reported Claims\n", + "\n", + "We then generate Sheet 6, Parts 1-4 which contain the data triangle and age-to-age factors for USPP reported claims under the increasing case outstanding strength scenario (p. 119)." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0ab5bcf6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999539,000630,000665,000686,000693,000693,000700,000700,000700,000700,000
2000565,950661,500698,250720,300727,650727,650735,000735,000735,000
2001594,248694,575733,163756,315764,033764,033771,750771,750
2002623,960729,304769,821794,131802,234802,234810,338
2003655,158765,769808,312833,837842,346842,346
2004687,916804,057848,727878,745884,463
2005722,312844,260897,355933,377
2006758,427897,702962,808
2007818,067979,922
2008931,185
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 539000.0 630000.0 665000.0 686000.0 693000.0 693000.0 700000.0 700000.0 700000.0 700000.0\n", + "2000 565950.0 661500.0 698250.0 720300.0 727650.0 727650.0 735000.0 735000.0 735000.0 NaN\n", + "2001 594248.0 694575.0 733163.0 756315.0 764033.0 764033.0 771750.0 771750.0 NaN NaN\n", + "2002 623960.0 729304.0 769821.0 794131.0 802234.0 802234.0 810338.0 NaN NaN NaN\n", + "2003 655158.0 765769.0 808312.0 833837.0 842346.0 842346.0 NaN NaN NaN NaN\n", + "2004 687916.0 804057.0 848727.0 878745.0 884463.0 NaN NaN NaN NaN NaN\n", + "2005 722312.0 844260.0 897355.0 933377.0 NaN NaN NaN NaN NaN NaN\n", + "2006 758427.0 897702.0 962808.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 818067.0 979922.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 931185.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.1691.0561.0321.0101.0001.0101.0001.0001.000
20001.1691.0561.0321.0101.0001.0101.0001.000
20011.1691.0561.0321.0101.0001.0101.000
20021.1691.0561.0321.0101.0001.010
20031.1691.0561.0321.0101.000
20041.1691.0561.0351.007
20051.1691.0631.040
20061.1841.073
20071.198
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.1781.0611.0341.0091.0001.0101.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.178 1.061 1.034 1.009 1.000 1.010 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.1781.0611.0341.0091.0001.0101.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.178 1.061 1.034 1.009 1.000 1.010 1.000 1.000 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate1.3171.1181.0541.0191.0101.0101.0001.0001.0001.000
Percent Reported0.7590.8940.9490.9810.9900.9901.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 1.317 1.118 1.054 1.019 1.010 1.010 1.000 1.000 1.000 1.000\n", + "Percent Reported 0.759 0.894 0.949 0.981 0.990 0.990 1.000 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " triangles.loc[\"Increasing Case\", \"Reported Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "2960fa5a", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.178, 1.061, 1.034, 1.009, 1.000,\n", + " 1.010, 1.000, 1.000, 1.000, 1.000,\n", + " ]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "fce58cd8", + "metadata": {}, + "source": [ + "### Exhibit III, Sheet 7: USPP Auto Increasing Case Outstanding Strength - Paid Claims\n", + "\n", + "We then generate Sheet 7, Parts 1-4 which contain the data triangle and age-to-age factors for USPP paid claims under the increasing case outstanding strength scenario (p. 120)." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "5a759ad5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999294,000497,000588,000644,000672,000686,000693,000693,000700,000700,000
2000308,700521,850617,400676,200705,600720,300727,650727,650735,000
2001324,135547,943648,270710,010740,880756,315764,033764,033
2002340,342575,340680,684745,511777,924794,131802,234
2003357,359604,107714,718782,786816,820833,837
2004375,227634,312750,454821,925857,661
2005393,988666,028787,976863,022
2006413,688699,329827,375
2007434,372734,295
2008456,090
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 294000.0 497000.0 588000.0 644000.0 672000.0 686000.0 693000.0 693000.0 700000.0 700000.0\n", + "2000 308700.0 521850.0 617400.0 676200.0 705600.0 720300.0 727650.0 727650.0 735000.0 NaN\n", + "2001 324135.0 547943.0 648270.0 710010.0 740880.0 756315.0 764033.0 764033.0 NaN NaN\n", + "2002 340342.0 575340.0 680684.0 745511.0 777924.0 794131.0 802234.0 NaN NaN NaN\n", + "2003 357359.0 604107.0 714718.0 782786.0 816820.0 833837.0 NaN NaN NaN NaN\n", + "2004 375227.0 634312.0 750454.0 821925.0 857661.0 NaN NaN NaN NaN NaN\n", + "2005 393988.0 666028.0 787976.0 863022.0 NaN NaN NaN NaN NaN NaN\n", + "2006 413688.0 699329.0 827375.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 434372.0 734295.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 456090.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.6901.1831.0951.0431.0211.0101.0001.0101.000
20001.6901.1831.0951.0431.0211.0101.0001.010
20011.6901.1831.0951.0431.0211.0101.000
20021.6901.1831.0951.0431.0211.010
20031.6901.1831.0951.0431.021
20041.6901.1831.0951.043
20051.6901.1831.095
20061.6901.183
20071.690
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.6901.1831.0951.0431.0211.0101.0001.0101.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.690 1.183 1.095 1.043 1.021 1.010 1.000 1.010 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.6901.1831.0951.0431.0211.0101.0001.0101.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.690 1.183 1.095 1.043 1.021 1.010 1.000 1.010 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate2.3781.4071.1901.0861.0421.0201.0101.0101.0001.000
Percent Reported0.4210.7110.8400.9210.9600.9800.9900.9901.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 2.378 1.407 1.190 1.086 1.042 1.020 1.010 1.010 1.000 1.000\n", + "Percent Reported 0.421 0.711 0.840 0.921 0.960 0.980 0.990 0.990 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " triangles.loc[\"Increasing Case\", \"Paid Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "009fb8f3", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.690, 1.183, 1.095, 1.043, 1.021,\n", + " 1.010, 1.000, 1.010, 1.000, 1.000,\n", + " ]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "dcd4322b", + "metadata": {}, + "source": [ + "### Exhibit III, Sheet 8: USPP Auto Increasing Claim Ratios and Increasing Case Outstanding Strength - Reported Claims\n", + "\n", + "We then generate Sheet 8, Parts 1-4 which contain the data triangle and age-to-age factors for USPP reported claims under the increasing claims ratio / increasing case outstanding strength scenario (p. 121)." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "ec0b53a5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999539,000630,000665,000686,000693,000693,000700,000700,000700,000700,000
2000565,950661,500698,250720,300727,650727,650735,000735,000735,000
2001594,248694,575733,163756,315764,033764,033771,750771,750
2002623,960729,304769,821794,131802,234802,234810,338
2003655,158765,769808,312833,837842,346842,346
2004786,189918,923969,9741,004,2801,010,815
2005877,0931,025,1731,089,6451,133,386
2006975,1211,154,1881,237,897
20071,110,2341,329,895
20081,330,264
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 539000.0 630000.0 665000.0 686000.0 693000.0 693000.0 700000.0 700000.0 700000.0 700000.0\n", + "2000 565950.0 661500.0 698250.0 720300.0 727650.0 727650.0 735000.0 735000.0 735000.0 NaN\n", + "2001 594248.0 694575.0 733163.0 756315.0 764033.0 764033.0 771750.0 771750.0 NaN NaN\n", + "2002 623960.0 729304.0 769821.0 794131.0 802234.0 802234.0 810338.0 NaN NaN NaN\n", + "2003 655158.0 765769.0 808312.0 833837.0 842346.0 842346.0 NaN NaN NaN NaN\n", + "2004 786189.0 918923.0 969974.0 1004280.0 1010815.0 NaN NaN NaN NaN NaN\n", + "2005 877093.0 1025173.0 1089645.0 1133386.0 NaN NaN NaN NaN NaN NaN\n", + "2006 975121.0 1154188.0 1237897.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 1110234.0 1329895.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 1330264.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.1691.0561.0321.0101.0001.0101.0001.0001.000
20001.1691.0561.0321.0101.0001.0101.0001.000
20011.1691.0561.0321.0101.0001.0101.000
20021.1691.0561.0321.0101.0001.010
20031.1691.0561.0321.0101.000
20041.1691.0561.0351.007
20051.1691.0631.040
20061.1841.073
20071.198
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.1791.0611.0351.0091.0001.0101.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.179 1.061 1.035 1.009 1.000 1.010 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.1791.0611.0351.0091.0001.0101.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.179 1.061 1.035 1.009 1.000 1.010 1.000 1.000 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate1.3191.1191.0551.0191.0101.0101.0001.0001.0001.000
Percent Reported0.7580.8940.9480.9810.9900.9901.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 1.319 1.119 1.055 1.019 1.010 1.010 1.000 1.000 1.000 1.000\n", + "Percent Reported 0.758 0.894 0.948 0.981 0.990 0.990 1.000 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " triangles.loc[\"Increasing Claim Case\", \"Reported Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "715e4a58", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.179, 1.061, 1.035, 1.009, 1.000,\n", + " 1.010, 1.000, 1.000, 1.000, 1.000,\n", + " ]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9a085c93", + "metadata": {}, + "source": [ + "### Exhibit III, Sheet 9: USPP Auto Increasing Claim Ratios and Increasing Case Outstanding Strength - Paid Claims\n", + "\n", + "We then generate Sheet 9, Parts 1-4 which contain the data triangle and age-to-age factors for USPP paid claims under the increasing claims ratio / increasing case outstanding strength scenario (p. 122):" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "16a0f5fd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999294,000497,000588,000644,000672,000686,000693,000693,000700,000700,000
2000308,700521,850617,400676,200705,600720,300727,650727,650735,000
2001324,135547,943648,270710,010740,880756,315764,033764,033
2002340,342575,340680,684745,511777,924794,131802,234
2003357,359604,107714,718782,786816,820833,837
2004428,831724,928857,661939,343980,184
2005478,414808,748956,8281,047,955
2006531,884899,1371,063,768
2007589,505996,544
2008651,558
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 294000.0 497000.0 588000.0 644000.0 672000.0 686000.0 693000.0 693000.0 700000.0 700000.0\n", + "2000 308700.0 521850.0 617400.0 676200.0 705600.0 720300.0 727650.0 727650.0 735000.0 NaN\n", + "2001 324135.0 547943.0 648270.0 710010.0 740880.0 756315.0 764033.0 764033.0 NaN NaN\n", + "2002 340342.0 575340.0 680684.0 745511.0 777924.0 794131.0 802234.0 NaN NaN NaN\n", + "2003 357359.0 604107.0 714718.0 782786.0 816820.0 833837.0 NaN NaN NaN NaN\n", + "2004 428831.0 724928.0 857661.0 939343.0 980184.0 NaN NaN NaN NaN NaN\n", + "2005 478414.0 808748.0 956828.0 1047955.0 NaN NaN NaN NaN NaN NaN\n", + "2006 531884.0 899137.0 1063768.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 589505.0 996544.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 651558.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.6901.1831.0951.0431.0211.0101.0001.0101.000
20001.6901.1831.0951.0431.0211.0101.0001.010
20011.6901.1831.0951.0431.0211.0101.000
20021.6901.1831.0951.0431.0211.010
20031.6901.1831.0951.0431.021
20041.6901.1831.0951.043
20051.6901.1831.095
20061.6901.183
20071.690
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.6901.1831.0951.0431.0211.0101.0001.0101.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.690 1.183 1.095 1.043 1.021 1.010 1.000 1.010 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.6901.1831.0951.0431.0211.0101.0001.0101.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.690 1.183 1.095 1.043 1.021 1.010 1.000 1.010 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate2.3781.4071.1901.0861.0421.0201.0101.0101.0001.000
Percent Reported0.4210.7110.8400.9210.9600.9800.9900.9901.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 2.378 1.407 1.190 1.086 1.042 1.020 1.010 1.010 1.000 1.000\n", + "Percent Reported 0.421 0.711 0.840 0.921 0.960 0.980 0.990 0.990 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " triangles.loc[\"Increasing Claim Case\", \"Paid Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "2fffd889", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.690, 1.183, 1.095, 1.043, 1.021,\n", + " 1.010, 1.000, 1.010, 1.000, 1.000,\n", + " ]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "4a34afcd", + "metadata": {}, + "source": [ + "### Exhibit III, Sheets 10 and 11: USPP Auto Development of Unpaid Claim Estimate\n", + "\n", + "We first create a function to handle formatting as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "191822b3", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "def Ex3Sht10(scenario, tr):\n", + "\n", + " def format_col(x, reverse = False):\n", + " if reverse is True:\n", + " return x.to_frame().squeeze()[::-1].reset_index(drop=True)\n", + " return x.to_frame().squeeze().reset_index(drop=True)\n", + "\n", + " def col_diff(x, y):\n", + " return x.squeeze() - y.squeeze()\n", + "\n", + " def col_mult(x, y):\n", + " return x.squeeze() * y.squeeze()\n", + "\n", + " tri = tr.copy()\n", + "\n", + " dev_input = {\n", + " \"average\" : \"volume\",\n", + " \"n_periods\" : 5\n", + " }\n", + "\n", + " tail_input = {\n", + " \"tail\" : 1.0,\n", + " \"projection_period\" : -1\n", + " }\n", + "\n", + " dev = cl.Development(**dev_input)\n", + " tail = cl.TailConstant(**tail_input)\n", + " tri = tail.fit_transform(dev.fit_transform(tri))\n", + "\n", + " actual_scenario = (\n", + " \"Steady State\"\n", + " if scenario in [\"Steady State\", \"Increasing Case\"]\n", + " else \"Increasing Claim\"\n", + " )\n", + "\n", + " cdf = format_col(tri.cdf_.loc[actual_scenario][\"Reported Claims\"], reverse=True)\n", + " ult = format_col(tri.loc[actual_scenario][\"Reported Claims\"].latest_diagonal)\n", + " \n", + " col1 = pd.DataFrame({\n", + " \"Accident Year\" : format_col(tr.origin)\n", + " })\n", + "\n", + " col2 = pd.DataFrame({\n", + " \"Age of Accident Year at 12/31/08\" : format_col(tr.development, reverse=True)\n", + "\n", + " })\n", + "\n", + " col3 = pd.DataFrame({\n", + " \"Claims at 12/31/2008 - Reported\" : format_col(tri.loc[scenario][\"Reported Claims\"].latest_diagonal)\n", + "\n", + " })\n", + "\n", + " col4 = pd.DataFrame({\n", + " \"Claims at 12/31/2008 - Paid\" : format_col(tri.loc[scenario][\"Paid Claims\"].latest_diagonal)\n", + "\n", + " })\n", + "\n", + " col5 = pd.DataFrame({\n", + " \"Case Outstanding\" : col_diff(col3, col4)\n", + "\n", + " })\n", + "\n", + " col6 = pd.DataFrame({\n", + " \"CDF to Ult. - Reported\" : format_col(tri.cdf_.loc[scenario][\"Reported Claims\"], reverse=True)\n", + "\n", + " })\n", + "\n", + " col7 = pd.DataFrame({\n", + " \"CDF to Ult. - Paid\" : format_col(tri.cdf_.loc[scenario][\"Paid Claims\"], reverse=True)\n", + " })\n", + "\n", + " col8 = pd.DataFrame({\n", + " \"Projected Ult. Claims Using Dev. Method - Reported\" : col_mult(col3, col6)\n", + " })\n", + "\n", + " col9 = pd.DataFrame({\n", + " \"Projected Ult. Claims Using Dev. Method - Paid\" : col_mult(col4, col7)\n", + " })\n", + "\n", + " col10 = pd.DataFrame({\n", + " \"Estimated IBNR Using Dev. Method - Reported\" : col_diff(col8, col3)\n", + " })\n", + "\n", + " col11 = pd.DataFrame({\n", + " \"Estimated IBNR Using Dev. Method - Paid\" : col_diff(col9, col3)\n", + " })\n", + "\n", + " col12 = pd.DataFrame({\n", + " \"Actual IBNR\" : col_diff(col_mult(ult, cdf), col3)\n", + " })\n", + "\n", + " col13 = pd.DataFrame({\n", + " \"Difference from Actual IBNR - Reported\" : col_diff(col12, col10)\n", + " })\n", + "\n", + " col14 = pd.DataFrame({\n", + " \"Difference from Actual IBNR - Paid\" : col_diff(col12, col11)\n", + " })\n", + "\n", + "\n", + " cols = [col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12, col13, col14]\n", + "\n", + " results = pd.concat(cols, axis=1)\n", + "\n", + " format_dict = {\n", + " # Dollar amounts\n", + " \"Claims at 12/31/2008 - Reported\": \"{:,.0f}\",\n", + " \"Claims at 12/31/2008 - Paid\": \"{:,.0f}\",\n", + " \"Case Outstanding\": \"{:,.0f}\",\n", + " \"Projected Ult. Claims Using Dev. Method - Reported\": \"{:,.0f}\",\n", + " \"Projected Ult. Claims Using Dev. Method - Paid\": \"{:,.0f}\",\n", + " \"Estimated IBNR Using Dev. Method - Reported\": \"{:,.0f}\",\n", + " \"Estimated IBNR Using Dev. Method - Paid\": \"{:,.0f}\",\n", + " \"Actual IBNR\": \"{:,.0f}\",\n", + " \"Difference from Actual IBNR - Reported\": \"{:,.0f}\",\n", + " \"Difference from Actual IBNR - Paid\": \"{:,.0f}\",\n", + "\n", + " # Ages\n", + " \"Age of Accident Year at 12/31/08\": \"{:.0f}\",\n", + "\n", + " # Factors\n", + " \"CDF to Ult. - Reported\": \"{:.3f}\",\n", + " \"CDF to Ult. - Paid\": \"{:.3f}\",\n", + " }\n", + "\n", + " results = results.set_index(\"Accident Year\")\n", + "\n", + " total_cols = [\n", + " \"Claims at 12/31/2008 - Reported\",\n", + " \"Claims at 12/31/2008 - Paid\",\n", + " \"Case Outstanding\",\n", + " \"Projected Ult. Claims Using Dev. Method - Reported\",\n", + " \"Projected Ult. Claims Using Dev. Method - Paid\",\n", + " \"Estimated IBNR Using Dev. Method - Reported\",\n", + " \"Estimated IBNR Using Dev. Method - Paid\",\n", + " \"Actual IBNR\",\n", + " \"Difference from Actual IBNR - Reported\",\n", + " \"Difference from Actual IBNR - Paid\",\n", + " ]\n", + " \n", + " results.loc[\"Total\", total_cols] = results[total_cols].sum()\n", + "\n", + " display(HTML(f\"

Exhibit III Sheets 10 and 11 — {scenario}

\"))\n", + "\n", + " display(\n", + " results.style.format(format_dict, na_rep=\"\")\n", + " )\n", + "\n", + " return results\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "71ab9a93", + "metadata": {}, + "source": [ + "We then generate Sheets 10 and 11 which illustrate the differences between the actual IBNR and the IBNR obtained through the development method for each scenario (pp. 123-124)." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "e0f134ea", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

Exhibit III Sheets 10 and 11 — Steady State

" + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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 of Accident Year at 12/31/08Claims at 12/31/2008 - ReportedClaims at 12/31/2008 - PaidCase OutstandingCDF to Ult. - ReportedCDF to Ult. - PaidProjected Ult. Claims Using Dev. Method - ReportedProjected Ult. Claims Using Dev. Method - PaidEstimated IBNR Using Dev. Method - ReportedEstimated IBNR Using Dev. Method - PaidActual IBNRDifference from Actual IBNR - ReportedDifference from Actual IBNR - Paid
Accident Year             
1999120700,000700,00001.0001.000700,000700,00000000
2000108735,000735,00001.0001.000735,000735,00000000
200196771,750764,0337,7171.0001.010771,750771,7510100-1
200284810,338802,2348,1041.0001.010810,338810,3370-1001
200372842,346833,8378,5091.0101.020850,855850,8548,5098,5088,50900
200460884,463857,66126,8021.0101.042893,397893,3978,9348,9348,93400
200548919,306863,02256,2841.0201.087938,068938,06718,76218,76118,76200
200636935,722827,375108,3471.0531.190984,970984,97049,24849,24849,24800
200724930,797734,295196,5021.1111.4081,034,2191,034,218103,422103,421103,42201
200812836,166456,090380,0761.2992.3811,085,9301,085,928249,764249,762249,76402
Total8,365,8887,573,547792,3418,804,5278,804,522438,639438,634438,63905
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Exhibit III Sheets 10 and 11 — Increasing Claim

" + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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 of Accident Year at 12/31/08Claims at 12/31/2008 - ReportedClaims at 12/31/2008 - PaidCase OutstandingCDF to Ult. - ReportedCDF to Ult. - PaidProjected Ult. Claims Using Dev. Method - ReportedProjected Ult. Claims Using Dev. Method - PaidEstimated IBNR Using Dev. Method - ReportedEstimated IBNR Using Dev. Method - PaidActual IBNRDifference from Actual IBNR - ReportedDifference from Actual IBNR - Paid
Accident Year             
1999120700,000700,00001.0001.000700,000700,00000000
2000108735,000735,00001.0001.000735,000735,00000000
200196771,750764,0337,7171.0001.010771,750771,7510100-1
200284810,338802,2348,1041.0001.010810,338810,3370-1001
200372842,346833,8378,5091.0101.020850,855850,8548,5098,5088,50900
2004601,010,815980,18430,6311.0101.0421,021,0251,021,02510,21010,21010,21000
2005481,116,3001,047,95568,3451.0201.0871,139,0821,139,08122,78222,78122,78200
2006361,203,0711,063,768139,3031.0531.1901,266,3911,266,39063,32063,31963,32000
2007241,263,224996,544266,6801.1111.4081,403,5821,403,583140,358140,359140,3580-0
2008121,194,523651,558542,9651.2992.3811,551,3281,551,328356,805356,805356,80500
Total9,647,3678,575,1131,072,25410,249,35110,249,350601,984601,983601,98401
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Exhibit III Sheets 10 and 11 — Increasing Case

" + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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 of Accident Year at 12/31/08Claims at 12/31/2008 - ReportedClaims at 12/31/2008 - PaidCase OutstandingCDF to Ult. - ReportedCDF to Ult. - PaidProjected Ult. Claims Using Dev. Method - ReportedProjected Ult. Claims Using Dev. Method - PaidEstimated IBNR Using Dev. Method - ReportedEstimated IBNR Using Dev. Method - PaidActual IBNRDifference from Actual IBNR - ReportedDifference from Actual IBNR - Paid
Accident Year             
1999120700,000700,00001.0001.000700,000700,00000000
2000108735,000735,00001.0001.000735,000735,00000000
200196771,750764,0337,7171.0001.010771,750771,7510100-1
200284810,338802,2348,1041.0001.010810,338810,3370-1001
200372842,346833,8378,5091.0101.020850,855850,8548,5098,5088,50900
200460884,463857,66126,8021.0101.042893,397893,3978,9348,9348,93400
200548933,377863,02270,3551.0201.087951,657938,06718,2804,6904,691-13,5890
200636962,808827,375135,4331.0551.1901,015,301984,97052,49322,16222,162-30,3310
200724979,922734,295245,6271.1191.4081,096,2351,034,218116,31354,29654,297-62,0161
200812931,185456,090475,0951.3182.3811,227,5891,085,928296,404154,743154,745-141,6592
Total8,551,1897,573,547977,6429,052,1218,804,522500,932253,333253,338-247,5955
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Exhibit III Sheets 10 and 11 — Increasing Claim Case

" + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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 of Accident Year at 12/31/08Claims at 12/31/2008 - ReportedClaims at 12/31/2008 - PaidCase OutstandingCDF to Ult. - ReportedCDF to Ult. - PaidProjected Ult. Claims Using Dev. Method - ReportedProjected Ult. Claims Using Dev. Method - PaidEstimated IBNR Using Dev. Method - ReportedEstimated IBNR Using Dev. Method - PaidActual IBNRDifference from Actual IBNR - ReportedDifference from Actual IBNR - Paid
Accident Year             
1999120700,000700,00001.0001.000700,000700,00000000
2000108735,000735,00001.0001.000735,000735,00000000
200196771,750764,0337,7171.0001.010771,750771,7510100-1
200284810,338802,2348,1041.0001.010810,338810,3370-1001
200372842,346833,8378,5091.0101.020850,855850,8548,5098,5088,50900
2004601,010,815980,18430,6311.0101.0421,021,0251,021,02510,21010,21010,21000
2005481,133,3861,047,95585,4311.0191.0871,155,4821,139,08122,0965,6955,696-16,4000
2006361,237,8971,063,768174,1291.0551.1901,305,6391,266,39067,74228,49328,494-39,2490
2007241,329,895996,544333,3511.1201.4081,488,8751,403,583158,98073,68873,687-85,293-0
2008121,330,264651,558678,7061.3202.3811,756,5041,551,328426,240221,064221,064-205,1760
Total9,901,6918,575,1131,326,57810,595,46910,249,350693,778347,659347,660-346,1181
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "res_1 = Ex3Sht10(\"Steady State\", triangles)\n", + "\n", + "res_2 = Ex3Sht10(\"Increasing Claim\", triangles)\n", + "\n", + "res_3 = Ex3Sht10(\"Increasing Case\", triangles)\n", + "\n", + "res_4 = Ex3Sht10(\"Increasing Claim Case\", triangles)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "21931acb", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "estimate_cols = [\n", + " \"Projected Ult. Claims Using Dev. Method - Reported\", # (8)\n", + " \"Projected Ult. Claims Using Dev. Method - Paid\", # (9)\n", + " \"Estimated IBNR Using Dev. Method - Reported\", # (10)\n", + " \"Estimated IBNR Using Dev. Method - Paid\", # (11)\n", + "]\n", + "\n", + "assert np.allclose(\n", + " res_1.loc[\n", + " res_1.index != \"Total\",\n", + " estimate_cols,\n", + " ].values,\n", + " np.array([\n", + " [700000, 700000, 0, 0],\n", + " [735000, 735000, 0, 0],\n", + " [771750, 771750, 0, 0],\n", + " [810338, 810338, 0, 0],\n", + " [850854, 850854, 8509, 8509],\n", + " [893397, 893397, 8934, 8934],\n", + " [938067, 938067, 18761, 18761],\n", + " [984970, 984970, 49249, 49249],\n", + " [1034219, 1034219, 103422, 103422],\n", + " [1085930, 1085930, 249764, 249764],\n", + "]),\n", + " atol=3,\n", + " rtol=0,\n", + ")\n", + "\n", + "assert np.allclose(\n", + " res_2.loc[\n", + " res_2.index != \"Total\",\n", + " estimate_cols,\n", + " ].values,\n", + " np.array([\n", + " [700000, 700000, 0, 0],\n", + " [735000, 735000, 0, 0],\n", + " [771750, 771750, 0, 0],\n", + " [810338, 810338, 0, 0],\n", + " [850854, 850854, 8509, 8509],\n", + " [1021025, 1021025, 10210, 10210],\n", + " [1139081, 1139081, 22782, 22782],\n", + " [1266390, 1266390, 63320, 63320],\n", + " [1403583, 1403583, 140358, 140358],\n", + " [1551328, 1551328, 356805, 356805],\n", + "]),\n", + " atol=3,\n", + " rtol=0,\n", + ")\n", + "\n", + "assert np.allclose(\n", + " res_3.loc[\n", + " res_3.index != \"Total\",\n", + " estimate_cols,\n", + " ].values,\n", + " np.array([\n", + " [700000, 700000, 0, 0],\n", + " [735000, 735000, 0, 0],\n", + " [771750, 771750, 0, 0],\n", + " [810338, 810338, 0, 0],\n", + " [850854, 850854, 8509, 8509],\n", + " [893397, 893397, 8934, 8934],\n", + " [951656, 938067, 18279, 4690],\n", + " [1015302, 984970, 52493, 22162],\n", + " [1096235, 1034219, 116313, 54296],\n", + " [1227589, 1085930, 296404, 154745],\n", + "]),\n", + " atol=3,\n", + " rtol=0,\n", + ")\n", + "\n", + "assert np.allclose(\n", + " res_4.loc[\n", + " res_4.index != \"Total\",\n", + " estimate_cols,\n", + " ].values,\n", + " np.array([\n", + " [700000, 700000, 0, 0],\n", + " [735000, 735000, 0, 0],\n", + " [771750, 771750, 0, 0],\n", + " [810338, 810338, 0, 0],\n", + " [850854, 850854, 8509, 8509],\n", + " [1021025, 1021025, 10210, 10210],\n", + " [1155482, 1139081, 22096, 5695],\n", + " [1305639, 1266390, 67742, 28494],\n", + " [1488874, 1403583, 158980, 73688],\n", + " [1756504, 1551328, 426240, 221064],\n", + "]),\n", + " atol=3,\n", + " rtol=0,\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "82fddb5f", + "metadata": {}, + "source": [ + "## Exhibit IV — Impact of Changing Product Mix Example\n", + "\n", + "In Exhibit IV, Friedland demonstrates the effect of changes in product mix on the development method in order to further illustrate its limitations before segueing into more advanced methods. The changing product mix in this example refers to the proportion of earned premiums attributable to the private passenger and commercial portfolios of U.S. Auto over a ten-year experience period. \n", + "\n", + "In the steady state scenario, both lines have an equal proportion of the total earned premiums (which increase by 5% annually), while in the changing product mix scenario, the proportionate share of earned premiums of commercial lines increases relative to private passenger (specifically, commercial's earned premium increases by 30% annually from the seventh development year). Other than the earned premium, the other key assumption of this study are as follows are assumed ultimate claim ratios of 70% and 80%, respectively, for private passenger and commercial.\n", + "\n", + "Since the USPP Auto dataset is contained in the `chainladder` package, we simply load it into a triangle as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "8d88d02f", + "metadata": {}, + "outputs": [], + "source": [ + "data = cl.load_sample(\"friedland_us_auto\")\n", + "tri = data.copy()" + ] + }, + { + "cell_type": "markdown", + "id": "f1f909dd", + "metadata": {}, + "source": [ + "### Exhibit IV, Sheet 1 - Summary of Assumptions - Earned Premiums and Claim Ratios\n", + "\n", + "To use Chainladder to reproduce Sheet 1 of Exhibit IV, we create the following function to take care of the necessary formatting, and to perform the appropriate transformations/slicing of the data triangle to apply the development method and determine the IBNR. " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "3db66603", + "metadata": {}, + "outputs": [], + "source": [ + "def Ex4Sht1(scenario, tri):\n", + "\n", + " def format_col(x, reverse = False):\n", + " if reverse is True:\n", + " return x.to_frame().squeeze()[::-1].reset_index(drop=True)\n", + " return x.to_frame().squeeze().reset_index(drop=True)\n", + "\n", + " def col_add(x, y):\n", + " return x.squeeze() + y.squeeze()\n", + "\n", + " def col_diff(x, y):\n", + " return x.squeeze() - y.squeeze()\n", + "\n", + " def col_div(x, y):\n", + " return x.squeeze() / y.squeeze()\n", + "\n", + " def col_mult(x, y):\n", + " return x.squeeze() * y.squeeze()\n", + "\n", + " tri = tri.copy()\n", + "\n", + " dev_input = {\n", + " \"average\" : \"volume\",\n", + " \"n_periods\" : 5\n", + " }\n", + "\n", + " tail_input = {\n", + " \"tail\" : 1.0,\n", + " \"projection_period\" : -1\n", + " }\n", + "\n", + " dev = cl.Development(**dev_input)\n", + " tail = cl.TailConstant(**tail_input)\n", + " tri = tail.fit_transform(dev.fit_transform(tri))\n", + "\n", + " col1 = pd.DataFrame({\n", + " \"Accident Year\" : format_col(tri.origin)\n", + " })\n", + "\n", + " col2 = pd.DataFrame({\n", + " \"Priv Pass Auto\" : format_col(tri.loc[\"Steady State\"][\"Earned Premium\"].latest_diagonal / 2)\n", + " })\n", + "\n", + " col3 = pd.DataFrame({\n", + " \"Comm Auto\" : col_diff(\n", + " format_col(tri.loc[scenario][\"Earned Premium\"].latest_diagonal),\n", + " col2\n", + " )\n", + " })\n", + "\n", + " col4 = pd.DataFrame({\n", + " \"Total\" : format_col(tri.loc[scenario][\"Earned Premium\"].latest_diagonal)\n", + " })\n", + "\n", + " col5 = pd.DataFrame({\n", + " \"Priv Pass Auto (%)\" : pd.Series([0.7] * 10) \n", + " })\n", + "\n", + " col6 = pd.DataFrame({\n", + " \"Comm Auto (%)\" : pd.Series([0.8] * 10) \n", + " })\n", + "\n", + " col8 = pd.DataFrame({\n", + " \"Priv Pass Auto\" : col_mult(col2, col5) \n", + " })\n", + "\n", + " col9 = pd.DataFrame({\n", + " \"Comm Auto\" : col_mult(col3, col6) \n", + " })\n", + "\n", + " col10 = pd.DataFrame({\n", + " \"Comm Auto\" : col_add(col8, col9) \n", + " })\n", + "\n", + " col7 = pd.DataFrame({\n", + " \"Total (%)\" : col_div(col10, col4) \n", + " })\n", + "\n", + " col11 = pd.DataFrame({\n", + " \"Reported Claims as at 12/31/2008\" : format_col(tri.loc[scenario][\"Reported Claims\"].latest_diagonal) \n", + " })\n", + "\n", + " col12 = pd.DataFrame({\n", + " \"Actual IBNR\" : col_diff(col10, col11) \n", + " })\n", + "\n", + "\n", + " cols = [col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12]\n", + "\n", + " results = pd.concat(cols, axis=1)\n", + "\n", + " format_dict = {\n", + " # Dollar amounts\n", + " \"Priv Pass Auto\": \"{:,.0f}\",\n", + " \"Comm Auto\": \"{:,.0f}\",\n", + " \"Total\": \"{:,.0f}\",\n", + " \"Reported Claims as at 12/31/2008\" : \"{:,.0f}\",\n", + " \"Actual IBNR\" : \"{:,.0f}\",\n", + "\n", + " # Percentages\n", + " \"Priv Pass Auto (%)\": \"{:.1%}\",\n", + " \"Comm Auto (%)\": \"{:.1%}\",\n", + " \"Total (%)\": \"{:.1%}\",\n", + "\n", + " # Factors\n", + " \"CDF to Ult. - Reported\": \"{:.3f}\",\n", + " \"CDF to Ult. - Paid\": \"{:.3f}\",\n", + " }\n", + "\n", + " results = results.set_index(\"Accident Year\")\n", + "\n", + " total_cols = [\n", + " \"Priv Pass Auto\",\n", + " \"Comm Auto\",\n", + " \"Total\",\n", + " \"Reported Claims as at 12/31/2008\",\n", + " \"Actual IBNR\",\n", + " ]\n", + "\n", + " results.loc[\"Total\", total_cols] = results[total_cols].sum()\n", + "\n", + " display(HTML(f\"

Exhibit IV, Sheet 1 — {scenario}

\"))\n", + "\n", + " display(\n", + " results.style.format(format_dict, na_rep=\"\").set_table_styles([\n", + " {\n", + " \"selector\": \"th.col_heading\",\n", + " \"props\": [\n", + " (\"white-space\", \"normal\"),\n", + " (\"max-width\", \"80px\"),\n", + " ]\n", + " }\n", + " ])\n", + " )\n", + "\n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "46324359", + "metadata": {}, + "source": [ + "Having defined the function, we generate Sheet 1, which contains the development of losses under the Steady State and Changing Product Mix scenarios (p. 125):" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "346c3742", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

Exhibit IV, Sheet 1 — Steady State

" + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 Priv Pass AutoComm AutoTotalPriv Pass Auto (%)Comm Auto (%)Total (%)Priv Pass AutoComm AutoComm AutoReported Claims as at 12/31/2008Actual IBNR
Accident Year           
19991,000,0001,000,0002,000,00070.0%80.0%75.0%700,000800,0001,500,0001,500,0000
20001,050,0001,050,0002,100,00070.0%80.0%75.0%735,000840,0001,575,0001,575,0000
20011,102,5001,102,5002,205,00070.0%80.0%75.0%771,750882,0001,653,7501,653,7500
20021,157,6251,157,6252,315,25070.0%80.0%75.0%810,338926,1001,736,4381,736,438-0
20031,215,5061,215,5062,431,01370.0%80.0%75.0%850,855972,4051,823,2601,814,7518,509
20041,276,2821,276,2822,552,56370.0%80.0%75.0%893,3971,021,0251,914,4221,885,06829,354
20051,340,0961,340,0962,680,19170.0%80.0%75.0%938,0671,072,0762,010,1431,948,49961,644
20061,407,1001,407,1002,814,20170.0%80.0%75.0%984,9701,125,6802,110,6511,937,577173,074
20071,477,4561,477,4562,954,91170.0%80.0%75.0%1,034,2191,181,9642,216,1831,852,729363,454
20081,551,3281,551,3283,102,65670.0%80.0%75.0%1,085,9301,241,0622,326,9921,568,393758,599
Total12,577,89212,577,89225,155,7858,804,52510,062,31418,866,83917,472,2051,394,634
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Exhibit IV, Sheet 1 — Changing Product Mix

" + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 Priv Pass AutoComm AutoTotalPriv Pass Auto (%)Comm Auto (%)Total (%)Priv Pass AutoComm AutoComm AutoReported Claims as at 12/31/2008Actual IBNR
Accident Year           
19991,000,0001,000,0002,000,00070.0%80.0%75.0%700,000800,0001,500,0001,500,0000
20001,050,0001,050,0002,100,00070.0%80.0%75.0%735,000840,0001,575,0001,575,0000
20011,102,5001,102,5002,205,00070.0%80.0%75.0%771,750882,0001,653,7501,653,7500
20021,157,6251,157,6252,315,25070.0%80.0%75.0%810,338926,1001,736,4381,736,438-0
20031,215,5061,215,5062,431,01370.0%80.0%75.0%850,855972,4051,823,2601,814,7518,509
20041,276,2821,276,2822,552,56370.0%80.0%75.0%893,3971,021,0251,914,4221,885,06829,354
20051,340,0961,659,1662,999,26270.0%80.0%75.5%938,0671,327,3332,265,4002,193,54571,855
20061,407,1002,156,9163,564,01670.0%80.0%76.1%984,9701,725,5322,710,5032,471,446239,057
20071,477,4562,803,9904,281,44670.0%80.0%76.5%1,034,2192,243,1923,277,4112,680,487596,924
20081,551,3283,645,1885,196,51670.0%80.0%77.0%1,085,9302,916,1504,002,0802,556,6951,445,385
Total12,577,89217,067,17429,645,0668,804,52513,653,73922,458,26420,067,1802,391,084
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "res_1 = Ex4Sht1(\"Steady State\", data)\n", + "\n", + "res_2 = Ex4Sht1(\"Changing Product Mix\", data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "c6744884", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " res_1.iloc[:-1, [8, 10]].values,\n", + " np.array([\n", + " [1500000, 0],\n", + " [1575000, 0],\n", + " [1653750, 0],\n", + " [1736438, 0],\n", + " [1823259, 8509],\n", + " [1914422, 29354],\n", + " [2010143, 61644],\n", + " [2110651, 173073],\n", + " [2216183, 363454],\n", + " [2326992, 758599],\n", + " ]),\n", + " atol=2,\n", + " rtol=0,\n", + ")\n", + "\n", + "assert np.allclose(\n", + " res_2.iloc[:-1, [8, 10]].values,\n", + " np.array([\n", + " [1500000, 0],\n", + " [1575000, 0],\n", + " [1653750, 0],\n", + " [1736438, 0],\n", + " [1823259, 8509],\n", + " [1914422, 29354],\n", + " [2265400, 71855],\n", + " [2710503, 239057],\n", + " [3277411, 596924],\n", + " [4002080, 1445385],\n", + " ]),\n", + " atol=2,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "fdbc301f", + "metadata": {}, + "source": [ + "### Exhibit IV, Sheet 2 - U.S. Auto Steady-State - Reported Claims\n", + "\n", + "We now use the 'dev_exhibit' function to generate Exhibit IV, Sheet 2 (p. 126):" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "8a7c6e5d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
19991,011,0001,254,0001,377,0001,454,0001,477,0001,493,0001,500,0001,500,0001,500,0001,500,000
20001,061,5501,316,7001,445,8501,526,7001,550,8501,567,6501,575,0001,575,0001,575,000
20011,114,6281,382,5351,518,1431,603,0351,628,3931,646,0331,653,7501,653,750
20021,170,3591,451,6621,594,0501,683,1871,709,8121,728,3341,736,438
20031,228,8771,524,2451,673,7521,767,3461,795,3031,814,751
20041,290,3211,600,4571,757,4401,855,7131,885,068
20051,354,8371,680,4801,845,3121,948,499
20061,422,5791,764,5041,937,577
20071,493,7071,852,729
20081,568,393
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 1011000.0 1254000.0 1377000.0 1454000.0 1477000.0 1493000.0 1500000.0 1500000.0 1500000.0 1500000.0\n", + "2000 1061550.0 1316700.0 1445850.0 1526700.0 1550850.0 1567650.0 1575000.0 1575000.0 1575000.0 NaN\n", + "2001 1114628.0 1382535.0 1518143.0 1603035.0 1628393.0 1646033.0 1653750.0 1653750.0 NaN NaN\n", + "2002 1170359.0 1451662.0 1594050.0 1683187.0 1709812.0 1728334.0 1736438.0 NaN NaN NaN\n", + "2003 1228877.0 1524245.0 1673752.0 1767346.0 1795303.0 1814751.0 NaN NaN NaN NaN\n", + "2004 1290321.0 1600457.0 1757440.0 1855713.0 1885068.0 NaN NaN NaN NaN NaN\n", + "2005 1354837.0 1680480.0 1845312.0 1948499.0 NaN NaN NaN NaN NaN NaN\n", + "2006 1422579.0 1764504.0 1937577.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 1493707.0 1852729.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 1568393.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.2401.0981.0561.0161.0111.0051.0001.0001.000
20001.2401.0981.0561.0161.0111.0051.0001.000
20011.2401.0981.0561.0161.0111.0051.000
20021.2401.0981.0561.0161.0111.005
20031.2401.0981.0561.0161.011
20041.2401.0981.0561.016
20051.2401.0981.056
20061.2401.098
20071.240
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.2401.0981.0561.0161.0111.0051.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.240 1.098 1.056 1.016 1.011 1.005 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.2401.0981.0561.0161.0111.0051.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.240 1.098 1.056 1.016 1.011 1.005 1.000 1.000 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate1.4841.1971.0901.0321.0161.0051.0001.0001.0001.000
Percent Reported0.6740.8350.9170.9690.9840.9951.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 1.484 1.197 1.090 1.032 1.016 1.005 1.000 1.000 1.000 1.000\n", + "Percent Reported 0.674 0.835 0.917 0.969 0.984 0.995 1.000 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " data.loc[\"Steady State\", \"Reported Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "2833183d", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.240, 1.098, 1.056, 1.016, 1.011,\n", + " 1.005, 1.000, 1.000, 1.000, 1.000,\n", + "]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a58d9059", + "metadata": {}, + "source": [ + "### Exhibit IV, Sheet 3 - U.S. Auto Steady-State - Paid Claims\n", + "\n", + "We now use the 'dev_exhibit' function to generate Exhibit IV, Sheet 3 (p. 127):" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "8c9306e2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999470,000865,0001,124,0001,300,0001,400,0001,446,0001,469,0001,477,0001,492,0001,500,000
2000493,500908,2501,180,2001,365,0001,470,0001,518,3001,542,4501,550,8501,566,600
2001518,175953,6631,239,2101,433,2501,543,5001,594,2151,619,5731,628,393
2002544,0841,001,3461,301,1711,504,9131,620,6751,673,9261,700,551
2003571,2881,051,4131,366,2291,580,1581,701,7091,757,622
2004599,8521,103,9841,434,5401,659,1661,786,794
2005629,8451,159,1831,506,2681,742,124
2006661,3371,217,1421,581,581
2007694,4041,277,999
2008729,124
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 470000.0 865000.0 1124000.0 1300000.0 1400000.0 1446000.0 1469000.0 1477000.0 1492000.0 1500000.0\n", + "2000 493500.0 908250.0 1180200.0 1365000.0 1470000.0 1518300.0 1542450.0 1550850.0 1566600.0 NaN\n", + "2001 518175.0 953663.0 1239210.0 1433250.0 1543500.0 1594215.0 1619573.0 1628393.0 NaN NaN\n", + "2002 544084.0 1001346.0 1301171.0 1504913.0 1620675.0 1673926.0 1700551.0 NaN NaN NaN\n", + "2003 571288.0 1051413.0 1366229.0 1580158.0 1701709.0 1757622.0 NaN NaN NaN NaN\n", + "2004 599852.0 1103984.0 1434540.0 1659166.0 1786794.0 NaN NaN NaN NaN NaN\n", + "2005 629845.0 1159183.0 1506268.0 1742124.0 NaN NaN NaN NaN NaN NaN\n", + "2006 661337.0 1217142.0 1581581.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 694404.0 1277999.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 729124.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.8401.2991.1571.0771.0331.0161.0051.0101.005
20001.8401.2991.1571.0771.0331.0161.0051.010
20011.8401.2991.1571.0771.0331.0161.005
20021.8401.2991.1571.0771.0331.016
20031.8401.2991.1571.0771.033
20041.8401.2991.1571.077
20051.8401.2991.157
20061.8401.299
20071.840
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.8401.2991.1571.0771.0331.0161.0051.0101.005
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.840 1.299 1.157 1.077 1.033 1.016 1.005 1.010 1.005" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.8401.2991.1571.0771.0331.0161.0051.0101.0051.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.840 1.299 1.157 1.077 1.033 1.016 1.005 1.010 1.005 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate3.1891.7331.3341.1531.0711.0361.0201.0151.0051.000
Percent Reported0.3140.5770.7500.8670.9340.9650.9800.9850.9951.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 3.189 1.733 1.334 1.153 1.071 1.036 1.020 1.015 1.005 1.000\n", + "Percent Reported 0.314 0.577 0.750 0.867 0.934 0.965 0.980 0.985 0.995 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " data.loc[\"Steady State\", \"Paid Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "5059355c", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.840, 1.299, 1.157, 1.077, 1.033,\n", + " 1.016, 1.005, 1.010, 1.005, 1.000,\n", + "]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7b782ca9", + "metadata": {}, + "source": [ + "### Exhibit IV, Sheet 4 - U.S. Auto Changing Product Mix - Reported Claims\n", + "\n", + "We now use the 'dev_exhibit' function to generate Exhibit IV, Sheet 4 (p. 128):" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "5c96f69e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
19991,011,0001,254,0001,377,0001,454,0001,477,0001,493,0001,500,0001,500,0001,500,0001,500,000
20001,061,5501,316,7001,445,8501,526,7001,550,8501,567,6501,575,0001,575,0001,575,000
20011,114,6281,382,5351,518,1431,603,0351,628,3931,646,0331,653,7501,653,750
20021,170,3591,451,6621,594,0501,683,1871,709,8121,728,3341,736,438
20031,228,8771,524,2451,673,7521,767,3461,795,3031,814,751
20041,290,3211,600,4571,757,4401,855,7131,885,068
20051,505,4381,879,5802,072,4902,193,545
20061,776,4912,232,3892,471,446
20072,119,8322,680,487
20082,556,695
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 1011000.0 1254000.0 1377000.0 1454000.0 1477000.0 1493000.0 1500000.0 1500000.0 1500000.0 1500000.0\n", + "2000 1061550.0 1316700.0 1445850.0 1526700.0 1550850.0 1567650.0 1575000.0 1575000.0 1575000.0 NaN\n", + "2001 1114628.0 1382535.0 1518143.0 1603035.0 1628393.0 1646033.0 1653750.0 1653750.0 NaN NaN\n", + "2002 1170359.0 1451662.0 1594050.0 1683187.0 1709812.0 1728334.0 1736438.0 NaN NaN NaN\n", + "2003 1228877.0 1524245.0 1673752.0 1767346.0 1795303.0 1814751.0 NaN NaN NaN NaN\n", + "2004 1290321.0 1600457.0 1757440.0 1855713.0 1885068.0 NaN NaN NaN NaN NaN\n", + "2005 1505438.0 1879580.0 2072490.0 2193545.0 NaN NaN NaN NaN NaN NaN\n", + "2006 1776491.0 2232389.0 2471446.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 2119832.0 2680487.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 2556695.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.2401.0981.0561.0161.0111.0051.0001.0001.000
20001.2401.0981.0561.0161.0111.0051.0001.000
20011.2401.0981.0561.0161.0111.0051.000
20021.2401.0981.0561.0161.0111.005
20031.2401.0981.0561.0161.011
20041.2401.0981.0561.016
20051.2491.1031.058
20061.2571.107
20071.264
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.2521.1011.0571.0161.0111.0051.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.252 1.101 1.057 1.016 1.011 1.005 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.2521.1011.0571.0161.0111.0051.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.252 1.101 1.057 1.016 1.011 1.005 1.000 1.000 1.000 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate1.5041.2011.0911.0321.0161.0051.0001.0001.0001.000
Percent Reported0.6650.8330.9170.9690.9840.9951.0001.0001.0001.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 1.504 1.201 1.091 1.032 1.016 1.005 1.000 1.000 1.000 1.000\n", + "Percent Reported 0.665 0.833 0.917 0.969 0.984 0.995 1.000 1.000 1.000 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " data.loc[\"Changing Product Mix\", \"Reported Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "ee12d597", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.252, 1.101, 1.057, 1.016, 1.011,\n", + " 1.005, 1.000, 1.000, 1.000, 1.000,\n", + "]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "bcaa5b7d", + "metadata": {}, + "source": [ + "### Exhibit IV, Sheet 5 - U.S. Auto Changing Product Mix - Paid Claims\n", + "\n", + "We now use the 'dev_exhibit' function to generate Exhibit IV, Sheet 5 (p. 129):" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "e0cc72a6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 1 - Data Triangle\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1224364860728496108120
1999470,000865,0001,124,0001,300,0001,400,0001,446,0001,469,0001,477,0001,492,0001,500,000
2000493,500908,2501,180,2001,365,0001,470,0001,518,3001,542,4501,550,8501,566,600
2001518,175953,6631,239,2101,433,2501,543,5001,594,2151,619,5731,628,393
2002544,0841,001,3461,301,1711,504,9131,620,6751,673,9261,700,551
2003571,2881,051,4131,366,2291,580,1581,701,7091,757,622
2004599,8521,103,9841,434,5401,659,1661,786,794
2005686,0011,276,6011,677,2891,951,435
2006793,3051,493,0741,983,482
2007927,8741,766,164
20081,097,644
" + ], + "text/plain": [ + " 12 24 36 48 60 72 84 96 108 120\n", + "1999 470000.0 865000.0 1124000.0 1300000.0 1400000.0 1446000.0 1469000.0 1477000.0 1492000.0 1500000.0\n", + "2000 493500.0 908250.0 1180200.0 1365000.0 1470000.0 1518300.0 1542450.0 1550850.0 1566600.0 NaN\n", + "2001 518175.0 953663.0 1239210.0 1433250.0 1543500.0 1594215.0 1619573.0 1628393.0 NaN NaN\n", + "2002 544084.0 1001346.0 1301171.0 1504913.0 1620675.0 1673926.0 1700551.0 NaN NaN NaN\n", + "2003 571288.0 1051413.0 1366229.0 1580158.0 1701709.0 1757622.0 NaN NaN NaN NaN\n", + "2004 599852.0 1103984.0 1434540.0 1659166.0 1786794.0 NaN NaN NaN NaN NaN\n", + "2005 686001.0 1276601.0 1677289.0 1951435.0 NaN NaN NaN NaN NaN NaN\n", + "2006 793305.0 1493074.0 1983482.0 NaN NaN NaN NaN NaN NaN NaN\n", + "2007 927874.0 1766164.0 NaN NaN NaN NaN NaN NaN NaN NaN\n", + "2008 1097644.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 2 - Age-to-Age Factors\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 12-2424-3636-4848-6060-7272-8484-9696-108108-120
19991.8401.2991.1571.0771.0331.0161.0051.0101.005
20001.8401.2991.1571.0771.0331.0161.0051.010
20011.8401.2991.1571.0771.0331.0161.005
20021.8401.2991.1571.0771.0331.016
20031.8401.2991.1571.0771.033
20041.8401.2991.1571.077
20051.8611.3141.163
20061.8821.328
20071.903
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 3 - Average Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120
volume_51.8701.3101.1581.0771.0331.0161.0051.0101.005
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120\n", + "volume_5 1.870 1.310 1.158 1.077 1.033 1.016 1.005 1.010 1.005" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " PART 4 - Selected Age-to-Age Factor\n", + "

\n", + " " + ], + "text/plain": [ + "" + ] + }, + "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", + "
12-2424-3636-4848-6060-7272-8484-9696-108108-120120-132
Selected1.8701.3101.1581.0771.0331.0161.0051.0101.0051.000
\n", + "
" + ], + "text/plain": [ + " 12-24 24-36 36-48 48-60 60-72 72-84 84-96 96-108 108-120 120-132\n", + "Selected 1.870 1.310 1.158 1.077 1.033 1.016 1.005 1.010 1.005 1.000" + ] + }, + "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", + "
12-Ult24-Ult36-Ult48-Ult60-Ult72-Ult84-Ult96-Ult108-Ult120-Ult
CDF to Ultimate3.2711.7491.3351.1531.0711.0361.0201.0151.0051.000
Percent Reported0.3060.5720.7490.8670.9340.9650.9800.9850.9951.000
\n", + "
" + ], + "text/plain": [ + " 12-Ult 24-Ult 36-Ult 48-Ult 60-Ult 72-Ult 84-Ult 96-Ult 108-Ult 120-Ult\n", + "CDF to Ultimate 3.271 1.749 1.335 1.153 1.071 1.036 1.020 1.015 1.005 1.000\n", + "Percent Reported 0.306 0.572 0.749 0.867 0.934 0.965 0.980 0.985 0.995 1.000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "devs = dev_exhibit(\n", + " data.loc[\"Changing Product Mix\", \"Paid Claims\"],\n", + " avg_params={\"volume_5\": {'n_periods': 5, 'average': 'volume'}},\n", + " selected_avg='volume_5',\n", + " tail=1\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "f8c3d22b", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "assert np.allclose(\n", + " devs[\"Selected\"].ldf_.round(3).values.squeeze(),\n", + " np.array([\n", + " 1.870, 1.310, 1.158, 1.077, 1.033,\n", + " 1.016, 1.005, 1.010, 1.005, 1.000,\n", + "]),\n", + " atol=0.0005,\n", + " rtol=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "0b198ff1", + "metadata": {}, + "source": [ + "### Exhibit IV, Sheet 6\n", + "\n", + "Finally, we produce the summary table contained in Exhibit IV, Sheet 6 (p. 130) by defining the following function to handle formatting:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "768432dc", + "metadata": {}, + "outputs": [], + "source": [ + "def Ex4Sht6(scenario, tr):\n", + "\n", + " def format_col(x, reverse = False):\n", + " if reverse is True:\n", + " return x.to_frame().squeeze()[::-1].reset_index(drop=True)\n", + " return x.to_frame().squeeze().reset_index(drop=True)\n", + "\n", + " def col_diff(x, y):\n", + " return x.squeeze() - y.squeeze()\n", + "\n", + " def col_mult(x, y):\n", + " return x.squeeze() * y.squeeze()\n", + "\n", + " def col_sum(x, y):\n", + " return x.squeeze() + y.squeeze()\n", + "\n", + " tri = tr.copy()\n", + "\n", + " dev_input = {\n", + " \"average\" : \"volume\",\n", + " \"n_periods\" : 5\n", + " }\n", + "\n", + " tail_input = {\n", + " \"tail\" : 1.0,\n", + " \"projection_period\" : -1\n", + " }\n", + "\n", + " dev = cl.Development(**dev_input)\n", + " tail = cl.TailConstant(**tail_input)\n", + " tri = tail.fit_transform(dev.fit_transform(tri))\n", + "\n", + " \n", + " col1 = pd.DataFrame({\n", + " \"Accident Year\" : format_col(tr.origin)\n", + " })\n", + "\n", + " col2 = pd.DataFrame({\n", + " \"Age of Accident Year at 12/31/08\" : format_col(tr.development, reverse=True)\n", + "\n", + " })\n", + "\n", + " col3 = pd.DataFrame({\n", + " \"Claims at 12/31/2008 - Reported\" : format_col(tri.loc[scenario][\"Reported Claims\"].latest_diagonal)\n", + "\n", + " })\n", + "\n", + " col4 = pd.DataFrame({\n", + " \"Claims at 12/31/2008 - Paid\" : format_col(tri.loc[scenario][\"Paid Claims\"].latest_diagonal)\n", + "\n", + " })\n", + "\n", + " col5 = pd.DataFrame({\n", + " \"Case Outstanding\" : col_diff(col3, col4)\n", + "\n", + " })\n", + "\n", + " col6 = pd.DataFrame({\n", + " \"CDF to Ult. - Reported\" : format_col(tri.cdf_.loc[scenario][\"Reported Claims\"], reverse=True)\n", + "\n", + " })\n", + "\n", + " col7 = pd.DataFrame({\n", + " \"CDF to Ult. - Paid\" : format_col(tri.cdf_.loc[scenario][\"Paid Claims\"], reverse=True)\n", + " })\n", + "\n", + " col8 = pd.DataFrame({\n", + " \"Projected Ult. Claims Using Dev. Method - Reported\" : col_mult(col3, col6)\n", + " })\n", + "\n", + " col9 = pd.DataFrame({\n", + " \"Projected Ult. Claims Using Dev. Method - Paid\" : col_mult(col4, col7)\n", + " })\n", + "\n", + " col10 = pd.DataFrame({\n", + " \"Estimated IBNR Using Dev. Method - Reported\" : col_diff(col8, col3)\n", + " })\n", + "\n", + " col11 = pd.DataFrame({\n", + " \"Estimated IBNR Using Dev. Method - Paid\" : col_diff(col9, col3)\n", + " })\n", + "\n", + " colA = col_mult(\n", + " format_col(tri.loc[\"Steady State\"][\"Earned Premium\"].latest_diagonal / 2),\n", + " pd.Series([0.7] * 10)\n", + " )\n", + " colB = col_diff(\n", + " format_col(tri.loc[scenario][\"Earned Premium\"].latest_diagonal), \n", + " format_col(tri.loc[\"Steady State\"][\"Earned Premium\"].latest_diagonal / 2)\n", + " ) * pd.Series([0.8] * 10)\n", + " colC = format_col(tri.loc[scenario][\"Reported Claims\"].latest_diagonal)\n", + " colD = col_diff(\n", + " col_sum(\n", + " colA, \n", + " colB\n", + " ), \n", + " colC)\n", + "\n", + " col12 = pd.DataFrame({\n", + " \"Actual IBNR\" : format_col(colD) \n", + " })\n", + "\n", + " col13 = pd.DataFrame({\n", + " \"Difference from Actual IBNR - Reported\" : col_diff(col12, col10)\n", + " })\n", + "\n", + " col14 = pd.DataFrame({\n", + " \"Difference from Actual IBNR - Paid\" : col_diff(col12, col11)\n", + " })\n", + "\n", + "\n", + " cols = [col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12, col13, col14]\n", + "\n", + " results = pd.concat(cols, axis=1)\n", + "\n", + " format_dict = {\n", + " # Dollar amounts\n", + " \"Claims at 12/31/2008 - Reported\": \"{:,.0f}\",\n", + " \"Claims at 12/31/2008 - Paid\": \"{:,.0f}\",\n", + " \"Case Outstanding\": \"{:,.0f}\",\n", + " \"Projected Ult. Claims Using Dev. Method - Reported\": \"{:,.0f}\",\n", + " \"Projected Ult. Claims Using Dev. Method - Paid\": \"{:,.0f}\",\n", + " \"Estimated IBNR Using Dev. Method - Reported\": \"{:,.0f}\",\n", + " \"Estimated IBNR Using Dev. Method - Paid\": \"{:,.0f}\",\n", + " \"Actual IBNR\": \"{:,.0f}\",\n", + " \"Difference from Actual IBNR - Reported\": \"{:,.0f}\",\n", + " \"Difference from Actual IBNR - Paid\": \"{:,.0f}\",\n", + "\n", + " # Ages\n", + " \"Age of Accident Year at 12/31/08\": \"{:.0f}\",\n", + "\n", + " # Factors\n", + " \"CDF to Ult. - Reported\": \"{:.3f}\",\n", + " \"CDF to Ult. - Paid\": \"{:.3f}\",\n", + " }\n", + "\n", + " results = results.set_index(\"Accident Year\")\n", + "\n", + " total_cols = [\n", + " \"Claims at 12/31/2008 - Reported\",\n", + " \"Claims at 12/31/2008 - Paid\",\n", + " \"Case Outstanding\",\n", + " \"Projected Ult. Claims Using Dev. Method - Reported\",\n", + " \"Projected Ult. Claims Using Dev. Method - Paid\",\n", + " \"Estimated IBNR Using Dev. Method - Reported\",\n", + " \"Estimated IBNR Using Dev. Method - Paid\",\n", + " \"Actual IBNR\",\n", + " \"Difference from Actual IBNR - Reported\",\n", + " \"Difference from Actual IBNR - Paid\",\n", + " ]\n", + " \n", + " results.loc[\"Total\", total_cols] = results[total_cols].sum()\n", + "\n", + " display(HTML(f\"

Exhibit IV Sheet 6 — {scenario}

\"))\n", + "\n", + " check_cols = [\n", + " \"Projected Ult. Claims Using Dev. Method - Reported\",\n", + " \"Projected Ult. Claims Using Dev. Method - Paid\",\n", + " \"Estimated IBNR Using Dev. Method - Reported\",\n", + " \"Estimated IBNR Using Dev. Method - Paid\",\n", + " \"Actual IBNR\",\n", + " \"Difference from Actual IBNR - Reported\",\n", + " \"Difference from Actual IBNR - Paid\",\n", + " ]\n", + "\n", + " #print(results[check_cols].to_string())\n", + "\n", + "\n", + " display(\n", + " results.style.format(format_dict, na_rep=\"\")\n", + " )\n", + "\n", + " \n", + "\n", + " return results\n" + ] + }, + { + "cell_type": "markdown", + "id": "afa6fa66", + "metadata": {}, + "source": [ + "Finally, we generate the tables in Sheet 6 calling the function once for each scenario:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "9b97c370", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

Exhibit IV Sheet 6 — Steady State

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Projected Ult. Claims Using Dev. Method - Reported Projected Ult. Claims Using Dev. Method - Paid Estimated IBNR Using Dev. Method - Reported Estimated IBNR Using Dev. Method - Paid Actual IBNR Difference from Actual IBNR - Reported Difference from Actual IBNR - Paid\n", + "Accident Year \n", + "1999 1.500000e+06 1.500000e+06 0.000000e+00 0.000000e+00 0.00 0.000000 0.000000\n", + "2000 1.575000e+06 1.575000e+06 0.000000e+00 0.000000e+00 0.00 0.000000 0.000000\n", + "2001 1.653750e+06 1.653751e+06 0.000000e+00 5.077861e-01 0.00 0.000000 -0.507786\n", + "2002 1.736438e+06 1.736437e+06 0.000000e+00 -6.286533e-01 -0.50 -0.500000 0.128653\n", + "2003 1.823260e+06 1.823259e+06 8.508579e+03 8.508370e+03 8508.75 0.170703 0.380116\n", + "2004 1.914422e+06 1.914422e+06 2.935449e+04 2.935417e+04 29354.25 -0.239665 0.082623\n", + "2005 2.010144e+06 2.010143e+06 6.164465e+04 6.164403e+04 61644.25 -0.396446 0.223476\n", + "2006 2.110650e+06 2.110651e+06 1.730732e+05 1.730736e+05 173073.75 0.573334 0.153008\n", + "2007 2.216183e+06 2.216183e+06 3.634539e+05 3.634537e+05 363454.25 0.377634 0.564373\n", + "2008 2.326992e+06 2.326992e+06 7.585992e+05 7.585987e+05 758599.00 -0.167707 0.339637\n", + "Total 1.886684e+07 1.886684e+07 1.394634e+06 1.394632e+06 1394633.75 -0.182146 1.364101\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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 of Accident Year at 12/31/08Claims at 12/31/2008 - ReportedClaims at 12/31/2008 - PaidCase OutstandingCDF to Ult. - ReportedCDF to Ult. - PaidProjected Ult. Claims Using Dev. Method - ReportedProjected Ult. Claims Using Dev. Method - PaidEstimated IBNR Using Dev. Method - ReportedEstimated IBNR Using Dev. Method - PaidActual IBNRDifference from Actual IBNR - ReportedDifference from Actual IBNR - Paid
Accident Year             
19991201,500,0001,500,00001.0001.0001,500,0001,500,00000000
20001081,575,0001,566,6008,4001.0001.0051,575,0001,575,00000000
2001961,653,7501,628,39325,3571.0001.0161,653,7501,653,7510100-1
2002841,736,4381,700,55135,8871.0001.0211,736,4381,736,4370-1-0-00
2003721,814,7511,757,62257,1291.0051.0371,823,2601,823,2598,5098,5088,50900
2004601,885,0681,786,79498,2741.0161.0711,914,4221,914,42229,35429,35429,354-00
2005481,948,4991,742,124206,3751.0321.1542,010,1442,010,14361,64561,64461,644-00
2006361,937,5771,581,581355,9961.0891.3352,110,6502,110,651173,073173,074173,07410
2007241,852,7291,277,999574,7301.1961.7342,216,1832,216,183363,454363,454363,45401
2008121,568,393729,124839,2691.4843.1912,326,9922,326,992758,599758,599758,599-00
Total17,472,20515,270,7882,201,41718,866,83918,866,8371,394,6341,394,6321,394,634-01
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Exhibit IV Sheet 6 — Changing Product Mix

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Projected Ult. Claims Using Dev. Method - Reported Projected Ult. Claims Using Dev. Method - Paid Estimated IBNR Using Dev. Method - Reported Estimated IBNR Using Dev. Method - Paid Actual IBNR Difference from Actual IBNR - Reported Difference from Actual IBNR - Paid\n", + "Accident Year \n", + "1999 1.500000e+06 1.500000e+06 0.000000e+00 0.000000e+00 0.00 0.000000 0.000000\n", + "2000 1.575000e+06 1.575000e+06 0.000000e+00 0.000000e+00 0.00 0.000000 0.000000\n", + "2001 1.653750e+06 1.653751e+06 0.000000e+00 5.077861e-01 0.00 0.000000 -0.507786\n", + "2002 1.736438e+06 1.736437e+06 0.000000e+00 -6.286533e-01 -0.50 -0.500000 0.128653\n", + "2003 1.823260e+06 1.823259e+06 8.508579e+03 8.508370e+03 8508.75 0.170703 0.380116\n", + "2004 1.914422e+06 1.914422e+06 2.935449e+04 2.935417e+04 29354.25 -0.239665 0.082623\n", + "2005 2.262942e+06 2.251656e+06 6.939716e+04 5.811071e+04 71855.05 2457.885317 13744.337224\n", + "2006 2.693735e+06 2.650749e+06 2.222891e+05 1.793029e+05 239056.75 16767.659023 59753.872297\n", + "2007 3.217775e+06 3.091665e+06 5.372877e+05 4.111784e+05 596924.25 59636.506072 185745.825499\n", + "2008 3.842646e+06 3.592941e+06 1.285951e+06 1.036246e+06 1445385.00 159434.484745 409138.546111\n", + "Total 2.221997e+07 2.178988e+07 2.152788e+06 1.722701e+06 2391083.55 238295.966195 668382.664738\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \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 of Accident Year at 12/31/08Claims at 12/31/2008 - ReportedClaims at 12/31/2008 - PaidCase OutstandingCDF to Ult. - ReportedCDF to Ult. - PaidProjected Ult. Claims Using Dev. Method - ReportedProjected Ult. Claims Using Dev. Method - PaidEstimated IBNR Using Dev. Method - ReportedEstimated IBNR Using Dev. Method - PaidActual IBNRDifference from Actual IBNR - ReportedDifference from Actual IBNR - Paid
Accident Year             
19991201,500,0001,500,00001.0001.0001,500,0001,500,00000000
20001081,575,0001,566,6008,4001.0001.0051,575,0001,575,00000000
2001961,653,7501,628,39325,3571.0001.0161,653,7501,653,7510100-1
2002841,736,4381,700,55135,8871.0001.0211,736,4381,736,4370-1-0-00
2003721,814,7511,757,62257,1291.0051.0371,823,2601,823,2598,5098,5088,50900
2004601,885,0681,786,79498,2741.0161.0711,914,4221,914,42229,35429,35429,354-00
2005482,193,5451,951,435242,1101.0321.1542,262,9422,251,65669,39758,11171,8552,45813,744
2006362,471,4461,983,482487,9641.0901.3362,693,7352,650,749222,289179,303239,05716,76859,754
2007242,680,4871,766,164914,3231.2001.7503,217,7753,091,665537,288411,178596,92459,637185,746
2008122,556,6951,097,6441,459,0511.5033.2733,842,6463,592,9411,285,9511,036,2461,445,385159,434409,139
Total20,067,18016,738,6853,328,49522,219,96821,789,8812,152,7881,722,7012,391,084238,296668,383
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "res_1 = Ex4Sht6(\"Steady State\", data)\n", + "\n", + "res_2 = Ex4Sht6(\"Changing Product Mix\", data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "471fa752", + "metadata": { + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "estimate_cols = [\n", + " \"Projected Ult. Claims Using Dev. Method - Reported\",\n", + " \"Projected Ult. Claims Using Dev. Method - Paid\",\n", + " \"Estimated IBNR Using Dev. Method - Reported\",\n", + " \"Estimated IBNR Using Dev. Method - Paid\",\n", + "]\n", + "\n", + "assert np.allclose(\n", + " res_1.loc[\n", + " res_1.index != \"Total\",\n", + " estimate_cols,\n", + " ].values,\n", + " np.array([\n", + " [1500000, 1500000, 0, 0],\n", + " [1575000, 1575000, 0, 0],\n", + " [1653750, 1653750, 0, 0],\n", + " [1736438, 1736438, 0, 0],\n", + " [1823259, 1823259, 8509, 8509],\n", + " [1914422, 1914422, 29354, 29354],\n", + " [2010143, 2010143, 61644, 61644],\n", + " [2110651, 2110651, 173073, 173073],\n", + " [2216183, 2216183, 363454, 363454],\n", + " [2326992, 2326992, 758599, 758599],\n", + "]),\n", + " atol=1,\n", + " rtol=1e-5,\n", + ")\n", + "\n", + "assert np.allclose(\n", + " res_2.loc[\n", + " res_2.index != \"Total\",\n", + " estimate_cols,\n", + " ].values,\n", + " np.array([\n", + " [1500000, 1500000, 0, 0],\n", + " [1575000, 1575000, 0, 0],\n", + " [1653750, 1653750, 0, 0],\n", + " [1736438, 1736438, 0, 0],\n", + " [1823259, 1823259, 8509, 8509],\n", + " [1914422, 1914422, 29354, 29354],\n", + " [2262942, 2251655, 69397, 58110],\n", + " [2693735, 2650749, 222289, 179303],\n", + " [3217775, 3091666, 537288, 411179],\n", + " [3842645, 3592939, 1285950, 1036245],\n", + "]),\n", + " atol=1,\n", + " rtol=1e-5,\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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}