This blog is an extension of our blog on #CFA Fixed Income: Mortgage Backed Securities: Part 2

Consider a freshly issued MBS with C coupon and that has mortgage loans of 30-year maturity. To value this security, we would perform the following steps:

1. Generate an interest rate path using Hull-White

In the area of financial mathematics, the Hull-White model endeavors to predict future interest rates. It can be of great help in valuing interest rate derivatives or bonds in an open market.

2. Calculate expected principal and interest payment for a given month

3. Using interest rate projections and prepayment model, project cash-flow due to prepayments for the same month

4. Get the total cashflow for the month

5. Similarly, project monthly cash flows for all the 30 years

6. Discount the cashflow to get the present value

7. This value is actually value of the MBS on a given path

Repeat steps 1-7 several times and average the value of MBS to get final value of MBS

Let us write a code in R language to value MBS through Two Factor Hull-White Model:

Let’s create a function with two inputs

#WAC – Weighted Average Coupon

MBS_pricing_withPP = function (WAC,r0) {

SYset=c(0.94, 0.76, 0.74, 0.95, 0.98, 0.92, 0.98, 1.1, 1.18, 1.22, 1.23, 0.98);

#Seasonality: Generally, monthly seasonality affects prepayments.

borrow=100;

sigma=0.02;kappa=0.2;rbar=0.06;T=30;#These are CIR model specification

N=200;#We are going to generate 200 simulation paths

n=T*12;#There are in total 12 months in year, each month is a time step

dt=1/12;#Time step is equal to a month

sqrtdt=sqrt(dt);

dz=matrix(rnorm(N*n,0,1),N);

r=matrix(0, N,n);

PV=r;RI=r;BM=r;CPR=r;MP=r;IP=r;SP=r;PP=r;C=r;PVcashflow=r;

Age=array(0,dim=n);

SY=Age;

for (t in 1:n) { # months

if (t>1)

{

r[,t]=r[,t-1]+kappa*(rbar-r[,t-1])*dt+sigma*sqrt(r[,t-1])*dz[,t]*sqrtdt;#CIR r(t)=r(t-1)+dr

}

else

{

r[,1]=r0;#for all paths initial r is set to r0

PV[,1]=borrow;

}

#prepayment part

RI[,t]=0.28+ 0.14*atan(-8.57+430*(WAC-r[,t]));#refinancing Incentive

BM[,t]=0.3+0.7*PV[,t]/borrow;# Burnout Multiplier

Age[t]=min(1,t/30);#Age

if (t%%12==0) { month=12; } else { month=t%%12;}

SY[t]=SYset[month];#Seasonality

CPR[,t]=RI[,t]*BM[,t]*Age[t]*SY[t];#conditional prepayment rate

MP[,t]=PV[,t]*WAC/12/(1-1/(1+WAC/12)^(n-t)); #monthly payment part

IP[,t]=PV[,t]*WAC/12;#Interest Payment

SP[,t]=MP[,t]-IP[,t];#Scheduled Principal payment

PP[,t]=(1-(1-CPR[,t])^(1/12))*(PV[,t]-SP[,t]);# prepayment part

C[,t]=IP[,t]+SP[,t]+PP[,t]; #monthly cash flow

if (t==1) {PVcashflow[,t]=exp(-sum(r[,1:t])*dt)*C[,t];} else {PVcashflow[,t]=exp(-rowSums(r[,1:t])*dt)*C[,t];}

if(t<n) {PV[,t+1]=PV[,t]-(SP[,t]+PP[,t]);}#outstanding balance

}

cashflow_perpath=rowSums(PVcashflow[,1:n-1]);

# outputs

price=mean(cashflow_perpath);

meanCPR=colMeans(CPR[,1:240]);

meanCash=colMeans(PVcashflow[,1:240]);

return(list(price=price, cpr=meanCPR,cash=meanCash));

}

p = MBS_pricing_withPP(0.06,0.04);

print(p\$price);

print(p\$cpr);

print(p\$cash);

Last three steps are for the output and following are the results:

We got the price of the MBS as \$105.4626

CPR: Conditional Prepayment Rate