# [Tutor] Cumulative distribution function

Peter Otten __peter__ at web.de
Thu Oct 1 10:57:18 CEST 2015

```Michel Guirguis wrote:

> I have a problem with the cumulative distribution function in calculating
> derivatives. I am getting a call option figure of 2.5961 while it should

> >>> S=50
> >>> K=50
> >>> r=0.03
> >>> q=0.02
> >>> sig=0.20
> >>> T=0.5

> >>> from math import*
> >>> d1=(log(S/K)+(r-q+(sig*sig)*0.5)*T)/(sig*sqrt(T))
> >>> d1
> 0.10606601717798211
> >>> d2 =d1-sig*sqrt(T)
> >>> d2
> -0.03535533905932742
> >>>  def cumdist():

Something is missing here...

> call = 50*exp(-0.02*0.5)*cumdist*(d1)-50*exp(-0.03*0.5)*cumdist*(d2)

... and here seem to be erroneous * operators.

> >>> call
> 2.596102990952506

scipy.stats.norm.cdf and turning your interactive session into a little
script I get

\$ cat cumulative.py
import scipy.stats
from math import log, exp, sqrt

cumdist = scipy.stats.norm.cdf

S = 50
K = 50
r = 0.03
q = 0.02
sig = 0.20
T = 0.5

d1 = (log(S/K)+(r-q+(sig*sig)*0.5)*T)/(sig*sqrt(T))
print("d1 = {}".format(d1))

d2 = d1-sig*sqrt(T)
print("d2 = {}".format(d2))

call = 50*exp(-0.02*0.5)*cumdist(d1)-50*exp(-0.03*0.5)*cumdist(d2)
print("call = {}".format(call))

\$ python cumulative.py
d1 = 0.106066017178
d2 = -0.0353553390593
call = 2.9087784079

Not exactly 2.9081, but closer :)

Assuming 2.9088 is the correct value, but for some reason you cannot use
scipy the problem is with your cumdist() function.

You don't provide that function and you don't provide the source where you