def test_egarch(self): nobs = self.T parameters = np.array([0.0, 0.1, -0.1, 0.95]) resids, sigma2 = self.resids, self.sigma2 p = o = q = 1 backcast = 0.0 var_bounds = self.var_bounds lnsigma2 = np.empty_like(sigma2) std_resids = np.empty_like(sigma2) abs_std_resids = np.empty_like(sigma2) recpy.egarch_recursion(parameters, resids, sigma2, p, o, q, nobs, backcast, var_bounds, lnsigma2, std_resids, abs_std_resids) sigma2_numba = sigma2.copy() recpy.egarch_recursion_python(parameters, resids, sigma2, p, o, q, nobs, backcast, var_bounds, lnsigma2, std_resids, abs_std_resids) sigma2_python = sigma2.copy() rec.egarch_recursion(parameters, resids, sigma2, p, o, q, nobs, backcast, var_bounds, lnsigma2, std_resids, abs_std_resids) assert_almost_equal(sigma2_numba, sigma2) assert_almost_equal(sigma2_python, sigma2) norm_const = np.sqrt(2 / np.pi) for t in range(nobs): lnsigma2[t] = parameters[0] if t == 0: lnsigma2[t] += parameters[3] * backcast else: stdresid = resids[t - 1] / np.sqrt(sigma2[t - 1]) lnsigma2[t] += parameters[1] * (np.abs(stdresid) - norm_const) lnsigma2[t] += parameters[2] * stdresid lnsigma2[t] += parameters[3] * lnsigma2[t - 1] sigma2[t] = np.exp(lnsigma2[t]) assert_almost_equal(sigma2_python, sigma2)
def test_egarch_performance(self): egarch_setup = """ nobs = T parameters = np.array([0.0, 0.1, -0.1, 0.95]) p = o = q = 1 backcast = 0.0 lnsigma2 = np.empty_like(sigma2) std_resids = np.empty_like(sigma2) abs_std_resids = np.empty_like(sigma2) """ egarch_first = """ rec.egarch_recursion(parameters, resids, sigma2, p, o, q, nobs, backcast, var_bounds, lnsigma2, std_resids, abs_std_resids) """ egarch_second = """ recpy.egarch_recursion(parameters, resids, sigma2, p, o, q, nobs, backcast, var_bounds, lnsigma2, std_resids, abs_std_resids) """ timer = Timer(egarch_first, 'Numba', egarch_second, 'Cython', 'EGARCH', self.timer_setup + egarch_setup) timer.display()