1
- from itertools import product
2
1
from typing import Optional , Tuple
3
2
4
3
import numpy as np
9
8
from arch .covariance .var import PreWhitenRecoloredCovariance
10
9
from arch .typing import NDArray
11
10
12
- DATA_PARAMS = list (product ([1 , 3 ], [True , False ], [0 ])) # , 1, 3]))
13
- DATA_IDS = [f"dim: { d } , pandas: { p } , order: { o } " for d , p , o in DATA_PARAMS ]
14
11
KERNELS = [
15
12
"Bartlett" ,
16
13
"Parzen" ,
@@ -32,40 +29,6 @@ def kernel(request):
32
29
return request .param
33
30
34
31
35
- @pytest .fixture (scope = "module" , params = DATA_PARAMS , ids = DATA_IDS )
36
- def data (request ):
37
- dim , pandas , order = request .param
38
- rs = np .random .RandomState ([839084 , 3823810 , 982103 , 829108 ])
39
- burn = 100
40
- shape = (burn + 500 ,)
41
- if dim > 1 :
42
- shape += (3 ,)
43
- rvs = rs .standard_normal (shape )
44
- phi = np .zeros ((order , dim , dim ))
45
- if order > 0 :
46
- phi [0 ] = np .eye (dim ) * 0.4 + 0.1
47
- for i in range (1 , order ):
48
- phi [i ] = 0.3 / (i + 1 ) * np .eye (dim )
49
- for i in range (order , burn + 500 ):
50
- for j in range (order ):
51
- if dim == 1 :
52
- rvs [i ] += np .squeeze (phi [j ] * rvs [i - j - 1 ])
53
- else :
54
- rvs [i ] += phi [j ] @ rvs [i - j - 1 ]
55
- if order > 1 :
56
- p = np .eye (dim * order , dim * order , - dim )
57
- for j in range (order ):
58
- p [:dim , j * dim : (j + 1 ) * dim ] = phi [j ]
59
- v , _ = np .linalg .eig (p )
60
- assert np .max (np .abs (v )) < 1
61
- rvs = rvs [burn :]
62
- if pandas and dim == 1 :
63
- return pd .Series (rvs , name = "x" )
64
- elif pandas :
65
- return pd .DataFrame (rvs , columns = [f"x{ i } " for i in range (dim )])
66
- return rvs
67
-
68
-
69
32
def direct_var (
70
33
x , const : bool , full_order : int , diag_order : int , max_order : Optional [int ] = None
71
34
) -> Tuple [NDArray , NDArray ]:
@@ -140,29 +103,36 @@ def direct_ic(
140
103
@pytest .mark .parametrize ("diag_order" , [3 , 5 ])
141
104
@pytest .mark .parametrize ("max_order" , [None , 10 ])
142
105
@pytest .mark .parametrize ("ic" , ["aic" , "bic" , "hqc" ])
143
- def test_direct_var (data , const , full_order , diag_order , max_order , ic ):
144
- direct_ic (data , ic , const , full_order , diag_order , max_order )
106
+ def test_direct_var (covariance_data , const , full_order , diag_order , max_order , ic ):
107
+ direct_ic (covariance_data , ic , const , full_order , diag_order , max_order )
145
108
146
109
147
110
@pytest .mark .parametrize ("center" , [True , False ])
148
111
@pytest .mark .parametrize ("diagonal" , [True , False ])
149
112
@pytest .mark .parametrize ("method" , ["aic" , "bic" , "hqc" ])
150
- def test_ic (data , center , diagonal , method ):
113
+ def test_ic (covariance_data , center , diagonal , method ):
151
114
pwrc = PreWhitenRecoloredCovariance (
152
- data , center = center , diagonal = diagonal , method = method , bandwidth = 0.0 ,
115
+ covariance_data , center = center , diagonal = diagonal , method = method , bandwidth = 0.0 ,
153
116
)
154
117
cov = pwrc .cov
155
- expected_type = np .ndarray if isinstance (data , np .ndarray ) else pd .DataFrame
118
+ expected_type = (
119
+ np .ndarray if isinstance (covariance_data , np .ndarray ) else pd .DataFrame
120
+ )
156
121
assert isinstance (cov .short_run , expected_type )
157
- expected_max_lag = int (data .shape [0 ] ** (1 / 3 ))
122
+ expected_max_lag = int (covariance_data .shape [0 ] ** (1 / 3 ))
158
123
assert pwrc ._max_lag == expected_max_lag
159
124
expected_ics = {}
160
125
for full_order in range (expected_max_lag + 1 ):
161
126
diag_limit = expected_max_lag + 1 if diagonal else full_order + 1
162
127
for diag_order in range (full_order , diag_limit ):
163
128
key = (full_order , diag_order )
164
129
expected_ics [key ] = direct_ic (
165
- data , method , center , full_order , diag_order , max_order = expected_max_lag
130
+ covariance_data ,
131
+ method ,
132
+ center ,
133
+ full_order ,
134
+ diag_order ,
135
+ max_order = expected_max_lag ,
166
136
)
167
137
assert tuple (sorted (pwrc ._ics .keys ())) == tuple (sorted (expected_ics .keys ()))
168
138
for key in expected_ics :
@@ -175,13 +145,18 @@ def test_ic(data, center, diagonal, method):
175
145
@pytest .mark .parametrize ("diagonal" , [True , False ])
176
146
@pytest .mark .parametrize ("method" , ["aic" , "bic" , "hqc" ])
177
147
@pytest .mark .parametrize ("lags" , [0 , 1 , 3 ])
178
- def test_short_long_run (data , center , diagonal , method , lags ):
148
+ def test_short_long_run (covariance_data , center , diagonal , method , lags ):
179
149
pwrc = PreWhitenRecoloredCovariance (
180
- data , center = center , diagonal = diagonal , method = method , lags = lags , bandwidth = 0.0 ,
150
+ covariance_data ,
151
+ center = center ,
152
+ diagonal = diagonal ,
153
+ method = method ,
154
+ lags = lags ,
155
+ bandwidth = 0.0 ,
181
156
)
182
157
cov = pwrc .cov
183
158
full_order , diag_order = pwrc ._order
184
- params , resids = direct_var (data , center , full_order , diag_order )
159
+ params , resids = direct_var (covariance_data , center , full_order , diag_order )
185
160
nobs , nvar = resids .shape
186
161
expected_short_run = resids .T @ resids / nobs
187
162
assert_allclose (cov .short_run , expected_short_run )
@@ -195,10 +170,27 @@ def test_short_long_run(data, center, diagonal, method, lags):
195
170
assert_allclose (cov .long_run , expected_long_run )
196
171
197
172
173
+ @pytest .mark .parametrize ("force_int" , [True , False ])
174
+ def test_pwrc_attributes (covariance_data , force_int ):
175
+ pwrc = PreWhitenRecoloredCovariance (covariance_data , force_int = force_int )
176
+ assert isinstance (pwrc .bandwidth_scale , float )
177
+ assert isinstance (pwrc .kernel_const , float )
178
+ assert isinstance (pwrc .rate , float )
179
+ assert isinstance (pwrc ._weights (), np .ndarray )
180
+ assert pwrc .force_int == force_int
181
+ expected_type = (
182
+ np .ndarray if isinstance (covariance_data , np .ndarray ) else pd .DataFrame
183
+ )
184
+ assert isinstance (pwrc .cov .short_run , expected_type )
185
+ assert isinstance (pwrc .cov .long_run , expected_type )
186
+ assert isinstance (pwrc .cov .one_sided , expected_type )
187
+ assert isinstance (pwrc .cov .one_sided_strict , expected_type )
188
+
189
+
198
190
@pytest .mark .parametrize ("sample_autocov" , [True , False ])
199
- def test_data (data , sample_autocov ):
191
+ def test_data (covariance_data , sample_autocov ):
200
192
pwrc = PreWhitenRecoloredCovariance (
201
- data , sample_autocov = sample_autocov , bandwidth = 0.0
193
+ covariance_data , sample_autocov = sample_autocov , bandwidth = 0.0
202
194
)
203
195
pwrc .cov
204
196
@@ -217,3 +209,8 @@ def test_pwrc_warnings():
217
209
x = np .random .standard_normal ((9 , 5 ))
218
210
with pytest .warns (RuntimeWarning , match = "The maximum number of lags is 0" ):
219
211
PreWhitenRecoloredCovariance (x ).cov
212
+
213
+
214
+ def test_unknown_kernel (covariance_data ):
215
+ with pytest .raises (ValueError , match = "" ):
216
+ PreWhitenRecoloredCovariance (covariance_data , kernel = "unknown" )
0 commit comments