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