Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
2846 views
Kernel: Python 3 (system-wide)
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy import interpolate
#Recovery rate R=0.4
#Берем немецкие облигации как безрисковые, итальянские - рискованные 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)
Table
#Цена бузкупонной облигации с ставкой r и сроком погашения T def BondPrice(T,r): return 1/(1+r)**T
#Вероятнось дефолта def ProbOfDefault(BondPriceRisk,BondpriceNotRisk,R): return (1-BondPriceRisk/BondpriceNotRisk)/(1-R)
#Посчитаем вероятность дефолта для каждой из облигаций, R=0.4 Table["Default"]=ProbOfDefault(BondPrice(Table.index,Table["Italy"]),BondPrice(Table.index,Table["Germany"]),R)
#Подсчет лямбда для каждого из временных отрезков def Lambda(T1,T2,p1,p2): return np.log((1-p1)/(1-p2))/(T2-T1)
# Создадим список из моментов выплат 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]
#Линейно проинтерполируем вероятности дефолта в промежуточных точках Inter = interpolate.interp1d([0]+list(Table.index), [0]+list(Table["Default"]), kind = "linear")
#Теперь мы знаем вероятности разорения для большого числа временных моментов, поэтому можем посчитать лямбды на каждом из подотрезочках 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)
#Создадим табличку с интерполированными вероятностями и интерполированными значениями лямбда NewTable = pd.DataFrame(index = Time) NewTable["Default"]=list(Inter(Time)) NewTable["NotDefault"]=1-NewTable["Default"] NewTable["Lambda"]=LAMBDA NewTable
#Построим все графики 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()
<matplotlib.legend.Legend at 0x7f23da5bd208>
Image in a Jupyter notebook
#Если своп расчитан на 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
Prodavec_pay_table = pd.DataFrame(index = Time) Prodavec_pay_table["Payment"]=1-R Prodavec_pay_table["ProbabilityOfPayment"]=NewTable["NotDefault"].shift(1)-NewTable["NotDefault"]
Prodavec_pay_table.head()
#Мат ожидание суммы платежей покупателя равно x/4 * (s(0.25)+ s(0.5)+ ... + s(4.75) + s(5)) (для пятилетнего свопа) E1_dividedby_x=NewTable["NotDefault"][0.5:5].sum()/4
#Мат ожидание суммы платежей продавца равно (1-R)*(1-s(5)) E2=(1-R)*(1-NewTable["NotDefault"][5])
x=E2/E1_dividedby_x print("Цена страховки: ",x*100, "%")
Цена страховки: 2.2368461390844323 %
#Логично предположить, что если R увеличивается, то цена страховки должна уменьшаться, однако в этом случае получилось наоборот #Также логично предположить, что с ростом доходности риковой облигации, вероятность дефолта увеличится => вероятность s уменьшится => страховка увеличится (все следует из формул с лекций)