Example #1
0
 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
Example #2
0
    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