Ejemplo n.º 1
0
    def generate_paths(self, fixed_seed=False, day_count=365.0):
        if self.time_grid is None:
            self.generate_time_grid()
        M = len(self.time_grid)
        I = self.paths
        paths = np.zeros((M, I))
        paths[0] = self.initial_value
        if self.correlated is False:
            sn1 = sn_random_numbers((1, M, I), fixed_seed=fixed_seed)
        else:
            sn1 = self.random_numbers

        # standard normally distributed pseudorandom 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)
        short_rate = self.discount_curve.short_rate

        for t in range(1, len(self.time_grid)):
            if self.correlated is False:
                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
            poi = np.random.poisson(self.lamb * dt, I)
            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
 def generate_paths(self, fixed_seed=False, day_count=365.0):
     if self.time_grid is None:
         self.generate_time_grid()
     # number of dates for time grid
     M = len(self.time_grid)
     I = self.paths
     paths = np.zeros((M, I))
     paths[0] = self.initial_value
     if not self.correlated:
         rand = sn_random_numbers((1, M, I), fixed_seed=fixed_seed)
     else:
         rand = self.random_numbers
     short_rate = self.discount_curve.short_rate
     for t in range(1, len(self.time_grid)):
         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
         paths[t] = paths[t - 1] * np.exp((short_rate - 0.5
                                           * self.volatility ** 2) * dt
                                          + self.volatility * np.sqrt(dt) * ran)
     self.instrument_values = paths