正态分布最佳方法

SNV*_*NV7 1 algorithm math xcode objective-c

我正在尝试使用黑色scholes公式http://en.wikipedia.org/wiki/Black%E2%80%93Scholes构建一个简单的程序来定价看涨期权.我试图找出从正态分布中获取概率的最佳方法.例如,如果我手动执行此操作,我得到的值为d1 = 0.43,而不是在此表中查看0.43 http://www.math.unb.ca/~knight/utility/NormTble.htm并获得值0.6664.

我相信c或objective-c中没有函数可以找到正态分布.我也在考虑创建一个二维数组并循环直到找到所需的值.或者也许我可以用相应的值定义300个双精度并循环遍历那些直到我得到适当的结果.有关最佳方法的任何想法?

Jas*_*n S 5

您需要更清楚地定义您正在寻找的内容.根据您发布的内容,您似乎正在寻找累积分布函数或P(d <d1),其中d1以标准差测量,d是正态分布:通过您的示例,如果d1 = 0.43则P(d < d1)= 0.6664.

您想要的函数称为错误函数erf(x),它有一些很好的近似值.

显然erf(x)math.hC 标准的一部分.(不确定Objective-c但我认为它可能也包含它).

erf(x)并不完全是你需要的功能.一般形式P(d <d1)可以通过erf(x)以下公式计算:

P(d<d1) = f(d1,sigma) = (erf(x/sigma/sqrt(2))+1)/2
Run Code Online (Sandbox Code Playgroud)

西格玛是标准偏差.(在您的情况下,您可以使用sigma = 1.)

您可以在Wolfram Alpha上测试这个例子:f(0.43,1)=(erf(0.43/sqrt(2))+ 1)/ 2 = 0.666402它与您的表匹配.

还有两件重要的事情:

  1. 如果你正在寻找P(d <d1),其中d1很大(绝对值大于约3.0*sigma)那么你应该使用互补误差函数erfc(x) = 1-erf(x),它告诉你P(d <d1)与0的接近程度或者1没有遇到数字错误.对于d1 <-3*sigma,P(d <d1)=(erf(d1/sigma/sqrt(2))+ 1)/ 2 = erfc(-d1/sigma/sqrt(2))/ 2,并且d1> 3*sigma,P(d <d1)=(erf(d1/sigma/sqrt(2))+ 1)/ 2 = 1 - erfc(d1/sigma/sqrt(2))/ 2 - 但是不要实际上是计算出来的; 而将其保留为1-K,其中K = erfc(d1/sigma/sqrt(2))/ 2.例如,如果d1 = 5*sigma,那么P(d <d1)= 1 - 2.866516*10 -7

  2. 例如,如果您的编程环境没有erf(x)内置到可用的库中,则需要一个很好的近似值.(我以为我有一个简单的使用但我找不到它,我认为它实际上是反向误差函数).我找到了WJ Cody的这篇1969年的文章,如果| x |,它给出了erf(x)的一个很好的近似值 <0.5,最好使用erf(x)= 1 - erfc(x)表示| x | > 0.5.例如,假设你想要来自Wolfram Alpha的erf(0.2)≈0.2227025892105 ; Cody说用x*R(x 2)进行评估,其中R是你可以从他的表中得到的有理函数.

如果我在Javascript(Cody论文的表II中的系数)中尝试这个:

 // use only for |x| <= 0.5
 function erf1(x)
 {
    var y = x*x;
    return x*(3.6767877 - 9.7970565e-2*y)/(3.2584593 + y);
 }
Run Code Online (Sandbox Code Playgroud)

erf1(0.2) = 0.22270208866303123对于一阶有理函数,我得到的非常接近.Cody给出了合理函数的系数表,直到4级; 这里的学位2:

 // use only for |x| <= 0.5
 function erf2(x)
 {
    var y = x*x;
    return x*(21.3853322378 + 1.72227577039*y + 0.316652890658*y*y)
      / (18.9522572415 + 7.8437457083*y + y*y);
 }
Run Code Online (Sandbox Code Playgroud)

它给出了erf2(0.2) = 0.22270258922638206正确的10位小数.Cody论文还为erfc(x)提供了类似的公式,其中| x | 在0.5和4.0之间,以及erfc(x)的第三个公式,其中| x | > 4.0,如果您愿意,可以使用Wolfram Alpha或已知的erfc(x)表格检查您的结果.

希望这可以帮助!