Loan Pricing

Overview


This example goes through the steps to price a loan given funding for the loan and a cost of equity for the bank. When a bank grants a loan to a customer, typically the funds that are given the customer represents a mixture of outside funding (from a deposit or other type of borrowing) and equity assets of the bank. Banks are required to hold a certain amount of capital for each loan, and this is generally recognized as the portion of the loan that is funded by equity capital. The remainder is funded through some type of borrowing. For the purposes of this example, we will assume that the split between equity funding and borrowing has already been calculated. For an example of calculating the regulatory capital amount, please refer to the basel corner. For books discussing loan pricing, please see

Calculating


The principle behind loan pricing is to choose a rate such the present value of the cash flows from the loan (including the non-equity funding) and including the effects of taxation, dicounted by the cost of equity is equal to the value of the equity used. As a simple example suppose we have a loan with the following characteristics:

  • $1,000 loan
  • 6% funded by equity ($60)
  • 94% funded by bank loan at 10% ($940)
  • $500 recovery on default
  • Cost of Equity : 15%
  • Tax Rate : 40%
  • Periods Per Year : 2



let instruments = await import('/lib/finance/fixed-income/v1.0.0/instruments.js');
let payDates = await import('/lib/finance/fixed-income/v1.0.0/pay-dates.js');
let dateRoll = await import('/lib/finance/fixed-income/v1.0.0/date-roll.js');
let daycount = await import('/lib/finance/fixed-income/v1.0.0/day-count.js');
let cashFlows = await import('/lib/finance/fixed-income/v1.0.0/cash-flows.js');


let principal = 1000;
let loanrate = 0.1;
let dates = payDates.monthly('2020-01-01', 13, dateRoll.FollowingBusinessDay);
let loan = instruments.bullet(principal, loanrate, daycount._30_360, dates);
let loanCashFlows = forecast.forecast(loan);
					


Next we need to calculate the cashflows from bank loan. In this case the cashflows are payments, so we multiply them by -1 to make the cash flows negative.


let principal = 940;
let rate = 0.1;
let dates = payDates.monthly('2020-01-01', 13, dateRoll.FollowingBusinessDay);
let bond = instruments.bullet(principal, rate, daycount._30_360, dates);
let bankLoanCashFlows = forecast.forecast(bond).map(p=>{
  p.payment = -1*p.payment;												
});
					


Next we need concatenate the results, multiply by one minus the taxrate:


  
let today = '2020-01-01';
let costOfEquity = 0.15;
let discountedValue =  $list(totalCashFlows).map(p=>{
  let T = $timespan(today,p.paydate).length('years');
  let discountedValue = p.payment * Math.exp(-1*costOfEquity*T);
  return discountedValue;
}).sum();
						 
Try it!

Adding Defaults



The final step to get an accurate loan price is to add in default behaviour. If the loan defaults, wthe cash flows will be less than the cash flows calculated above. Because we used the cost of equity, we need to discount the expected cash flows, i.e. the average cash flows. For a loan that does not default, the calculation above works, however, we need to account for the expected loss from default. We could do this by simulating a bunch of bonds with different default probabilities, however, if we know the prob of default, we can just apply the probability of default to our loan. Lets assume a 1% probability of default with a loss given default of 50%. We can alter the above cash flows to account for expected loss by adding a defaultedPrincipal method to our bond. Add the following lines


loan.defaultedPrincipal = function(date){
  return this.principal * 0.01 * 0.5;				  
}
					


Contents