def generate_paths(self, fixed_seed=False, day_count=365.): if self.time_grid == None: self.generate_time_grid() #number of dates in time grid M = len(self.time_grid) #number of paths I = self.paths #array initalization for path simulation paths = np.zeros((M, I)) paths_ = np.zeros_like(paths) paths[0] = self.initial_value paths_[0] = self.initial_value if not self.correlated: #If not correlated, generate random numbers rand = sn_random_numbers((1, M, I), fixed_seed=fixed_seed) else: #if not correlated, use random numbers in market env rand = self.random_numbers #get short rate for drift of processes short_rate = self.discount_curve.short_rate for t in range(1, len(self.time_grid)): #select the right time slice from the relevant time sets if not self.correlated: ran = rand[t] else: ran = np.dot(self.cholesky_matrix, rand[:, t, :]) ran = ran[self.rn_set] dt = (self.time_grid[t] - self.time_grid[t - 1]).days / day_count #diff between two dates as year fraction paths_[t] = (paths_[t - 1] + self.kappa * (self.theta - np.maximum(0, paths_[t - 1, :])) * dt + np.sqrt(np.maximum(0, paths_[t - 1, :])) * self.volatility * np.sqrt(dt) * ran) paths[t] = np.maximum(0, paths_[t]) self.instrument_values = paths
def generate_paths(self, fixed_seed=False, day_count=365.): if self.time_grid is None: self.generate_time_grid() #number of dates in time grid M = len(self.time_grid) #number of paths I = self.paths #array initalization for path simulation paths = np.zeros((M, I)) paths[0] = self.initial_value if not self.correlated: #If not correlated, generate random numbers sn1 = sn_random_numbers((1, M, I), fixed_seed=fixed_seed) else: #if not correlated, use random numbers in market env sn1 = self.random_numbers #for the jump component sn2 = sn_random_numbers((1, M, I), fixed_seed=fixed_seed) rj = self.lamb * (np.exp(self.mu + 0.5 * self.delt**2) - 1) #get short rate for drift of processes short_rate = self.discount_curve.short_rate for t in range(1, len(self.time_grid)): #select the right time slice from the relevant time sets if not self.correlated: ran = sn1[t] else: ran = np.dot(self.cholesky_matrix, sn1[:, t, :]) ran = ran[self.rn_set] dt = (self.time_grid[t] - self.time_grid[t - 1]).days / day_count #diff between two dates as year fraction poi = np.random.poisson(self.lamb * dt, I) #poisson distrubited jump numbers paths[t] = paths[t - 1] * ( np.exp((short_rate - rj - 0.5 * self.volatility**2) * dt + self.volatility * np.sqrt(dt) * ran) + (np.exp(self.mu + self.delt * sn2[t]) - 1) * poi) self.instrument_values = paths