主要内容

基于蒙特卡罗模拟的百慕大互换期权定价

这个例子展示了如何使用金融工具工具箱™中的利率模型为百慕大互换定价。具体来说,霍尔-怀特单因素模型、线性高斯双因素模型和LIBOR市场模型根据市场数据进行校准,然后使用蒙特卡洛模拟生成利率路径。

零线

在这个例子中ZeroRates因为零曲线是硬编码的。您也可以通过从市场数据(例如,存款、期货/远期和掉期)引导零曲线来创建零曲线。零曲线的硬编码数据定义为:

解决= datenum (2008年- 7月21日的);%零线曲线数据=日分配(结算,360*([1 3 5 7 10 20]),1;零利率=[1.9 2.6 3.1 3.5 4 4.3]'/100;绘图(曲线数据,零利率)日期勾选标题([“零曲线”datestr(解决)]);

图中包含一个轴对象。2008年7月21日标题为零曲线的轴对象包含一个类型为line的对象。

RateSpec = intenvset (“费率”ZeroRates,“结束日期”CurveDates,StartDate可以的、解决);

定义交换参数

对于本例,计算10-no- 1百慕大互换的价格。

BermudanExerciseDates = daysadd(结算360 * (1:9),1);BermudanMaturity = datenum (2018年- 7月21日的);BermudanStrike = .045;

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

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

SwoptionBlackVol=[22 21 19 17 15 13 12 21 19 17 16 15 13 11 12 11 19 15 13 12 11 11 11 11 11 11 10 14 12 11 11 11 10 9]/100;行使日期=[1:5 7 10];期限=[1:5 7 10];EurExDatesFull=repmat(结算,行使日期*360,1),...长度(期限),1;EurMatFull=重塑(日期)daysadd(EurExDatesFull,...repmat(360*期限,1,长度(行使日期)),1),尺寸(EurExDatesFull));

选择校正仪器

选择用于校准模型的仪器是校准中的任务之一。对于百慕大互换期权,通常校准为与您要定价的百慕大互换期权共终端的欧洲互换期权。在这种情况下,所有互换期权的基本期限在待定价互换期权到期之前到期在校准中使用。

%查找在到期日当天或之前到期的掉期期权%样本互换期权relidx=发现(EurMatFull<=百慕大到期日);

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

互换价格是用布莱克模型计算的。然后,您可以使用掉期价格来比较模型的预测值。使用Black模型计算掉期价格:

%使用布莱克模型计算交换价格SwaptionBlackPrices = 0(大小(SwaptionBlackVol));SwaptionStrike = 0(大小(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)、SwapptionBlackVol(iTenor,iSwaption));结束结束

仿真参数

在每个练习日期都是模拟日期的情况下,使用以下参数。

nPeriods = 9;DeltaTime = 1;nTrials = 1000;男高音= (1:10)';SimDates = daysadd(结算360 * DeltaTime * (0: nPeriods), 1);SimTimes = diff (yearfrac (SimDates (1) SimDates));

船体白1因素模型

赫尔-怀特单因素模型描述了短期利率的演变,具体如下:

d r θ t - α r d t + σ d W

赫尔-怀特模型使用该函数进行校准swaptionbyhw,它构建了一个三叉树来为互换定价。校准包括最小化观察到的市场价格(上面用布莱克隐含掉期波动率矩阵计算)和模型的预测价格之间的差异。

这个例子使用了最优化工具箱™函数lsqnonlin找出能使观测值和预测值之间的差值最小的参数集。然而,其他方法(例如,模拟退火)可能是合适的。的起始参数和约束 α σ 是否设置在变量中x0乌兰巴托;根据特定的校准方法,这些参数也可能有所不同。

warnId =“fininst: swaptionbyirtree: IgnoredSettle”;warnStruct =警告(“关闭”,warnId);%关闭警告TimeSpec = hwtimespec(set,daysadd(set,360*(1:11),1), 2);HW1Fobjfun = @(x) SwaptionBlackPrices(relidx) -...swaptionbyhw (hwtree (hwvolspec(结算,' 11 - 8月- 2015 ', x (2),' 11 - 8月- 2015 'x (1)), RateSpec TimeSpec),“呼叫”SwaptionStrike (relidx),...eurrexdatesfull (relidx), 0, eurrexdatesfull (relidx), EurMatFull(relidx));选择= optimset (“disp”“通路”“MaxFunEvals”, 1000,“TolFun”1 e-5);%找出使观测值与实际值之间的差异最小化的参数%的预测价格x0 =[。1.01];Lb = [0 0];Ub = [1 1];HW1Fparams = lsqnonlin (x0, HW1Fobjfun磅,乌兰巴托,选项);
一阶迭代Func计数f(x)的范数阶跃最优性0 3 0.953772 20.5 1 6 0.142828 0.0169199 1.53 2 9 0.123022 0.0146705 2.31 3 12 0.122222 0.0154098 0.482 4 15 0.122217 0.00131291 0.0041局部最小值。lsqnonlin停止,因为相对于其初始值的平方和的最终变化小于功能公差值。
警告(warnStruct);%打开警告HW_alpha=hw1params(1);HW_sigma=hw1params(2);%使用HullWhite1F构造器构建HullWhite1F模型。HW1F = HullWhite1F (RateSpec HW_alpha HW_sigma);%使用蒙特卡罗模拟生成利率路径%HullWhite1F.simTermStructs。HW1FSimPaths = HW1F.simTermStructs (nPeriods,“NTRIALS”nTrials,...“DeltaTime”DeltaTime,“男高音”男高音歌唱家,“反向”,真正的);%检查一个模拟trialIdx=1;图形冲浪(期限、SimDates、HW1FSimPaths(:,:,trialIdx))日期勾选ykeeptickskeeplimits标题([“试验零曲线的演变”num2str (trialIdx)“Hull White模型”])包含(‘年期’

图中包含一个轴对象。标题为“船体白模型零曲线演化:1”的轴对象包含一个类型为曲面的对象。

%使用helper函数h百慕大回答为交换定价HW1FBermPrice = hBermudanSwaption (BermudanStrike HW1FSimPaths SimDates,男高音歌唱家,...百慕大群岛(日期、百慕大群岛成熟期);

线性高斯因子模型

线性高斯双因素模型(Brigo和Mercurio称G2++)也是一个短期利率模型,但涉及两个因素。具体地说:

r t x t + y t + φ t

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

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

在哪里 d W 1 t d W 2 t 是一个具有相关性的二维布朗运动 ρ

d W 1 t d W 2 t ρ

φ 是为匹配初始零曲线而选择的函数。

你可以使用这个函数swaptionbylg2f计算模型参数的互换价格的解析值,并对模型进行校准。校准包括尽量减少观察到的市场价格和模型的预测价格之间的差异。

%校准一组参数,使两个参数之间的差异最小化%使用swaptionbylg2f和lsqnonlin观察和预测的值。G2PPobjfun = @(x) SwaptionBlackPrices(relidx) -...swaptionbylg2f(等级规范,x(1),x(2),x(3),x(4),x(5),SwaptionStrike(relidx),...EurExDatesFull (relidx) EurMatFull (relidx),“重置”1);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计数f(x)的范数阶跃最优性0 6 11.9838 66.5 1 12 1.35076 0.0967223 8.47 2 18 1.35076 0.111744 8.47 3 24 0.439341 0.0279361 1 1.29 4 30 0.237917 0.0558721 3.49 5 36 0.126732 0.0836846 7.51 6 42 0.0395759 0.01377335 7.43 7 48 0.0265828 0.0355771 0.787 54 0.0252764 0.111744 0.5 9 0.60 0.0228936 0.08366 0.02798 0.017911 0.029 0.01798 0.02977 0.912 12 78 0.0221726 0.016321 1.37可能的局部最小值。lsqnonlin停止,因为相对于其初始值的平方和的最终变化小于功能公差值。
LG2f_a=LG2Params(1);LG2f_b=LG2Params(2);LG2f_sigma=LG2Params(3);LG2f_eta=LG2Params(4);LG2f_rho=LG2Params(5);%创建G2PP对象并使用蒙特卡罗模拟生成%利率路径与LinearGaussian2F.simTermStructs。G2PP = LinearGaussian2F (RateSpec LG2f_a、LG2f_b LG2f_sigma, LG2f_eta, LG2f_rho);G2PPSimPaths = G2PP.simTermStructs (nPeriods,“NTRIALS”nTrials,...“DeltaTime”DeltaTime,“男高音”男高音歌唱家,“反向”,真正的);%检查一个模拟trialIdx=1;数字冲浪(期限、SimDates、G2pps(:,:,trialIdx))日期勾选ykeeptickskeeplimits标题([“试验零曲线的演变”num2str (trialIdx)“G2++模式”])包含(‘年期’

图中包含一个轴对象。gg2 ++模型的标题为“试验零曲线的演化:1”的轴对象包含一个类型为曲面的对象。

%使用helper函数h百慕大回答为交换定价LG2FBermPrice=hBermudanSwaption(G2PPs、SimDates、期限、百慕大Strike、百慕大执行日期、百慕大到期日);

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

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

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

在哪里

σ 波动性函数是否适用于每一种汇率和 d W 是一个N空间几何布朗运动:

d W t d W j t ρ j

LMM将基于无套利参数的远期汇率的漂移联系起来。

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

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

σ t ϕ 一个 T - t + b e c T - t + d

在哪里 ϕ 调整曲线以匹配 t h 远期利率。对于这个例子,所有的都是1

对于相关性,使用以下函数形式:

ρ j e - β | - j |

一旦确定了功能形式,就需要使用市场数据来估计参数。下面是Rebonato最初提出的一个有用的近似,它计算了欧洲互换的黑色波动率,给出了一个带有一组波动率函数和一个相关矩阵的LMM。

v α β 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 β τ k P t t k

这个计算是用blackvolbyrebonato计算模型参数的互换价格的解析值,并对模型进行校准。校准包括尽量减少观测到的隐含互换黑波动率和预测黑波动率之间的差异。

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);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.0892616 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停止的原因是相对于初始值的平方和的最终变化小于函数的容差值。
%计算LMM对象的VolFunc。一个= LMMparams (1);b = LMMparams (2);c = LMMparams (3);d = LMMparams (4);β= LMMparams (5);VolFunc = repmat({@(t) ones(size(t)))。*(a*t + b).*exp(-c*t) + d}, nrates -1,1);%绘制波动率函数图fplot(VolFunc{1},[0 20])标题(“波动率函数”

图中包含一个轴对象。标题为“波动函数”的轴对象包含一个类型为functionline的对象。

%检查相关矩阵CorrelationMatrix=CorrFunc(meshgrid(1:nRates-1)”,meshgrid(1:nRates-1),Beta);displayCorrelationMatrix(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.9420.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.990 1.000
%创建LMM对象并使用蒙特卡罗模拟生成%具有libormerketmodel.simTermStructs的利率路径。LMM=LiborMarketModel(RateSpec、VolFunc、CorrelationMatrix、,“时间”1);[LMMZeroRates, ForwardRates] = LMM.simTermStructs(nPeriods,“nTrials”, nTrials);%检查一个模拟trialIdx = 1;图tmpPlotData = LMMZeroRates(:,:,trialIdx);tmpPlotData(tmpPlotData == 0) = NaN;冲浪(男高音,SimDates tmpPlotData)标题([“试验零曲线的演变”num2str (trialIdx)LIBOR市场模型])包含(‘年期’

图中包含一个轴对象。LIBOR市场模型的题目为“Trial Zero Curve Evolution:1”的坐标轴对象包含一个类型为曲面的对象。

%使用helper函数h百慕大回答为交换定价LMMTenor = 1:10;LMMBermPrice = hBermudanSwaption (LMMZeroRates SimDates、LMMTenor .045, BermudanExerciseDates, BermudanMaturity);

结果

displayResults(nTrials, nPeriods, HW1FBermPrice, LG2FBermPrice, LMMBermPrice);
9 HW1F百慕大掉期价格:3.7577 LG2F百慕大掉期价格:3.5576 LMM百慕大掉期价格:3.4911

参考书目

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

  1. 安徒生和彼得巴。利率建模。大西洋金融出版社,2010。

  2. 布里格,D.和F.墨丘利奥。利率模型-理论和实践与微笑,通货膨胀和信贷Springer Verlag,2007年。

  3. 格拉斯曼,P。金融工程中的蒙特卡罗方法斯普林格,2003年。

  4. 船体,J。期权、期货和其他衍生品.普伦蒂斯霍尔,2008年。

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

效用函数

作用displayCorrelationMatrix(CorrelationMatrix)fprintf(“相关矩阵\ n”);流([repmat (' % 1.3 f '1、长度(CorrelationMatrix))“\n”), CorrelationMatrix);结束作用显示结果(nTrials, nPeriods, HW1FBermPrice, LG2FBermPrice, LMMBermPrice)蒙特卡洛审判:%8d\n', nTrials);流(' # of Time Periods/Trial: %8d\n\n', nPeriods);流('HW1F百慕大互换期权价格:%8.4f\n', HW1FBermPrice);流(LG2F百慕大互换价格:%8.4f\n', LG2FBermPrice);流(' LMM百慕大互换价格:%8.4f\n',LMMBermPrice);结束

另请参阅

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

相关的例子

更多关于