imsl.timeseries.garch

garch(p, q, series, guess, max_sigma=10.0)

Compute parameter estimates of a GARCH model.

Parameters:
  • p (int) – Number of GARCH parameters.
  • q (int) – Number of ARCH parameters.
  • series ((N,) array_like) – Array containing the observed time series data.
  • guess ((p+q+1,) array_like) – Array containing the initial values for the parameter array x.
  • max_sigma (float, optional) –

    Value of the upper bound on the first element (sigma) of the array x of returned estimated coefficients.

    Default: max_sigma = 10.

Returns:

  • A named tuple with the following fields
  • x ((p+q+1,) ndarray) – Array containing the estimated values of sigma squared, followed by the q ARCH parameters and the p GARCH parameters.
  • log_likeli (float) – Value of the log-likelihood function evaluated at the estimated parameter array x.
  • aic (float) – Value of the Akaike Information Criterion (AIC) evaluated at the estimated parameter array x.
  • var ((p+q+1, p+q+1) ndarray) – Array of size (p+q+1) × (p+q+1) containing the variance-covariance matrix.

Notes

The Generalized Autoregressive Conditional Heteroskedastic (GARCH) model for a time series wt is defined as

wt=ztσt
σ2t=σ2+pi=1βiσ2ti+qi=1αiw2ti,

where zt is a sequence of independent and identically distributed standard normal random variables,

0<σ2<max_sigma,βi0,αi0,andp+q+1i=2xi=pi=1βi+qi=1αi<1.

The above model is denoted as GARCH(p, q). The βi and αi coefficients are referred to as GARCH and ARCH coefficients, respectively. When βi=0,i=1,2,,p, the above model reduces to ARCH(q) which was proposed by Engle ([1]). The nonnegativity conditions on the parameters imply a nonnegative variance and, the condition on the sum of the βi‘s and αi‘s is required for wide sense stationarity.

In the empirical analysis of observed data, GARCH(1,1) or GARCH(1,2) models have often found to appropriately account for conditional heteroskedasticity ([2]). This finding is similar to linear time series analysis based on ARMA models.

Note that for the above models, positive and negative past values have a symmetric impact on the conditional variance. In practice, many series may have a strong asymmetric influence on the conditional variance. To take into account this phenomena, Nelson ([3]) put forward exponential GARCH (EGARCH). Lai ([4], [5], [6]) proposed and studied some properties of a general class of models that extended the linear relationship of the conditional variance in ARCH and GARCH into a nonlinear relationship.

The maximum likelihood method is used in estimating the parameters in GARCH(p, q). The log-likelihood of the model for the observed series wt with length m is

log(L)=m2log(2π)12mt=1y2t/σ2t12mt=1log(σ2t),whereσ2t=σ2+pi=1βiσ2ti+qi=1αiw2ti

Thus, log(L) is maximized subject to the constraints on the αi,βi, and σ.

In this model, if q = 0, the GARCH model is singular since the estimated Hessian matrix is singular.

The initial values of the parameter vector x entered in vector guess must satisfy certain constraints. The first element of guess refers to σ2 and must be greater than zero and less than max_sigma. The remaining p+q initial values must each be greater than or equal to zero and sum to a value less than one.

To guarantee stationarity in model fitting,

p+q+1i=2xi=pi=1βi+qi=1αi<1

is checked internally. The initial values should be selected from values between zero and one.

AIC is computed by

2log(L)+2(p+q+1),

where log(L) is the value of the log-likelihood function.

Statistical inferences can be performed outside the function GARCH based on the output of the log-likelihood function (log_likeli), the Akaike Information Criterion (aic), and the variance-covariance matrix (var).

References

[1]Engle, C. (1982), Autoregressive conditional heteroskedasticity with estimates of the variance of U.K. inflation, Econometrica, 50, 987-1008.
[2]Palm, F. C. (1996), GARCH models of volatility. In Handbook of Statistics, Vol. 14, 209-240. Eds: Maddala and Rao. Elsevier, New York.
[3]Nelson, Peter (1989), Multiple Comparisons of Means Using Simultaneous Confidence Intervals, Journal of Quality Technology, 21, 232-241.
[4]Lai, D. (1998), Local Asymptotic Normality for Location-Scale Type Processes, Far East Journal of Theorectical Statistics, Vol. 2, 171-186.
[5]Lai, D. (1999), Asymptotic distributions of the correlation integral based statistics, Journal of Nonparametric Statistics, 10(2), 127-135.
[6]Lai, D. (2000), Asymptotic distribution of the estimated BDS statistic and residual analysis of AR Models on the Canadian lynx data, Journal of Biological Systems, Vol. 8, 95-114.

Examples

The data for this example are generated to follow a GARCH(p,q) process by using a random number generation function sgarch. The data set is analyzed and estimates of sigma, the ARCH and GARCH parameters, the log-likelihood and the AIC are returned.

>>> import numpy as np
>>> from imsl.timeseries.garch import garch
>>> def sgarch(p, q, m, x, y, z, y0, sigma):
...     k = max(1, p, q)
...     for i in range(0, k):
...         y0[i] = z[i] * x[0]
...     # Compute the initial value of sigma
...     s3 = 0.0
...     if max(p, q) >= 1:
...         for i in range(1, p+q+1):
...             s3 += x[i]
...     for i in range(k):
...         sigma[i] = x[0] / (1.0 - s3)
...     for i in range(k, m+1000):
...         s1 = 0.0
...         s2 = 0.0
...         if q >= 1:
...             for j in range(q):
...                 s1 += x[j + 1] * y0[i - j - 1] * y0[i - j - 1]
...         if p >= 1:
...             for j in range(p):
...                 s2 += x[q + 1 + j] * sigma[i - j - 1]
...         sigma[i] = x[0] + s1 + s2
...         y0[i] = z[i] * np.sqrt(sigma[i])
...     # Discard the first 1000 simulated observations
...     y[0:m] = y0[1000:1000+m]
>>>
>>> np.random.seed(182198625)
>>> m = 1000
>>> p = 2
>>> q = 1
>>> wk1 = np.random.normal(size=m + 1000)
>>> wk2 = np.empty(m+1000, dtype=np.float64)
>>> wk3 = np.empty(m+1000, dtype=np.float64)
>>> y = np.empty(m, dtype=np.float64)
>>> x = np.array([1.3, 0.2, 0.3, 0.4], dtype=np.float64)
>>> guess = np.array([1.0, 0.1, 0.2, 0.3], dtype=np.float64)
>>>
>>> sgarch(p, q, m, x, y, wk1, wk2, wk3)
>>>
>>> result = garch(p, q, y, guess)
>>>
>>> print("Sigma estimate is {0:11.4f}".format(result.x[0]))
... 
Sigma estimate is      1.3083
>>> print("ARCH(1) estimate is {0:11.4f}".format(result.x[1]))
... 
ARCH(1) estimate is      0.1754
>>> print("GARCH(1) estimate is {0:11.4f}".format(result.x[2]))
... 
GARCH(1) estimate is      0.3519
>>> print("GARCH(2) estimate is {0:11.4f}".format(result.x[3]))
... 
GARCH(2) estimate is      0.3477
>>> print("\nLog-likelihood function value is {0:11.4f}".format
...       (result.log_likeli)) 
Log-likelihood function value is  -2558.5405
>>> print("Akaike Information Criterion value is {0:11.4f}".format
...       (result.aic)) 
Akaike Information Criterion value is   5125.0810
>>> print("\n    Variance-covariance matrix")
... 
    Variance-covariance matrix
>>> np.set_printoptions(precision=2)
>>> print(str(result.var)) 
[[   73.91   481.41   657.06   663.43]
 [  481.55  4823.93  5019.15  5040.94]
 [  657.06  5018.17  6448.31  6523.42]
 [  663.44  5039.96  6523.44  6645.81]]