Integer type:  int32  int64  nag_int  show int32  show int32  show int64  show int64  show nag_int  show nag_int

Chapter Contents
Chapter Introduction
NAG Toolbox

# NAG Toolbox: nag_rand_times_garch_exp (g05pg)

## Purpose

nag_rand_times_garch_exp (g05pg) generates a given number of terms of an exponential GARCH(p,q)$\text{GARCH}\left(p,q\right)$ process (see Engle and Ng (1993)).

## Syntax

[ht, et, r, state, ifail] = g05pg(dist, num, ip, iq, theta, df, fcall, r, state, 'lr', lr)
[ht, et, r, state, ifail] = nag_rand_times_garch_exp(dist, num, ip, iq, theta, df, fcall, r, state, 'lr', lr)

## Description

An exponential GARCH(p,q)$\text{GARCH}\left(p,q\right)$ process is represented by:
 q q p ln(ht) = α0 + ∑ αizt − i + ∑ φi(|zt − i| − E[|zt − i|]) + ∑ βjln(ht − j),  t = 1,2, … ,T; i = 1 i = 1 j = 1
$ln(ht)=α0+∑i=1qαizt-i+∑i=1qϕi(|zt-i|-E[|zt-i|])+∑j=1pβjln(ht-j), t=1,2,…,T;$
where zt = (εt)/(sqrt(ht)) ${z}_{t}=\frac{{\epsilon }_{t}}{\sqrt{{h}_{t}}}$, E[|zti|]$E\left[|{z}_{t-i}|\right]$ denotes the expected value of |zti|$|{z}_{t-i}|$, and εtψt1 = N(0,ht)${\epsilon }_{t}\mid {\psi }_{t-1}=N\left(0,{h}_{t}\right)$ or εtψt1 = St(df,ht)${\epsilon }_{t}\mid {\psi }_{t-1}={S}_{t}\left(\mathit{df},{h}_{t}\right)$. Here St${S}_{t}$ is a standardized Student's t$t$-distribution with df$\mathit{df}$ degrees of freedom and variance ht${h}_{t}$, T$T$ is the number of observations in the sequence, εt${\epsilon }_{t}$ is the observed value of the GARCH(p,q)$\text{GARCH}\left(p,q\right)$ process at time t$t$, ht${h}_{t}$ is the conditional variance at time t$t$, and ψt${\psi }_{t}$ the set of all information up to time t$t$.
One of the initialization functions nag_rand_init_repeat (g05kf) (for a repeatable sequence if computed sequentially) or nag_rand_init_nonrepeat (g05kg) (for a non-repeatable sequence) must be called prior to the first call to nag_rand_times_garch_exp (g05pg).

## References

Bollerslev T (1986) Generalised autoregressive conditional heteroskedasticity Journal of Econometrics 31 307–327
Engle R (1982) Autoregressive conditional heteroskedasticity with estimates of the variance of United Kingdom inflation Econometrica 50 987–1008
Engle R and Ng V (1993) Measuring and testing the impact of news on volatility Journal of Finance 48 1749–1777
Glosten L, Jagannathan R and Runkle D (1993) Relationship between the expected value and the volatility of nominal excess return on stocks Journal of Finance 48 1779–1801
Hamilton J (1994) Time Series Analysis Princeton University Press

## Parameters

### Compulsory Input Parameters

1:     dist – string (length ≥ 1)
The type of distribution to use for εt${\epsilon }_{t}$.
dist = 'N'${\mathbf{dist}}=\text{'N'}$
A Normal distribution is used.
dist = 'T'${\mathbf{dist}}=\text{'T'}$
A Student's t$t$-distribution is used.
Constraint: dist = 'N'${\mathbf{dist}}=\text{'N'}$ or 'T'$\text{'T'}$.
2:     num – int64int32nag_int scalar
T$T$, the number of terms in the sequence.
Constraint: num0${\mathbf{num}}\ge 0$.
3:     ip – int64int32nag_int scalar
The number of coefficients, βi${\beta }_{\mathit{i}}$, for i = 1,2,,p$\mathit{i}=1,2,\dots ,p$.
Constraint: ip0${\mathbf{ip}}\ge 0$.
4:     iq – int64int32nag_int scalar
The number of coefficients, αi${\alpha }_{\mathit{i}}$, for i = 1,2,,q$\mathit{i}=1,2,\dots ,q$.
Constraint: iq1${\mathbf{iq}}\ge 1$.
5:     theta(2 × iq + ip + 1$2×{\mathbf{iq}}+{\mathbf{ip}}+1$) – double array
The initial parameter estimates for the vector θ$\theta$. The first element must contain the coefficient αo${\alpha }_{o}$ and the next iq elements must contain the autoregressive coefficients αi${\alpha }_{\mathit{i}}$, for i = 1,2,,q$\mathit{i}=1,2,\dots ,q$. The next iq elements must contain the coefficients φi${\varphi }_{\mathit{i}}$, for i = 1,2,,q$\mathit{i}=1,2,\dots ,q$. The next ip elements must contain the moving average coefficients βj${\beta }_{\mathit{j}}$, for j = 1,2,,p$\mathit{j}=1,2,\dots ,p$.
Constraints:
• i = 1p βi1.0$\sum _{\mathit{i}=1}^{p}{\beta }_{i}\ne 1.0$;
• (α0)/( 1 i = 1p βi ) log(x02am) $\frac{{\alpha }_{0}}{1-\sum _{\mathit{i}=1}^{p}{\beta }_{i}}\le -\mathrm{log}\left(\mathbf{x02am}\right)$.
6:     df – int64int32nag_int scalar
The number of degrees of freedom for the Student's t$t$-distribution.
If dist = 'N'${\mathbf{dist}}=\text{'N'}$, df is not referenced.
Constraint: if dist = 'T'${\mathbf{dist}}=\text{'T'}$, df > 2${\mathbf{df}}>2$.
7:     fcall – logical scalar
If fcall = true${\mathbf{fcall}}=\mathbf{true}$, a new sequence is to be generated, otherwise a given sequence is to be continued using the information in r.
8:     r(lr) – double array
lr, the dimension of the array, must satisfy the constraint lr2 × (ip + 2 × iq + 2)${\mathbf{lr}}\ge 2×\left({\mathbf{ip}}+2×{\mathbf{iq}}+2\right)$.
The array contains information required to continue a sequence if fcall = false${\mathbf{fcall}}=\mathbf{false}$.
9:     state( : $:$) – int64int32nag_int array
Note: the actual argument supplied must be the array state supplied to the initialization routines nag_rand_init_repeat (g05kf) or nag_rand_init_nonrepeat (g05kg).
Contains information on the selected base generator and its current state.

### Optional Input Parameters

1:     lr – int64int32nag_int scalar
Default: The dimension of the array r.
The dimension of the array r as declared in the (sub)program from which nag_rand_times_garch_exp (g05pg) is called.
Constraint: lr2 × (ip + 2 × iq + 2)${\mathbf{lr}}\ge 2×\left({\mathbf{ip}}+2×{\mathbf{iq}}+2\right)$.

None.

### Output Parameters

1:     ht(num) – double array
The conditional variances ht${h}_{\mathit{t}}$, for t = 1,2,,T$\mathit{t}=1,2,\dots ,T$, for the GARCH(p,q)$\text{GARCH}\left(p,q\right)$ sequence.
2:     et(num) – double array
The observations εt${\epsilon }_{\mathit{t}}$, for t = 1,2,,T$\mathit{t}=1,2,\dots ,T$, for the GARCH(p,q)$\text{GARCH}\left(p,q\right)$ sequence.
3:     r(lr) – double array
Contains information that can be used in a subsequent call of nag_rand_times_garch_exp (g05pg), with fcall = false${\mathbf{fcall}}=\mathbf{false}$.
4:     state( : $:$) – int64int32nag_int array
Note: the actual argument supplied must be the array state supplied to the initialization routines nag_rand_init_repeat (g05kf) or nag_rand_init_nonrepeat (g05kg).
Contains updated information on the state of the generator.
5:     ifail – int64int32nag_int scalar
${\mathrm{ifail}}={\mathbf{0}}$ unless the function detects an error (see [Error Indicators and Warnings]).

## Error Indicators and Warnings

Errors or warnings detected by the function:
ifail = 1${\mathbf{ifail}}=1$
 On entry, dist ≠ 'N'${\mathbf{dist}}\ne \text{'N'}$ or 'T'$\text{'T'}$.
ifail = 2${\mathbf{ifail}}=2$
 On entry, num < 0${\mathbf{num}}<0$.
ifail = 3${\mathbf{ifail}}=3$
 On entry, ip < 0${\mathbf{ip}}<0$.
ifail = 4${\mathbf{ifail}}=4$
 On entry, iq < 1${\mathbf{iq}}<1$.
ifail = 6${\mathbf{ifail}}=6$
 On entry, dist = 'T'${\mathbf{dist}}=\text{'T'}$ and df ≤ 2${\mathbf{df}}\le 2$.
ifail = 10${\mathbf{ifail}}=10$
The value of ip or iq is not the same as when r was set up in a previous call.
ifail = 11${\mathbf{ifail}}=11$
 On entry, lr < 2 × (ip + iq + 2)${\mathbf{lr}}<2×\left({\mathbf{ip}}+{\mathbf{iq}}+2\right)$.
ifail = 12${\mathbf{ifail}}=12$
 On entry, state vector was not initialized or has been corrupted.
ifail = 20${\mathbf{ifail}}=20$
Invalid sequence generated, use different parameters.

Not applicable.

None.

## Example

```function nag_rand_times_garch_exp_example
% Initialize the seed
seed = [int64(1762543)];
% genid and subid identify the base generator
genid = int64(1);
subid =  int64(1);

dist = 'N';
num = 10;
ip = 1;
iq = 1;
theta = [0.1; -0.3; 0.1; 0.9];
df = int64(0);
fcall = true;
r = zeros(2*(2*ip+iq+2),1);
% Initialize the generator to a repeatable sequence
[state, ifail] = nag_rand_init_repeat(genid, subid, seed);

% Generate the first realisation
[ht, et, r, state, ifail] = nag_rand_times_garch_exp(dist, int64(num), int64(ip), int64(iq), ...
theta, df, fcall, r, state);
% Display the results
if ifail == 0
fprintf('\n Realisation Number 1\n');
fprintf('   I            HT(I)            ET(I)\n');
fprintf('  --------------------------------------\n');
for i=1:num
fprintf('  %2d  %16.4f %16.4f\n', i, ht(i), et(i));
end
else
fprintf('\n nag_rand_times_garch_exp exited with ifail = %d \n', ifail);
end

% Generate a second realisation
fcall = false;
[ht, et, r, state, ifail] = nag_rand_times_garch_exp(dist, int64(num), int64(ip), int64(iq), ...
theta, df, fcall, r, state);
% Display the results
if ifail == 0
fprintf('\n Realisation Number 2\n');
fprintf('   I            HT(I)            ET(I)\n');
fprintf('  --------------------------------------\n');
for i=1:num
fprintf('  %2d  %16.4f %16.4f\n', i, ht(i), et(i));
end
else
fprintf('\n nag_rand_times_garch_exp exited with ifail = %d \n', ifail);
end
```
```

Realisation Number 1
I            HT(I)            ET(I)
--------------------------------------
1            2.5098           0.5526
2            2.1785          -1.8383
3            3.3844           1.2180
4            2.6780           1.3672
5            2.0953          -1.8178
6            3.2813          -0.0343
7            2.9958          -0.5094
8            3.0815           1.3978
9            2.3961          -0.0070
10            2.2445           0.6661

Realisation Number 2
I            HT(I)            ET(I)
--------------------------------------
1            1.9327          -2.2795
2            3.5577          -1.2249
3            4.1461           0.6424
4            3.4455          -2.9920
5            5.9199           0.5777
6            4.8221          -1.2894
7            5.3174          -1.6473
8            6.1095           6.1689
9            3.1579           2.2935
10            2.2189           0.1141

```
```function g05pg_example
% Initialize the seed
seed = [int64(1762543)];
% genid and subid identify the base generator
genid = int64(1);
subid =  int64(1);

dist = 'N';
num = 10;
ip = 1;
iq = 1;
theta = [0.1; -0.3; 0.1; 0.9];
df = int64(0);
fcall = true;
r = zeros(2*(2*ip+iq+2),1);
% Initialize the generator to a repeatable sequence
[state, ifail] = g05kf(genid, subid, seed);

% Generate the first realisation
[ht, et, r, state, ifail] = g05pg(dist, int64(num), int64(ip), int64(iq), ...
theta, df, fcall, r, state);
% Display the results
if ifail == 0
fprintf('\n Realisation Number 1\n');
fprintf('   I            HT(I)            ET(I)\n');
fprintf('  --------------------------------------\n');
for i=1:num
fprintf('  %2d  %16.4f %16.4f\n', i, ht(i), et(i));
end
else
fprintf('\n g05pg exited with ifail = %d \n', ifail);
end

% Generate a second realisation
fcall = false;
[ht, et, r, state, ifail] = g05pg(dist, int64(num), int64(ip), int64(iq), ...
theta, df, fcall, r, state);
% Display the results
if ifail == 0
fprintf('\n Realisation Number 2\n');
fprintf('   I            HT(I)            ET(I)\n');
fprintf('  --------------------------------------\n');
for i=1:num
fprintf('  %2d  %16.4f %16.4f\n', i, ht(i), et(i));
end
else
fprintf('\n g05pg exited with ifail = %d \n', ifail);
end
```
```

Realisation Number 1
I            HT(I)            ET(I)
--------------------------------------
1            2.5098           0.5526
2            2.1785          -1.8383
3            3.3844           1.2180
4            2.6780           1.3672
5            2.0953          -1.8178
6            3.2813          -0.0343
7            2.9958          -0.5094
8            3.0815           1.3978
9            2.3961          -0.0070
10            2.2445           0.6661

Realisation Number 2
I            HT(I)            ET(I)
--------------------------------------
1            1.9327          -2.2795
2            3.5577          -1.2249
3            4.1461           0.6424
4            3.4455          -2.9920
5            5.9199           0.5777
6            4.8221          -1.2894
7            5.3174          -1.6473
8            6.1095           6.1689
9            3.1579           2.2935
10            2.2189           0.1141

```