def CarrBSCV(n, s0, K, T, model, a=100): ''' input model must have vol() implemented ''' s0, K, T, a = map(float, (s0, K, T, a)) k = math.log(K) b = 1.5 r = model.r c1, c2 = model.cumulants(1)[:2] modelCV = BSCV(c1, c2) modelCV.setIR(r) ''' intgDiff = lambda u: ((cmath.exp(1j*(-u*k + (u-(b+1)*1j)*math.log(s0)))*math.exp(-r*T) \ *model.chf(u - (b+1)*1j, T) \ - cmath.exp(1j*(-u*k + (u-(b+1)*1j)*(math.log(s0) )))*math.exp(-r*T) \ *modelCV.chf(u - (b+1)*1j, T)) \ /(b**2 + b - u**2 + (2*b+1)*u*1j)).real ''' intgDiff = lambda u: ( cmath.exp(1j * (-u * k + (u - (b + 1) * 1j) * math.log(s0))) * math.exp(-r * T) * (model.chf(u - (b + 1) * 1j, T) - modelCV.chf(u - (b + 1) * 1j, T)) / (b**2 + b - u**2 + (2 * b + 1) * u * 1j)).real return math.exp(-b * k) * fnc.trap( n, intgDiff, 0, a) / math.pi + modelCV.callforCarr(s0, K, T)
def Lewis(n, s0, K, T, model, a=100): s0, K, T = map(float, [s0, K, T]) r = model.r integrand = lambda u: (cmath.exp(u * (math.log(s0 / K)) * (1j) - 0.5 * r * T) * model.chf( u - 0.5j, T) / (u**2 + 0.25)).real return s0 - math.sqrt(s0 * K) * math.exp(-0.5 * r * T) * fnc.trap( n, integrand, 0, a) / math.pi
def Carr(n, s0, K, T, model, a=100): s0, K, T, a = map(float, (s0, K, T, a)) k = math.log(K) b = 1.5 r = model.r integrand = lambda u: (cmath.exp(1j * (-u * k + (u - (b + 1) * 1j) * math.log(s0))) * math.exp(-r * T) * model.chf(u - (b + 1) * 1j, T) / (b**2 + b - u**2 + (2 * b + 1) * u * 1j)).real return math.exp(-b * k) * fnc.trap(n, integrand, 0, a) / math.pi
def CarrRealBSCV(n, s0, K, T, model, a=100): ''' input model must have vol() implemented ''' s0, K, T, a = map(float, (s0, K, T, a)) k = math.log(K) b = 1.5 r = model.r modelCV = BS(model.vol()) modelCV.setIR(r) intgDiff = lambda u: ( cmath.exp(1j * (-u * k + (u - (b + 1) * 1j) * math.log(s0))) * math.exp(-r * T) * (model.chf(u - (b + 1) * 1j, T) - modelCV.chf(u - (b + 1) * 1j, T)) / (b**2 + b - u**2 + (2 * b + 1) * u * 1j)).real return math.exp(-b * k) * fnc.trap(n, intgDiff, 0, a) / math.pi + modelCV.call(s0, K, T)