按揭抵押债券(Mortgage Backed Securities,MBS),又名抵押支持债券,是一种便于按揭债权交易的标准化债券,是最早的资产证券化商品,由美国吉利美(Ginnie Mae)于1970年首创。美国的住房专业银行及储蓄机构将贷出的住房抵押贷款中符合一定条件的贷款集中起来,形成一个抵押贷款的集合体(pool),利用贷款集合体定期发生的本金及利息的现金流入来发行证券,并由政府机构或政府背景的金融机构对该证券进行担保,以便贷款机构能够及时套现,从30年或更长贷款期限中解脱出来。抵押集合体所产生的本金、利息以及债务风险原封不动地转移支付给MBS的投资者。因此,MBS也被称为过手证券(pass-through securities)。
美国的过手抵押证券主要有吉利美(美国政府国民抵押贷款协会)担保的过手证券、房地美(美国联邦住宅贷款抵押公司FHLMC)的参政书、房利美(美国联邦国民抵押协会FNMA)的抵押支持债券,以及民间性质的抵押过手债券等。
Matlab代码如下:
[hide]
- function MBS_MC_Pricing(MC_Times)
- %%MBS_Value,MBS_VAR分别为MBS的价值和方差
- %%基于Matlab的MBS蒙特卡罗模拟定价
- %%MBS具有路径依赖性
- %%举例说明
- %%by fantuanxiaot
- %%基础参数的设定
- %基本假设:平均加权时间假设10年
- WAM=10;
- %二叉树的规模
- N=WAM+1;
- %蒙特卡罗模拟的次数
- %MC_Times=1000;
- %本金
- Principal=1e5;
- %期权调整价差
- OAS=0.02;
- %初始的一年期即期利率(Spot Rate)
- %初始的再融资利率(Refinancing Rate)
- %利息支付利率或者转付率
- %加权平均票面利率
- rand('seed',100);
- InitialSpotRate=0.06;
- InitialRefinancingRate=0.08;
- PT_Rate=0.075;
- WAC_Rate=0.08;
- %%首先构建利率的二叉树
- %%liv二叉树模型基于RendleMan和Bartter模型
- u=1.05;
- d=1/u;
- SpotRate=zeros(N);
- DiscountRate=zeros(N);
- for i=1:N
- for j=1:i
- SpotRate(j,i)=InitialSpotRate*u^(i-j)*d^(j-1);
- DiscountRate(j,i)=SpotRate(j,i)+OAS;
- end
- end
- %参数:MBS平均价值和标准差
- MBS_Vector=zeros(MC_Times,1);
- MBS_Value=0;
- MBS_STD=0;
- %二叉树路径起始点
- BinTree_Index=1;
- %计算的贴现率
- DiscountRate_Vector=[];
- %%蒙特卡罗计算MBS
- for i=1:MC_Times
- %剩余的本金
- Residual_Principal=Principal;
- %再融资利率
- RefinancingRate=InitialRefinancingRate;
- %计算的贴现率
- DiscountRate_Vector=[];
- %二叉树路径起始点
- BinTree_Index=1;
- %计划偿还本金
- SchedualPrincipal=0;
- %预计提前偿还本金
- ExpectedPrePrincipal=0;
- %现金流
- CashFlow=zeros(WAM,1);
- for j=1:WAM
- Residual_Principal=Residual_Principal-(SchedualPrincipal+ExpectedPrePrincipal);
- %利率的随机模拟路径
- if j==1
- DiscountRate_Vector=[DiscountRate_Vector DiscountRate(1,1)];
- if randn>0
- RefinancingRate=RefinancingRate*u;
- else
- RefinancingRate=RefinancingRate*d;
- end
- elseif j>1
- if randn>0
- BinTree_Index=BinTree_Index-1;
- if BinTree_Index<1
- BinTree_Index=1;
- end
- RefinancingRate=RefinancingRate*u;
- DiscountRate_Vector=[DiscountRate_Vector DiscountRate(BinTree_Index,j)];
- else
- BinTree_Index=BinTree_Index+1;
- if BinTree_Index>j
- BinTree_Index=j;
- end
- RefinancingRate=RefinancingRate*d;
- DiscountRate_Vector=[DiscountRate_Vector DiscountRate(BinTree_Index,j)];
- end
- end
- %利息支付
- Interest=PT_Rate*Residual_Principal;
- %计算月末或年末的贷款偿还余额
- Payment=CaCuPayment(Residual_Principal,WAM-j+1,WAC_Rate);
- %计算偿还本金
- SchedualPrincipal=Payment-Residual_Principal*WAC_Rate;
- if Residual_Principal>SchedualPrincipal
- CPR_Rate=CaCuCPR(WAC_Rate,RefinancingRate);
- ExpectedPrePrincipal=CPR_Rate*(Residual_Principal-SchedualPrincipal);
- if j<=N-1
- CashFlow(j)=Interest+SchedualPrincipal+ExpectedPrePrincipal;
- else
- CashFlow(j)=Interest+Residual_Principal;
- end
- end
- end
- MBS_Vector(i)=CaCuMBS(CashFlow,DiscountRate_Vector);
- end
- MBS_Value=mean(MBS_Vector);
- MBS_STD=std(MBS_Vector);
- disp(['蒙特卡罗模拟次数为:',num2str(MC_Times)])
- disp(['MBS的本金为:',num2str(Principal),'元'])
- disp(['MBS的价值为:',num2str(MBS_Value),'元'])
- disp(['基于蒙特卡罗模拟的MBS价值标准差:',num2str(MBS_STD)])
- fprintf('\n')
- end
- %%计算MBS价值
- function result=CaCuMBS(CashFlow,DiscountRate_Vector)
- result=0;
- for i=1:length(CashFlow)
- result=result+CashFlow(i)/(1+DiscountRate_Vector(i))^i;
- end
- end
- %%计算月末或者年末抵押偿还的金额
- function result=CaCuPayment(Payment,Time,WAC_Rate)
- %Time是剩余的月份
- %Payment是剩余的抵押贷款偿还的金额
- result=WAC_Rate*Payment/(1-1/(1+WAC_Rate)^Time);
- end
- %%CPR条件提前偿还率的计算
- %%建立提前还款模型
- function CPRresult=CaCuCPR(WAC_Rate,RefinancingRate)
- %CPR由差价来决定
- CPR_Minus=WAC_Rate-RefinancingRate;
- %判断条件
- if CPR_Minus<=0
- CPRresult=0.05;
- elseif CPR_Minus>0 && CPR_Minus<=0.5/100
- CPRresult=0.1;
- elseif CPR_Minus>0.5/100 && CPR_Minus<=0.01
- CPRresult=0.2;
- elseif CPR_Minus>0.01 && CPR_Minus<=1.25/100
- CPRresult=0.3;
- elseif CPR_Minus>1.25/100 && CPR_Minus<=2/100
- CPRresult=0.4;
- elseif CPR_Minus>0.02 && CPR_Minus<=2.5/100
- CPRresult=0.5;
- elseif CPR_Minus>0.025 && CPR_Minus<=0.3
- CPRresult=0.6;
- else
- CPRresult=0.7;
- end
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码
[/hide]
蒙特卡罗模拟效果如下:
C++的代码如下:
[hide]
首先构建一个MBS类:
”MBS.h“
- //构建MBS的类
- //by fantuanxiaot
- #ifndef _MBS_H_
- #define _MBS_H_
- //判别Visual C++的版本
- #if _MSC_VER>1000
- #pragma once
- #endif
- #include <vector>
- #include <Matrix.h>
- #include <MatrixIO.h>
- #include <cmath>
- #include <random>
- #include <iostream>
- //MBS的类
- using namespace std;
- using namespace Numeric_lib;
- class MBS
- {
- private:
- //期权调整价差
- double OAS;
- //MBS面值
- double Principal;
- //加权平均到期时间
- int WAM;
- //蒙特卡罗模拟的次数
- int MC_Times;
- //初始的一年期即期收益率
- double InitialSpotRate;
- //初始的再融资收益率
- double InitialRefinancingRate;
- //利息支付利率或者转付率
- double PT_Rate;
- //加权平均票面利率
- double WAC_Rate;
- public:
- ~MBS(){}
- MBS(double OAS1,double Principal1,int WAM1,int MC_Times1,double InitialSpotRate1,
- double InitialRefinancingRate1,double PT_Rate1,double WAC_Rate1)
- {
- OAS=OAS1;
- Principal=Principal1;
- WAM=WAM1;
- MC_Times=MC_Times1;
- InitialSpotRate=InitialSpotRate1;
- InitialRefinancingRate=InitialRefinancingRate1;
- PT_Rate=PT_Rate1 ;
- WAC_Rate=WAC_Rate1;
- }
- double CaCuCPR(double WAC_Rate,double RefinancingRate);
- double CaCuPayment(double Payment,int Time,double WAC_Rate);
- double CaCuMBS(vector<double> CashFlow,vector<double> DiscountRate_Vector);
- double MEAN(vector<double>);
- double STD(vector<double>);
- void CaCuMBSPricing();
- };
- #endif
复制代码 随后写入函数:
"MBSModel.cpp"
- #include "MBS.h"
- //内置函数
- double MBS::CaCuCPR(double WAC_Rate,double RefinancingRate)
- {
- double CPRresult;
- double CPR_Minus=WAC_Rate-RefinancingRate;
- //判断条件
- if (CPR_Minus<=0.0)
- {CPRresult=0.05;}
- else if (CPR_Minus>0.0 && CPR_Minus<=0.5/100)
- {CPRresult=0.1;}
- else if (CPR_Minus>0.5/100 && CPR_Minus<=0.01)
- {CPRresult=0.2;}
- else if (CPR_Minus>0.01 && CPR_Minus<=1.25/100)
- {CPRresult=0.3;}
- else if (CPR_Minus>1.25/100 && CPR_Minus<=2.0/100)
- {CPRresult=0.4;}
- else if (CPR_Minus>0.02 && CPR_Minus<=2.5/100)
- {CPRresult=0.5;}
- else if (CPR_Minus>0.025 && CPR_Minus<=0.3)
- {CPRresult=0.6;}
- else
- {CPRresult=0.7;}
- return CPRresult;
- }
- double MBS::CaCuPayment(double Payment,int Time,double WAC_Rate)
- {
- return(WAC_Rate*Payment/(1.0-1.0/pow((1+WAC_Rate),Time)));
- }
- double MBS::CaCuMBS(vector<double> CashFlow,vector<double> DiscountRate_Vector)
- {
- double result=0;
- for(int i=0;i<=CashFlow.size()-1;i++)
- {
- result=result+CashFlow[i]/pow(1+DiscountRate_Vector[i],i+1);
- }
- return result;
- }
- double MBS::MEAN(vector<double> A)
- {
- double sum=0.0;
- for(int i=0;i<=A.size()-1;i++)
- {
- sum=sum+A[i];
- }
- return(sum/A.size());
- }
- double MBS::STD(vector<double> A)
- {
- double sum=0.0;
- for(int i=0;i<=A.size()-1;i++)
- {
- sum=sum+pow(A[i]-MEAN(A),2);
- }
- return(sqrt(sum/A.size()));
- }
- void MBS::CaCuMBSPricing()
- {
- double u=1.05;
- double d=1/u;
- //利率二叉树的规模
- double N=WAM+1;
- //首先构建利率的二叉树
- Matrix<double,2> SpotRate(N,N);
- Matrix<double,2> DiscountRate(N,N);
- for(int i=0;i<=N-1;i++)
- {
- for(int j=0;j<=i;j++)
- {
- SpotRate[j][i]=InitialSpotRate*pow(u,i-j)*pow(d,j);
- DiscountRate[j][i]=SpotRate[j][i]+OAS;
- }
- }
- //参数:MBS平均价值和标准差
- vector<double> MBS_Vector(MC_Times);
- double MBS_Value=0;
- double MBS_STD=0;
- //二叉树路径起始点
- int BinTree_Index=0;
- //计算的贴现率
- vector<double> DiscountRate_Vector(WAM);
- //计算现金流
- vector<double> CashFlow(WAM);
- //蒙特卡罗计算MBS
- //剩余的本金
- double Residual_Principal=Principal;
- //再融资利率
- double RefinancingRate=InitialRefinancingRate;
- //计划偿还本金
- double SchedualPrincipal=0.0;
- //预计提前偿还本金
- double ExpectedPrePrincipal=0.0;
- //产生随机数
- default_random_engine generator;
- //产生均匀分布的随机数
- uniform_real_distribution<double> unif_dis(0,1);
- //利息
- double Interest=0.0;
- //支付
- double Payment=0.0;
- //CPR利率
- double CPR_Rate=0.0;
- for(int i=0;i<=MC_Times-1;i++)
- {
- //数据的重置
- Residual_Principal=Principal;
- SchedualPrincipal=0.0;
- ExpectedPrePrincipal=0.0;
- for(int m=0;m<=WAM-1;m++)
- {
- CashFlow[m]=0.0;
- DiscountRate_Vector[m]=0.0;
- }
- RefinancingRate=InitialRefinancingRate;
- BinTree_Index=0;
- for(int j=0;j<=WAM-1;j++)
- {
- Residual_Principal=Residual_Principal-(SchedualPrincipal+ExpectedPrePrincipal);
- //利率的随机模拟
- if(j==0)
- {
- DiscountRate_Vector[j]=(DiscountRate[0][0]);
- if (unif_dis(generator)>=0.5)
- {
- RefinancingRate=RefinancingRate*u;
- } else
- {
- RefinancingRate=RefinancingRate*d;
- }
- } else if(j>=1)
- {
- if (unif_dis(generator)>=0.5)
- {
- BinTree_Index--;
- if(BinTree_Index<0) BinTree_Index=0;
- RefinancingRate=RefinancingRate*u;
- DiscountRate_Vector[j]=DiscountRate[BinTree_Index][j];
- } else
- {
- BinTree_Index++;
- if(BinTree_Index>j) BinTree_Index=j;
- RefinancingRate=RefinancingRate*d;
- DiscountRate_Vector[j]=DiscountRate[BinTree_Index][j];
- }
- }
- //利息支付
- Interest=PT_Rate*Residual_Principal;
- //计算月末或年末的贷款偿还余额
- Payment=CaCuPayment(Residual_Principal,WAM-j,WAC_Rate);
- //计算偿还本金
- SchedualPrincipal=Payment-Residual_Principal*WAC_Rate;
- if(Residual_Principal>SchedualPrincipal)
- {
- CPR_Rate=CaCuCPR(WAC_Rate,RefinancingRate);
- ExpectedPrePrincipal=CPR_Rate*(Residual_Principal-SchedualPrincipal);
- if (j<=WAM-2)
- {
- CashFlow[j]=(Interest+SchedualPrincipal+ExpectedPrePrincipal);
- } else
- {
- CashFlow[j]=(Interest+Residual_Principal);
- }
- }
- }
- MBS_Vector[i]=CaCuMBS(CashFlow,DiscountRate_Vector);
- }
- MBS_Value=MEAN(MBS_Vector);
- MBS_STD=STD(MBS_Vector);
- cout<<"蒙特卡罗模拟的次数为"<<MC_Times<<endl;
- cout<<"MBS的本金为:"<<Principal<<"元"<<endl;
- cout<<"MBS的价值为:"<<MBS_Value<<"元"<<endl;
- cout<<"基于蒙特卡罗模拟的MBS价值标准差"<<MBS_STD<<endl;
- cout<<endl;
- }
复制代码 最后是调试:
“Main.cpp”
- #include "MBS.h"
- int main()
- {
- int WAM=10;
- //期权调整价差
- double OAS=0.02;
- //MBS面值
- double Principal=100000;
- //蒙特卡罗模拟的次数
- int MC_Times1=10;
- int MC_Times2=100;
- int MC_Times3=1000;
- int MC_Times4=10000;
- //初始的一年期即期收益率
- double InitialSpotRate=0.06;
- //初始的再融资收益率
- double InitialRefinancingRate=0.08;
- //利息支付利率或者转付率
- double PT_Rate=0.075;
- //加权平均票面利率
- double WAC_Rate=0.08;
- MBS MBS1(OAS,Principal,WAM,MC_Times1,InitialSpotRate,InitialRefinancingRate,PT_Rate,WAC_Rate);
- MBS MBS2(OAS,Principal,WAM,MC_Times2,InitialSpotRate,InitialRefinancingRate,PT_Rate,WAC_Rate);
- MBS MBS3(OAS,Principal,WAM,MC_Times3,InitialSpotRate,InitialRefinancingRate,PT_Rate,WAC_Rate);
- MBS MBS4(OAS,Principal,WAM,MC_Times4,InitialSpotRate,InitialRefinancingRate,PT_Rate,WAC_Rate);
- MBS1.CaCuMBSPricing();
- MBS2.CaCuMBSPricing();
- MBS3.CaCuMBSPricing();
- MBS4.CaCuMBSPricing();
- return 0;
- }
复制代码 蒙特卡罗模拟效果如下:
所有源码:
[/hide]
|