我正在尝试使用黑色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个双打并循环遍历这些,直到我得到适当的结果。有关最佳方法的任何想法吗?
答案 0 :(得分:5)
您需要更清楚地定义您正在寻找的内容。根据您发布的内容,您似乎正在寻找累积分布函数或P(d 您想要的函数称为错误函数 显然 但是 其中sigma是标准偏差。 (在您的情况下,您可以使用sigma = 1。) 您可以在Wolfram Alpha上进行测试,例如:f(0.43,1)=(erf(0.43 / sqrt(2))+ 1)/ 2 = 0.666402与您的表格匹配。 还有另外两件重要的事情: 如果您正在寻找P(d 例如,如果您的编程环境没有在可用库中内置 如果我在Javascript中尝试这个(Cody论文表II中的系数): 然后我得到 给你 希望这有帮助!erf(x)
,它有一些很好的近似值。erf(x)
是C中标准math.h
的一部分。(不确定Objective-c但我认为它可能也包含它)。erf(x)
并不完全是你需要的功能。一般形式P(d P(d<d1) = f(d1,sigma) = (erf(x/sigma/sqrt(2))+1)/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是你可以从他的表中得到的有理函数。 // 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)表格检查您的结果。