Skip to content

Commit 7ce242b

Browse files
committed
Expand FIAPARCH test coverage for edge cases and partial branches
Cover the two partial-coverage lines flagged by Codecov (q=0 branch in fiaparch_recursion_python, persistence >= 1 simulation path) and exercise additional edge cases: p=0/q=0 recursion, updater buffer reuse, and compute_variance sigma_delta reuse. Made-with: Cursor
1 parent 11d18ab commit 7ce242b

1 file changed

Lines changed: 72 additions & 0 deletions

File tree

arch/tests/univariate/test_volatility.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,12 @@ def test_fiaparch(setup):
18581858
fiaparch.compute_variance(
18591859
parameters, setup.resids, setup.sigma2, backcast, var_bounds
18601860
)
1861+
# Call again to exercise the sigma_delta buffer reuse path
1862+
sigma2_second = np.zeros_like(setup.sigma2)
1863+
fiaparch.compute_variance(
1864+
parameters, setup.resids, sigma2_second, backcast, var_bounds
1865+
)
1866+
assert_allclose(setup.sigma2, sigma2_second)
18611867

18621868
cond_var_direct = np.zeros_like(setup.sigma2)
18631869
sigma_delta_direct = np.zeros_like(setup.sigma2)
@@ -1967,6 +1973,13 @@ def test_fiaparch_updater_matches_recursion(setup, o, delta):
19671973

19681974
assert_allclose(sigma2_updater, sigma2)
19691975

1976+
# Second initialize_update to exercise the buffer-already-allocated branch
1977+
updater.initialize_update(parameters, backcast, setup.t)
1978+
sigma2_updater2 = np.zeros_like(setup.sigma2)
1979+
for t in range(setup.t):
1980+
updater._update_tester(t, parameters, setup.resids, sigma2_updater2, var_bounds)
1981+
assert_allclose(sigma2_updater2, sigma2)
1982+
19701983

19711984
def test_fiaparch_no_phi(setup):
19721985
trunc_lag = 333
@@ -2024,6 +2037,28 @@ def test_fiaparch_no_beta(setup):
20242037
fiaparch.compute_variance(parameters, setup.resids, sigma2, backcast, var_bounds)
20252038
assert np.all(np.isfinite(sigma2))
20262039

2040+
cond_var_direct = np.zeros_like(setup.sigma2)
2041+
sigma_delta_direct = np.zeros_like(setup.sigma2)
2042+
fig_params = parameters[:3] # omega, phi, d (no beta)
2043+
gamma = parameters[3]
2044+
delta = parameters[4]
2045+
recpy.fiaparch_recursion_python(
2046+
fig_params,
2047+
setup.resids,
2048+
np.abs(setup.resids),
2049+
cond_var_direct,
2050+
sigma_delta_direct,
2051+
1,
2052+
0,
2053+
setup.t,
2054+
1000,
2055+
backcast,
2056+
var_bounds,
2057+
gamma,
2058+
delta,
2059+
)
2060+
assert_allclose(sigma2, cond_var_direct)
2061+
20272062

20282063
def test_fiaparch_no_asym(setup):
20292064
fiaparch = FIAPARCH(o=0)
@@ -2141,6 +2176,21 @@ def test_fiaparch_simulate_high_beta(setup):
21412176
fiaparch.simulate(parameters, 20, rng.simulate([]))
21422177

21432178

2179+
def test_fiaparch_simulate_persistence_ge_1(setup):
2180+
fiaparch = FIAPARCH(truncation=100)
2181+
rng = Normal(seed=RandomState())
2182+
# d > 1 pushes persistence >= 1
2183+
parameters = np.array([0.1, 0.2, 1.01, 0.2, -0.3, 1.5])
2184+
fig_params = parameters[:4]
2185+
lam = rec.figarch_weights(fig_params[1:], 1, 1, 100)
2186+
persistence = np.sum(lam)
2187+
assert persistence >= 1
2188+
with pytest.warns(InitialValueWarning):
2189+
sim_data = fiaparch.simulate(parameters, 20, rng.simulate([]))
2190+
assert sim_data[0].shape[0] == 20
2191+
assert sim_data[1].shape[0] == 20
2192+
2193+
21442194
@pytest.mark.parametrize(
21452195
"p,o,q",
21462196
[(0, 1, 1), (1, 0, 1), (1, 1, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (0, 0, 0)],
@@ -2220,6 +2270,28 @@ def test_fiaparch_minimal(setup):
22202270
fiaparch.compute_variance(parameters, setup.resids, sigma2, backcast, var_bounds)
22212271
assert np.all(np.isfinite(sigma2))
22222272

2273+
cond_var_direct = np.zeros_like(setup.sigma2)
2274+
sigma_delta_direct = np.zeros_like(setup.sigma2)
2275+
fig_params = parameters[:2] # omega, d (no phi, no beta)
2276+
gamma = parameters[2]
2277+
delta = parameters[3]
2278+
recpy.fiaparch_recursion_python(
2279+
fig_params,
2280+
setup.resids,
2281+
np.abs(setup.resids),
2282+
cond_var_direct,
2283+
sigma_delta_direct,
2284+
0,
2285+
0,
2286+
setup.t,
2287+
1000,
2288+
backcast,
2289+
var_bounds,
2290+
gamma,
2291+
delta,
2292+
)
2293+
assert_allclose(sigma2, cond_var_direct)
2294+
22232295

22242296
def test_fiaparch_errors(setup):
22252297
with pytest.raises(ValueError, match=r"truncation must be a positive integer"):

0 commit comments

Comments
 (0)