@@ -1979,11 +1979,23 @@ def test_fiaparch_no_phi(setup):
19791979 # omega, d, beta, gamma, delta
19801980 assert len (bounds ) == fiaparch .num_params
19811981
1982+ names = fiaparch .parameter_names ()
1983+ assert "phi" not in names
1984+ assert names == ["omega" , "d" , "beta" , "gamma" , "delta" ]
1985+
19821986 a , _ = fiaparch .constraints ()
19831987 # No phi => FIGARCH block shrinks (5 rows), gamma (2 rows), delta (2 rows) = 9
19841988 assert a .shape [1 ] == 5
19851989 assert a .shape [0 ] == 9
19861990
1991+ backcast = fiaparch .backcast (setup .resids )
1992+ var_bounds = fiaparch .variance_bounds (setup .resids )
1993+ # omega, d, beta, gamma, delta (no phi)
1994+ parameters = np .array ([1.0 , 0.4 , 0.2 , - 0.3 , 1.5 ])
1995+ sigma2 = np .zeros_like (setup .sigma2 )
1996+ fiaparch .compute_variance (parameters , setup .resids , sigma2 , backcast , var_bounds )
1997+ assert np .all (np .isfinite (sigma2 ))
1998+
19871999
19882000def test_fiaparch_no_beta (setup ):
19892001 fiaparch = FIAPARCH (q = 0 )
@@ -1995,6 +2007,10 @@ def test_fiaparch_no_beta(setup):
19952007 # omega, phi, d, gamma, delta
19962008 assert len (bounds ) == fiaparch .num_params
19972009
2010+ names = fiaparch .parameter_names ()
2011+ assert "beta" not in names
2012+ assert names == ["omega" , "phi" , "d" , "gamma" , "delta" ]
2013+
19982014 a , _ = fiaparch .constraints ()
19992015 # No beta => FIGARCH block shrinks (5 rows), gamma (2 rows), delta (2 rows) = 9
20002016 assert a .shape [1 ] == 5
@@ -2022,6 +2038,7 @@ def test_fiaparch_no_asym(setup):
20222038
20232039 names = fiaparch .parameter_names ()
20242040 assert "gamma" not in names
2041+ assert names == ["omega" , "phi" , "d" , "beta" , "delta" ]
20252042
20262043 assert_equal (fiaparch .name , "FI Power ARCH" )
20272044
@@ -2124,6 +2141,30 @@ def test_fiaparch_simulate_high_beta(setup):
21242141 fiaparch .simulate (parameters , 20 , rng .simulate ([]))
21252142
21262143
2144+ @pytest .mark .parametrize (
2145+ "p,o,q" ,
2146+ [(0 , 1 , 1 ), (1 , 0 , 1 ), (1 , 1 , 0 ), (0 , 0 , 1 ), (0 , 1 , 0 ), (1 , 0 , 0 ), (0 , 0 , 0 )],
2147+ )
2148+ def test_fiaparch_simulate_reduced (setup , p , o , q ):
2149+ fiaparch = FIAPARCH (p = p , o = o , q = q , truncation = 100 )
2150+ rng = Normal (seed = RandomState ())
2151+ params = [1.0 ]
2152+ if p :
2153+ params .append (0.2 )
2154+ params .append (0.4 )
2155+ if q :
2156+ params .append (0.2 )
2157+ if o :
2158+ params .append (- 0.3 )
2159+ params .append (1.5 )
2160+ parameters = np .array (params )
2161+ sim_data = fiaparch .simulate (parameters , setup .t , rng .simulate ([]))
2162+ assert sim_data [0 ].shape [0 ] == setup .t
2163+ assert sim_data [1 ].shape [0 ] == setup .t
2164+ assert np .all (np .isfinite (sim_data [0 ]))
2165+ assert np .all (np .isfinite (sim_data [1 ]))
2166+
2167+
21272168def test_fiaparch_backcast_transform (setup ):
21282169 fiaparch = FIAPARCH ()
21292170 backcast = fiaparch .backcast (setup .resids )
@@ -2137,6 +2178,48 @@ def test_fiaparch_backcast_transform(setup):
21372178 assert result_arr .shape == (2 ,)
21382179 assert_allclose (result_arr , np .array ([expected , expected ]))
21392180
2181+ fiaparch_fd = FIAPARCH (delta = 1.5 )
2182+ backcast_fd = fiaparch_fd .backcast (setup .resids )
2183+ result_fd = fiaparch_fd .backcast_transform (backcast_fd )
2184+ assert np .isscalar (result_fd )
2185+ expected_fd = float (np .sqrt (backcast_fd ) ** 1.5 )
2186+ assert_allclose (result_fd , expected_fd )
2187+
2188+ result_fd_arr = fiaparch_fd .backcast_transform (
2189+ np .array ([backcast_fd , backcast_fd ])
2190+ )
2191+ assert result_fd_arr .shape == (2 ,)
2192+ assert_allclose (result_fd_arr , np .array ([expected_fd , expected_fd ]))
2193+
2194+
2195+ def test_fiaparch_minimal (setup ):
2196+ fiaparch = FIAPARCH (p = 0 , q = 0 )
2197+
2198+ assert fiaparch .num_params == 4 # omega, d, gamma, delta
2199+
2200+ names = fiaparch .parameter_names ()
2201+ assert names == ["omega" , "d" , "gamma" , "delta" ]
2202+
2203+ bounds = fiaparch .bounds (setup .resids )
2204+ assert len (bounds ) == 4
2205+
2206+ a , b = fiaparch .constraints ()
2207+ # FIGARCH block: omega > 0, d > 0, d < 1 => 3 rows
2208+ # gamma: 2 rows, delta: 2 rows => total 7
2209+ assert a .shape == (7 , 4 )
2210+ assert b .shape == (7 ,)
2211+
2212+ sv = fiaparch .starting_values (setup .resids )
2213+ assert sv .shape [0 ] == 4
2214+
2215+ backcast = fiaparch .backcast (setup .resids )
2216+ var_bounds = fiaparch .variance_bounds (setup .resids )
2217+ # omega, d, gamma, delta
2218+ parameters = np .array ([1.0 , 0.4 , - 0.3 , 1.5 ])
2219+ sigma2 = np .zeros_like (setup .sigma2 )
2220+ fiaparch .compute_variance (parameters , setup .resids , sigma2 , backcast , var_bounds )
2221+ assert np .all (np .isfinite (sigma2 ))
2222+
21402223
21412224def test_fiaparch_errors (setup ):
21422225 with pytest .raises (ValueError , match = r"truncation must be a positive integer" ):
@@ -2165,3 +2248,4 @@ def test_fiaparch_str(setup, p, o, q):
21652248 assert f"q: { q } " in s
21662249 assert f"p: { p } " in s
21672250 assert f"o: { o } " in s
2251+ assert "delta:" not in s
0 commit comments