Skip to content
Draft
Changes from 1 commit
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
93e924f
initial commit CAT Bonds
KaiOBerg Oct 31, 2025
f502208
change subarea building to resolution input
KaiOBerg Nov 3, 2025
2c23ff5
alter subarea creation test notebook
KaiOBerg Nov 3, 2025
3e9457e
take crs from exposure
KaiOBerg Nov 7, 2025
efe9a75
dont save exp_gdf and adjust plotting
KaiOBerg Nov 7, 2025
cbd9b94
add buffer to create subareas
KaiOBerg Nov 7, 2025
716d3a0
streamline calculations
KaiOBerg Nov 7, 2025
96c26c4
change calculation of attachment and prinipal
KaiOBerg Nov 7, 2025
cc4fdee
keep only grids with exposure point within
KaiOBerg Nov 7, 2025
16caea0
fix bugs
KaiOBerg Nov 7, 2025
6533b49
adjust calc savings
KaiOBerg Nov 7, 2025
bf54f9b
adjust test notebook to changed classes
KaiOBerg Nov 7, 2025
688027d
inititate bond simulation class
KaiOBerg Nov 7, 2025
0a35b87
delete pay_dam_subarea class
KaiOBerg Nov 7, 2025
519dcb4
update function descriptions
KaiOBerg Nov 7, 2025
8a2accf
fix bugs
KaiOBerg Nov 7, 2025
08bd04e
add total payout and damage
KaiOBerg Nov 7, 2025
3d59693
update function description
KaiOBerg Nov 7, 2025
edf6598
add net cash flow and premium simulation
KaiOBerg Nov 7, 2025
2388d7c
adjust metric naming
KaiOBerg Nov 7, 2025
7db291c
update test to classes
KaiOBerg Nov 7, 2025
f9c6cab
change function naming
KaiOBerg Nov 7, 2025
1168e62
inititate premium class
KaiOBerg Nov 7, 2025
8ef65cb
add IBRD CAT bonds data file
KaiOBerg Nov 7, 2025
6d30ad7
add ibrd based premium calculation
KaiOBerg Nov 7, 2025
fc3edc8
improve logging and fix bug chatoro
KaiOBerg Nov 7, 2025
c7d1134
fix path to data dir
KaiOBerg Nov 7, 2025
6bf627e
remove premium input
KaiOBerg Nov 7, 2025
c93b862
adjust test notebook to classes
KaiOBerg Nov 7, 2025
b820b8c
add benchmark premium calculation
KaiOBerg Nov 7, 2025
ce9952c
include all premium methods in test notebook
KaiOBerg Nov 7, 2025
0d5fbcd
remove buffer grid size
KaiOBerg Nov 7, 2025
82d185d
define variables
KaiOBerg Nov 7, 2025
d6a494c
rename bond_simulation to sng_bond_simulation
KaiOBerg Nov 7, 2025
7322e02
initialize multi country bond simulation
KaiOBerg Nov 7, 2025
d6250ff
add function to derive VaR and ES
KaiOBerg Nov 7, 2025
ac4c317
add jamaica bond
KaiOBerg Nov 9, 2025
c4d2d99
fix bugs exp and haz jamaica
KaiOBerg Nov 9, 2025
78e8b8e
test multi-country bond in notebook
KaiOBerg Nov 9, 2025
4b9c735
add minimum simulation year
KaiOBerg Nov 9, 2025
a440927
Update climada_petals/engine/cat_bonds/mlt_bond_simulation.py
KaiOBerg Nov 16, 2025
616bf60
make init loss more pythonic
KaiOBerg Nov 16, 2025
d50ceb5
change var es function
KaiOBerg Nov 16, 2025
ac20d79
adjust test notebook for confidence intervals
KaiOBerg Nov 16, 2025
50ac5ef
remove nested loop from bond simulation
KaiOBerg Nov 17, 2025
da53e8a
change fucntion description
KaiOBerg Nov 17, 2025
c02d1eb
fix type of single events in df_loss_month
KaiOBerg Nov 21, 2025
7c6458b
adjust to chanings in sng_simulation
KaiOBerg Nov 21, 2025
ad92d39
implement return simulation mlt bonds
KaiOBerg Nov 21, 2025
9c5ca13
rename funciton names
KaiOBerg Nov 21, 2025
0e95f18
init function to calculate returns with trances
KaiOBerg Nov 21, 2025
805bbe1
add required principal calculation
KaiOBerg Nov 21, 2025
d692bea
save required principal to mlt_bond class
KaiOBerg Nov 21, 2025
05a88ee
rename functions
KaiOBerg Nov 21, 2025
61802b5
make bond term function private
KaiOBerg Nov 21, 2025
2b3484b
adapt changes in mlt class to test notebook
KaiOBerg Nov 21, 2025
1d5897d
fix min year in requ_principal and initialze min_year at class init
KaiOBerg Nov 21, 2025
499bf97
add function for overlapping subareas
KaiOBerg Nov 21, 2025
0fef13e
add belize
KaiOBerg Nov 21, 2025
a53e32e
make build_subareas optional
KaiOBerg Nov 21, 2025
0b09fe5
minor adjustments
KaiOBerg Nov 21, 2025
6051337
rename class names
KaiOBerg Nov 21, 2025
d2ec6c4
initialize pooling optimization problems
KaiOBerg Nov 21, 2025
edfb591
add function to derive optimal fixed pools
KaiOBerg Nov 21, 2025
7efc9a2
move allocate tranche payout to utils
KaiOBerg Nov 24, 2025
5a29cc3
rename test notebook to tutorial
KaiOBerg Nov 24, 2025
58bf8e1
move tutorial
KaiOBerg Nov 27, 2025
9166134
initialize subareas with resolution
KaiOBerg Nov 27, 2025
e5d2d47
initiate subareas by resolution
KaiOBerg Nov 27, 2025
5abe3c1
implement pooling n pools
KaiOBerg Nov 27, 2025
d8f70a0
initialise class with optimized n pools
KaiOBerg Nov 28, 2025
fc1a62f
rename n to n_pools
KaiOBerg Nov 28, 2025
7186418
rename fct process_n to process_n_pools
KaiOBerg Nov 28, 2025
62e4808
add maximum principal wrapper function
KaiOBerg Nov 28, 2025
f5c774b
fix iterration bug
KaiOBerg Nov 28, 2025
5e14044
return whole dictionary conatining multiple class instances
KaiOBerg Nov 28, 2025
b311758
add logging to simulate_bond_pool_n
KaiOBerg Nov 28, 2025
b262e71
add max_principal pooling optimization function
KaiOBerg Nov 28, 2025
4dbea02
adapt to changes in mlt_cty_bond
KaiOBerg Nov 28, 2025
20b08fa
update funciton descriptions
KaiOBerg Nov 28, 2025
c486f9c
comment tutorial script
KaiOBerg Nov 28, 2025
ad94804
change inital guess values to percentiles of hazard intensity
KaiOBerg Nov 28, 2025
df09dd3
implement option to plug in manuall init guess
KaiOBerg Nov 28, 2025
a84e767
add function to initialize subarea class with a gdf
KaiOBerg Nov 28, 2025
d422c83
update function description
KaiOBerg Nov 28, 2025
9c4a252
move turotial to docs and create init
KaiOBerg Nov 28, 2025
e9078d4
fix file paths
KaiOBerg Nov 28, 2025
f30d74b
move explode into exp_gdf function
KaiOBerg Nov 28, 2025
fa871c8
initialize subaarea unit tests
KaiOBerg Nov 28, 2025
16ce43d
remove padding of exposure resolution
KaiOBerg Nov 28, 2025
d784b82
add 1.2 padding to exposure resolution
KaiOBerg Nov 28, 2025
b7e95b4
add testing of merging polygons
KaiOBerg Nov 28, 2025
c1f5d4d
add more test cases to merging polyons
KaiOBerg Nov 28, 2025
70cd21d
fromatting
KaiOBerg Dec 1, 2025
e5d515a
init test subarea_calculations
KaiOBerg Dec 1, 2025
9635151
clearify variable origin
KaiOBerg Dec 1, 2025
b353942
fix bug
KaiOBerg Dec 1, 2025
f2e8f90
add pay_vs_dam test function
KaiOBerg Dec 1, 2025
cd7432a
add test objective_function
KaiOBerg Dec 1, 2025
b264001
initiate test script for single country bonds
KaiOBerg Dec 1, 2025
56bee84
fix loop bug and remove simulated years
KaiOBerg Dec 1, 2025
5de50d6
test simulate loss
KaiOBerg Dec 1, 2025
a7305bd
finish tests for single country bonds
KaiOBerg Dec 1, 2025
f7aae42
formatting
KaiOBerg Dec 1, 2025
76b10bc
adjust descriptions
KaiOBerg Dec 1, 2025
f53bc2e
initialize test for premium calculations
KaiOBerg Dec 1, 2025
bcd29f7
format
KaiOBerg Dec 1, 2025
e63caaa
test benchmark sharpe ration function
KaiOBerg Dec 1, 2025
b8b65f1
formatting
KaiOBerg Dec 1, 2025
9434653
update function description
KaiOBerg Dec 1, 2025
bd5b76d
test multi_level_es function
KaiOBerg Dec 1, 2025
a3ca2a0
formatting
KaiOBerg Dec 1, 2025
64c233c
update logging to petals LOGGER
KaiOBerg Dec 12, 2025
301b485
restructure tests
KaiOBerg Dec 12, 2025
d857f33
changed structure of tests
KaiOBerg Dec 12, 2025
675f460
change structure of tests
KaiOBerg Dec 12, 2025
c8c5e24
adjust test structure
KaiOBerg Dec 12, 2025
8eaa0c0
change test structure
KaiOBerg Dec 12, 2025
da8d4c4
remove bug of missing last term
KaiOBerg Dec 12, 2025
c24c18e
fix bug of starting year
KaiOBerg Dec 12, 2025
ef05eae
test multi country cat bond class
KaiOBerg Dec 12, 2025
43dc34e
ensure valid results
KaiOBerg Dec 15, 2025
007155d
get country location even if risk concentration does not improve
KaiOBerg Dec 15, 2025
819677e
finsih mlt_bond_class tests
KaiOBerg Dec 15, 2025
e9917d7
remove unnecessary packages
KaiOBerg Dec 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add ibrd based premium calculation
  • Loading branch information
KaiOBerg committed Nov 7, 2025
commit 6d30ad74509aa7422a05e19d494f307b6a54b51f
48 changes: 48 additions & 0 deletions climada_petals/engine/cat_bonds/premium_class.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
import pandas as pd
import numpy as np
from pathlib import Path
from scipy.optimize import curve_fit

import logging

# path to data folder
DATA_DIR = (Path(__file__).parent.parent).joinpath('data/cat_bonds')

# setup logger
LOGGER = logging.getLogger(__name__)

# regression coefficients for chatoro premium calculation (extracted from Chatoro et al., 2022)
Expand All @@ -19,6 +26,7 @@ class premium_calculations:
def __init__(self, bond_simulation_class):
self.bond_simulation_class = bond_simulation_class

### CHATORO-PRICING ###
def chatoro_premium(self, peak_multi, investment_graded, hybrid_trigger, GCIndex=None, BBSpread=None):
'''Linear regression formula to calculate the premium based on the regression model presented in Chatoro et al., 2022'''

Expand All @@ -33,3 +41,43 @@ def chatoro_premium(self, peak_multi, investment_graded, hybrid_trigger, GCIndex

self.chatoro_prem_rate = b_0 + b_1 * self.bond_simulation_class.loss_metrics['EL_ann'] + b_2 * peak_multi + b_3 * GCIndex + b_4 * BBSpread + b_5 * self.bond_simulation_class.term * 12 + b_6 * investment_graded + b_7 * hybrid_trigger


### IBRD-PRICING ###
def monoExp(self, x, a, k, b):
'''Exponential function to fit the risk multiple curve'''
return a * np.exp(-k * x) + b

def init_prem_ibrd(self, peril=None, year=None):
"""
Fits a monotonic exponential curve to catastrophe bond data for bonds issued by the World Bank to estimate premium parameters.
This function loads IBRD bond data from an Excel file, optionally filters the data by peril type or issuing year,
and fits a monotonic exponential function to the relationship between expected loss and risk multiple.
The fitted parameters are returned. Optionally, the function can generate and save a plot of the fit.
Parameters
----------
peril : str, optional
Peril type to filter the bonds (e.g., 'Earthquake', 'Flood'). If None, no filtering by peril is applied.
year : list or int, optional
Issuing year(s) to filter the bonds. If None, no filtering by year is applied.
Returns
-------
ibrd_prem_rate : float
The estimated premium rate based on the fitted curve and the bond's expected annual loss.
"""
ibrd_bonds = pd.read_excel(DATA_DIR.joinpath('IBRD_bonds.xlsx'))
if peril is not None:
flt_ibrd_bonds = ibrd_bonds[ibrd_bonds['Peril'] == peril]
flt_ibrd_bonds = flt_ibrd_bonds.reset_index(drop=True)

elif year is not None:
flt_ibrd_bonds = ibrd_bonds[ibrd_bonds['Issuing date'].isin(year)]
flt_ibrd_bonds = flt_ibrd_bonds.reset_index(drop=True)

else:
flt_ibrd_bonds = ibrd_bonds.copy()
#perform the fit
params_prem_ibrd, cv = curve_fit(self.monoExp, flt_ibrd_bonds['Expected Loss'], flt_ibrd_bonds['Risk Multiple'])

a, k, b = params_prem_ibrd
LOGGER.info(f'Fitted IBRD premium parameters: a={a}, k={k}, b={b}')
self.ibrd_prem_rate = self.monoExp(self.bond_simulation_class.loss_metrics['EL_ann']*100, a, k, b) * self.bond_simulation_class.loss_metrics['EL_ann']