原先都是使用 trapezoidal quadrature formula 積分的方法計算面積求出其累積機率。
雖然曾經懷疑為什麼 Excel 可以運算得這麼快,但是一直沒有去找到真正的解答。
直到最近又翻起 John Hull 的書籍,才知道可以運用逼近的方法達成..
在 Options, Futures, And Other Derivatives 6th Ed. p.297 中有提到其如何用數值逼近
其準確度到達小數第六位,在此列出其程式碼,希望能藉此幫助更多人。
class CDF
{
const double a1 = 0.31938153;
const double a2 = -0.356563782;
const double a3 = 1.781477937;
const double a4 = -1.821255978;
const double a5 = 1.330274429;
const double gamma = 0.2316419;
///
/// A polynomial approximation that gives six-decimal-place accuracy.
///
///
///
public static double N(double x){
double k = 1 / (1+gamma*x);
if(x>=0){
return (1 - _NProun(x)*(a1*k + a2*Math.Pow(k,2)+a3*Math.Pow(k,3)+a4*Math.Pow(k,4) + a5*Math.Pow(k,5)));
}else{
return (1 - N(-x));
}
}
private static double _NProun(double x){
return (1 / Math.Sqrt(2 * Math.PI)) * Math.Exp(-Math.Pow(x, 2) / 2);
}
}
另一種方法
回覆刪除可以內建幾個表值..
然後再挑選最近 x 的值再去計算
我覺得這個方法比較好耶!
回覆刪除因為他的時間複雜度與空間複雜度相對而言較小
還是要感謝你的分享!Thanks..