1- from itertools import product
21from typing import Optional , Tuple
32
43import numpy as np
98from arch .covariance .var import PreWhitenRecoloredCovariance
109from arch .typing import NDArray
1110
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 ]
1411KERNELS = [
1512 "Bartlett" ,
1613 "Parzen" ,
@@ -32,40 +29,6 @@ def kernel(request):
3229 return request .param
3330
3431
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-
6932def direct_var (
7033 x , const : bool , full_order : int , diag_order : int , max_order : Optional [int ] = None
7134) -> Tuple [NDArray , NDArray ]:
@@ -140,29 +103,36 @@ def direct_ic(
140103@pytest .mark .parametrize ("diag_order" , [3 , 5 ])
141104@pytest .mark .parametrize ("max_order" , [None , 10 ])
142105@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 )
145108
146109
147110@pytest .mark .parametrize ("center" , [True , False ])
148111@pytest .mark .parametrize ("diagonal" , [True , False ])
149112@pytest .mark .parametrize ("method" , ["aic" , "bic" , "hqc" ])
150- def test_ic (data , center , diagonal , method ):
113+ def test_ic (covariance_data , center , diagonal , method ):
151114 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 ,
153116 )
154117 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+ )
156121 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 ))
158123 assert pwrc ._max_lag == expected_max_lag
159124 expected_ics = {}
160125 for full_order in range (expected_max_lag + 1 ):
161126 diag_limit = expected_max_lag + 1 if diagonal else full_order + 1
162127 for diag_order in range (full_order , diag_limit ):
163128 key = (full_order , diag_order )
164129 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 ,
166136 )
167137 assert tuple (sorted (pwrc ._ics .keys ())) == tuple (sorted (expected_ics .keys ()))
168138 for key in expected_ics :
@@ -175,13 +145,18 @@ def test_ic(data, center, diagonal, method):
175145@pytest .mark .parametrize ("diagonal" , [True , False ])
176146@pytest .mark .parametrize ("method" , ["aic" , "bic" , "hqc" ])
177147@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 ):
179149 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 ,
181156 )
182157 cov = pwrc .cov
183158 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 )
185160 nobs , nvar = resids .shape
186161 expected_short_run = resids .T @ resids / nobs
187162 assert_allclose (cov .short_run , expected_short_run )
@@ -195,10 +170,27 @@ def test_short_long_run(data, center, diagonal, method, lags):
195170 assert_allclose (cov .long_run , expected_long_run )
196171
197172
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+
198190@pytest .mark .parametrize ("sample_autocov" , [True , False ])
199- def test_data (data , sample_autocov ):
191+ def test_data (covariance_data , sample_autocov ):
200192 pwrc = PreWhitenRecoloredCovariance (
201- data , sample_autocov = sample_autocov , bandwidth = 0.0
193+ covariance_data , sample_autocov = sample_autocov , bandwidth = 0.0
202194 )
203195 pwrc .cov
204196
@@ -217,3 +209,8 @@ def test_pwrc_warnings():
217209 x = np .random .standard_normal ((9 , 5 ))
218210 with pytest .warns (RuntimeWarning , match = "The maximum number of lags is 0" ):
219211 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