Michel Guirguis wrote: [Please don't start a new thread for an old problem]
> 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 > be 2.9081. Could you please help. > >>> 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 Did you see Laura's answer to your previous question? Using 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 adapted it from. How do you expect us to help you fix code without spec -- and without seeing said code? _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor