主要内容

使用Longstaff-Schwartz方法为波动期权定价

这个例子展示了如何使用蒙特卡罗模拟和Longstaff-Schwartz方法定价一个摆动期权。采用均值回归模型对潜在天然气价格进行风险中性模拟。仿真结果用于基于Longstaff-Schwartz方法的摆动期权定价[6.].这种方法使用回归技术来近似期权的延续值。对多项式基和样条基进行了比较,以拟合回归。最后,根据标准的欧洲和美国期权的价格下限和价格上限对所得到的价格进行分析。

Swing选项概述

波动期权是能源市场上流行的金融工具,它在交付资产的数量上提供了灵活性。能源消费者为了保护自己不受能源价格波动的影响,他们希望通过购买远期合约来锁定价格基本负载远期合同.然而,消费者不知道将来使用多少能量,并且不容易存储电力和天然气等能源商品。因此,消费者希望灵活地改变每个交货日期交付的能量量。Swing选项提供这种灵活性。因此,完整合同由两部分组成:Baseload Forward合同,以及Swing选项组件。

期权通常是可以高度定制的场外(OTC)合约。因此,有许多不同类型的约束和惩罚(见[5.)。在这个例子中,波动期权的定价中,唯一的限制是每日交易量,也就是所谓的每日合约量(DCQ)。右转时,音量不能低于最小DCQ (minDCQ),或超过最大DCQ (maxdcq.).

波动期权的定价有几种方法,如有限差分法、仿真法和基于树的动态规划法[5.].这个例子使用基于模拟的方法和Longstaff-Schwartz方法。基于模拟的方法的好处是用于模拟标的资产价格的动态从定价算法中分离出来。在有限差分和基于树的方法中,定价算法必须改变,以考虑不同的基础价格动态定价。

天然气价格风险中性模拟

在该示例中,天然气用作以下平均备受动态的底层资产[8]:

D. S. T. = κ μ - 日志 S. T. S. T. D. T. + σ S. T. D. W. T.

在哪里 W. T. 是标准的布朗运动。对价格的对数应用Ito引理可以得到一个Orstein-Uhlenbeck过程:

D. X T. = κ θ - X T. D. T. + σ D. W. T.

在哪里 X T. = 日志 S. T. κ > 0. , θ 被定义为:

θ = μ - σ 2 2 κ

θ 是均值的均值升降级别,用于确定模拟值将在长期恢复到的值。 κ 是指确定发生这种逆转的速度的均值升降速度。 σ 是波动率 X .我们首先模拟价格的对数。然后,取模拟值的指数来得到价格。

模拟的长度为一年,初始价格为每MMBTU 3.9美元。Monte Carlo仿真进行了1,000项试验,每天都有一次。在实践中,这些参数校准了市场数据。在这个例子中, κ = 1 2 θ = 1 7. , σ = 5. 9. .的hwv对象用于模拟天然气价格的均值回归动态。

%结算日期解决=“01 - jun - 2014”;%到期日成熟=“01 - jun - 2015”;%实际/实际的基础基础= 0;%初始日志(价格$/MMBtu)X0 =日志(3.9);日志(价格)波动率%σ= 0.59;蒙特卡罗模拟中的百分比试验NumTrials = 1000;周期数(日)NumPeriods = daysdif(结算,到期,基础);%每日时间步骤dt = 1 / NumPeriods;数值的数值升降速度(价格)k = 1.2;对数(价格)的平均回归水平%θ= 1.7;%create hwv对象hwvobj = hwv(Kappa, Theta, Sigma,“StartState”,x0);

模拟运行并绘制。

%设置随机数生成器种子savedState = rng (0,'twister');%模拟汽油价格[路径] = hwvobj.simbysolution(numperiods,'ntrial'NumTrials,...“DeltaTime”, dt);路径=挤压(exp(路径));%恢复随机数生成器状态rng (savedState);%绘制路径图;情节(时间、路径);标题(“天然气风险中性价格模拟”);Xlabel('时间');ylabel (“价格”);

图中包含一个轴。以天然气风险中性价格模拟为轴,包含1000个类型线对象。

在本例中,使用天然气作为具有均值还原动态的基础资产。然而,Longstaff-Schwartz算法可以用于其他基础资产,如电力,任何基础价格动态。

为期权定价

我们考虑一种以4.69美元/MMBtu为执行价、带有五个期权的期权,该期权可在结算日后至到期日之间每日行使。每日合同量(DCQ)是10000 MMBtu,这是消费者预期在一天内购买的平均天然气量。用户可以灵活地在一天内减少购买量(下降)至最低2500 MMBtu的DCQ,或增加购买量(上升)至15000 MMBtu。连续复合年无风险利率为1%。

RateSpec用于表示利率术语结构。为简单起见,我们在此示例中考虑平面利率术语结构。价值RateSpec可以修改以适应任何利率曲线。这个函数hswingbyls在这个例子中假设每日锻炼ExerciseDates输入是空的。

%定义RateSpecrfrate = 0.01;复合= -1;ratespec = intenvset(“ValuationDate”解决,startdate可以的解决,...“EndDates”,成熟,“利率”rfrate,...“复合”复合,“基础”、基础);%日常锻炼% hswingbyls假设每天锻炼空的ExerciseDatesExerciseDates = [];摇摆次数%NumSwings = 5;MMBTU的每日合同数量%DCQ = 10000;% MMBtu中最小DCQ约束mindcq = 2500;% MMBtu中最大DCQ约束maxDCQ = 15000;% 罢工罢工= 4.69;

Longstaff-Schwartz方法是一种向后迭代算法,从到期日开始按时间向后进行。在每个练习日期,算法近似延续值,这是期权的价值,如果它没有行使。这是通过拟合对模拟价格的价值和期权在下一个行使日期的贴现未来价值的回归来实现的。期权的未来价值被称为时间向后移动的算法。持续价值是与立即执行的收益(下摆动或上摆动)和右摆动少一的摆动期权的持续价值的总和相比较。如果这个金额较小,期权持有人的最佳策略是在该日期不行权。这个函数hswingbyls在本例中,使用该方法来确定最优的期权行使策略和价格[127.].

如前所述,本例中考虑的唯一约束是最小和最大DCQ。在这种情况下,最佳的早期锻炼策略是“砰砰”式的。这意味着,当在某一行使日期上行或下行是最佳时,期权持有人应始终以最大或最小DCQ行使,以实现利润最大化。例如,如果有一个基于交易量的终极惩罚,那么“砰砰”练习就不是最佳策略。定价算法将需要额外跟踪所有可能的容量级别,这将显著增加运行时性能成本。

首先,利用三阶多项式拟合Longstaff-Schwartz方法对期权定价。这个函数hswingbyls亦会生成基础价格与到期前行使日期的延续价值之间的回归图。

%价格波动期权使用三阶多项式拟合Longstaff-Schwartz%的回归抽搐;useSpline = false;SwingPrice = hswingbyls(Paths, Times, rate espec, Settle, Maturity,...罢工,锻炼,numswings,dcq,mindcq,maxdcq,userpline,...[], 真的)

图中包含一个轴。题目为Longstaff-Schwartz回归拟合(三阶多项式)的轴包含散点型、线型两种对象。

SwingPrice = 5.6943 e + 04
lsPolyTime = toc;

从上面的回归拟合图可以看出,三阶多项式并不能很好地拟合连续值,特别是在铰链附近和极值点。使用csaps使用三次平滑样条函数拟合回归,平滑参数为0.7。运行示例的其余部分需要曲线拟合工具箱™。

%价格摆动选项使用平滑的样条,以适合Longstaff-Schwartz%的回归抽搐;userpline = true;smoothingparam = 0.7;Swingpricspline = Hswingbyls(路径,时代,率,定居,成熟,...罢工,锻炼,numswings,dcq,mindcq,maxdcq,userpline,...smoothingParam,真的)

图中包含一个轴。带有标题的轴LongStaf-Schwartz回归配合(样条曲线)包含2个类型散射,线的对象。

SwingPriceSpline = 6.0757 e + 04
lssplinetime = toc;

回归曲线图表明,三次平滑样条与数据具有更好的拟合性,从而获得更准确的连续值。但是,下面的比较表明,使用三次平滑样条比使用三次多项式需要更长的时间。

%打印运行时间的比较displayrunningtimes(lspolytime,lssplinetime)
运行时间比较:三阶多项式:9.48秒样条:13.13秒

同样,需要注意的是,价格仅代表可选性部分。因此,上述计算价格中不包括基准负荷远期合同的价格。因为我们使用的是固定执行价格,所以基本负荷合同有一个非零值,可以通过以下方法计算:

B. 一种 S. E. L. O. 一种 D. P. R. 一世 C E. = 一世 = 1 N E. - R. T. 一世 E. S. T. 一世 - K.

在哪里 T. 一世 一世 = 1 N 运动日期(见[3.)。下面使用来自平滑的立方样条曲线的Swing期权价格计算合同的全价,包括Baseload和Swing选项。

获得贴现因子卢比= intenvset (RateSpec,'startimes'0,“EndTimes”,次(2:结束));d = intenvget(RS2,“盘”);%计算基本负荷价格BaseLoadPrice = DCQ。*意味着(路径(2:,:)罢工,2)“* D;%根据三次样条LS的结果计算全部合同价格fullcontractprice = baseloadprice + splingpricspline
FullContractPrice = 1.2482 e + 05

价格界限

波动期权的下限是一条欧式期权的带,上限是一条美式期权的带[4.].与欧式期权相比,期权在每个行使日期都有提前行使的溢价,因此价格应该更高。该价格低于美式期权剥离,因为在每个行使日期只能执行一次右转。可以使用美式期权在一天内行使多个条幅。

下界和上界的价格在下面计算,以检查摆动期权价格是否在这些范围内。欧洲带钢价格是根据最近5个执行日期计算的。

%获取num秋千运动最后日期的折扣因子D = D (end-NumSwings + 1:结束);%欧洲下限idx = size(Paths, 1):-1:(size(Paths, 1) - num秋千+ 1);putEuro = D'*mean(max(Strike - Paths(idx,:), 0),2);callEuro = D'*mean(max(Paths(idx,:) - Strike, 0),2);下界= ((DCQ-minDCQ)。* putEuro + (maxDCQ-DCQ)。* callEuro);%美国上界[putAmer, callAmer] = hamericanPrice(Paths, Times, rate espec, Strike);upperBound = NumSwings。* ((DCQ-minDCQ)。* putAmer + (maxDCQ-DCQ)。* callAmer);%打印价格和较低/上限displaySummary (SwingPriceSpline下界,upperBound);
波动期权价格:60757.33上界(美国):68181.42

使用LongStaff-Schwartz算法计算的价格在较低和上限内。下面的曲线显示摆动选项和上限和下限之间的比较,因为摇摆的数量增加。当摆动的数量是1在美国,摆动期权相当于美式期权。就日常锻炼机会而言(NumSwings = 365),摆动选项相当于欧洲选项的条带,日常成熟。

结论

该示例显示了LongStaff-Schwartz方法的使用,以价格为逻辑资产遵循平均恢复动态的摆动选项。使用3阶多项式和平滑的立方样条曲线来拟合LongStaff-Schwartz算法中的回归,以近似延续值。结果表明,平滑的立方样条符合较慢的性能成本更好地拟合数据。最后,通过欧洲方案条带的下限和美国选项带上的下限来检查所产生的秋千期权价格。

参考文献

Boogert, A., de Jong, C.;用蒙特卡罗方法评估储气库衍生物杂志。15(3): 81 - 98年,2008年。

[2] Dorr,Uwe。“蒙特卡洛技术估价摆动选项和锻炼策略估算。”牛津,2002年。

赫尔,约翰C。期权、期货和其他衍生品.第六版,培生教育公司,2006年。

越狱,P., Ronn, E. I., Tompaidis, S.。“基于大宗商品的期权估值,管理科学。50(7):909-921,2004。

land, Ambers, Lindqvist, Ola。基于大宗商品的波动期权估值:一项调查。挪威语,Regnesentral 2008。

朗斯塔夫,弗朗西斯,施瓦茨,爱德华多S。美国期权的模拟价值:一个简单的最小二乘方法金融研究检讨。14(1): 113 - 147年,2001年。

[7] Meinshausen,N.,Hambly,B.M.“Monte Carlo用于估值多项运动选择的方法。”数学科学。14:557-583,2004。

[8] Schwartz,Eduardo S.“商品价格的随机行为:对估值和对冲的影响。”金融杂志。52(3): 923 - 973年,1997年。

效用函数

函数DisplaySummary(SwingPricspline,Dewerbound,Upplebound)FPRINTF(`与下界和上界的比较:\n');fprintf(' \ n ')流('下界(欧洲):%.2f\n',下界);fprintf('Swing期权价格:%.2F \ n', SwingPriceSpline);fprintf('上限(美国):%.2f\n\n',上行);结尾函数displayRunningTimes (lsPolyTime lsSplineTime)流(`运行时间比较:\n `);fprintf(' \ n ')流('三阶多项式:%。2 f秒\ n”,lspolytime);fprintf(花键:%。2 f秒\ n \ n”, lsSplineTime);结尾

也可以看看

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

相关例子

更多关于

外部网站