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))
Пример #3
0
 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