r语言二元期权barrier option实现案例

Double-no-touch(DNT)选项是二元期权,在到期时支付固定金额的现金。不幸的是,fExoticOptions包目前不包含此选项的公式。我们将展示两种不同的方式来定价包含两种不同定价方法的DNT。在本节中,我们将调用函数dnt1,对于第二种方法,我们将使用dnt2作为函数的名称。

 

 掌握数量金融的ř

 首先,我们将尝试使用正常参数,看看收敛速度有多快:

print(dnt1(100,10,120,80,0.1,0.25,0.05,0.03,20,TRUE))
 

以下屏幕截图显示了上述代码的结果:

公式错误图表显示,在第七步之后,其他步骤不会影响结果。这意味着,出于实际目的,可以通过仅计算前七个步骤来快速估计无限和。这看起来确实很快收敛。然而,这可能是纯粹的运气或巧合。

那么将波动率降低到3%呢我们必须将Ñ设置为50才能看到收敛?:

print(dnt1(100,10,120,80,0.03,0.25,0.05,0.03,50,TRUE))
上述命令提供以下输出:

不是那么令人印象50步不然没那么糟糕。如何降低波动率甚至更低?1%时,带有这些参数的公式就会爆炸。首先,这看起来很灾难; 然而,当我们使用3%的波动率时,DNT的价格已经是支付的98.75%。逻辑表示DNT价格应该是波动率的单调递减函数,因此我们已经知道,如果波动率低于3%,DNT的价格应至少为98.75%。

另一个问题是,如果我们选择极高的ü或极低的L,则会出现计算错误然而,类似于波动性的问题,常识也有帮助。如果我们将ü更高或更低,则DNT的价格应该增加。

还有一个伎俩。由于所有问题都来自一个参数,我们可以尝试将b设置为0,这将使得等于0.5。如果我们也将ř设置为0,则当波动率下降时,DNT的价格会收敛到100%。

无论如何,每当我们用有限的总和代替无限和时,总是很好的知道什么时候它会工作,什么时候不工作。我们制作了一个新代码,考虑到融合并不总是很快诀窍。在于,只要最后一步发生了重大变化,该函数就会计算下一步。这仍然不适合所有参数,因为无法解决非常低的波动性,除非我们接受隐含波动率低于1%的这一事实,这是一个极端的市场情况,在这种情况下,DNT期权不应定价通过这个公式:

 

既然我们有一个很好的公式,就可以绘制一些与DNT相关的图表来更熟悉这个选项。之后,我们将使用具有以下参数的特定AUDUSD DNT选项:L等于0.9200,U等于0.9600,K(支付)等于100万美元,T等于0。25年,波动率等于6%,
r_AUD等于2.75%,r_USD等于0.25%,b等于-2.5%。我们将计算并绘制该DNT的所有可能值,从0.9200 
到0.9600; 每一步都是一个点(0.0001),所以我们将使用2000步。

以下代码绘制了底层价格的图表:

 
 for(i in 1:2000){ 
   y [i] 
    z [i] 
 } 
matplot(x,cbind(y,z),type =“l”,lwd = 2,lty = 1,
   main =“ “,cex.main = 0.8,xlab =” “)

以下输出是上述代码的结果:掌握数量金融的ř

可以清楚地看到,即使波动率的微小变化也会对DNT的价格产生巨大影响。 

大多数最终用户认为最大的风险是现场接近触发点。这是因为最终用户真的以二进制方式考虑二元期权。 

同样非常有趣的是,由于T-Bill价格与波动性无关,并且由于DNT + DOT = T-Bill等式成立,因此增加的波动性将使DNT的价格降低完全相同的数量,就像它将增加一样DOT的价格。毫无疑问,DOT的维加应该是DNT的精确镜像。

我们可以使用GetGreeks函数来估计维加,γ,δ和有峰。
对于γ,我们可以通过以下方式使用GetGreeks函数:

GetGreeks 
    all_args1 
    all_args1 [[arg]] 
    all_args2 [[arg]] 
    (do.call(FUN,all_args1) - 
       do.call(FUN,all_args2))/(2 * epsilon)
} 
Gamma 
    arg1 
    arg2 
    arg3 
    y1 
    y2 
   (y1  -  y2 )/(2 * epsilon)
} 
 
delta 
 (i in 1:200){ delta [i] 
    x [i],1000000,0.96,0.92,0.06,0.5,0.02 ,-0.02)vega [i] 
    x [i],1000000,0.96,0.92,0.06,0.5,0.0025,-0.025)theta [i] 
    x [i],1000000,0.96,0.92,0.06,0.5,0.0025, - 0.025)gamma [i] 
  
} 
windows()plot(x,vega,type =“l”,xlab =“S”,ylab =“”,main =“Vega”) 

以下图表是上述代码的结果:掌握数量金融的ř

在看了价值图表之后,DNT的增量也非常接近直觉; 如果我们接近更高的障碍,我们的增量变为负值,如果我们接近较低的障碍,增量变为正值如下:

windows()
plot(x,delta,type =“l”,xlab =“S”,ylab =“”,main =“Delta”)

这实际上是一个非凸的情况; 如果我们想做一个动态的三角洲对冲,我们肯定会赔钱。如果现货价格上涨,DNT的差值会减少,所以我们应该购买一些澳元兑美元作为对冲。但是,如果现货价格下跌,我们应该卖出一些澳元兑美元。想象一下,澳元兑美元在早上上涨20点,然后在下午下跌20点。对于动态套期保值者来说,这意味着在价格上涨后买入一些澳元兑美元,并在价格下跌后卖出相同的金额。

可以通过如下的伽玛来描述增量的变化:

windows()
plot(x,gamma,type =“l”,xlab =“S”,ylab =“”,main =“Gamma”)

负伽玛意味着如果该点上升,我们的增量正在减少,但如果该点下降,我们的增量增加。这听起来不太好。对于这种不方便的非凸状况,有一些补偿,即THETA的值是正的。如果没有任何反应,但有一天过去了,DNT将自动获得更多价值。

在这里,我们使用THETA作为偏导数的负1倍,因为如果(TT)是剩余时间,我们检查值如何随着吨增加一天而变化:

windows()
plot(x,theta,type =“l”,xlab =“S”,ylab =“”,main =“Theta”)

伽马越负,我们的θ越正。这就是时间补偿负伽玛产生的潜在损失的方式。

 我们之前已经介绍了布莱克 - 斯科尔斯表面; 现在,我们可以详细介绍一下。这个表面也是对θ和三角如何工作的很好的解释。它显示了不同现货价格和成熟时间的期权价格,因此该表面的斜率是一个方向的θ和另一个方向的增量代码如下:

BS_surf 
 n 
 k 
 m 
 for(i in 1:n){ 
   for(j in 1:k){ 
     l 
      m [i,j] 
      } 
} 
persp3D(z = m,xlab =“underlying”,ylab =“Time”,
 } 
 上面的代码给出了以下输出:

掌握数量金融的ř

  

Double-no-touch 模拟

DNT价格在2014年第二季度的变化情况如何?
我们有开放 - 高 - 低 - 关闭型时间序列,澳元兑美元的频率为5分钟,因此我们知道所有极端价格:

 
 option_price 
 for(i in 1:n){ option_price [i] U = 0.9600,L = 0.9200,sigma = 0.06,T = t [i] /(60 * 24 * 365),      r = 0.0025,b = -0.0250)} a 
 b 
 option_price_transformed =(option_price  -  a)* 0.03 /(b  -  a)+ 0.92 par(mar = c(6,3,3,5 ))matplot(cbind(underlying,option_price_transformed),type = “l”,  



以下是上述代码的输出:掌握数量金融的ř

DNT的价格在右轴显示为红色(除以1000),实际的AUDUSD价格在左轴显示为灰色。绿线是0.9200和0.9600的障碍。该图表显示,在2014年第二季度,澳元兑美元货币对在(0.9200; 0.9600)区间内交易; 因此,DNT的支出将为100万美元这个DNT看起来是一项非常好的投资。然而,只是现实一个先验几乎无限集的轨迹。它可能发生了不同的事情例如,2014年5月2日,到期还有59天,澳元兑美元汇率为0.9203,距离下方隔离点只有3个点此时,此DNT的价格仅为5302美元,如下面的代码所示:

dnt1(0.9203,1000000,0.9600,0.9200,0.06,59 / 365,0.0025,-0.025)
[1] 5302.213

比较此5302美元至最初的48564美元期权价格 

在下面的模拟中,我们将展示一些不同的轨迹所有这些都是从与4月1日黎明时相同的0.9266澳元兑美元现货价格开始,我们将看到其中有多少人保持在(0.9200。0.9600)区间内为简单起见,我们将使用与我们用于定价DNT相同的6%波动率来模拟几何布朗运动:

library(matrixStats)
DNT_sim 
 L = 0.92,N = 5){ 
  
    option_price 
 
  matplot(t,option_price,type =“l”,main =“DNT price”,
       xlab =“”,ylab =“”)} 
set.seed(214)
system.time(DNT_sim())

以下是上述代码的输出:掌握数量金融的ř

在这里,唯一幸存的轨迹是红色轨迹; 在所有其他情况下,DNT击中较高或较低的障碍该生产线。set.seed(214)授予,该模拟会看我们运行这个相同的任何时候五分之一仍然不是那么糟糕。这表明对于没有动态套期保值的最终用户或赌徒,此选项的近似值为支付的20%(特别是因为利率很低,货币的时间价值并不重要)。

然而,五条轨迹仍然太少,无法得出这样的结论。我们应该检查DNT生存率,以获得更高数量的轨迹。

幸存轨迹的比率可以是该DNT的先验现实生存概率的良好估计; 因此,它的最终用户价值。在迅速增加N之前,我们应该记住这个模拟花了多少时间。对于我的电脑,N = 5需要50.75秒,N = 15需要153.11秒。

 

 

 

还有问题吗?联系我们!

 

 

转载于:https://www.cnblogs.com/tecdat/p/10108830.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值