此示例显示如何使用金融仪器工具箱™的功能模拟Matlab®。具体地,利用两个因子船体 - 白兴趣模型和Libor市场模型来实现理查德和卷预付费模型的变化,以模拟未来的利率路径。抵押贷款支持的安全性是定制和默认预付款模型的定价。
预付款建模对抵押贷款支持证券(MBS)的分析至关重要。个人抵押贷款人的预付款会影响现金流量的金额和时间 - 以及对抵押抵押义务(例如,仅利息证券),预付款可以影响证券的价值。
最基本的预付款模型是公共证券协会(PSA)模型,其假设增速相位,然后是恒定的条件预付款率(CPR)。PSA模型可以使用金融仪器工具箱功能在Matlab中生成PsaSpeed2rate.
.
G2PP_CPR = psaspeed2rate([100 200]);图绘制(G2PP_CPR)标题(“100和200 PSA预付速度”)包含(“月”) ylabel (“心肺复苏”)ylim([0 .14])传奇({“100 PSA”,'200 psa'},“位置”,“最好的”)
本例中分析的抵押贷款证券于2020年到期,并具有本节所述的性质。只需输入PSA速度作为输入参数,即可为PSA预付款速度生成现金流。
要定价的MBS直通参数settr = datenum('15 -dec-2007');到期日=datenum('15 -dec-2020');发行=数据项('15 -dec-2000');grossrate = .0475;佣金= .045;延迟= 14;期间= 12;基础= 4;使用100 PSA为基准情况生成现金流量和日期[CFlowAmounts,CFlowDates]=mbscfamounts(结算、到期、发行日期、,...GrossRate,耦合率,延迟,100);CFlowTimes=年分数(结算,CFlowTimes);NUMCOUPPONSRAING=CPN账户(结算、到期、期限、基础、1、发行日期);
虽然预付款建模往往涉及复杂和复杂的建模,但通常在贷款级别,此示例使用基于理查德和滚动中提出的模型的略微修改的方法。
理查德和卷预付款模型涉及以下因素:
再融资激励
季节性(一年中的月份)
调味或抵押贷款年龄
燃尽
理查德和劳斯提出了一种乘法模型:
对于本示例中的自定义模型,倦怠乘法器,它描述了预付款速度慢,当大量的房主已经改进时,被忽略,并且使用前三个术语。
再融资激励是抵押贷款优惠券与可用抵押贷款率在该特定时间点的可用抵押贷款比率的函数。例如,节俭监督办公室(OTS)提出了以下型号:
再融资激励需要对未来利率进行模拟。这将在本示例的后面讨论。
c_m = .1:.1:2;g2pp_refi = .2406 - .1389 * atan(5.952 *(1.089 - c_m));图绘制(C_M,G2PP_REFI)XLABEL('优惠券/按揭率') ylabel (“心肺复苏”) 标题('再融资激励')
调味是指在抵押贷款开始时提前支付的趋势,在趋于平稳之前逐渐增加。OTS对调味乘数的模型如下:
调味料=(360,1);调味料(1:29)=(1:29)/ 30;图绘图(调味料)XLIM([1 360])标题(“调味乘数”)包含(“月”)
季节性乘法器简单模型预付款的季节性行为 - 这数据是根据图3中[6],它适用于吉利美30年,单户的MBS的行为。
季节性= [.94 .76 .73 .96 .98 .92 .99 1.1 1.18 1.21 1.23 .97];图绘图(季节性)XLIM([1 12])AX = GCA;ax.xtick = 1:12;ax.xticklabel = {'1月','2月','mar','APR',“可能”,'君','七月','八月',...“9”,'OCT','11月','Dec'};头衔('季节性乘数')
由于再融资激励需要模拟未来利率,因此必须使用利率模型。一个选择是一个双因素添加剂高斯模型,由Brigo和Mercurio称为G2 ++ [2]。
G2++利率模型为:
在哪里二维布朗运动有关联吗
和是短率,和是平均回复常数和和波动性是常数吗是市场前瞻性率,或在结算日期中观察到的前瞻性率。
LIBOR市场模型(LMM)与短期利率模型的不同之处在于,它演化出一组离散的远期利率。具体来说,对数正态LMM为每个正向速率指定如下扩散方程:
在哪里
dW是一个N尺寸几何布朗运动:
LMM基于无套利论据关联远期利率的漂移。具体而言,在即期伦敦银行同业拆借利率(LIBOR)措施下,漂移表示如下:
在哪里
是与前进率相关的时间分数
即期LIBOR的定义如下:
鉴于上述情况,LMM的选择是如何模拟波动性和相关性。
速率的挥发性可以用随机挥发性建模,但对于该示例,使用确定性挥发性,因此需要指定功能形式。文献中最受欢迎的功能形式之一是以下内容:
在哪里调整曲线以匹配波动率前瞻性率。
类似地,需要指定前向速率之间的相关性。这可以从历史数据估算或适用于期权价格。对于此示例,将使用以下功能形式:
一旦指定了波动性和相关性,需要校准参数 - 这可以用历史或市场数据,通常是睡眠或帽/地板完成的。对于此示例,我们只需使用合理的估计来进行相关性和波动性参数。
%使用的波动率函数 - 以及参数的一个选择lmmvolfunc = @(a,t)(a(1)* t + a(2))。* exp(-a(3)* t)+ a(4);lmmvolparams = [.13 .04 .7 .08];%挥发性规范fplot(@(t) LMMVolFunc(LMMVolParams,t),[0 10]) title([“具有参数的波动函数”mat2str(LMMVolParams)]ylabel('挥发率(%)')包含(‘年期’)
G2++模型中的参数可以根据市场数据进行校准。通常,这些参数根据观察到的利率上限、下限和/或互换期权数据进行校准。目前,市场上限数据用于校准。
该数据是硬件,但可以使用Database Toolbox™或DataFeed Toolbox™导入MATLAB。
% 0曲线——该数据目前是硬编码的,但可以引导%使用|引导|方法的方法|。Zerotimes = [3/12 6/12 1 5 7 10 20 30]''Zerorates = [0.033 0.034 0.035 0.042 0.044 0.048 0.047''Zerodates = StaysAdd(定居,360 * Zerotimes,1);discountrates = Zero2disc(Zerorates,Zerodates,sold);IRDC = Irdatacurve('零',结算,ZeroDates,ZeroRates);图形绘图(ZeroDates,ZeroRates)日期勾选标题(['美国零曲线'DATSTR(定居)])%帽数据重置=2;名义=100;资本到期日=Daysad(结算,360*[1:5710152530],1);资本波动率=[28.30.32.31.30.27.23.2.18.17.165];可以使用swapbyzero计算%ATM罢工罢工= [0.0353 0.0366 0.0378 0.0390 0.0402 0.0421 0.0439...0.0456 0.0471 0.0471 0.0471]';%这可以用capbyblk计算BlackCapPrices = [0.1532 0.6416 1.3366 2.0290 2.7366 4.2960 6.5992 ....9.6787 12.2580 14.0969 15.7873]'图分散(CapMaturity,Capvolatility)DateTick标题(['帽子的ATM波动'DATSTR(定居)])
为了校准模型参数,将找到参数集,从而最小化G2 ++预测帽值与观察到的黑帽值之间的平方差的总和。优化工具箱™功能lsqnonlin
,尽管其他方法(例如全局优化)也可能适用。这个函数capbylg2f
计算给定参数值caps的解析值。
模型参数的上限和下限设置为相对受限。正如Brigo和Mercurio所讨论的,相关参数,,可以经常接近-1
当G2++模型拟合利率上限价格时。因此,被限制在-.7
和.7
确保参数表示真正的双因子模型。剩余的平均逆转和波动性参数被约束为之间0
和.5
.校准仍然是一个复杂的任务,而下面的剧情表明,最佳的拟合参数似乎做出了再现盖帽价格的合理工作,但应该指出的是这里概述的程序简单地代表一种方法。
%呼叫LSQNONLIN以校准参数objfun = @(x) BlackCapPrices - capbylg2f(irdc,x(1),x(2),x(3),x(4),x(5),Strike,CapMaturity);x0 =[。5.05 .1 .01 - 1];Lb = [0 0 0 0 -.7];乌兰巴托=[。5 .5 .5 .7];G2PP_Params = lsqnonlin (x0, objfun磅,乌兰巴托);一个= G2PP_Params (1);b = G2PP_Params (2);σ= G2PP_Params (3); eta = G2PP_Params(4); rho = G2PP_Params(5);%比较结果数字分散(卡普到期日、黑卡普价格)持有在散射(CapMaturity capbylg2f (irdc, a, b,σ,埃塔(ρ,罢工,CapMaturity),'rx')DateTick标题('市场和模型隐含价格') ylabel (的价格($))
局部最小值。Lsqnonlin停止的原因是相对于初始值的平方和的最终变化小于函数的容差值。
这个LinearGaussian2F
模型可用于指定G2 ++模型,并模拟未来的路径利率。
来自Brigo和Mercurio的%G2 ++模型随着时间的均匀波动性%参数g2pp = lineargaussian2f(IRDC,A,B,Sigma,ETA,Rho);
在对波动率和相关性进行校准后,采用蒙特卡罗模拟方法对利率进行时间向前演化LiborMarketModel
对象用于模拟转发速率。
虽然因子缩减通常用于LMM以降低计算复杂度,但在本例中并没有因子缩减。
选择6M Libor率在该模拟中进化。由于必须计算每月预付费矢量,因此使用插值用于生成中间速率。使用简单的线性插值。
numforwardrates = 46;VolPhi不是健康的,而是简单的硬编码——%代表随着时间的推移而波动下降。volphi = linspace(1.2,.8,numforwardrates-1)';Beta = .08;corrfunc = @(i,j,beta)exp(-beta * abs(i-j));corrmat = corrfunc(meshgrid(1:numforwardrates-1)',meshgrid(1:numforwardrates-1),beta);volfunc = cell(长度(volphi),1);对于jdx = 1:length(VolPhi) VolFunc(jdx) = {@(t) VolPhi(jdx)*ones(size(t)).*(LMMVolParams(1)*t + ....LMMVolParams(2))。* exp (-LMMVolParams (3) * t) + LMMVolParams (4)};结束LMM = LiborMarketModel (irdc VolFunc CorrMat);
通过调用来模拟各种兴趣路径simtermstructs.
方法。
像这样的双因素高斯模型的一个限制是它允许负利率。这是一个令人担忧的问题,尤其是在低利率环境下。为了应对这种可能性,任何负利率的利率路径都被拒绝。
nperiods = numcourousRemaining;ntrials = 100;deltatime = 1/12;%生成因子和短率tenor = [1/12 1 2 3 4 5 7 10 15 20 30];g2pp_simzerorates = g2pp.simtermstructs(nperiods,“NTRIALS”,ntrials,...“男高音”男高音'deltatime',倾角长);simdates = daysadd(定居,360 * deltatime *(0:nperiods),1);%将为每个模拟日期恢复的期限。步长为%包括在这里,以便于计算每个项目的折扣系数%模拟路径。%删除所有为负的路径NegIdx=挤压(any(any(G2PP_SimZeroRates<0,1,2));G2PP_SimZeroRates(:,:,NegIdx)=[];nTrials=大小(G2PP_SimZeroRates,3);一个样本路径的%图演变trialIdx=1;数字冲浪(期限、SimDates、G2PP_SimZeroRates(:,:,trialIdx))日期勾选Y守克克利弗里维标题(['试验零曲线的演变:'num2str(timatiDX)“G2++模型的特性”])Xlabel('男高音(年)')
通过调用来模拟各种兴趣路径simtermstructs.
方法的方法LiborMarketModel
对象。
lmmperiod = 2;%半年费率lmmnumperiods = num couroundesremaining / 12 * lmmperiod;半年期间数量lmmdeltatime = 1 / lmmperiod;lmmntrials = 100;%模拟[lmmzerates,lmmforwardrates] = lmm.simtermstructs(lmmnumperiods,“nTrials”LMMNTRIALS,'deltatime',lmmdeltaTime);forwardtimes = 1/2:1/2:numforwardrates / 2;lmmsimtimes = 0:1 / Lmmperiod:lmmnumperiods / lmmperiod;一个样本路径的%图演变TAILIDX = 1;图tmpplotdata = lmmzerates(:,:,timidx);tmpplotdata(tmpplotdata == 0)= nan;冲浪(Forwardtims,LMMSImtimes,TMPPLOTDATA)标题(['试验零曲线的演变:'num2str(timatiDX)“伦敦银行同业拆借利率市场模型的应用”])Xlabel('男高音(年)')
一旦模拟了利率路径,就需要计算抵押贷款利率——[7]讨论了一种方法,即结合2年期和10年期利率计算抵押贷款利率。
对于此示例,使用以下以下操作:
%计算利率路径的抵押贷款利率Twoyearrates =挤压(G2PP_Simberorates(:,tenor == 2,:));tenyearrates =挤压(g2pp_simberorates(:,tenor == 7,:));g2pp_mortgagerates = .024 + .2 * Twoyearrates + .6 * Tenyearrates;lmmmmorgagerates =挤压(.024 + .2 * lmmzerates(:,4,:) + .6 * lmmerorates(:,20,:));lmmdiscountfactors =挤压(Cumprod(1 ./(1 + lmmerates(:,1,:) *。5)))));%插值以获得每月抵押贷款利率每月一次= 0:1/12:lmmnumperiods / lmmperiod;lmmmonthlymortgagerates = zeros(nperiods + 1,lmmntrials);lmmmonthlydf = zeros(nperiods + 1,lmmntrial);对于trialidx=1:lmmN试验lmmMonthlyMortgages(:,trialidx)=interp1(lmmSmimTimes,lmmMortgages(:,trialidx),月时,“线性”,“extrap”); LmmonthlyDF(:,trialidx)=interp1(LMMSimTimes,LMMDisConsultFactors(:,trialidx),月时间,“线性”,“extrap”);结束
一旦模拟抵押贷款率,CPR可以从每个兴趣路径的乘法模型计算。
计算调味和再融资乘数调味料的= (nPeriods + 1, - 1);调味料(1:30)= 1/30 * (1:30);g2pp_rei = .2406 - .1389 * atan(5.952*(1.089 - CouponRate./G2PP_MortgageRates));lmm_rei = .2406 - .1389 * atan(5.952*(1.089 - CouponRate./ lmmmonthmortgagerates));%CPR通过计算乘法模型来简单计算g2pp_cpr = bsxfun(@ times,g2pp_refi,调味料。*(季节性(季节性)(clowddates))'));lmm_cpr = bsxfun(@ times,lmm_refi,调味料。*(季节性(季节性)(月(clowddates))'));%根据CPR计算单月死亡率(SMM)G2pp_smm = 1 - (1 - g2pp_cpr).^(1/12);= 1 - (1 - lmm_cpr).^(1/12);绘制CPR与100 PSA的对比图CPR_PSA100 = PSASPEED2RATE(100);图psa_handle = plot(cpr_psa100(1:nperiods),'rx');抓住在g2pp_handle = plot(g2pp_cpr,“b”);LMM_handle=绘图(LMM_CPR,'G');标题('预付款速度') legend([PSA_handle(1) G2PP_handle(1) LMM_handle(1)],{“100 PSA”,'G2PP CPR','lmm cpr'},“位置”,“最好的”);
通过为每个利率路径计算单月死亡率向量(SMM),可以计算并贴现MBS的现金流。
%计算每个现金流时间的基准零利率cflowzero = Interp1(Zerotimes,Zerorates,CFlowtimes,“线性”,“extrap”);计算每个现金流时间的DFcflowdf_zero = zero2disc(cflowzero,cflowdates,setten);%使用零曲线计算MBS的价格price_zero = cflowamounts * cflowdf_zero';%为每个IR路径产生现金流量g2pp_cflowamounts = mbscfamounts(定居,...repmat(Maturity,1,nTrials), IssueDate, GrossRate, CouponRate, Delay, [], G2PP_SMM(2:end,:));%计算每个IR路径的DFG2PP_CFlowDFSim = cumprod (exp(挤压(-G2PP_SimZeroRates(: 1:)。* DeltaTime)));%各抵押贷款证券的现金流现值g2pp_price_ind = sum(g2pp_cflowamounts。* g2pp_cflowdfsim',2);g2pp_price =均值(g2pp_price_ind);%重复LMMLMM_CFlowAmounts=mbscfamounts(结算,...repmat(Maturity,1,LMMNTRIALS), IssueDate, GrossRate, CouponRate, Delay, [], LMM_SMM(2:end,:));%各抵押贷款证券的现金流现值lmm_price_ind = sum(lmm_cflowamounts。* lmmmonthlydf',2);lmm_price =均值(lmm_price_ind);
不同方法的结果可以进行比较。G2++模型的试验次数通常少于100次,因为过滤掉了产生负利率的任何路径。
另外,虽然在该示例中的G2 ++模型的试验数量被设置为100,但是通常需要运行更多数量的模拟来产生准确的估值。
fprintf('蒙特卡罗试验:%8d \ n',ntrials)fprintf('时间段/试验:%8d \ n \ n',nperiods)fprintf('MBS价格与PSA 100:%8.4F \ n',price_zero)fprintf('MBS价格与自定义G2PP预付款型号:%8.4F \ n \ n',g2pp_price)fprintf(自定义LMM预付模型的MBS价格:%8.4f\n\n'LMM_Price)
Monte Carlo试验:72个时间段/试验:156 MBS价格与PSA 100:1.0187 MBS价格与定制G2PP预付款型号:0.9884 MBS价格与定制LMM预付款型号:0.9993
此示例显示如何校准和模拟G2 ++兴趣模型以及如何基于Richard和Roll模型松散地使用预付款模型中的生成的兴趣路径。此示例还提供了在其他财务应用中使用G2 ++和LMM兴趣模型的有用起点。
此示例基于以下书籍,论文和期刊文章:
安德森,L.和V. Piterbarg(2010年)。利率建模,大西洋金融新闻。
Brigo, D.和F. Mercurio(2001)。利率模型——微笑的理论与实践,通货膨胀与信贷(2006年第2版)。施普林格-。ISBN 978-3-540-22149-4。
《萨洛蒙·史密斯·巴尼抵押贷款支持证券和资产支持证券指南》。纽约:约翰·威利父子出版社,2001年b
Karpishpan, Y., O. Turel,和A. Hasha,引入花旗LMM抵押贷款期限结构模型,《固定收益杂志》,第20卷(2010)44-58。
Rebonato,R.,K.McKay和R.White(2010)。Sabr/Libor市场模型:复杂利率衍生品的定价、校准和套期保值。John Wiley&Sons。
Richard,S.F.和R.Roll,1989,“固定利率抵押贷款支持证券的预付款”,投资组合管理杂志。
节俭监督办公室,“净投资组合价值模型手册”,2000年3月。
斯坦坦,H. J.,Belikoff,A. L.,Levin,K.和Tian,X.,抵押贷款支持证券分析:信贷危机前后(2007年1月5日)。信用风险边界:次贷危机,定价和套期保值,CVA,MB,评级和流动性;Bielecki,Tomasz;Damiano Brigo和Frederic Patras,EDS。,2011年2月。在SSRN提供:https://papers.srn.com/sol3/papers.cfm?abstract_id=955358
MBSCFamounts.
|mbsconvp
|mbsconvy
|MBSDurp.
|MBSDURY.
|mbsnoprepay
|MBSOAS2PRICE.
|mbsoas2yield
|mbspassthrough
|MBSPRICE.
|mbsprice2oas
|mbsprice2速度
|MBSWAL.
|mbsyield.
|mbsyield2oas.
|MBSYIELD2速度
|psaspeed2default
|PsaSpeed2rate.