全部版块 我的主页
论坛 提问 悬赏 求职 新闻 读书 功能一区 经管百科 爱问频道
5786 6
2014-07-05
各位大大好。

在使用monte carlo为一只简单的欧式期权定价时,最大的难题在于所得的价格并不是十分精确。因为一些原因,在定价上被规定只能使用vba去模拟,当vba跑超过1w次模拟后反应就开始变慢。因此靠扩大样本来获得更精确数据并不可行。

于是参阅了一些利用control variates减少方差的一些方法后,并开始尝试引入。但因为本人不是quant出身,所以理解上会有相当大的误差。这导致我修改计算出来的价格和原来未修改的数据几乎一样。所得的premium集合中的方差也没有差别。。。这说明我的理解绝对有错。

以下是我参考的资料(比较简单,只有一页):
搜狗截图_2014-07-04_19-41-36.jpg
问题:
1)在”set Xk= S0* exp(-rT)* exp(.....), k<=n那段话中, 假如把exp(-rT)剔除,实际上Xk=St,St*exp(-rT)=S0, 这样兜一大个圈子说明Xk=S0有什么特别意义吗?

2)在"set Yk=(Xk-K)+ 这段话中,如果我没有理解错,应该是表示Xk-K的最大值。其中我最不明白的是,Xk实际上是S0,因为S0是现值,K是未来值,那么Xk减K是不是没有比较意义?PS:以原始Monte carlo定价上,也是使用Max(St-K)* exp(-rT),先处理未来值,在回归现值出的啊。

3)最后一行, 这个b在现实的期权定价上到底怎么算出来?

4)同样最后一行,这个"mu"(字符打不出来,发音是mu,就是等号左边那部分),是不是代表经过减少方差后的期权价格均数,也就是最终模拟所得后所得的价格?

如果各位大大觉得问题无法理解,可不可以用以下的数据,演算一次如何减少方差呢?以下是我使用计算的数据和结果:
搜狗截图_2014-07-04_20-23-24.png


ps: prime= premium
跪谢!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-7-5 11:03:20
先试着回答你的几个问题:
1. X_k不可能等于S_0。X_k是有randomness的,很明显的来源于Z。而S_0是个定值。你的逻辑的问题在于St*exp(-rT)=S0.这个只在risk neutral measure下成立,不在physical measure成立。

2. 是最大值。基于1是错的,2的推理也是错的。如果X_k是确定的,就不用做模拟了。

3. 不知道mu是什么,所以猜不出b是什么。

最后,我不太明白怎么vba上跑这么简单的1w次模拟都会变慢。matlab跑这种100w次都不慢。还有就是为什么不直接算准确的在bs模型下的期权价格。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-7-5 16:10:38
soar1120 发表于 2014-7-5 11:03
先试着回答你的几个问题:
1. X_k不可能等于S_0。X_k是有randomness的,很明显的来源于Z。而S_0是个定值。 ...
感谢你的热心回答:)

问题1和2我听你解释后有些眉目了。但关键的问题3和4始终没有太多头绪。b我找过一些其他资料,好像是Y对X的beta= covar(X,Y)/Var(X), 但具体怎么算出来呢?用原始的求解方法把所有数据过滤一次算出来(covar(x, y)= E(X*Y)+E(X)*E(Y),还是说有特别的方法呢?

matlab好像会快特别多,我也不太想用vba。我试过从1w次改成10w次,结果等待时间有些长,使用感觉不好。
bs的Pricer已经有了,多一个价格比较总是好的。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-7-5 21:46:23
branch_jj 发表于 2014-7-5 16:10
感谢你的热心回答:)

问题1和2我听你解释后有些眉目了。但关键的问题3和4始终没有太多头绪。b我找过一些 ...
3,4问的话因为你讲的不是太清楚,我也猜不出来是什么。你vba的话等待时间有多长?matlab的话,我估计一般电脑等待时间不会超过5分钟。

还有就是如果你都可以用公式算出bsprice了,没有必要用simulation做,因为simulation是一定有error的。不知道多一个价格对你有什么用?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-7-5 22:59:55
看了两位的对话,有几点供参考:
1. 问题2:(Xk-K)+等价于max(0,Xk-k),注意,不是算最大值。
2. 问题3,4,我觉得这个b在实务中很难算的,我觉得一般取b=1,MU只是对结果的称呼,没什么重要意义。
3. 你试试同样是10000次运算,用b=1看看是否算出来的值的标准差比不使用CONTROL VARIATE(即b=0)算出来的标准差要小?而且b=1时的结果多数情况下(不是所有情况下)比b=0的结果要接近于BS算出来的值?这样,才能理解CONTROL VARIATE的作用。
4. 关于VBA运算速度,我同意VBA当然很慢。但不会慢到你们说的程度,我的机器(现在能买到的中档配置的电脑而已)计算100万次模拟只需跑6秒钟。你看看是否程序有错。
5. 还有你那个例子,我用BS和MONTE CARLO模拟这两种方法算出来的PREMIUM都是18.757左右,不是10.7多,与你的结果差太远了,看看你程序是否有错。
6. 有了BS为啥还需要MONTE CARLO模拟?在BS可以计算(如你的那个例子)时,当然是多此一举。但是,其他条款复杂的期权,BS根本就没用了。在很多情况下,MONTE CARLO模拟可能是唯一可行的(算近似值的)方法。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-7-6 18:04:40
谢谢各位热心解答。

那个运算结果的确是错误的,soar说的没错,结果应该是在18左右。

使用MC的原因如楼上所说,并非只为了欧式期权,只是定价中有欧式期权,就顺道测试一下MC欧式期权中实际应用意义。

VBA定价如果等待时间超过5秒就没意义了。

最后,受到各路英雄指点后,算是完成了一个减少方差的方法。
b是需要Pre run出来的。b=covar(X, Y)/var(X), 重新导入计算mu,mu的均值为结果。
但是我程序似乎还有错,因为当我增加T,并把s设与k相当接近的情况后(也就是一个很接近ATM的期权),BS和MC的误差变得相当大(见图)。
搜狗截图_2014-07-06_11-55-33.png

我感觉MC的计算或许有错。
以下是我的MC计算code (为了方便阅读,我省略了减少方差的部分)另外如果觉得这个过程可以优化的话,请猛拍砖~~

Function MC(ByVal s As Double, _
                    ByVal r As Double, _
                    ByVal T As Double, _
                    ByVal v As Double, _
                    Optional ByVal y As Double)

Dim variationRelative As Double
Dim rand As Double
rand = Application.NormSInv(Rnd())
variationRelative = (r - y - v ^ 2 / 2) * T + rand * v * T ^ (1 / 2)
MC = s * Exp(variationRelative)
End Function

Sub MC1()
Dim CP As String
Dim s, k, r, T, v, y As Double
Dim tempResult As Double, tempResultS As Double
Dim nbScenario
Dim prime As Double, meanPrime As Double

    Sheets("Pricer").Activate
    CP = Cells(2, 2)
    s = Cells(3, 2)
    k = Cells(4, 2)
    r = Cells(5, 2)
    T = Cells(6, 2)
    v = Cells(7, 2)
    y = Cells(8, 2)
   
    nbScenario = 10000

    If CP = "c" Then
        For i = 1 To nbScenario
        
            prime = WorksheetFunction.Max(0, (MC(s, r, T, v, y) - k) * Exp(-r * T))
            tempResult = tempResult + prime
           
        Next i
        meanPrime = tempResult / nbScenario
    ElseIf CP = "p" Then
        For i = 1 To nbScenario
            prime = WorksheetFunction.Max(0, (k - MC(s, r, T, v, y)) * Exp(-r * T))
            tempResult = tempResult + prime

        Next i
        meanPrime = (tempResult / nbScenario)
    End If

    Cells(12, 2) = meanPrime



附件列表
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群