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;
}