主要内容

基于两因素Hull White模型和LIBOR市场模型的提前支付模型

这个例子说明了如何在MATLAB®使用从金融工具的工具箱™功能模型预付款。具体来说,理查德和辊预付费模式的变化是使用双因素赫尔 - 怀特利率模型和LIBOR市场模型来模拟未来的利率路径实现的。A住房贷款抵押支持证券的定价与自定义和默认提前还款模型两者。

介绍

提前支付模型是抵押贷款支持证券(MBS)分析的关键。个人抵押贷款持有人的提前支付会影响现金流的数量和时间——对于抵押贷款担保债券(例如,有息证券),提前支付会极大地影响证券的价值。

PSA模型

最基本的预付款模型是公众证券协会(PSA)模型,其中假定斜坡上升相,然后以恒定的条件预付率(CPR)。可以在MATLAB使用金融工具工具箱功能来生成PSA模型psaspeed2rate

G2PP_CPR = psaspeed2rate([100 200]);图绘制(G2PP_CPR)标题(“100和200 PSA预付速度”)包含(“月”) ylabel (“心肺复苏”) ylim([0 .14]) legend({100 PSA200 PSA},“位置”“最佳”

抵押贷款支持证券

本例中分析的住房抵押贷款支持证券将于2020年到期,并具有本节概述的属性。只需输入PSA速度作为输入参数,就可以为PSA提前支付速度生成现金流。

要定价的MBS直通参数解决= datenum (的15 - 12月- 2007);成熟= datenum (的15 - 12月- 2020);IssueDate = datenum (的15 - 12月- 2000);GrossRate = .0475;CouponRate = .045;延迟= 14;时间= 12;基础= 4;使用100 PSA为基准情况生成现金流量和日期[cflowands, CFlowDates] = mbscfamounts(结算,到期,发行日期,...GrossRate CouponRate,延迟,100);CFlowDates CFlowTimes = yearfrac(解决);NumCouponsRemaining = cpncount(结算,到期,期限,基础,1,发行日期);

理查德和罗尔模型

虽然预付款造型往往涉及复杂的和先进的建模,通常在贷款层面,本例中使用基于文献[6]理查德和轧辊提出的模型稍微修改的方法。

理查德和轧辊预付费模式包括以下因素:

  • 再融资激励

  • 季节性(一年中的月份)

  • 节日或抵押的年龄

  • 倦怠

Richard和Roll提出了一个乘法模型:

$$ CPR = RefiIncentive*SeasoningMultiplier*
季节性乘数*BurnoutMultiplier $$

对于本例中的自定义模型,倦怠的乘数,它描述了当大量房主已经进行再融资时,提前还款会放缓的趋势,被忽略了,使用了前三个术语。

再融资动机是抵押给现有抵押贷款利率的息票率的在特定时间点的比率的函数。例如,储蓄机构监理局(OTS)提出了以下模型:

$ $再融资= .2406 -.1389 *反正切(5.952 *(1.089 - \压裂{CouponRate} {MortgageRate})) & # xA; $ $

再融资激励需要对未来利率进行模拟。这将在本示例的后面讨论。

C_M =。1:.1:2;g2pp_rei = .2406 - .1389 * atan(5.952*(1.089 - C_M));图绘制(C_M G2PP_Refi)包含(的优惠券/抵押贷款利率) ylabel (“心肺复苏”)标题(“再融资动机”

调味是指在抵押贷款开始时提前支付的趋势,在趋于平稳之前逐渐增加。OTS对调味乘数的模型如下:

调味=酮(360,1);调味料(1:29)=(1:29)/ 30;图图(调味料)XLIM([1 360])标题(“调味乘数”)包含(“月”

季节性乘数简单地模拟了提前支付的季节性行为——该数据是基于[6]的图3,[6]适用于Ginnie Mae的30年期单户抵押贷款支持证券的行为。

季节性= [0.94 0.76 0.73 0.96 0.98 0.92 0.99 1.1 1.18 1.21 1.23 0.97];图图(季节性)XLIM([112])AX = GCA;ax.XTick = 1:12;ax.XTickLabel = {“1月”2月的“三月”“四月”“可能”“君”“7”“8月”...“9”“十月”11月的12月的};标题(“季节性乘数”

G2 ++利率模型

由于再融资激励需要对未来利率进行模拟,因此必须使用利率模型。一种选择是双因素加性高斯模型,被Brigo和Mercurio[2]称为G2++。

G2++利率模型为:

$ r(t) = x(t) + y(t) + var (t) $

$ dx(t) = -ax(t) dt + dW_1(t) $

$$ DY(T)= -by(T)dt的+ \ ETA dW_2(t)的$$

在哪里$ $ dW_1 (t) dW_2 (t) $ $二维布朗运动有关联吗$ $ \ρ$ $

$ dW_1(t)dW_2(t) = rho dt $

$ $ \ varphi (T) = f M ^ (0, T) + \压裂{\σ^ 2}{2 ^ 2}(1 - e ^{——})^ 2 + & # xA; \压裂{\埃塔^ 2}{2 b ^ 2} (1 - e ^ {bt}) ^ 2 + \ρ\压裂{\σ\埃塔}{ab} & # xA; (1 - e ^{——})(1 - e ^ {bt}) $ $

$ $ $ $ r (t)是短期汇率,$ $ $ $$ $ $ $均值回归常数和$ $ \σ$ $$ $ \埃塔$ $波动性是常数吗$ $ f M (0, T) $ $ ^为市场远期汇率,或结算日观察到的远期汇率。

伦敦银行间拆放款利率市场模式

LIBOR市场模型(LMM)与短期利率模型的不同之处在于,它演化出一组离散的远期利率。具体来说,对数正态LMM为每个正向速率指定如下扩散方程:

$ $ \压裂{dF_i (t)} {F_i} = - \ mu_i dt + \ sigma_i (t) dW_i $ $

在哪里

dW是一个N空间几何布朗运动:

$ dW_i(t) dW_j(t) = r_ {ij} dt $

LMM将基于无套利参数的远期汇率的漂移联系起来。具体而言,在即期伦敦银行同业拆借利率(LIBOR)测度下,偏差表示如下:

$ $ \ mu_i (t) = - \ sigma_i (t) \ sum_ {j = q (t)} ^我{\压裂{\ tau_j \ rho_ {i, j} \ sigma_j (t) F_j (t)} {1 + \ tau_j F_j (t)}} $ $

在哪里

$ $ \ tau_i $ $时间分数是否与第i次forward速率相关

$$ q(t) $$是由$$ T_{q(t)-1} < t
< T_{q(t)} $$关系定义的索引函数

即期LIBOR的定义如下:

$ $ B (t) = P (t) T_{问(t)})识别\ prod_ {n = 0} ^ {q (t) 1} (1 + \ tau_n fn (T_n)) $ $

鉴于上述情况,与LMM的选择是如何模型波动性和相关性。

比率的波动率可以用随机波动率建模,但是对于本例,使用了确定性波动率,因此需要指定函数形式。以下是文献中最常见的功能形式:

$ $ \ sigma_i (t) = \ phi_i (a (T_i - t) + b) e ^ {c (T_i-t)} + d $ $

在哪里$ $ $ $ \φ调整曲线以匹配波动率我$ $ ^ {th} $ $远期利率。

类似地,需要指定远期汇率之间的相关性。这可以从历史数据中估计或拟合到期权价格。对于本例,将使用以下函数形式:

$ r_ {i,j} = e^{- |i-j|} $

一旦确定了波动性和相关性,就需要对参数进行校准——这可以通过历史或市场数据来完成,通常是互换或上限/下限。对于本例,我们简单地使用了相关性和波动性参数的合理估计。

要使用的波动率函数——参数的一个选择LMMVolFunc = @(A,T)(A(1)* T + A(2))* EXP(-a(3)* T)+ A(4)。LMMVolParams = [0.13 0.04 0.7 0.08];%波动规范fplot(@(t) LMMVolFunc(LMMVolParams,t),[0 10]) title([“带有参数的波动函数”mat2str (LMMVolParams)]) ylabel (的波动率(%))包含(“男高音(年)”

校正市场数据

G2++模型中的参数可以根据市场数据进行校准。通常,这些参数是根据观察到的利率上限、下限和/或互换数据进行校准的。目前,我们使用市值数据进行校准。

这个数据是硬编码,但可以导入到MATLAB与数据库工具箱™或数据传送专线工具箱™。

% 0曲线——该数据目前是硬编码的,但可以引导%使用| irdataccurve |的|bootstrap|方法。ZeroTimes = [3/12 6/12 1 5 7 10 20 30]';ZeroRates = [0.033 0.034 0.035 0.040 0.042 0.044 0.048 0.0475]';ZeroDates = daysadd(结算360 * ZeroTimes 1);DiscountRates = zero2disc (ZeroRates ZeroDates,解决);irdc = IRDataCurve ('零'、结算、ZeroDates ZeroRates);数字图(zeroates,ZeroRates)日期标记标题([“美国的零曲线”datestr(解决)))%帽数据重置= 2;名义= 100;CapMaturity = daysadd(结算,360*[1:5 7 10 15 20 25 30],1);CapVolatility =[。28 .30 .32 .31 .30 .27 .23 .18 .17 .165]';% ATM罢工可以用swapby0计算罢工= [0.0353 0.0366 0.0378 0.0390 0.0402 0.0421 0.0439 ....';%这可以用capbyblk计算BlackCapPrices = [0.1532 0.6416 1.3366 2.0290 2.7366 4.2960 6.5992 ....';图分散(CapMaturity,CapVolatility)日期标记标题([“ATM波动对帽”datestr(解决)))

为了校准模型参数,将找到一个参数集,使G2++预测的Cap值与观测的Black Cap值之间的平方和最小。优化工具箱™功能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 BlackCapPrices)散射(CapMaturity capbylg2f (irdc, a, b,σ,埃塔(ρ,罢工,CapMaturity),'RX') datetick标题(“市场及模型隐含价格”) ylabel (的价格($)
局部最小值。Lsqnonlin停止的原因是相对于初始值的平方和的最终变化小于函数的容差值。

G2 + +模型实现

LinearGaussian2F模型可用于指定G2++模型,并模拟未来利率路径。

% G2++模型来自Brigo和Mercurio的时间均质波动%的参数G2PP = LinearGaussian2F (irdc, a, b,σ,η,ρ);

LIBOR市场模型实施

在对波动率和相关性进行校准后,利用蒙特卡洛模拟在时间上向前演化速率。的LiborMarketModel对象用于模拟转发速率。

虽然LMM经常使用因子减少来降低计算复杂度,但在本例中没有因子减少。

6M LIBOR利率都选择在这个模拟中演变而来的。由于每月预付款矢量必须计算,插值被用于产生所述中间速率。简单的线性插值被使用。

numForwardRates = 46;VolPhi不是健康的,而是简单的硬编码——%代表波动性随时间而下降。VolPhi = linspace (1.2, 8, numForwardRates-1)”;β=。08;CorrFunc = @(i,j,Beta) exp(-Beta*abs(i-j));CorrMat = CorrFunc (meshgrid (1: numForwardRates-1)”,meshgrid (1: numForwardRates-1),β);VolFunc =细胞(长度(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);

G2++蒙特卡罗模拟

不同的利率路径可以通过调用simTermStructs方法。

像这样的双因素高斯模型的一个限制是它允许负利率。这是一个令人担忧的问题,尤其是在低利率环境下。为了应对这种可能性,任何负利率的利率路径都被拒绝。

nPeriods = NumCouponsRemaining;nTrials = 100;DeltaTime = 1/12;%产生因素和短期利率男高音= [1/12 1 2 3 4 5 7 10 15 20 30];G2PP_SimZeroRates = G2PP.simTermStructs(nPeriods,“NTRIALS”,nTrials,...“男高音”男高音歌唱家,“DeltaTime”, DeltaTime);SimDates = daysadd(结算360 * DeltaTime * (0: nPeriods), 1);%将为每个模拟日期恢复的期限。stepsize是%包括在这里,以方便计算每个折扣因素%模拟路径。%删除所有为负的路径NegIdx = squeeze(any(any(any(G2PP_SimZeroRates < 0,1),2)));G2PP_SimZeroRates (:,:, NegIdx) = [];nTrials =大小(G2PP_SimZeroRates, 3);%绘制一个样本路径的演化图trialIdx = 1;图冲浪(男高音、SimDates G2PP_SimZeroRates (:,:, trialIdx)) datetickykeeptickskeeplimits标题([“试验零曲线的演变”num2str (trialIdx)“G2++模式”])包含(“男高音(年)”

LIBOR市场模型模拟

不同的利率路径可以通过调用simTermStructs的方法LiborMarketModel对象。

LMMPeriod = 2;%半年度利率LMMNumPeriods = NumCouponsRemaining / 12 * LMMPeriod;%半年度周期数LMMDeltaTime = 1 / LMMPeriod;LMMNTRIALS = 100;%模拟[LMMZeroRates, LMMForwardRates] = LMM.simTermStructs(LMMNumPeriods,“nTrials”LMMNTRIALS,“DeltaTime”,LMMDeltaTime);ForwardTimes = 1/2:1/2:numForwardRates / 2;LMMSimTimes = 0:1 / LMMPeriod:LMMNumPeriods / LMMPeriod;%绘制一个样本路径的演化图trialIdx = 1;图tmpPlotData = LMMZeroRates(:,:,trialIdx);tmpPlotData(tmpPlotData == 0) = NaN;冲浪(ForwardTimes LMMSimTimes tmpPlotData)标题([“试验零曲线的演变”num2str (trialIdx)LIBOR市场模型])包含(“男高音(年)”

从模拟计算抵押贷款利率

一旦模拟了利率路径,就需要计算抵押贷款利率——[7]讨论了一种方法,即结合2年期和10年期利率计算抵押贷款利率。

对于此示例,以下是用于:

$$ MortgageRate = 0.024 + 0.2 *两年利率+ 0.6 *十年利率$$

%从利率路径计算抵押贷款利率TwoYearRates = squeeze(G2PP_SimZeroRates(:,Tenor == 2,:));TenYearRates = squeeze(G2PP_SimZeroRates(:,Tenor == 7,:));G2PP_MortgageRates = 0.024 + 0.2 *两年利率+ 0.6 *十年利率;(LMMMortgageRates =紧缩。024 + .2*LMMZeroRates(:,4,:) + .6*LMMZeroRates(:,20,:)); LMMDiscountFactors = squeeze(cumprod(1./(1 + LMMZeroRates(:,1,:)*.5)));%插值得到每月的抵押贷款利率MonthlySimTimes = 0:1/12:LMMNumPeriods / LMMPeriod;LMMMonthlyMortgageRates =零(nPeriods + 1,LMMNTRIALS);LMMMonthlyDF =零(nPeriods + 1,LMMNTRIALS);LMMSimTimes,LMMMortgageRates(:,trialidx) = interp1(LMMSimTimes,LMMMortgageRates(:,trialidx),“线性”“extrap”);LMMMonthlyDF (:, trialidx) = interp1 (LMMSimTimes, LMMDiscountFactors (:, trialidx) MonthlySimTimes,“线性”“extrap”);结束

计算CPR,生成和评估现金流

一旦模拟了抵押贷款利率,就可以从每个利率路径的乘法模型中计算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));%心肺复苏率可通过乘法模型简单计算G2PP_CPR = bsxfun(@倍,G2PP_Refi,调味料*(季节性(月(CFlowDates))')。);LMM_CPR = bsxfun(@倍,LMM_Refi,调味料*(季节性(月(CFlowDates))')。);%计算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 =情节(G2PP_CPR,“b”);LMM_handle =情节(LMM_CPR,‘g’);标题(“提前还款的速度”) legend([PSA_handle(1) G2PP_handle(1) LMM_handle(1)],{100 PSA“G2PP心肺复苏”“LMM心肺复苏”},“位置”“最佳”);

产生现金流量和计算现值

通过计算每个利率路径的单个月死亡率(SMM)向量,可以计算和折现MBS的现金流。

计算每个现金流时间的基准零利率CFlowZero = interp1 (ZeroTimes ZeroRates CFlowTimes,“线性”“extrap”);计算每个现金流时间的DFCFlowDF_Zero = zero2disc (CFlowZero CFlowDates,解决);%使用零曲线计算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)));%每个MBS的现金流现值G2PP_Price_Ind =总和(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,:));%每个MBS的现金流现值LMM_Price_Ind =总和(LMM_CFlowAmounts * LMMMonthlyDF”,2);LMM_Price =平均值(LMM_Price_Ind);

不同方法的结果可以进行比较。G2++模型的试验次数通常少于100次,因为它过滤掉了任何产生负利率的路径。

此外,虽然本例中G2++模型的试验次数被设置为100次,但通常情况下,需要运行更多的模拟来产生准确的估值。

流(蒙特卡洛审判:%8d\n'nTrials)流(' # of Time Periods/Trial: %8d\n\n'nPeriods)流(' MBS价格与PSA 100: %8.4f\n'Price_Zero)流(' MBS价格与自定义G2PP预付模式:%8.4f\n\n',G2PP_Price)fprintf中(自定义LMM预付模型的MBS价格:%8.4f\n\n'LMM_Price)
蒙特卡洛试验#:72#时间段/试验:156个MBS价格与PSA 100:1.0187 MBS价格与定制G2PP预付款型号:0.9884 MBS价格与定制LMM预付款型号:0.9993

结论

这个例子显示如何校准和模拟G2 ++利率模型,以及如何使用松散的基础上,理查德和滚动模式为预付费模式产生的利率路径。这个例子还提供了一个有用的起点使用G2 ++和LMM利率模型等金融领域。

参考书目

这个例子是基于以下书籍、论文和期刊文章:

  1. 安德森,L和V. Piterbarg(2010)。利率建模,大西洋金融出版社。

  2. Brigo, D.和F. Mercurio(2001)。利率模型——微笑的理论与实践,通货膨胀与信贷(2006年第2版)。施普林格-。ISBN 978-3-540-22149-4。

  3. 《所罗门美邦抵押贷款支持证券和资产支持证券指南》。纽约:John Wiley & Sons, 2001b

  4. Karpishpan, Y., O. Turel,和A. Hasha,引入花旗LMM抵押贷款期限结构模型,《固定收益杂志》,第20卷(2010)44-58。

  5. Rebonato, R., K. McKay, and R. White(2010)。Sabr/Libor市场模型:复杂利率衍生品的定价、校准和对冲。约翰·威利父子公司。

  6. Richard, S. F.和R. Roll, 1989,“固定利率抵押贷款支持证券的提前支付”,《投资组合管理杂志》。

  7. 储蓄管理局,《净投资组合价值模型手册》,2000年3月。

  8. 斯坦因,H. J.,Belikoff,A. L.,李文,K和田玉,X.,抵押贷款支持证券的分析:之前和之后的信贷危机(2007年1月5日)。信用风险前沿:次贷危机,定价和套期保值策略,CVA,MBS,评级和流动性;别莱茨基,托马斯,;达米亚诺·布里戈和弗雷德里克·帕特拉斯,编,2011年可用2月在SSRN:https://papers.ssrn.com/sol3/papers.cfm?abstract_id=955358

另请参阅

|||||||||||||||||

相关的例子

更多关于