主要内容

利用模拟利率模型的价格互换

简介

这个例子展示了如何使用金融工具工具箱™中的利率模型为欧洲掉期定价。具体来说,赫尔-怀特单因素模型、线性高斯双因素模型和LIBOR市场模型被校准到市场数据,然后使用蒙特卡罗模拟生成利率路径。

下面几节设置数据,然后与示例一起使用<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/price-bermudan-swaptions-with-different-interest-rate-models.html" class="intrnllnk">使用Hull-White单因素模型模拟利率路径,<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/price-bermudan-swaptions-with-different-interest-rate-models.html" class="intrnllnk">用线性高斯双因素模型模拟利率路径,<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/price-bermudan-swaptions-with-different-interest-rate-models.html" class="intrnllnk">使用LIBOR市场模型模拟利率路径:

构造零曲线

这个例子展示了如何使用ZeroRates对于硬编码的零曲线。您还可以通过从市场数据(例如,存款、期货/远期和掉期)引导零曲线来创建零曲线。

零曲线的硬编码数据定义为:

Settle = datetime(2008,7,21);%零曲线CurveDates = daysadd(Settle,360*([1 3 5 7 10 20]),1);ZeroRates = [1.9 2.6 3.1 3.5 4 4.3]'/100;plot(CurveDates,ZeroRates)日期标记标题([的零曲线datestr(解决)]);

图中包含一个轴对象。标题为Zero Curve for july -2008的axes对象包含一个类型为line的对象。

构造一个<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/irdatacurve.html" data-docid="fininst_ug#btxewws-2143" class="a">IRDataCurve对象。

irdc = irdata曲线(“零”、结算、CurveDates ZeroRates);

创建RateSpec使用<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/intenvset.html" data-docid="fininst_ug#btxewv2-1122" class="a">intenvset

RateSpec = intenvset(“利率”ZeroRates,“EndDates”CurveDates,StartDate可以的,解决)
RateSpec =带字段的结构:FinObj: 'RateSpec'复合:2光盘:[6x1 double]利率:[6x1 double] EndTimes: [6x1 double] StartTimes: [6x1 double] EndDates: [6x1 double] StartDates: 733610估值日期:733610基础:0 EndMonthRule: 1

定义交换参数

虽然蒙特卡洛模拟通常用于对更复杂的衍生品(例如,百慕大掉期)进行估值,但在本例中,欧洲掉期的价格是以5年的行权日期和5年的标的掉期计算的。

InstrumentExerciseDate = datenum(2013年- 7月21日的);InstrumentMaturity = datenum(2018年- 7月21日的);InstrumentStrike = .045;

计算布莱克模型和互换波动矩阵

Black的模型经常被用于欧洲行权利率期权的定价和报价,即上限、下限和掉期。在互换的情况下,布莱克的模型被用来暗示给定当前观察到的市场价格的波动。下面的矩阵显示了一系列互换执行日期(列)和潜在互换期限(行)的布莱克隐含波动率。

SwaptionBlackVol = [22 21 19 17 15 15 13 12 21 19 17 16 13 11 11 20 18 16 15 14 12 11 19 17 14 14 12 10 18 16 14 13 13 12 12 11 10 13 13 12 11 11 13 13 12 11 11 10 10 9]/100;ExerciseDates = [1:5 7 10];男高音= [1:5 7 10];EurExDatesFull = repmat(daysadd(Settle,ExerciseDates*360,1)',...长度(期限),1);EurMatFull =重塑(daysadd(EurExDatesFull,...repmat(360 *男高音,1,长度(ExerciseDates)), 1),大小(EurExDatesFull));

选择校准仪器

选择校准模型的仪器是校准工作中的一项任务。对于百慕大交换,典型的做法是校准与百慕大交换共同定价的欧洲交换。在这种情况下,所有具有标的期限且在将要定价的互换到期(2018年7月21日)之前到期的互换都被用于校准。

的到期日或之前到期的掉期%样品交换relidx = find(EurMatFull <= InstrumentMaturity);

使用布莱克模型计算交换价格

这个例子展示了如何使用布莱克模型计算交换价格。然后,交换价格用于比较从校准过程中获得的模型预测值。

使用Black模型计算交换价格:

SwaptionBlackPrices =零(大小(SwaptionBlackVol));SwaptionStrike = 0 (size(SwaptionBlackVol));iSwaption = 1:长度(ExerciseDates)iTenor=1:length(Tenors) [~,SwaptionStrike(iTenor,iSwaption)] = swapbyzero(RateSpec,[NaN 0], Settle, EurMatFull(iTenor,iSwaption),...StartDate可以的EurExDatesFull (iTenor iSwaption),“LegReset”[1]);SwaptionBlackPrices(iTenor,iSwaption) = swaptionbyblk(RateSpec,“电话”SwaptionStrike (iTenor iSwaption),结算,...EurExDatesFull(iTenor,iSwaption), EurMatFull(iTenor,iSwaption), SwaptionBlackVol(iTenor,iSwaption));结束结束

定义仿真参数

方法的使用simTermStructs方法HullWhite1FLinearGaussian2F,LiborMarketModel对象。

要演示使用simTermStructs方法HullWhite1FLinearGaussian2F,LiborMarketModel对象,使用以下模拟参数:

nPeriods = 5;DeltaTime = 1;nTrials = 1000;男高音= (1:10)';SimDates = daysadd(360*DeltaTime*(0:nPeriods),1) SimTimes = diff(yearfrac(SimDates(1),SimDates))对于1年期和等距期,练习行将为%表示第5行,第5列表示交换期限exRow = 5;endCol = 5;
SimDates = 733610 733975 734340 734705 735071 735436 SimTimes = 1.0000 1.0000 1.0000 1.0027 1.0000

使用Hull-White单因素模型模拟利率路径

这个例子展示了如何使用赫尔-怀特单因素模型模拟利率路径。在开始本例之前,使用了HullWhite1F模型,确保您已经设置了如下所述的数据:

赫尔-怀特单因素模型描述了短期速率的演变,并使用零曲线来指定,α,σ方程的参数

d r θ t 一个 t r ] d t + σ t d W

地点:

博士是短期利率在短时间内的变化,dt

r是短期利率。

Θ(t)是时间的函数决定了平均方向吗r动作,选择这样的动作r与今天的零息收益率曲线一致。

α是平均回归率。

dt是时间上的微小变化。

σ是短期汇率的年标准差。

W为布朗运动。

Hull-White模型使用该函数进行校准swaptionbyhw,它构造了一个三叉树来为交换定价。校准包括最小化观察到的市场价格之间的差异(上面使用布莱克的隐含互换波动率矩阵计算,见<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/price-bermudan-swaptions-with-different-interest-rate-models.html" class="intrnllnk">计算布莱克模型和互换波动矩阵)和模型预测的价格。

在本例中,最优化工具箱™函数lsqnonlin用于寻找使观测值与预测值之间的差值最小的参数集。然而,其他方法(例如,模拟退火)可能是合适的。的起始参数和约束α而且σ都在变量中x0,乌兰巴托;这些也可以根据特定的校准方法而变化。

校准一组参数,使观测值和预测值之间的差异最小化<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/swaptionbyhw.html">swaptionbyhw而且lsqnonlin

TimeSpec = hwtimespec(结算,daysadd(结算,360*(1:11),1),2);HW1Fobjfun = @(x) SwaptionBlackPrices(relidx) -...swaptionbyhw (hwtree (hwvolspec(结算,' 11 - 8月- 2015 ', x (2),' 11 - 8月- 2015 ',x(1)), rate, TimeSpec),“电话”SwaptionStrike (relidx),...EurExDatesFull(relidx), 0, EurExDatesFull(relidx), EurMatFull(relidx));选项= optimset(“disp”“通路”“MaxFunEvals”, 1000,“TolFun”1 e-5);找出使观测值和实际值之间的差值最小的参数%预测价格X0 =[。1.01];Lb = [0 0];Ub = [1 1];HW1Fparams = lsqnonlin(HW1Fobjfun,x0,lb,ub,options);HW_alpha = HW1Fparams(1) HW_sigma = HW1Fparams(2)
一阶迭代函数函数数f(x)步进最优性范数0 3 0.953772 20.5 16 0.142828 0.0169199 1.53 29 0.123022 0.0146705 2.31 312 0.122222 0.0154098 0.482 4 15 0.122217 0.00131297 0.00409局部可能的最小值。Lsqnonlin停止,因为最终平方和相对于其初始值的变化小于函数公差的选定值。HW_alpha = 0.0967 HW_sigma = 0.0088

构建HullWhite1F使用<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/hullwhite1f.html">HullWhite1F构造函数。

HW1F = HullWhite1F(RateSpec,HW_alpha,HW_sigma)
HW1F = HullWhite1F属性:零曲线:[1x1 IRDataCurve] Alpha: @(t,V)inAlpha Sigma: @(t,V)inSigma

用蒙特卡罗模拟生成利率路径HullWhite1F.simTermStructs

HW1FSimPaths = HW1F.simTermStructs(nPeriods,“NTRIALS”nTrials,...“DeltaTime”DeltaTime,“男高音”男高音歌唱家,“反向”,真正的);trialIdx = 1;figure surf(Tenor,SimDates,HW1FSimPaths(:,:,trialIdx)) datetickykeeptickskeeplimits标题([“审判零曲线的演变:”num2str (trialIdx)“赫尔白色模型”])包含(“男高音(年)”

为欧洲货币互换定价。

DF = exp(bsxfun(@times,-HW1FSimPaths,repmat(Tenor',[nPeriods+1 1])));SwapRate = (1 - DF (exRow、endCol:))。/笔(bsxfun (@times 1 DF (exRow, 1: endCol,:)));= 100*max(SwapRate-InstrumentStrike,0).*sum(bsxfun(@times,1,DF(exRow,1:endCol,:)));RealizedDF = prod(exp(bsxfun(@times,-HW1FSimPaths(1:exRow,1,:),SimTimes(1:exRow))),1);HW1F_SwaptionPrice = mean(RealizedDF.*PayoffValue)
HW1F_SwaptionPrice = 2.1839

用线性高斯双因素模型模拟利率路径

这个例子展示了如何使用线性高斯双因素模型模拟利率路径。在开始本例之前,使用了LinearGaussian2F模型,确保您已经设置了如下所述的数据:

线性高斯双因素模型(被Brigo和Mercurio称为G2++)<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/Bibliography.html" class="a">利率模型的蒙特卡罗模拟)也是短期利率模型,但涉及两个因素。具体地说:

r t x t + y t + ϕ t

d x t 一个 t x t d t + σ t d W 1 t x 0 0

d y t b t y t d t + η t d W 2 t y 0 0

在哪里 d W 1 t d W 2 t ρ d t 是有相关性的二维布朗运动吗ρ,ϕ是选择来匹配初始零曲线的函数。

这个函数swaptionbylg2f用于计算模型参数的交换价格的解析值,因此可用于对模型进行校准。校准包括最小化观察到的市场价格之间的差异(上面使用布莱克的隐含互换波动率矩阵计算,见<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/price-bermudan-swaptions-with-different-interest-rate-models.html" class="intrnllnk">计算布莱克模型和互换波动矩阵)和模型预测的价格。

在本例中,方法类似于<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/price-bermudan-swaptions-with-different-interest-rate-models.html" class="intrnllnk">使用Hull-White单因素模型模拟利率路径和优化工具箱功能lsqnonlin用于最小化观察到的交换价格和预测的交换价格之间的差异。然而,其他方法(例如,模拟退火)也可能是合适的。的起始参数和约束一个bηρ,σ都在变量中x0,乌兰巴托;这些也可以根据特定的校准方法而变化。

校准一组参数,使观测值和预测值之间的差异最小化<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/swaptionbylg2f.html">swaptionbylg2f而且lsqnonlin

G2PPobjfun = @ SwaptionBlackPrices(relidx) - swaptionbylg2f(irdc,x(1),x(2),x(3),x(4),x(5),SwaptionStrike(relidx),...EurExDatesFull (relidx) EurMatFull (relidx),“重置”1);选项= optimset(“disp”“通路”“MaxFunEvals”, 1000,“TolFun”1 e-5);X0 =[。2.1.02.01-.5]; lb = [0 0 0 0 -1]; ub = [1 1 1 1 1]; LG2Fparams = lsqnonlin(G2PPobjfun,x0,lb,ub,options)
规范一阶迭代Func-count f (x)最优步0 6 12.3547 67.6 1 12 1.37984 0.0979743 8.59 2 18 24 0.445202 0.0282118 1.31 1.37984 0.112847 8.59 3 4 30 42 36 0.134678 0.0843366 7.78 0.236746 0.0564236 3.02 5 6 7 48 0.0287731 0.038967 0.732 0.0398816 0.015084 6.34 8 54 0.0273025 0.112847 0.881 9 60 66 0.0241689 0.125602 1.06 0.0241689 0.213033 1.06 72 0.0239103 0.0314005 9.78 78 0.0234246 0.0286685 1.21 84 0.0234246 0.0491135 1.21 96 90 0.023304 0.0122784 1.67 150.0231931 0.0245568 5.92 16 102 0.0230898 0.00785421 0.434 17 108 0.0230898 0.0245568 0.434 18 114 0.023083 0.00613919 0.255本地最小值可能。Lsqnonlin停止,因为最终平方和相对于其初始值的变化小于函数公差的选定值。LG2Fparams = 0.5752 0.1181 0.0146 0.0119 -0.7895

创建G2PP对象使用<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/lineargaussian2f.html">LinearGaussian2F并利用蒙特卡罗模拟生成利率路径LinearGaussian2F.simTermStructs

LG2f_a = LG2Fparams(1);LG2f_b = LG2Fparams(2);LG2f_sigma = LG2Fparams(3);LG2f_eta = LG2Fparams(4);LG2f_rho = LG2Fparams(5);G2PP =线性高斯2f (RateSpec,LG2f_a,LG2f_b,LG2f_sigma,LG2f_eta,LG2f_rho);G2PPSimPaths = G2PP.simTermStructs(nPeriods,“NTRIALS”nTrials,...“DeltaTime”DeltaTime,“男高音”男高音歌唱家,“反向”,真正的);trialIdx = 1;数字冲浪(Tenor,SimDates,G2PPSimPaths(:,:,trialIdx))日期标记ykeeptickskeeplimits标题([“审判零曲线的演变:”num2str (trialIdx)“G2++模型”])包含(“男高音(年)”

为欧洲货币互换定价。

DF = exp(bsxfun(@times,-G2PPSimPaths,repmat(Tenor',[nPeriods+1 1])));SwapRate = (1 - DF (exRow、endCol:))。/笔(bsxfun (@times 1 DF (exRow, 1: endCol,:)));= 100*max(SwapRate-InstrumentStrike,0).*sum(bsxfun(@times,1,DF(exRow,1:endCol,:)));RealizedDF = prod(exp(bsxfun(@times,-G2PPSimPaths(1:exRow,1,:),SimTimes(1:exRow))),1);G2PP_SwaptionPrice = mean(RealizedDF.*PayoffValue)
G2PP_SwaptionPrice = 2.0988

使用LIBOR市场模型模拟利率路径

这个例子展示了如何使用LIBOR市场模型模拟利率路径。在开始本例之前,使用了LiborMarketModel,确保已按以下步骤设置数据:

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

d F t F μ d t + σ t d W

地点:

W是一个n维几何布朗运动

d W t d W j t ρ j

LMM是基于无套利理论来计算远期利率的变动。具体来说,在即期LIBOR指标下,漂移被表示为

μ t σ t j t τ j ρ j σ j t F j t 1 + τ j F j t

地点:

τ 时间分数与远期汇率

问(t)索引是由关系定义的吗

T t 1 < t < T t

即期LIBOR数字定义为

B t P t T t n 0 t 1 1 + τ n F n T n

LMM的选择是如何对波动率和相关性建模,以及如何估计这些模型的波动率和相关性参数。在实践中,您可以结合使用历史数据(例如,观察到远期利率之间的相关性)和当前市场数据。对于本例,只使用交换数据。此外,波动性和相关性存在许多不同的参数化。对于这个示例,使用了两个相对简单的参数化。

在波动性的文献中最流行的函数形式之一是:

σ t φ 一个 T t + b e c T t + d

在哪里ϕ的波动率调整曲线以匹配远期汇率。在这个例子中,所有的ϕ被认为是1.对于相关性,使用以下函数形式:

ρ j e β | j |

一旦指定了功能形式,就必须使用市场数据来估计这些参数。Rebonato最初提出的一种有用的近似方法如下,它在给定一组波动函数和相关矩阵的情况下,将欧洲掉期的黑色波动率联系起来

υ α β l F 2 j α + 1 β w 0 w j 0 F 0 F j 0 ρ j 年代 α β 0 2 0 T α σ t σ j t d t

地点:

w t τ P t T k α + 1 β τ κ P t t κ

这个计算是使用函数完成的blackvolbyrebonato为模型参数计算交换价格的解析值,因此,然后用于校准模型。校准包括最小化观察到的隐含互换黑挥发率和预测黑挥发率之间的差异。

在本例中,方法类似于<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/price-bermudan-swaptions-with-different-interest-rate-models.html" class="intrnllnk">使用Hull-White单因素模型模拟利率路径而且<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/price-bermudan-swaptions-with-different-interest-rate-models.html" class="intrnllnk">用线性高斯双因素模型模拟利率路径优化工具箱功能在哪里lsqnonlin用于最小化观察到的交换价格和预测的交换价格之间的差异。然而,其他方法(例如,模拟退火)也可能是合适的。的起始参数和约束一个bd,β都在变量中x0,乌兰巴托;这些也可以根据特定的校准方法而变化。

校准一组参数,使观测值和预测值之间的差异最小化<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/blackvolbyrebonato.html">blackvolbyrebonato而且lsqnonlin

nRates = 10;CorrFunc = @(i,j,Beta) exp(-Beta*abs(i-j));objfun = @(x) SwaptionBlackVol(relidx) - blackvolbyrebonato(RateSpec,...repmat ({@ (t)的(大小(t))。* * t + x (x(1)(2))。* exp (t - x (3) *) + x (4)}, nRates-1, 1),...CorrFunc (meshgrid (1: nRates-1)”,meshgrid (1: nRates-1) x (5))...EurExDatesFull (relidx) EurMatFull (relidx),“时间”1);选项= optimset(“disp”“通路”“MaxFunEvals”, 1000,“TolFun”1 e-5);X0 =[。2.05 1 .05 .2]; lb = [0 0 .5 0 .01]; ub = [1 1 2 .3 1]; LMMparams = lsqnonlin(objfun,x0,lb,ub,options)
一阶迭代函数函数数f(x)步进最优性的范数0 6 0.156251 0.483 1 12 0.00870177 0.188164 0.0339 2 18 0.00463441 0.165527 0.00095 3 24 0.00331055 0.351017 0.0154 4 30 0.00294775 0.0892617 7.47e-05 5 36 0.00281565 0.385779 0.00917 6 42 0.00278988 0.0145632 4.15e-05 7 48 0.00278522 0.115042 0.00116局部可能的最小值。Lsqnonlin停止,因为最终平方和相对于其初始值的变化小于函数公差的选定值。LMMparams = 0.0781 0.1656 0.5121 0.0617 0.0100

计算VolFuncLMM对象。

a = LMMparams(1);b = LMMparams(2);c = LMMparams(3);d = LMMparams(4);Beta = LMMparams(5);VolFunc = repmat({@(t) ones(size(t))。*(a*t + b).*exp(-c*t) + d}, nrates -1,1);

绘制波动函数。

图fplot(VolFunc{1},[0 20]) title(“波动性”功能) CorrelationMatrix = CorrFunc(meshgrid(1:nRates-1)',meshgrid(1:nRates-1),Beta);

检查相关矩阵。

disp (的相关矩阵)流([repmat (' % 1.3 f '1、长度(CorrelationMatrix))' \ n '】,CorrelationMatrix)
相关矩阵1.000 0.990 0.980 0.970 0.961 0.951 0.942 0.932 0.923 0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.942 0.932 0.980 0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.942 0.970 0.980 0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.980 0.970 0.961 0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.980 0.970 0.942 0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.980 0.932 0.942 0.951 0.961 0.970 0.980 0.990 1.000 0.990 0.923 0.932 0.942 0.951 0.961 0.970 0.980 0.9901.000

创建LMM对象使用<一个href="//www.tianjin-qmedu.com/nl/nl/help/fininst/libormarketmodel.html">LiborMarketModel并利用蒙特卡罗模拟生成利率路径LiborMarketModel.simTermStructs

LMM = LiborMarketModel(irdc,VolFunc,相关性矩阵,“时间”1);[LMMZeroRates, ForwardRates] = LMM.simTermStructs(nPeriods,“nTrials”, nTrials);trialIdx = 1;figure tmpPlotData = LMMZeroRates(:,:,trialIdx);tmpPlotData(tmpPlotData = 0) = NaN;冲浪(男高音,SimDates tmpPlotData)标题([“审判零曲线的演变:”num2str (trialIdx)LIBOR市场模型])包含(“男高音(年)”

为欧洲货币互换定价。

DF = exp(bsxfun(@times,-LMMZeroRates,repmat(Tenor',[nPeriods+1 1])));SwapRate = (1 - DF (exRow、endCol:))。/笔(bsxfun (@times 1 DF (exRow, 1: endCol,:)));= 100*max(SwapRate-InstrumentStrike,0).*sum(bsxfun(@times,1,DF(exRow,1:endCol,:)));RealizedDF = prod(exp(bsxfun(@times,-LMMZeroRates(2:exRow+1,1,:),SimTimes(1:exRow)),1);LMM_SwaptionPrice = mean(RealizedDF.*PayoffValue)
LMM_SwaptionPrice = 1.9915

比较利率建模结果

这个例子展示了如何比较不同利率模型对欧洲掉期的定价结果。

用蒙特卡洛模拟比较了欧洲掉期与利率模型的定价结果。

disp (' ')流(#蒙特卡洛选拔赛:%8d\n', nTrials) fprintf(# of Time Periods/Trial: %8d\n\n'fprintf()'HW1F欧洲掉期价格:%8.4f\n', HW1F_SwaptionPrice) fprintf('LG2F Europesn swap价格:%8.4f\n', G2PP_SwaptionPrice) fprintf(' LMM欧洲互换价格:%8.4f\n'LMM_SwaptionPrice)
#蒙特卡洛试验:1000 #时间周期/试验:5 HW1F欧洲互换价格:2.1839 LG2F欧洲互换价格:2.0988 LMM欧洲互换价格:1.9915

参考文献

布里戈,D.和F.墨丘利奥。利率模型-理论与实践与微笑,通货膨胀和信贷。施普林格财经,2006。

安德森,L.和V.皮特巴。利率建模。大西洋金融出版社,2010。

船体,J。期权、期货和其他衍生品。施普林格金融,2003年。

Glasserman, P。金融工程中的蒙特卡罗方法。普伦蒂斯·霍尔,2008年。

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

另请参阅

|||||||||||

相关的例子

更多关于