def test_calculateEV_norm(mean=0.0, moment=2): # calculate moments of a normal distribution def fFn(x): return abs(scipy.real(scipy.power(x, moment))) gridArray = scipy.linspace(-10, 10, 500) fArray = fFn(gridArray) sdRange = scipy.linspace(0.1, 2.0, 100) t1 = time.time() result1 = [calculateEV_montecarlo(fFn, scipy.stats.norm(loc=mean, scale=sd)) for sd in sdRange] t2 = time.time() result2 = [calculateEV_integrate(fFn, scipy.stats.norm(loc=mean, scale=sd)) for sd in sdRange] t3 = time.time() result3 = [calculateEV_grid(gridArray, fFn, scipy.stats.norm(loc=mean, scale=sd), zOffset=0.0, leftK=fArray[0], rightK=fArray[-1]) for sd in sdRange] t4 = time.time() result4 = [_myfuncs.mycalcEV_grid(gridArray, fArray, _myfuncs.NormalCDFObj(mean, sd), _myfuncs.NormalPDFObj(mean, sd), 0.0, fArray[0], fArray[-1]) for sd in sdRange] t5 = time.time() print("montecarlo: %f" % (t2-t1)) print("integrate: %f" % (t3-t2)) print("grid: %f" % (t4-t3)) print("c++ grid: %f" % (t5-t4)) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result1) plt.title("monte carlo") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result2) plt.title("integrate") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result3) plt.title("grid") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result4) plt.title("c++ grid")
def test_calculateEV_lognorm(mean=0.0, moment=2): # calculate moments of a lognormal distribution def fFn(x): #return abs(scipy.real(scipy.power(x, moment))) return scipy.real(-(1.0/x)) #gridArray = scipy.linspace(0.001, 20, 1000) sdRange = scipy.linspace(0.1, 1.5, 100) t1 = time.time() result1 = [] for sd in sdRange: rv = scipy.stats.lognorm(sd, scale=scipy.exp(mean)) EV = calculateEV_montecarlo(fFn, rv) result1.append(EV) t2 = time.time() result2 = [calculateEV_integrate(fFn, scipy.stats.lognorm(sd, scale=scipy.exp(mean))) for sd in sdRange] t3 = time.time() result3 = [] for sd in sdRange: rv = scipy.stats.lognorm(sd, scale=scipy.exp(mean)) x = rv.ppf(scipy.linspace(0, 1, 200))[1:-1] y = fFn(x) EV = calculateEV_grid(x, fFn, rv, zOffset=0.0, leftK=y[0], rightK=y[-1], fArray=y) result3.append(EV) t4 = time.time() result4 = [] for sd in sdRange: rv = scipy.stats.lognorm(sd, scale=scipy.exp(mean)) x = rv.ppf(scipy.linspace(0, 1, 200))[1:-1] y = fFn(x) result4.append(_myfuncs.mycalcEV_grid(x, y, _myfuncs.LognormalCDFObj(mean, sd), _myfuncs.LognormalPDFObj(mean, sd), 0.0, y[0], y[-1])) t5 = time.time() result5 = [] x = scipy.linspace(0, 20, 1000) y = fFn(x) for sd in sdRange: rv = scipy.stats.lognorm(sd, scale=scipy.exp(mean)) pdf_x = rv.ppf(scipy.linspace(0, 1, 1000))[1:-1] pdf_y = rv.pdf(pdf_x) result5.append(_myfuncs.mycalcEV_grid2(x, y, pdf_x, pdf_y)) t6 = time.time() result6 = [] x = scipy.linspace(0, 20, 1000)[1:-1] y = fFn(x) for sd in sdRange: rv = scipy.stats.lognorm(sd, scale=scipy.exp(mean)) EV = calculateEV_montecarlo2(x, y, rv) result6.append(EV) t7 = time.time() result7 = [] x = scipy.linspace(0, 20, 1000)[1:-1] y = fFn(x) for sd in sdRange: EV = calculateEV_lognorm(x, y, lambda x: x, mean, sd) result7.append(EV) t8 = time.time() result8 = [] x = scipy.linspace(0, 20, 1000)[1:-1] y = fFn(x) for sd in sdRange: EV = _myfuncs.lognormal_EV_lininterp(x, y, mean, sd) result8.append(EV) t9 = time.time() print("montecarlo: %f" % (t2-t1)) print("integrate: %f" % (t3-t2)) print("grid with CDF/PDF: %f" % (t4-t3)) print("c++ grid with CDF/PDF: %f" % (t5-t4)) print("c++ grid 2: %f" % (t6-t5)) print("monte carlo 2: %f" % (t7-t6)) print("partial exp: %f" % (t8-t7)) print("c++ partial exp: %f" % (t9-t8)) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result1) plt.title("monte carlo") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result2) plt.title("integrate") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result3) plt.title("grid") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result4) plt.title("c++ grid") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result5) plt.title("c++ grid 2") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result6) plt.title("monte carlo 2") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result7) plt.title("partial exp") fig = plt.figure() ax = fig.add_subplot(111) ax.plot(sdRange, result8) plt.title("c++ partial exp")