MATLAB:定价数字期权,蒙特卡罗与显式积分公式?

时间:2014-07-16 15:00:37

标签: matlab integration montecarlo probability-density

使用MATLAB我遇到了以下问题:

设Z是对数正态分布,使得ln Z具有均值m和方差w。设eta为负数,c为正常数。

我试图计算期望值(让I(Z <= c)表示集合的指标函数(Z <= c))

E [Z ^(η+ 1)I(Z <= c)] =(1 / sqrt(w))integral_0 ^ cx ^(η)phi((ln x-m)/ sqrt(w)) DX,

其中phi()表示标准正态随机变量的概率分布函数。

我做的第一件事是模拟Z的10.000次试验,将值> c的向量的条目设置为0,升高到(eta + 1)的幂,然后计算平均值。这应该给我MC估计的预期值。

ST = random('Lognormal', m,w_sq,10000,1);
hlp = zeros(10000,1);
hlp(ST<=2) = ST(ST<=2);
hlp(hlp>0) = hlp(hlp>0).^(eta1+1); % 0^(eta1+1) gives infinity
mean(hlp)

对于积分,我使用了以下代码

tmpp = integral(@(x) x.^(eta1) .* normpdf((log(x)-m)/sqrt(w_sq),0,c);
tmpp / sqrt(w_sq(1))

不幸的是,程序会导致完全不同的结果,尽管在数学上它们应该是相同的。

这一切都是更大代码的一部分,使用积分版本对我来说会更方便。最初我试图使用MC模拟进行双重检查,然后发现某些东西一定是错的......

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

对于第一段代码,

  

我猜你有意想不到的结果的原因就在于你   在hlp上进行计算,您尝试避免0值,因为0^eta   会爆炸 - 这不是想要的结果,所以你只需放弃它。   但在最后一步中,mean(hlp)将获取数组hlp中的所有值,   包括那些0。试试这个:

     

mean(hlp(hlp>0))

     

我的结果大约是2.x,10,000点模拟,2.3x~   2.4x,1,000,000分。

我错了。你的问题是你使用的点数太少了。尝试10,000,000点,你会感到满意:)

对于第二个问题,我在理解您定义变量的方式时遇到了问题。 (我没有足够的声誉来添加评论,所以我把它放在这里。)w_sq中的“sq”是否表示w的平方根?因为根据random的文档,参数应该是“sigma”,这是标准偏差。将SD定义为方差的平方根是很自然的,我猜测它是w。然后你在第一件事中做得对。

如果是这样,在代码的第二部分中,为什么要将sqrt()放在w_sq上?你的意思是取第四个方差吗?从你对期望的定义来看,我不认为这是正确的。请看一下。

另一方面,w_sq是一个数字还是一个数组?

  • 如果是数字 -

tmpp / sqrt(w_sq(1))应为tmpp / sqrt(w_sq),尽管它们实际上没有区别。

  • 如果是阵列 -

您可能希望将所有代码放在for循环中。循环遍历w_sq,每次它挑选出数组中的一个元素(将变量命名为w_sq_elem),然后让其余的代码执行就像它是单个的一样数。

无论如何,(log(x)-m)/sqrt(w_sq)tmpp / sqrt(w_sq(1))会在w_sq上提供不同的信息。第一个假定它是一个数字,因此除法可以只是/,而不是./。第二个表明它是一个数组,所以你选择它的第一个元素。但是数组在这里没有意义,因为根据我的理解,你不会在x中将10,000个点除以10,000个不同的方差。

m = 3;
w_sq = 2;
eta1 = -2;
ST = random('Lognormal',m,w_sq,10000000,1);
hlp = zeros(10000000,1);
hlp(ST<=2) = ST(ST<=2);
hlp(hlp>0) = hlp(hlp>0).^(eta1+1); % 0^(eta1+1) gives infinity
mean(hlp)

tmpp = integral(@(x) x.^(eta1) .* normpdf((log(x)-m)/w_sq),0,2) ;
tmpp / w_sq

>> untitled

ans =

    0.2944


ans =

    0.2948

>>