Kernel: Python 3 (system-wide)
In [44]:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import interpolate
In [211]:
#Recovery rate R=0.4
In [180]:
#Берем немецкие облигации как безрисковые, итальянские - рискованные German_notrisk = [-0.857,-0.889,-0.896,-0.759,-0.722,-0.545] German_notrisk = [0.01*x for x in German_notrisk] Italian_risk=[0.243,0.777,0.983,1.298,1.468,1.762] Italian_risk = [0.01*x for x in Italian_risk] Maturity = [1,2,3,5,7,10] Table = pd.DataFrame({"Germany":German_notrisk, "Italy":Italian_risk}, index = Maturity)
In [181]:
Table
Out[181]:
In [182]:
#Цена бузкупонной облигации с ставкой r и сроком погашения T def BondPrice(T,r): return 1/(1+r)**T
In [183]:
#Вероятнось дефолта def ProbOfDefault(BondPriceRisk,BondpriceNotRisk,R): return (1-BondPriceRisk/BondpriceNotRisk)/(1-R)
In [184]:
#Посчитаем вероятность дефолта для каждой из облигаций, R=0.4 Table["Default"]=ProbOfDefault(BondPrice(Table.index,Table["Italy"]),BondPrice(Table.index,Table["Germany"]),R)
In [185]:
#Подсчет лямбда для каждого из временных отрезков def Lambda(T1,T2,p1,p2): return np.log((1-p1)/(1-p2))/(T2-T1)
In [186]:
# Создадим список из моментов выплат Mat = [0]+list(Table.index) Time =[] for i in range(len(Mat)-1): Time=Time+[Mat[i]+x/4 for x in range(4*(Mat[i+1]-Mat[i]))] Time = Time +[10]
In [187]:
#Линейно проинтерполируем вероятности дефолта в промежуточных точках Inter = interpolate.interp1d([0]+list(Table.index), [0]+list(Table["Default"]), kind = "linear")
In [188]:
#Теперь мы знаем вероятности разорения для большого числа временных моментов, поэтому можем посчитать лямбды на каждом из подотрезочках T1=pd.Series(Time, index=Time) T2=pd.Series(Time, index=Time).shift(-1) P1=pd.Series(list(Inter(Time)),index=Time) P2=pd.Series(list(Inter(Time)),index=Time).shift(-1) LAMBDA=Lambda(T1,T2,P1,P2)
In [189]:
#Создадим табличку с интерполированными вероятностями и интерполированными значениями лямбда NewTable = pd.DataFrame(index = Time) NewTable["Default"]=list(Inter(Time)) NewTable["NotDefault"]=1-NewTable["Default"] NewTable["Lambda"]=LAMBDA NewTable
Out[189]:
In [190]:
#Построим все графики plt.plot(NewTable.index, NewTable["Default"], 'bo-', color = "green", markersize=3,label ="InterpolatedProbsDefault") plt.plot(NewTable.index, NewTable["NotDefault"], 'bo-', color = "yellow", markersize=3,label ="InterpolatedProbsNotDefault") plt.plot(Table.index, Table["Default"], 'X', color = "green", markersize=12,label ="InitialProbsDefault") plt.plot(Table.index, 1-Table["Default"], 'X', color = "yellow", markersize=12,label ="InitialProbsNotDefault") plt.plot(Time,LAMBDA,'bo-',label='Hazard rate',markersize=3,color="red") plt.plot(Table.index,Table["Italy"],'bo-',label='Italy',markersize=3,color="brown") plt.plot(Table.index,Table["Germany"],'bo-',label='Germany',markersize=3,color="violet") plt.legend()
Out[190]:
<matplotlib.legend.Legend at 0x7f23da5bd208>
In [191]:
#Если своп расчитан на 5 лет, то максимальное число платежей равно 5*4=20 платежей, вероятность платежа равна вероятности неразорения компании к этому моменту, то есть S #Если заемщик разорится между Tn и Tn-1(вероятность этого равна P(Tn)-P(Tn-1)=(1-S(Tn)) - (1-S(Tn-1)) = S(Tn-1)-S(Tn)), то продавец страховки заплатит (1-R) в момент Tn
In [192]:
Prodavec_pay_table = pd.DataFrame(index = Time) Prodavec_pay_table["Payment"]=1-R Prodavec_pay_table["ProbabilityOfPayment"]=NewTable["NotDefault"].shift(1)-NewTable["NotDefault"]
In [193]:
Prodavec_pay_table.head()
Out[193]:
In [207]:
#Мат ожидание суммы платежей покупателя равно x/4 * (s(0.25)+ s(0.5)+ ... + s(4.75) + s(5)) (для пятилетнего свопа) E1_dividedby_x=NewTable["NotDefault"][0.5:5].sum()/4
In [208]:
#Мат ожидание суммы платежей продавца равно (1-R)*(1-s(5)) E2=(1-R)*(1-NewTable["NotDefault"][5])
In [209]:
x=E2/E1_dividedby_x print("Цена страховки: ",x*100, "%")
Out[209]:
Цена страховки: 2.2368461390844323 %
In [213]:
#Логично предположить, что если R увеличивается, то цена страховки должна уменьшаться, однако в этом случае получилось наоборот #Также логично предположить, что с ростом доходности риковой облигации, вероятность дефолта увеличится => вероятность s уменьшится => страховка увеличится (все следует из формул с лекций)
In [0]:
In [0]: