Running the examples requires loading some Python libraries. See blog post version of this presentation for the code.
1 Listen to Management
Management’s Complaint
Too many actuarial pricing models
over-weight tail catastrophe risk, and
under-weight earnings-hit volatility risk.
This behavior drives portfolio steering and reinsurance purchase decisions materially at odds with management’s risk preferences.
Diagnosis
Management’s complaint is entirely explained by an assumption that the cost of capital is constant.
The assumption is often implicit and hidden.
Prescription
Stop assuming the cost of capital is constant!
There are other good alternatives … enter Spectral Risk Measures (SRMs).
2 ToyCo Model
Example: Scenario Losses and Portfolio Statistics
Table 1: Assumptions for ToyCo two-unit portfolio across 10 equally likely scenarios.
X1
X2 net
X2 ceded
X2
total
0
36.0
0.0
0.0
0.0
36.0
1
40.0
0.0
0.0
0.0
40.0
2
28.0
0.0
0.0
0.0
28.0
3
22.0
0.0
0.0
0.0
22.0
4
33.0
7.0
0.0
7.0
40.0
5
32.0
8.0
0.0
8.0
40.0
6
31.0
9.0
0.0
9.0
40.0
7
45.0
10.0
0.0
10.0
55.0
8
25.0
40.0
0.0
40.0
65.0
9
25.0
40.0
35.0
75.0
100.0
EX
31.700
11.400
3.500
14.900
46.600
CV
0.215
1.299
3.0
1.545
0.455
Unit X1 is non-cat
Unit X2 is cat exposed, shown split into net and ceded to 35 xs 40 cover
Example: Pricing
Keep these numbers in mind!
Market pricing for the total portfolio earns a 15% return on a fully capitalized basis
Premium , capital , total assets , and return are related by where and are the discount rate and factor
Facts imply , loss ratio 87%, and premium to surplus ratio of 1.15:1
3 The “Industry Standard Approach”
Portfolio Pricing
Adam Smith’s pricing rule
Portfolio pricing rule
Common loss = expected loss
Dollar cost of capital (CoC), reflects
different forms of capital: equity, debt, reinsurance;
each with different cost rates.
Premium is a technical price and excludes expenses, investment income
Adam Smith - 1789
Determining the Cost of Capital
Constant CoC assumption
Constant cost of capital (CCoC) is a standard assumption, ignoring alternatives
Vary across lines of business (too hard)
Vary across layers of capital (debt, equity, reins.)
CCoC of capital is called target return on capital, WACC, opportunity cost of capital, average CoC
CCoC assumption Dollar CoC = (average CoC) × (amount of capital)
CCoC Premium = expected loss + (avg CoC) x (amount of capital)
CCoC Pricing Rule Formula
Left plot shows CCoC risk (probability) adjustment factor distortion function relative to base at 1 (dashed line), equals
All outcome probabilities except the largest (“100%-percentile”) discounted by 0.87
Largest outcome probability increased to 0.13 (red star)
Right plot shows ToyCo total loss outcome as a quantile plot
Low (good) loss outcomes shown on left
High (bad) loss outcomes shown on right
Obvious Question
What about using other distortions?
The all-or-nothing nature of CCoC seems unsatisfactory and is numerically unstable
What other options are available?
How are different choices interpreted?
Do business decisions vary materially by distortion?
Alternatives to CCoC Assumption
Re-weight using risk-adjusted probabilities
Imagine spreadsheet of equally likely scenarios. Want to re-weight with risk-adjusted probabilities. What properties must rational adjusted probabilities possess?
Non-negative
Sum to 1
Weight should increase with increasing loss
All bad outcomes that occur at a lower losses also occur for any larger loss
Spectral distortion functions are a systematic way to derive weights satisfying 1-3
4 The Spectral World: Why and How
Distortion Functions and Insurance Statistics
Figure 1: A distortion in orange compared to expected loss in blue (left). Relation to meaningful insurance statistics for each layer of loss (right).
Spectral Pricing Rules Have Nice Properties
All risk measures with the following four properties are SRM rules
Comonotonic additive: no credit when no diversification; if out-comes imply same event order, then prices add
Law invariant: Price depends only on the distribution
Since layer losses are comonotonic (they are increasing functions of total loss), SRM pricing adds-up by layer
SRM Pricing Adds Up Pricing by Layer: ToyCo Example
ToyCo losses (left and center)
Proportional hazard distortion calibrated to 15% overall return at ,
SRMs to Reflect a Range of Risk Appetites
Five parametric families of distortion functions
CCoCPH (Proportional hazard) WangdualTVaR
Express progressively less tail-centric appetite
Five different one-parameter families of risk-adjusted probabilities
Each easily parameterized to desired pricing
Graph shows weight adjustments for comparably calibrated distortions
Dual distortion popular in applications: bounded, but weights all scenarios
5 ToyCo Numerical Example
Example: Scenario Losses and Portfolio Statistics (recap)
Table 2: Assumptions for ToyCo two-unit portfolio across 10 equally likely scenarios.
X1
X2 net
X2 ceded
X2
total
0
36.0
0.0
0.0
0.0
36.0
1
40.0
0.0
0.0
0.0
40.0
2
28.0
0.0
0.0
0.0
28.0
3
22.0
0.0
0.0
0.0
22.0
4
33.0
7.0
0.0
7.0
40.0
5
32.0
8.0
0.0
8.0
40.0
6
31.0
9.0
0.0
9.0
40.0
7
45.0
10.0
0.0
10.0
55.0
8
25.0
40.0
0.0
40.0
65.0
9
25.0
40.0
35.0
75.0
100.0
EX
31.700
11.400
3.500
14.900
46.600
CV
0.215
1.299
3.0
1.545
0.455
Unit X1 is non-cat
Unit X2 is cat exposed, shown split into net and ceded to 35 xs 40 cover
Example: Cat Pricing Across a Range of Risk Appetites
Mechanics
p
S
gS
q
dx
loss
22.0
0.100
0.900
0.975
0.025
22.0
28.0
0.100
0.800
0.923
0.051
6.0
36.0
0.100
0.700
0.853
0.070
8.0
40.0
0.400
0.300
0.434
0.420
4.0
55.0
0.100
0.200
0.299
0.134
15.0
65.0
0.100
0.100
0.155
0.145
10.0
100.0
0.100
0.0
0.0
0.155
35.0
Total
46.600
46.600
53.565
53.565
100.0
Columns
p : probability of each total loss value
S : the survival function
gS: distortion applied to
q : backward differences of gS, fill value 1 at the top
dx: backward differences of loss fill value 0
Total row calculation with denoting loss value
p : , expected loss
S : , expected loss
gS: , premium (risk adjusted expected loss)
q : , premium
dx:
Example: Cat Pricing Across a Range of Risk Appetites
Natural allocation pricing and loss ratios implied by dual distortion
Table 3: Expected loss L, premium P, and loss ratio LR by unit
L
P
LR
unit
X1
31.700
32.310
0.981
X2
14.900
21.256
0.701
X2 ceded
3.500
5.415
0.646
X2 net
11.400
15.841
0.720
total
46.600
53.565
0.870
Gross pricing at 87% loss ratio calibrated to 15% return with assets sufficient to pay all claims with no-default
Total
Loss ratio for X2 ceded loss represents model minimum acceptable ceded loss ratio
Example: Cat Pricing Across a Range of Risk Appetites
Implied loss ratios by unit across distortion risk appetites
Table 4: Model loss ratios by distortion
unit
X1
X2 net
X2 ceded
total
distortion
ccoc
102.8%
75.3%
46.0%
87.0%
ph
101.7%
72.5%
52.5%
87.0%
wang
100.1%
72.1%
57.5%
87.0%
dual
98.1%
72.0%
64.6%
87.0%
tvar
95.7%
72.9%
72.9%
87.0%
All risk appetites calibrated to same total loss ratio
Distortions shown from tail-centric to volatility-centric
Ceded loss ratios show decreasing value of tail-reinsurance as risk appetite becomes more volatility driven
Conversely X1 loss ratio increases as tail-hedge becomes more valuable
Example: Cat Pricing Across a Range of Risk Appetites
CoC by capital tranche: equity vs. reinsurance
Table 5: Model indicated CoC for equity and reinsurance capital.
Reins
Equity
Capital
distortion
ccoc
15.0%
15.0%
15.0%
ph
11.2%
21.0%
15.0%
wang
8.9%
25.0%
15.0%
dual
6.5%
30.0%
15.0%
tvar
4.3%
34.9%
15.0%
Gross calibrated to 15% average return, determined by market dynamics
Purchase reinsurance when implied CoC at or below indicated return
Reflects lower value ascribed to reinsurance by volatility-sensitive management
What is the “Market ”?
Figure 2: Five distortions calibrated to 15 percent return pricing (left). The minimum of CCoC and TVaR pricing (right).
Distortions correspond with investor’s risk tolerances. Figure is consistent with thesis that cat (TVaR) and equity (CCoC) are two most important source of capital.
Premium, Return and Loss Ratio by Tranche by Market Agent
metric
Premium
ROE
Loss ratio
layer
Equity
Debt
Total
Equity
Debt
Total
Equity
Debt
Total
distortion
ccoc
45.957
7.609
53.565
0.150
0.150
0.150
0.938
0.460
0.870
tvar
48.762
4.803
53.565
0.349
0.043
0.150
0.884
0.729
0.870
min_g
45.658
4.803
50.461
0.132
0.043
0.078
0.944
0.729
0.923
Debt attaching at 90th percentile or 65
Rows: pricing from each agent and minimum across agents (min_g)
Columns: equity and debt correspond to capital tranches
Key takeaway: min_g price for the equity layer is not placeable
min_g of 45.658 lower than equity agent’s price 45.957 and debt’s 48.762
Neither equity nor debt agent’s distortion is uniformly lower over full range of the equity tranche sub-optimal tranching
Placeable Premium vs. Debt Attachment Point
Orange line shows total cost of capital varying with different debt/equity splits
Material costs from sub-optimal tranching of capital
Potential cost savings explain active broker rôle in reinsurance markets
Source Code
---title: 'Going Spectral'subtitle: "A shorter version of Going Spectral."date: 2025-02-23date-modified: last-modifiedcategories:- presentations- insurance- risk- pricing- pirauthor: - name: Stephen J. Mildenhall orcid: 0000-0001-6956-0098 corresponding: true email: mynl@me.combibliography: - library.bib - books.bibcolorlinks: truecsl: style.cslfig-format: svglink-bibliography: truelink-citations: truenumber-offset: 0number-sections: truenumber-depth: 1# tbl-align: left# fig-aling: leftreference-section-title: 'References'format: html: smooth-scroll: true citations-hover: true crossrefs-hover: false footnotes-hover: true link-external-icon: true link-external-newwindow: true page-layout: article fig-responsive: true lightbox: true ft_obj-contained: false toc: true toc-depth: 3 toc-title: 'In this post:' code-line-numbers: false code-overflow: wrap code-fold: true code-tools: true code-copy: true # revealjs: # slide-level: 2 # output-file: slides.html # options: # vertical-align: top # pptx: # slide-level: 2 # reference-doc: "master.potx" beamer: fontsize: 18pt citecolor: smcolor classoption: handout,t # ignore pauses etc. colorlinks: true colortheme : orchid filecolor: smcolor fonttheme : structurebold innertheme : metropolis keep-tex: true linkcolor: smcolor outertheme : metropolis slide-level: 2 slide-number: true toc-depth: 1 toc-title: 'Contents' toc: false urlcolor: smcolor pdf-engine: lualatex pdf-engine-opts: - '-interaction=nonstopmode' header-includes: - \geometry{paper=legalpaper, landscape, truedimen, right=1.5cm, left=0.5cm, top=0cm, bottom=1cm, mag=2000} - \usepackage{xcolor} - \definecolor{smcolor}{HTML}{3333B2} - \setbeamertemplate{footline}{\hspace{1em}\insertframenumber{} / \inserttotalframenumber \hfil}execute: cache: true # incremental: only recalc if any block changes freeze: auto # re-render only when source changes (global) daemon: 600 # stay alive for 600 second error: false # ignore errors ??image: img/banner.png---## Setup CodeRunning the examples requires loading some Python libraries. See [blog post](/posts/presentations/2025-02-23-Going-Spectral/) version of this presentation for the code.<!-- DEETS from fourier post. -->```{python}#| echo: false# xlabel: lst-setup-code# xlst-cap: Basic setup Python code.import matplotlib as mplimport matplotlib.pyplot as pltimport numpy as npimport pandas as pdfrom aggregate import build, qd, Distortion, Portfoliodef my_ff(x):"""My float formatter."""try:if x ==int(x):returnf'{x:,d}'elifabs(x) <0.005:returnf'{x:.5g}'elifabs(x) <100:returnf'{x:.3f}'else:returnf'{x:,.0f}'except:returnstr(x)pd.options.display.float_format = my_fffrom IPython.display import HTML, displayfrom greater_tables import GT__gt_global = GT()def nothing(df):return dfsd = sdp = nothing#from greater_tables import qd# try:# from greater_tables import qd# except ModuleNotFoundError:# print('Greater tables not found...using IPython.display.')# qd = display#sd = qd#sdp = qd#def sd(df):# # return df# bit = df.style.format(formatter=lambda x: #f'{x:.4g}').set_properties(**{'text-align': 'right'})# print(bit.to_html())# return bit##def sdp(df):# # return df# bit = df.style.format(formatter=lambda x: #f'{x:.1%}').set_properties(**{'text-align': 'right'})# print(bit.to_html())# return bitgcn_namer = {'X2': 'X2 net', 'X3': 'X2 ceded', 'X': 'X2', 'X4': 'X2'}def gcn(df): bit = df.loc[['X2', 'X3']] df.loc['X', :] = bit.sum(0) df.loc['X', 'LR'] = df.loc['X', 'L'] / df.loc['X', 'P'] df.loc['X', 'PQ'] = df.loc['X', 'P'] / df.loc['X', 'Q'] df.loc['X', 'COC'] = df.loc['X', 'M'] / df.loc['X', 'Q'] df = df.rename(index=gcn_namer) df = df.sort_index()return dfwgs = pd.DataFrame( {'X1': [36, 40, 28, 22, 33, 32, 31, 45, 25, 25],'X2': [ 0, 0, 0, 0, 7, 8, 9, 10, 40, 40],'X3': [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 35],'p_total': 1/10 })wport = Portfolio.create_from_sample('ToyCo', wgs, bs=1, log2=8)wport.calibrate_distortions(Ps=[1], COCs=[.15])ans = wport.price(1, allocation='linear')port = wport# local codeimport tranching_problem_code as tpcPLOT_FACE_COLOR ='white'# '#e9e9f2' # 'lightsteelblue'FIGURE_BG_COLOR ='#e9e9f2'# '#262680' # 'aliceblue'plt.rcParams.update({"axes.edgecolor": "black","axes.facecolor": PLOT_FACE_COLOR,"axes.labelcolor": "black","figure.dpi": 150,"figure.facecolor": FIGURE_BG_COLOR,"font.family": "sans-serif","font.size": 10,"legend.edgecolor": "none","legend.facecolor": PLOT_FACE_COLOR,"legend.labelcolor": "black","text.color": 'black', # "white","xtick.color": 'black', #"white","ytick.color": 'black', #"white",})```# Listen to Management## Management's Complaint\LargeToo many actuarial pricing models* over-weight tail catastrophe risk, and* under-weight earnings-hit volatility risk.This behavior drives portfolio steering and reinsurance purchase decisions materially at odds with management's risk preferences.\normalsize## Diagnosis\LargeManagement's complaint is entirely explained by an assumption that the cost of capital is constant.The assumption is often implicit and hidden.\normalsize## Prescription\LargeStop assuming the cost of capital is constant!There are other good alternatives ... enter Spectral Risk Measures (SRMs).\normalsize# ToyCo Model## Example: Scenario Losses and Portfolio Statistics\scriptsize```{python}#| echo: false#| label: tbl-assumptions-0#| tbl-cap: "Assumptions for ToyCo two-unit portfolio across 10 equally likely scenarios."# X1 is a non-cat line and X2 is cat exposed, shown with a 35 xs 40 cession."wgs_ = wgs.copy().drop(columns='p_total')wgs_['X4'] = wgs_['X2'] + wgs_['X3']wgs_['total'] = wgs.drop(columns='p_total').sum(1)wgs2 = wgs_.copy()wgs2.loc['EX', :] = wgs_.mean(0)wgs2.loc['EX2', :] = (wgs_**2).mean(0)wgs2.loc['Var', :] = wgs2.loc['EX2', :] - wgs2.loc['EX', :]**2wgs2.loc['CV', :] = wgs2.loc['Var', :]**.5/ wgs2.loc['EX', :]wgs2 = wgs2.drop(index = ['EX2', 'Var']).rename(columns=gcn_namer)sd(wgs2)```\normalsize* Unit X1 is non-cat* Unit X2 is cat exposed, shown split into net and ceded to 35 xs 40 cover## Example: Pricing### Keep these numbers in mind!* Market pricing for the total portfolio earns a 15% return on a fully capitalized basis* Premium $P$, capital $Q$, total assets $a=P+Q=\max(L)=100$, and return $r=0.15$ are related by $$P = \mathsf E[L] + r (a - P) \implies P = v \mathsf E[L] + d\max(L)$$ where $v = 1/(1+r)$ and $d=r/(1+r)$ are the discount rate and factor* Facts imply $P=53.565$, loss ratio 87%, and premium to surplus ratio of 1.15:1# The "Industry Standard Approach"## Portfolio Pricing:::::: {.columns}::: {.column width="30%"}:::::: {.column width="70%"}### Adam Smith's pricing rule* Portfolio pricing rule \begin{center} {\bf Premium = common loss $+$ cost of capital } \end{center}* Common loss = expected loss* Dollar cost of capital (CoC), reflects * different forms of capital: equity, debt, reinsurance; * each with different cost rates.* Premium is a **technical price** and excludes expenses, investment income* Adam Smith - 1789:::::::::## Determining the Cost of Capital::: {.columns}::: {.column width="60%"}### Constant CoC assumption* Constant cost of capital (CCoC) is a standard assumption, ignoring alternatives - Vary across lines of business (too hard) - Vary across layers of capital (debt, equity, reins.)* CCoC of capital $r$ is called target return on capital, WACC, opportunity cost of capital, average CoC* CCoC assumption \ **Dollar CoC = (average CoC) × (amount of capital)*** CCoC Premium = expected loss + (avg CoC) x (amount of capital):::::: {.column width="40%" }{width=85%}::::::## CCoC Pricing Rule Formula::: {.columns}::: {.column width=75%}```{python}#| echo: false#| fig-width: 6# fig-cap: "(left) Care/don't care risk adjusted probability weights for CCoC; (right) outcome distribution."fig, axs = plt.subplots(1, 2, figsize=(2*4, 3), constrained_layout=True)ax0, ax1 = axs.flatax0.plot([0,1], [1/1.15]*2)ax0.plot(0, 2, 'r*')ax0.axhline(1, lw=.5, c='k', ls=':')ax0.set(ylim=[-0.05, 2.5], xlabel='Exceedance', ylabel='Weight adjustment')# plot quantiles from Toy Examplebit = port.density_df.query('p_total > 0').Fbit.loc[0] =0bit = bit.sort_index()ax = bit.reset_index(drop=False).set_index('F').plot( drawstyle='steps-pre', ax=ax1)ax.set(xlim=[0, 1.05], ylim=[0, 105], xlabel='Percentile', ylabel='Loss outcome');```::::::\medskip\small::: {.columns}::: {.column width="50%"}* Left plot shows CCoC risk (probability) adjustment factor **distortion function** relative to base at 1 (dashed line), equals $g'(s)$* All outcome probabilities except the largest ("100%-percentile") discounted by 0.87* Largest outcome probability increased to 0.13 (red star):::::: {.column width="50%"}* Right plot shows ToyCo total loss outcome as a quantile plot* Low (good) loss outcomes shown on left* High (bad) loss outcomes shown on right* $s\leftrightarrow p=1-s$::::::\normalsize## Obvious Question### What about using other distortions?The all-or-nothing nature of CCoC seems unsatisfactory and is numerically unstable* What other options are available?* How are different choices interpreted?* Do business **decisions** vary **materially** by distortion?## Alternatives to CCoC Assumption### Re-weight using risk-adjusted probabilitiesImagine spreadsheet of equally likely scenarios. Want to re-weight with risk-adjusted probabilities. What properties must rational adjusted probabilities possess?\pause1. Non-negative2. Sum to 13. Weight should increase with increasing lossAll bad outcomes that occur at a lower losses also occur for any larger lossSpectral **distortion functions** are a systematic way to derive weights satisfying 1-3# The Spectral World: Why and How## Distortion Functions and Insurance Statistics::: {.columns}::: {.column width=66%}```{python}#| echo: false#| label: fig-dist-ins#| fig-cap: "A distortion in orange compared to expected loss in blue (left). Relation to meaningful insurance statistics for each layer of loss (right)."from aggregate.extensions.pir_figures import fig_10_3from aggregate import Distortiond = Distortion.ph(.6)d = port.dists['ph']fig_10_3(d)```::::::\begin{center}{\bf Steeper $g \leftrightarrow$ greater risk aversion }\end{center}## Spectral Pricing Rules Have Nice Properties### **All** risk measures with the following four properties are **SRM** rules1. **Monotone**: Uniformly higher risk implies higher price2. **Sub-additive**: diversification decreases price3. **Comonotonic additive**: no credit when no diversification; if out-comes imply same event order, then prices add4. **Law invariant**: Price depends only on the distributionSince layer losses are comonotonic (they are increasing functions of total loss), SRM pricing adds-up by layer## SRM Pricing Adds Up Pricing by Layer: ToyCo Example $x=60$::: {.columns}::: {.column width=70%}```{python}#| echo: falsefrom aggregate.extensions.pir_figures import fig_10_5fig_10_5(port=port, dist=d, x=60)```::::::\medskip* ToyCo losses (left and center)* Proportional hazard distortion calibrated to 15% overall return at $a=100$, $g(s)=s^{0.72}$## SRMs to Reflect a Range of Risk Appetites### Five parametric families of distortion functions* **CCoC** $\to$ **PH** (Proportional hazard) $\to$ **Wang** $\to$ **dual** $\to$ **TVaR** * Express progressively less tail-centric appetite * Five different one-parameter families of risk-adjusted probabilities * Each easily parameterized to desired pricing* Graph shows weight adjustments $g'(s)$ for comparably calibrated distortions::: {.columns}::: {.column width=100%}```{python}#| echo: false#| xlabel: fig-distortions# xfig-cap: "Distortion probability adjustment functions."fig, axs = plt.subplots(1, 5, figsize=(5*2, 2), constrained_layout=True, sharey=True)xs = np.linspace(0, 1, 101)for (k, v), ax inzip(wport.dists.items(), axs.flat):if k =='ccoc': ax.plot([0,1], [1/1.15]*2) ax.plot(0, 2, 'r*')else: ax.plot(xs, v.g_prime(xs)) ax.plot([0, 1], [1,1], lw=.5, c='k') ax.set(title=k, ylim=[-0.05, 2.5], xlabel='Exceedance')if ax is axs[0]: ax.set(ylabel='Weight adjustment')```::::::* Dual distortion popular in applications: bounded, but weights all scenarios# ToyCo Numerical Example## Example: Scenario Losses and Portfolio Statistics (recap)\scriptsize```{python}#| echo: false#| label: tbl-assumptions#| tbl-cap: "Assumptions for ToyCo two-unit portfolio across 10 equally likely scenarios."# X1 is a non-cat line and X2 is cat exposed, shown with a 35 xs 40 cession."wgs_ = wgs.copy().drop(columns='p_total')wgs_['X4'] = wgs_['X2'] + wgs_['X3']wgs_['total'] = wgs.drop(columns='p_total').sum(1)wgs2 = wgs_.copy()wgs2.loc['EX', :] = wgs_.mean(0)wgs2.loc['EX2', :] = (wgs_**2).mean(0)wgs2.loc['Var', :] = wgs2.loc['EX2', :] - wgs2.loc['EX', :]**2wgs2.loc['CV', :] = wgs2.loc['Var', :]**.5/ wgs2.loc['EX', :]wgs2 = wgs2.drop(index = ['EX2', 'Var']).rename(columns=gcn_namer)sd(wgs2)```\normalsize* Unit X1 is non-cat* Unit X2 is cat exposed, shown split into net and ceded to 35 xs 40 cover## Example: Cat Pricing Across a Range of Risk Appetites### Mechanics::: {.columns}::: {.column width=45%}\scriptsize```{python}#| echo: falseg = wport.dists['dual']bit = port.density_df.query('p_total > 0')[['p_total','S']]bit.index.name ='loss'bit = bit.rename(columns={'p_total': 'p'})bit['gS'] = g.g(bit.S)bit['q'] =-np.diff(bit.gS, prepend=1)bit['dx'] = np.diff(bit.index, prepend=0)bit0 = bit.copy()bit.loc['Total', :] = [(bit0.p * bit0.index).sum(), (bit0.S.shift(1, fill_value=1) * bit0.dx).sum(), (bit0.gS.shift(1, fill_value=1) * bit0.dx).sum(), (bit0.q * bit0.index).sum(), bit0.dx.sum()]bit```\normalsize:::::: {.column width=50%}\scriptsize**Columns*** `p` : probability of each total loss value* `S` : the survival function* `gS`: distortion applied to $S$ $g(s)=1-(1-s)^{1.59515}$* `q` : backward differences $dgS$ of `gS`, fill value 1 at the top* `dx`: backward differences of `loss` fill value 0\medskip**Total row calculation** with $x$ denoting loss value* `p` : $\sum_x x p_x$, expected loss* `S` : $\int_0^{100} S(x)\,dx$, expected loss* `gS`: $\int_0^{100} g(S(x))\,dx$, premium (risk adjusted expected loss)* `q` : $\sum_x x q_x$, premium* `dx`: $\sum_x dx = a$\normalsize::::::## Example: Cat Pricing Across a Range of Risk Appetites### Natural allocation pricing and loss ratios implied by dual distortion\scriptsize```{python}#| echo: false#| label: tbl-dual-1#| tbl-cap: Expected loss `L`, premium `P`, and loss ratio `LR` by unitsd(gcn(ans.df.loc['dual'])[['L', 'P', 'LR']])```\normalsize* Gross pricing at 87% loss ratio calibrated to 15% return with assets $a=100$ sufficient to pay all claims with no-default* Total $P = 53.565 = v EL + d \max(L) = 46.6 / 1.15 + (0.15 / 1.15) \times 100$* Loss ratio for X2 ceded loss represents model minimum acceptable ceded loss ratio## Example: Cat Pricing Across a Range of Risk Appetites### Implied loss ratios by unit across distortion risk appetites\scriptsize```{python}#| echo: false#| label: tbl-ra-comp#| tbl-cap: Model loss ratios by distortionpd.options.display.float_format =lambda x: f'{x:.1%}'ans.df[['LR']].unstack(1).droplevel(0,1).rename(columns=gcn_namer)```\normalsize* All risk appetites calibrated to same total loss ratio* Distortions shown from tail-centric to volatility-centric* Ceded loss ratios show decreasing value of tail-reinsurance as risk appetite becomes more volatility driven* Conversely X1 loss ratio increases as tail-hedge becomes more valuable## Example: Cat Pricing Across a Range of Risk Appetites### CoC by capital tranche: equity vs. reinsurance\scriptsize```{python}#| echo: false#| label: tbl-cocs#| tbl-cap: "Model indicated CoC for equity and reinsurance capital."# Ceded capital benefit is 35 - cat bond collateral amounts# a = 35; ceded ROE from reinsurance:re_coc = ans.df[['M']].unstack(1).droplevel(0,1)[['X3']] / (35- ans.df[['P']].unstack(1).droplevel(0,1)[['X3']])eq_coc = (.15*46.434783- (35- ans.df[['P']].unstack(1).droplevel(0,1)[['X3']]) * re_coc.values) / (46.434783- (35- ans.df[['P']].unstack(1).droplevel(0,1)[['X3']]))c = re_coc.copy()c.X3 =.15sdp(pd.concat((re_coc, eq_coc, c), keys=['Reins', 'Equity', 'Capital'], axis=1).droplevel(1,1))```\normalsize* Gross calibrated to 15% average return, determined by market dynamics* Purchase reinsurance when implied CoC at or below indicated return* Reflects lower value ascribed to reinsurance by volatility-sensitive management## What is the "Market $g$"?::: {.columns}::: {.column width=66%}```{python}#| echo: false#| label: fig-market#| fig-cap: "Five distortions calibrated to 15 percent return pricing (left). The minimum of CCoC and TVaR pricing (right)."# put formatter backpd.options.display.float_format = my_fffig, axs = plt.subplots(1, 2, figsize=(2*3, 3), constrained_layout=True, sharey=True)ax0, ax1 = axs.flatps = np.linspace(0, 1, 1001)colors = {k: f'C{i}'for i, k inenumerate(wport.dists.keys())}ax = ax0for (k, v) in wport.dists.items(): ax.plot(ps, v.g(ps), lw=1, label=k, c=colors[k])ax.set(aspect='equal')ax.legend(loc='upper left')ccoc = wport.dists['ccoc']tvar = wport.dists['tvar']min_g = Distortion.minimum([ccoc, tvar])colors[min_g.name] ='k'ax = ax1for g in [ccoc, tvar, min_g]: ax.plot(ps, g.g(ps), lw=2if g is min_g else1, ls='--'if g is min_g else'-', label=g.name, c=colors[g.name])ax.set(aspect='equal')ax.legend(loc='upper left')```::::::Distortions correspond with investor's risk tolerances. Figure is consistent with thesis that cat (TVaR) and equity (CCoC) are two most important source of capital.## Premium, Return and Loss Ratio by Tranche by Market Agent\scriptsize```{python}#| echo: falsea =100layering = tpc.make_and_plot_layering_small(port, a, .9, plot=False)ans = tpc.ccoc_tvar_pricing(port, layering, a)tpc.roe_lr(ans)```\normalsize* Debt attaching at 90th percentile or 65* Rows: pricing from each agent and minimum across agents (`min_g`)* Columns: equity and debt correspond to capital tranches* Key takeaway: `min_g` price for the equity layer is **not placeable*** `min_g` of **45.658** lower than equity agent's price **45.957** and debt's **48.762*** Neither equity nor debt agent's distortion is uniformly lower over full range of the equity tranche $\implies$ **sub-optimal** tranching## Placeable Premium vs. Debt Attachment Point::: {.columns}::: {.column width=50%}```{python}#| echo: falseequal_s = tpc.equal_s(port)layering_opt = tpc.make_and_plot_layering_small(port, a, 1- equal_s, plot=False)ans_opt = tpc.ccoc_tvar_pricing(port, layering_opt, a)s_values = port.density_df.query('p_total > 0').F.valuesplaced = tpc.placement_analysis(port, a, s_values)placed.columns = ['p break', 'Equity', 'Eq Cost', 'Debt Cost', 'Placeable Prem', 'Min Prem']placed = placed.set_index('p break')ax = placed['Min Prem'].plot(figsize=(5,3))placed['Placeable Prem'].plot(ax=ax)ax.legend(loc='lower left')ax.set(ylim= [45, 55], xlabel='p break', ylabel='Premium');```::::::\medskip* Orange line shows total cost of capital varying with different debt/equity splits* Material costs from sub-optimal tranching of capital* Potential cost savings explain active broker rôle in reinsurance markets