1- from  itertools  import  product 
21from  typing  import  Optional , Tuple 
32
43import  numpy  as  np 
54from  numpy .testing  import  assert_allclose 
65import  pandas  as  pd 
76import  pytest 
87
8+ from  arch .covariance .kernel  import  CovarianceEstimate 
99from  arch .covariance .var  import  PreWhitenRecoloredCovariance 
1010from  arch .typing  import  NDArray 
1111
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 ]
1412KERNELS  =  [
1513    "Bartlett" ,
1614    "Parzen" ,
@@ -32,40 +30,6 @@ def kernel(request):
3230    return  request .param 
3331
3432
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- 
6933def  direct_var (
7034    x , const : bool , full_order : int , diag_order : int , max_order : Optional [int ] =  None 
7135) ->  Tuple [NDArray , NDArray ]:
@@ -140,29 +104,38 @@ def direct_ic(
140104@pytest .mark .parametrize ("diag_order" , [3 , 5 ]) 
141105@pytest .mark .parametrize ("max_order" , [None , 10 ]) 
142106@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 )
107+ def  test_direct_var (covariance_data , const , full_order , diag_order , max_order , ic ):
108+     direct_ic (covariance_data , ic , const , full_order , diag_order , max_order )
145109
146110
147111@pytest .mark .parametrize ("center" , [True , False ]) 
148112@pytest .mark .parametrize ("diagonal" , [True , False ]) 
149113@pytest .mark .parametrize ("method" , ["aic" , "bic" , "hqc" ]) 
150- def  test_ic (data , center , diagonal , method ):
114+ def  test_ic (covariance_data , center , diagonal , method ):
151115    pwrc  =  PreWhitenRecoloredCovariance (
152-         data , center = center , diagonal = diagonal , method = method , bandwidth = 0.0 ,
116+         covariance_data , center = center , diagonal = diagonal , method = method , bandwidth = 0.0 ,
153117    )
154118    cov  =  pwrc .cov 
155-     expected_type  =  np .ndarray  if  isinstance (data , np .ndarray ) else  pd .DataFrame 
119+     expected_type  =  (
120+         np .ndarray  if  isinstance (covariance_data , np .ndarray ) else  pd .DataFrame 
121+     )
156122    assert  isinstance (cov .short_run , expected_type )
157-     expected_max_lag  =  int (data .shape [0 ] **  (1  /  3 ))
123+     expected_max_lag  =  int (covariance_data .shape [0 ] **  (1  /  3 ))
158124    assert  pwrc ._max_lag  ==  expected_max_lag 
159125    expected_ics  =  {}
160126    for  full_order  in  range (expected_max_lag  +  1 ):
161127        diag_limit  =  expected_max_lag  +  1  if  diagonal  else  full_order  +  1 
128+         if  covariance_data .ndim  ==  1  or  covariance_data .shape [1 ] ==  1 :
129+             diag_limit  =  full_order  +  1 
162130        for  diag_order  in  range (full_order , diag_limit ):
163131            key  =  (full_order , diag_order )
164132            expected_ics [key ] =  direct_ic (
165-                 data , method , center , full_order , diag_order , max_order = expected_max_lag 
133+                 covariance_data ,
134+                 method ,
135+                 center ,
136+                 full_order ,
137+                 diag_order ,
138+                 max_order = expected_max_lag ,
166139            )
167140    assert  tuple (sorted (pwrc ._ics .keys ())) ==  tuple (sorted (expected_ics .keys ()))
168141    for  key  in  expected_ics :
@@ -175,13 +148,18 @@ def test_ic(data, center, diagonal, method):
175148@pytest .mark .parametrize ("diagonal" , [True , False ]) 
176149@pytest .mark .parametrize ("method" , ["aic" , "bic" , "hqc" ]) 
177150@pytest .mark .parametrize ("lags" , [0 , 1 , 3 ]) 
178- def  test_short_long_run (data , center , diagonal , method , lags ):
151+ def  test_short_long_run (covariance_data , center , diagonal , method , lags ):
179152    pwrc  =  PreWhitenRecoloredCovariance (
180-         data , center = center , diagonal = diagonal , method = method , lags = lags , bandwidth = 0.0 ,
153+         covariance_data ,
154+         center = center ,
155+         diagonal = diagonal ,
156+         method = method ,
157+         lags = lags ,
158+         bandwidth = 0.0 ,
181159    )
182160    cov  =  pwrc .cov 
183161    full_order , diag_order  =  pwrc ._order 
184-     params , resids  =  direct_var (data , center , full_order , diag_order )
162+     params , resids  =  direct_var (covariance_data , center , full_order , diag_order )
185163    nobs , nvar  =  resids .shape 
186164    expected_short_run  =  resids .T  @ resids  /  nobs 
187165    assert_allclose (cov .short_run , expected_short_run )
@@ -195,12 +173,29 @@ def test_short_long_run(data, center, diagonal, method, lags):
195173    assert_allclose (cov .long_run , expected_long_run )
196174
197175
176+ @pytest .mark .parametrize ("force_int" , [True , False ]) 
177+ def  test_pwrc_attributes (covariance_data , force_int ):
178+     pwrc  =  PreWhitenRecoloredCovariance (covariance_data , force_int = force_int )
179+     assert  isinstance (pwrc .bandwidth_scale , float )
180+     assert  isinstance (pwrc .kernel_const , float )
181+     assert  isinstance (pwrc .rate , float )
182+     assert  isinstance (pwrc ._weights (), np .ndarray )
183+     assert  pwrc .force_int  ==  force_int 
184+     expected_type  =  (
185+         np .ndarray  if  isinstance (covariance_data , np .ndarray ) else  pd .DataFrame 
186+     )
187+     assert  isinstance (pwrc .cov .short_run , expected_type )
188+     assert  isinstance (pwrc .cov .long_run , expected_type )
189+     assert  isinstance (pwrc .cov .one_sided , expected_type )
190+     assert  isinstance (pwrc .cov .one_sided_strict , expected_type )
191+ 
192+ 
198193@pytest .mark .parametrize ("sample_autocov" , [True , False ]) 
199- def  test_data (data , sample_autocov ):
194+ def  test_data (covariance_data , sample_autocov ,  kernel ):
200195    pwrc  =  PreWhitenRecoloredCovariance (
201-         data , sample_autocov = sample_autocov , bandwidth = 0.0 
196+         covariance_data , sample_autocov = sample_autocov ,  kernel = kernel , bandwidth = 0.0 
202197    )
203-     pwrc .cov 
198+     assert   isinstance ( pwrc .cov ,  CovarianceEstimate ) 
204199
205200
206201def  test_pwrc_errors ():
@@ -216,4 +211,9 @@ def test_pwrc_errors():
216211def  test_pwrc_warnings ():
217212    x  =  np .random .standard_normal ((9 , 5 ))
218213    with  pytest .warns (RuntimeWarning , match = "The maximum number of lags is 0" ):
219-         PreWhitenRecoloredCovariance (x ).cov 
214+         assert  isinstance (PreWhitenRecoloredCovariance (x ).cov , CovarianceEstimate )
215+ 
216+ 
217+ def  test_unknown_kernel (covariance_data ):
218+     with  pytest .raises (ValueError , match = "" ):
219+         PreWhitenRecoloredCovariance (covariance_data , kernel = "unknown" )
0 commit comments