def calcOption(S, r, sigma, T, K, NumOftimeStep, NumOfSimulation, callput, rnds = []): dt = T / NumOftimeStep payoffs = [] delta = [] vega = [] rho = [] theta = [] for simIndex in range(0, NumOfSimulation): #For price calculation rnd = [] stockPath = [] stockPath.append(S) for stepIndex in range(0, NumOftimeStep): if len(rnds) is not 0 : rnd.append(rnds[simIndex][stepIndex]) else : rnd.append(random.gauss(0, 1)) stockPath.append(AAD_Adjoint_EuropeanVanilla.genStockPath(stockPath[stepIndex], r, sigma, dt, rnd[stepIndex])) #print rnd[stepIndex], stockPath[stepIndex], S_dot_delta[stepIndex] #print len(rnd), len(stockPath), len(S_dot_delta) payoffs.append(AAD_Adjoint_EuropeanVanilla.calcPayoff(stockPath[NumOftimeStep], r, T, K, callput)) #print payoffs[simIndex] #For greeks calculation flag = 0 if callput == 'C' : flag = 1 if stockPath[NumOftimeStep] > K else 0 elif callput == 'P' : flag = -1 if stockPath[NumOftimeStep] < K else 0 S_bar = math.exp(-r * T) * flag r_bar = -math.exp(-r * T) * T * flag * (stockPath[NumOftimeStep] - K) sigma_bar = 0 T_bar = math.exp(-r * T) * flag * (stockPath[NumOftimeStep] - K) * r K_bar = - math.exp(-r * T) * flag for stepIndex in range(NumOftimeStep - 1, 0, -1): #print stepIndex r_bar = r_bar + stockPath[stepIndex] * dt * S_bar sigma_bar = sigma_bar + stockPath[stepIndex] * math.sqrt(dt) * rnd[stepIndex] * S_bar T_bar = T_bar - (r * stockPath[stepIndex] + 0.5 * sigma * stockPath[stepIndex] * rnd[stepIndex] / math.sqrt(dt)) * S_bar / NumOftimeStep S_bar = (1 + r * dt + sigma * math.sqrt(dt) * rnd[stepIndex]) * S_bar delta.append(S_bar) vega.append(sigma_bar) rho.append(r_bar) theta.append(T_bar) price = numpy.average(payoffs) print "Price: " + repr(price) print "Delta: " + repr(numpy.average(delta)) print "Vega: " + repr(numpy.average(vega)) print "Rho: " + repr(numpy.average(rho)) print "Theta: " + repr(numpy.average(theta))
def calcOption(S, r, sigma, T, K, NumOftimeStep, NumOfSimulation, callput, rnds = []): dt = T / NumOftimeStep payoffs = [] delta = [] vega = [] rho = [] theta = [] for simIndex in range(0, NumOfSimulation): #For price calculation rnd = [] stockPaths = [] stockPaths.append(S) #For greeks calculation S_dot_delta = [] S_dot_vega = [] S_dot_rho = [] S_dot_theta = [] S_dot_delta.append(1) S_dot_vega.append(0) S_dot_rho.append(0) S_dot_theta.append(0) for stepIndex in range(0, NumOftimeStep): if len(rnds) is not 0 : rnd.append(rnds[simIndex][stepIndex]) else : rnd.append(random.gauss(0, 1)) stockPaths.append(AAD_Tangent_EuropeanVanilla.genStockPath(stockPaths[stepIndex], r, sigma, dt, rnd[stepIndex])) S_dot_delta.append(AAD_Tangent_EuropeanVanilla.calcSenOfStockPath(stockPaths[stepIndex], r, sigma, dt, rnd[stepIndex], NumOftimeStep, S_dot_delta[stepIndex], 0, 0, 0)) S_dot_vega.append(AAD_Tangent_EuropeanVanilla.calcSenOfStockPath(stockPaths[stepIndex], r, sigma, dt, rnd[stepIndex], NumOftimeStep,S_dot_vega[stepIndex], 0, 1, 0)) S_dot_rho.append(AAD_Tangent_EuropeanVanilla.calcSenOfStockPath(stockPaths[stepIndex], r, sigma, dt, rnd[stepIndex], NumOftimeStep,S_dot_rho[stepIndex], 1, 0, 0)) S_dot_theta.append(AAD_Tangent_EuropeanVanilla.calcSenOfStockPath(stockPaths[stepIndex], r, sigma, dt, rnd[stepIndex], NumOftimeStep,S_dot_theta[stepIndex], 0, 0, 1)) #print rnd[stepIndex], stockPaths[stepIndex], S_dot_delta[stepIndex] #print len(rnd), len(stockPaths), len(S_dot_delta) #def calcPayoffSen(S, r, T, K, S_dot_delta, K_dot, r_dot, T_dot): payoffs.append(AAD_Tangent_EuropeanVanilla.calcPayoff(stockPaths[NumOftimeStep], r, T, K, callput)) delta.append(AAD_Tangent_EuropeanVanilla.calcPayoffSen(stockPaths[NumOftimeStep], r, T, K, S_dot_delta[NumOftimeStep], 0, 0, 0, callput)) vega.append(AAD_Tangent_EuropeanVanilla.calcPayoffSen(stockPaths[NumOftimeStep], r, T, K, S_dot_vega[NumOftimeStep], 0, 0, 0, callput)) rho.append(AAD_Tangent_EuropeanVanilla.calcPayoffSen(stockPaths[NumOftimeStep], r, T, K, S_dot_rho[NumOftimeStep], 0, 1, 0, callput)) theta.append(AAD_Tangent_EuropeanVanilla.calcPayoffSen(stockPaths[NumOftimeStep], r, T, K, S_dot_theta[NumOftimeStep], 0, 0, 1, callput)) #print payoffs[simIndex] price = numpy.average(payoffs) print "Price: " + repr(price) print "Delta: " + repr(numpy.average(delta)) print "Vega: " + repr(numpy.average(vega)) print "Rho: " + repr(numpy.average(rho)) print "Theta: " + repr(numpy.average(theta))
def calcOption(self, S, r, sigma, T, K, NumOftimeStep, NumOfSimulation, callput): dt = T / NumOftimeStep payoffs = [] for simIndex in range(0, NumOfSimulation): #For price calculation rnd = [] stockPaths = [] stockPaths.append(S) for stepIndex in range(0, NumOftimeStep): if self.rndFlag is True : rnd.append(self.rnds[simIndex][stepIndex]) else : rnd.append(random.gauss(0, 1)) stockPaths.append(self.genStockPath(stockPaths[stepIndex], r, sigma, dt, rnd[stepIndex])) #print rnd[stepIndex], stockPaths[stepIndex], S_dot_delta[stepIndex] #print len(rnd), len(stockPaths), len(S_dot_delta) #def calcPayoffSen(S, r, T, K, S_dot_delta, K_dot, r_dot, T_dot): payoffs.append(self.calcPayoff(stockPaths[NumOftimeStep], r, T, K, callput)) #print payoffs[simIndex] if self.rndFlag is False : self.rnds.append(rnd) price = numpy.average(payoffs) if self.rndFlag is False : self.rndFlag = True return price