我试图用black-scholes公式建立一个简单的程序来定价看涨期权我想找出从正态分布中得到概率的最佳方法。例如,如果我要手动执行此操作,得到的值为d1=0.43,则在该表中查找0.43http://en.wikipedia.org/wiki/Black%E2%80%93Scholes并得到值0.6664。
我认为在c或objective-c中没有找到正态分布的函数。我也在考虑创建一个二维数组并循环遍历,直到找到所需的值。或者我可以用相应的值定义300个double,并循环这些值,直到得到适当的结果。对最好的方法有什么想法吗?
最佳答案
你需要更清楚地定义你想要的是什么根据你发布的内容,你似乎在寻找累积分布函数或P(d你想要的函数称为误差函数erf(x)
,它有一些很好的近似值。
显然erf(x)
是c中标准math.h
的一部分(不确定objective-c,但我认为它可能也包含它)。
但是erf(x)
并不是你所需要的功能。一般形式p(derf(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,它与您的表匹配。
还有两件事很重要:
如果你寻找的是P(d
erf(x)
,那么您需要一个很好的近似。(我认为我有一个简单的使用,但我找不到它,我认为它实际上是为反误差函数)。我发现这个[AA]对于Erf(x)给出了一个很好的近似,如果x<0.5,最好使用Erf(x)=1 -ErFC(x),以x>>0.5。例如,假设你想要Wolfram Alpha的erf(0.2)≈1969 article by W. J. Cody;Cody说用x*R(x2)求值,其中R是一个可以从他的表中得到的有理函数。如果我用Javascript(Cody论文表I I中的系数)尝试一下:
// 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 |>4.0,您可以使用Wolfram Alpha或已知的erfc(x)表检查结果的准确性,如果您愿意的话。希望这有帮助!