# Package loading
import pandas as pd
import numpy as np
# Define R
R = 0.40
# Create data
arrays = [['10-Jul_07']*5+['12-Jun_08']*5, ['1y','3y','5y','7y','10y']*2]
data = pd.DataFrame(data = None, index = pd.MultiIndex.from_arrays(arrays, names=('Year', 'Maturity')), columns = ['s(bps)', 'lambda', 'PD(%)'])
data['s(bps)'] = [16, 29, 45, 50, 58, 397, 315, 277, 258, 240]
# Populate lambda according to eq (19.3)
data['lambda'] = data['s(bps)'].values/10000/(1-R)
# Show data
data
# A function to get intensity using a linear piecewise function
def DefaultIntensity(data):
# Subfunction to do it for one pair
def _get_intermediate(sub_data):
index_years = [int(i[:-1]) for i in sub_data.keys()]
values_years = sub_data.values
return (index_years[1]*values_years[1]-index_years[0]*values_years[0])/(index_years[1]-index_years[0])
# Apply to all pairs
return [_get_intermediate(data.iloc[i:(i+2)]) for i in range(len(data)-1)]
# Define subdata
data07 = data.loc['10-Jul_07','lambda']
data08 = data.loc['12-Jun_08','lambda']
y_keys = [data07.keys()[i]+'-'+data07.keys()[i+1] for i in range(len(data07.keys())-1)]
linear_default07 = pd.Series(data = DefaultIntensity(data07), index = y_keys)
linear_default07
linear_default08 = pd.Series(data = DefaultIntensity(data08), index = y_keys)
linear_default08
# Calculate the probability of default using eq. (19.2) in (%)
def CumulProb(lamb, t):
return (1-np.exp(-lamb*t))*100
# Use the function for 2007
t = [int(i[:-1]) for i in data07.keys()]
lamb = data07.values
data.loc['10-Jul_07','PD(%)'] = [CumulProb(l, t) for l, t in list(zip(lamb,t))]
# Use the function for 2008
t = [int(i[:-1]) for i in data08.keys()]
lamb = data08.values
data.loc['12-Jun_08','PD(%)'] = [CumulProb(l, t) for l, t in list(zip(lamb,t))]
data
100*np.append(data.loc[('10-Jul_07', '1y'), 'lambda'], data.loc[('10-Jul_07', '1y'), 'lambda'] + np.cumsum(time_frames*linear_default07.values))
100*np.append(data.loc[('12-Jun_08', '1y'), 'lambda'], data.loc[('12-Jun_08', '1y'), 'lambda'] + np.cumsum(time_frames*linear_default08.values))
Tab191 = pd.DataFrame(data = np.array([
[0.000, 0.011, 0.011, 0.031, 0.085, 0.195, 0.386, 0.705, 0.824],
[0.021, 0.060, 0.110, 0.192, 0.298, 0.525, 0.778, 1.336, 2.151],
[0.055, 0.165, 0.345, 0.536, 0.766, 1.297, 2.224, 3.876, 5.793],
[0.177, 0.461, 0.804, 1.216, 1.628, 2.472, 3.925, 7.006, 10.236],
[0.945, 2.583, 4.492, 6.518, 8.392, 11.667, 16.283, 23.576, 29.733],
[3.573, 8.436, 13.337, 17.828, 21.908, 28.857, 36.177, 43.658, 48.644],
[10.624, 18.670, 25.443, 30.974, 35.543, 42.132, 50.258, 53.377, 53.930]
]),
index = ['Aaa', 'Aa', 'A', 'Baa', 'Ba', 'B', 'Caa-C'], columns = [1,2,3,4,5,7,10,15,20])
Tab191
cols_ar = np.array(Tab191.columns)
pd.DataFrame(data = ((Tab191.values)[:,1:]-(Tab191.values)[:,:-1]) / (cols_ar[1:]-cols_ar[:-1]),
index = Tab191.index, columns = [str(cols_ar[i])+'-'+str(cols_ar[i+1]) for i in range(len(cols_ar)-1)])