【问题标题】:MATLAB: Pricing a digital option, Monte Carlo vs. explicit integral formula?MATLAB:为数字期权定价,蒙特卡洛与显式积分公式?
【发布时间】:2014-09-07 04:18:21
【问题描述】:

我在使用 MATLAB 时遇到以下问题:

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

我正在尝试计算期望值(令 I(Z

E[Z^(eta+1) I(Z

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

我做的第一件事是模拟 10.000 次 Z 试验,将值 >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 模拟复查,结果发现肯定有问题……

有人可以帮忙吗?

【问题讨论】:

    标签: matlab integration montecarlo probability-density


    【解决方案1】:

    对于第一段代码,

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

    mean(hlp(hlp&gt;0)).

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

    我错了。您的问题是您使用的积分太少。试试 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
    
    >> 
    

    【讨论】:

    • 天哪,非常感谢您的详细回答!首先,感谢关于随机文档的注释,我在计算中不小心混淆了标准偏差和方差。第二:在我的(较长的)代码中,w_sq 是时间相关方差的向量(_sq 表示“平方”),但我想在此处编辑此示例的索引,因为它可能会引起混淆。显然我错过了一些台词并让你感到困惑,我很抱歉。总而言之,您的最小示例向我展示了我的参数是问题的根源。我有 m = -0.33,w = .75(标准),eta1 = -8.3375。
    • 对于 eta1,我的意思是 eta.. 尤其是 eta 的这个值会扰乱计算,让两者偏差很大......因为现在这是一个不同的问题,我感谢负载,我们可以标记这已经解决了!
    • 它与数学无关,但您可能会发现避免使用可能有两种不同含义的“平方”或“平方根”来命名变量很有用?人们偶尔会陷入歧义,即使处理自己的代码也是如此(例如,在命名w_sq 之后很长时间您可能会忘记您的意思)。
    • 你为什么不写w=.75w2=w^2? :)
    猜你喜欢
    • 2014-03-26
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多