正态分布最佳方法

时间:2012-04-04 02:07:33

标签: objective-c xcode algorithm math

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

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

1 个答案:

答案 0 :(得分:5)

您需要更清楚地定义您正在寻找的内容。根据您发布的内容,您似乎正在寻找累积分布函数或P(d

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

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

但是erf(x)并不完全是你需要的功能。一般形式P(d erf(x)计算:

P(d<d1) = f(d1,sigma) = (erf(x/sigma/sqrt(2))+1)/2

其中sigma是标准偏差。 (在您的情况下,您可以使用sigma = 1。)

您可以在Wolfram Alpha上进行测试,例如:f(0.43,1)=(erf(0.43 / sqrt(2))+ 1)/ 2 = 0.666402与您的表格匹配。

还有另外两件重要的事情:

  1. 如果您正在寻找P(d erfc(x) = 1-erf(x)你有多接近P(d -7

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

  3. 如果我在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);
     }
    

    然后我得到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);
     }
    

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

    希望这有帮助!