Source code for RiskQuantLib.Model.KMV.kmv
#!/usr/bin/python
#coding = utf-8
import numpy as np
from scipy.optimize import fsolve
from scipy.stats import norm
from RiskQuantLib.Model.model import model
#<import>
#</import>
[docs]class kmv(model):
"""
kmv(base) is a class to calculate KMV relative parameters, including Asset Volatility, Asset Value,
Distance to Default.
"""
#<init>
def __init__(self, riskFreeRateNum:float, tenorNum:float, debtNum:float, equityNum:float, equitySigmaNum:float):
"""
You must specify risk free rate, tenor, debt value, equity value and equity volatility to
initialize KMV object.
"""
super(kmv,self).__init__()
self.riskFreeRate = riskFreeRateNum
self.tenor = tenorNum
self.debt = debtNum
self.equity = equityNum
self.equitySigma = equitySigmaNum
#</init>
[docs] def BSfunction(self, i):
"""
A BS function used in KMV model.
"""
riskFreeRate, tenor, debt, equity, equitySigma = self.riskFreeRate, self.tenor, self.debt, self.equity, self.equitySigma
asset, assetSigma = i[0], i[1]
d1 = (np.log(asset / debt) + (riskFreeRate + 0.5*assetSigma*assetSigma)*tenor)/(assetSigma*np.sqrt(tenor))
d2 = d1 - assetSigma*np.sqrt(tenor)
return [asset*norm.cdf(d1) - debt*np.exp(-1*riskFreeRate*tenor)*norm.cdf(d2) - equity, norm.cdf(d1) * asset * assetSigma / equity - equitySigma]
[docs] def calAssetAndAssetSigma(self):
"""
Calculate asset value and volatility of asset value
"""
r = fsolve(self.BSfunction, [self.debt+self.equity, 0.5*self.equitySigma])
self.asset = r[0]
self.assetSigma = r[1]
[docs] def calDistanceToDefault(self, shortTermDebtNum:float, longTermDebtNum:float, mixedRatioNum=0.5):
"""
Calculate distance to default given short term debt and long term debt and mixed ratio.
"""
self.defaultPoint = shortTermDebtNum + mixedRatioNum * longTermDebtNum
self.defaultDistance = (self.asset - self.defaultPoint)/(self.asset * self.assetSigma)
#<kmv>
#</kmv>