美国的过手抵押证券主要有吉利美(美国政府国民抵押贷款协会)担保的过手证券、房地美(美国联邦住宅贷款抵押公司FHLMC)的参政书、房利美(美国联邦国民抵押协会FNMA)的抵押支持债券,以及民间性质的抵押过手债券等。
Matlab代码如下:
本帖隐藏的内容
- 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
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
蒙特卡罗模拟效果如下:
C++的代码如下:
本帖隐藏的内容
首先构建一个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;
- }
所有源码:
MBS_Model(抵押支持债券).zip
(309.96 KB)



雷达卡





[lol][lol]

京公网安备 11010802022788号







