Пример #1
0
def get_har_model(dependent, lags):

    dist = SkewStudent_Haisun(
        random_state=None)  #set parameter values for nu and lambda

    har = HARX(y=dependent, lags=lags, distribution=dist)
    res_train = har.fit()  #fit the data

    print("-------HAR MODEL" + str(lags) +
          " Skewed Student [eta = 10, lam = 0.4] ---------")
    har_summ = res_train.summary()  #print summary
    errors = res_train.resid  #call the residual metod
    errors = errors.dropna(
    )  #residuals are nan in bregiining for leng equal to lag

    print("Model summary", har_summ)
    print("\n")
    print("Misspecification of the process tests")
    print('\n')
    print("Analytics of redisual analysis", get_prelim_stats(errors))
    print(get_engle_arch(errors, 22))  #get ARCH-LM
    print(get_durbin_watson(errors, 0))  #get DW test statistic
    print(get_ljung_box(errors, lags))  #get LjungBox test statistic

    return (errors)  #getting the model returns the errors from the model.
Пример #2
0
def get_harx_model(dependent, exogenous, lags, dist):
    '''
    This function takes a dependent variable(series/dataframe), the exogenous (dataframe), lags (list) and a distribution (arch distribution object)
    and fits a model according to the HAR specification.

    It sets the covariance estimate as the Bollerslev-Woodbridge Heteroscedastic consistent estimator

    It returns the errors of the fitted model

    It prints the summary of the model, preliminary statistcs of the residuals, and returns misspecification tests under the stat_testing.py module 
    '''
    har = HARX(y = dependent, x = exogenous, lags = lags, volatility = None, distribution = dist) #HARCH(lags = lags) #, volatility = EGARCH(1,1)
    res_train = har.fit(options = {'maxiter': 1000,'ftol':1e-10, 'eps':1e-12}, cov_type='robust', disp = 'off')  #fit the data

    print("-------HAR MODEL" + str(lags) + str(exogenous) + " ---------")

    har_summ = res_train.summary()   #print summary
    errors = res_train.resid  #call the residual metod
    errors = errors.dropna()  #residuals are nan in bregiining for leng equal to lag
    
    print("Model summary", har_summ)
    print("\n")
    print("Analytics of redisual analysis", get_prelim_stats(errors))
    print("Misspecification of the process tests")
    print('\n')
    print(get_engle_arch(errors, 22))  #get ARCH-LM
    print(get_durbin_watson(errors,0))  #get DW test statistic
    print(get_ljung_box(errors, lags))  #get LjungBox test statistic
    
    return (errors)    #getting the model returns the errors from the model.
Пример #3
0
    def test_empty_mean(self):
        mod = HARX(self.y, None, None, False, volatility=ConstantVariance(),
                   distribution=Normal())
        res = mod.fit()

        mod = ZeroMean(self.y, volatility=ConstantVariance(), distribution=Normal())
        res_z = mod.fit()

        assert res.num_params == res_z.num_params
        assert_series_equal(res.params, res_z.params)
        assert res.loglikelihood == res_z.loglikelihood
Пример #4
0
    def test_warnings(self):
        with warnings.catch_warnings(record=True) as w:
            ARX(self.y, lags=[1, 2, 3, 12], hold_back=5)
            assert_equal(len(w), 1)

        with warnings.catch_warnings(record=True) as w:
            HARX(self.y, lags=[[1, 1, 1], [2, 5, 22]], use_rotated=True)
            assert_equal(len(w), 1)

        har = HARX()
        with warnings.catch_warnings(record=True) as w:
            har.fit()
            assert_equal(len(w), 1)
Пример #5
0
    def test_warnings(self):
        with warnings.catch_warnings(record=True) as w:
            ARX(self.y, lags=[1, 2, 3, 12], hold_back=5)
            assert_equal(len(w), 1)

        with warnings.catch_warnings(record=True) as w:
            HARX(self.y, lags=[[1, 1, 1], [2, 5, 22]], use_rotated=True)
            assert_equal(len(w), 1)

        har = HARX()
        with warnings.catch_warnings(record=True) as w:
            har.fit()
            assert_equal(len(w), 1)
Пример #6
0
    def test_harx(self):
        harx = HARX(self.y, self.x, lags=[1, 5, 22])
        params = np.array([1.0, 0.4, 0.3, 0.2, 1.0, 1.0])
        data = harx.simulate(params, self.T, x=randn(self.T + 500, 1))
        iv = randn(22, 1)
        data = harx.simulate(params,
                             self.T,
                             x=randn(self.T + 500, 1),
                             initial_value=iv)
        assert_equal(data.shape, (self.T, 3))
        cols = ['data', 'volatility', 'errors']
        for c in cols:
            assert_true(c in data)

        bounds = harx.bounds()
        for b in bounds:
            assert_equal(b[0], -np.inf)
            assert_equal(b[1], np.inf)
        assert_equal(len(bounds), 5)

        assert_equal(harx.num_params, 1 + 3 + self.x.shape[1])
        assert_equal(harx.constant, True)
        a, b = harx.constraints()
        assert_equal(a, np.empty((0, 5)))
        assert_equal(b, np.empty(0))
        res = harx.fit()
        assert_raises(RuntimeError, res.forecast, horizon=10)
        assert_raises(ValueError, res.forecast, params=np.array([1.0, 1.0]))
        nobs = self.T - 22
        rhs = np.ones((nobs, 5))
        y = self.y
        lhs = y[22:]
        for i in range(self.T - 22):
            rhs[i, 1] = y[i + 21]
            rhs[i, 2] = np.mean(y[i + 17:i + 22])
            rhs[i, 3] = np.mean(y[i:i + 22])
        rhs[:, 4] = self.x[22:, 0]
        params = np.linalg.pinv(rhs).dot(lhs)
        assert_almost_equal(params, res.params[:-1])

        assert_equal(harx.first_obs, 22)
        assert_equal(harx.last_obs, 1000)
        assert_equal(harx.hold_back, None)
        assert_equal(harx.lags, [1, 5, 22])
        assert_equal(harx.nobs, self.T - 22)
        assert_equal(harx.name, 'HAR-X')
        assert_equal(harx.use_rotated, False)
        harx
        harx._repr_html_()
        res = harx.fit(cov_type='mle')
        res
Пример #7
0
 def test_little_or_no_data(self):
     mod = HARX(self.y[:24], lags=[1, 5, 22])
     with pytest.raises(ValueError):
         mod.fit()
     mod = HARX(None, lags=[1, 5, 22])
     with pytest.raises(RuntimeError):
         mod.fit()
Пример #8
0
    def test_errors(self):
        with pytest.raises(ValueError):
            ARX(self.y, lags=np.array([[1, 2], [3, 4]]))
        x = self.rng.randn(self.y.shape[0] + 1, 1)
        with pytest.raises(ValueError):
            ARX(self.y, x=x)
        with pytest.raises(ValueError):
            HARX(self.y, lags=np.eye(3))
        with pytest.raises(ValueError):
            ARX(self.y, lags=-1)
        with pytest.raises(ValueError):
            ARX(self.y, x=self.rng.randn(1, 1), lags=-1)

        ar = ARX(self.y, lags=1)
        with self.assertRaises(ValueError):
            d = Normal()
            ar.volatility = d

        with self.assertRaises(ValueError):
            v = GARCH()
            ar.distribution = v
        x = self.rng.randn(1000, 1)
        with pytest.raises(ValueError):
            ar.simulate(np.ones(5), 100, x=x)
        with pytest.raises(ValueError):
            ar.simulate(np.ones(5), 100)
        with pytest.raises(ValueError):
            ar.simulate(np.ones(3), 100, initial_value=self.rng.randn(10))

        with self.assertRaises(ValueError):
            ar.volatility = ConstantVariance()
            ar.fit(cov_type='unknown')
Пример #9
0
    def test_harx(self):
        harx = HARX(self.y, self.x, lags=[1, 5, 22])
        params = np.array([1.0, 0.4, 0.3, 0.2, 1.0, 1.0])
        data = harx.simulate(params, self.T, x=randn(self.T + 500, 1))
        iv = randn(22, 1)
        data = harx.simulate(params, self.T, x=randn(self.T + 500, 1),
                             initial_value=iv)
        assert_equal(data.shape, (self.T, 3))
        cols = ['data', 'volatility', 'errors']
        for c in cols:
            assert_true(c in data)

        bounds = harx.bounds()
        for b in bounds:
            assert_equal(b[0], -np.inf)
            assert_equal(b[1], np.inf)
        assert_equal(len(bounds), 5)

        assert_equal(harx.num_params, 1 + 3 + self.x.shape[1])
        assert_equal(harx.constant, True)
        a, b = harx.constraints()
        assert_equal(a, np.empty((0, 5)))
        assert_equal(b, np.empty(0))
        res = harx.fit()
        assert_raises(RuntimeError, res.forecast, horizon=10)
        assert_raises(ValueError, res.forecast, params=np.array([1.0, 1.0]))
        nobs = self.T - 22
        rhs = np.ones((nobs, 5))
        y = self.y
        lhs = y[22:]
        for i in range(self.T - 22):
            rhs[i, 1] = y[i + 21]
            rhs[i, 2] = np.mean(y[i + 17:i + 22])
            rhs[i, 3] = np.mean(y[i:i + 22])
        rhs[:, 4] = self.x[22:, 0]
        params = np.linalg.pinv(rhs).dot(lhs)
        assert_almost_equal(params, res.params[:-1])

        assert_equal(harx.first_obs, 22)
        assert_equal(harx.last_obs, 1000)
        assert_equal(harx.hold_back, None)
        assert_equal(harx.lags, [1, 5, 22])
        assert_equal(harx.nobs, self.T - 22)
        assert_equal(harx.name, 'HAR-X')
        assert_equal(harx.use_rotated, False)
        harx
        harx._repr_html_()
        res = harx.fit(cov_type='mle')
        res
Пример #10
0
 def test_harx_error(self):
     with pytest.raises(ValueError):
         HARX(self.y, self.x, lags=[1, -5, 22])
     with pytest.raises(ValueError):
         HARX(self.y, self.x, lags=[0, 1, 5, 22])
     with pytest.raises(ValueError):
         HARX(self.y, self.x, lags=[[-1], [3]])
     with pytest.raises(ValueError):
         HARX(self.y, self.x, lags=[[0], [0]])
     with pytest.raises(ValueError):
         HARX(self.y, self.x, lags=[[1, 1, 2], [2, 3, 2]])
     with pytest.raises(ValueError):
         HARX(self.y, self.x, lags=[[[1], [3]]])
Пример #11
0
    def test_har_lag_specifications(self):
        """ Test equivalence of alternative lag specifications"""
        har = HARX(self.y, lags=[1, 2, 3])
        har_r = HARX(self.y, lags=[1, 2, 3], use_rotated=True)
        har_r_v2 = HARX(self.y, lags=3, use_rotated=True)
        ar = ARX(self.y, lags=[1, 2, 3])
        ar_v2 = ARX(self.y, lags=3)

        res_har = har.fit(disp=DISPLAY)
        res_har_r = har_r.fit(disp=DISPLAY)
        res_har_r_v2 = har_r_v2.fit(disp=DISPLAY)
        res_ar = ar.fit(disp=DISPLAY)
        res_ar_v2 = ar_v2.fit(disp=DISPLAY)
        assert_almost_equal(res_har.rsquared, res_har_r.rsquared)
        assert_almost_equal(res_har_r_v2.rsquared, res_har_r.rsquared)
        assert_almost_equal(np.asarray(res_ar.params),
                            np.asarray(res_ar_v2.params))
        assert_almost_equal(np.asarray(res_ar.params),
                            np.asarray(res_har_r_v2.params))
        assert_almost_equal(np.asarray(res_ar.param_cov),
                            np.asarray(res_har_r_v2.param_cov))
        assert_almost_equal(res_ar.conditional_volatility,
                            res_har_r_v2.conditional_volatility)
        assert_almost_equal(res_ar.resid, res_har_r_v2.resid)
Пример #12
0
    def test_har_lag_specifications(self):
        """ Test equivalence of alternative lag specifications"""
        har = HARX(self.y, lags=[1, 2, 3])
        har_r = HARX(self.y, lags=[1, 2, 3], use_rotated=True)
        har_r_v2 = HARX(self.y, lags=3, use_rotated=True)
        ar = ARX(self.y, lags=[1, 2, 3])
        ar_v2 = ARX(self.y, lags=3)

        res_har = har.fit(disp=DISPLAY)
        res_har_r = har_r.fit(disp=DISPLAY)
        res_har_r_v2 = har_r_v2.fit(disp=DISPLAY)
        res_ar = ar.fit(disp=DISPLAY)
        res_ar_v2 = ar_v2.fit(disp=DISPLAY)
        assert_almost_equal(res_har.rsquared, res_har_r.rsquared)
        assert_almost_equal(res_har_r_v2.rsquared, res_har_r.rsquared)
        assert_almost_equal(np.asarray(res_ar.params),
                            np.asarray(res_ar_v2.params))
        assert_almost_equal(np.asarray(res_ar.params),
                            np.asarray(res_har_r_v2.params))
        assert_almost_equal(np.asarray(res_ar.param_cov),
                            np.asarray(res_har_r_v2.param_cov))
        assert_almost_equal(res_ar.conditional_volatility,
                            res_har_r_v2.conditional_volatility)
        assert_almost_equal(res_ar.resid, res_har_r_v2.resid)
Пример #13
0
def test_harx_lag_spec(simulated_data):
    harx_1 = HARX(simulated_data, lags=[1, 5, 22])
    harx_2 = HARX(simulated_data, lags=[1, 5, 22], use_rotated=True)
    harx_3 = HARX(simulated_data, lags=[[1, 1, 1], [1, 5, 22]])
    harx_4 = HARX(simulated_data, lags=[[1, 2, 6], [1, 5, 22]])

    r2 = harx_1.fit().rsquared
    assert_almost_equal(harx_2.fit().rsquared, r2)
    assert_almost_equal(harx_3.fit().rsquared, r2)
    assert_almost_equal(harx_4.fit().rsquared, r2)
Пример #14
0
    def test_har(self):
        har = HARX(self.y, lags=[1, 5, 22])
        params = np.array([1.0, 0.4, 0.3, 0.2, 1.0])
        data = har.simulate(params, self.T)
        assert_equal(data.shape, (self.T, 3))
        cols = ['data', 'volatility', 'errors']
        for c in cols:
            assert c in data

        bounds = har.bounds()
        for b in bounds:
            assert_equal(b[0], -np.inf)
            assert_equal(b[1], np.inf)
        assert_equal(len(bounds), 4)

        assert_equal(har.num_params, 4)
        assert_equal(har.constant, True)
        a, b = har.constraints()
        assert_equal(a, np.empty((0, 4)))
        assert_equal(b, np.empty(0))
        res = har.fit(disp=DISPLAY)
        nobs = self.T - 22
        rhs = np.ones((nobs, 4))
        y = self.y
        lhs = y[22:]
        for i in range(self.T - 22):
            rhs[i, 1] = y[i + 21]
            rhs[i, 2] = np.mean(y[i + 17:i + 22])
            rhs[i, 3] = np.mean(y[i:i + 22])
        params = np.linalg.pinv(rhs).dot(lhs)
        assert_almost_equal(params, res.params[:-1])

        with pytest.raises(ValueError):
            res.forecast(horizon=6, start=0)
        forecasts = res.forecast(horizon=6)
        t = self.y.shape[0]
        direct = pd.DataFrame(index=np.arange(t),
                              columns=['h.' + str(i + 1) for i in range(6)],
                              dtype=np.float64)

        params = np.asarray(res.params)
        fcast = np.zeros(t + 6)
        for i in range(21, t):
            fcast[:i + 1] = self.y[:i + 1]
            fcast[i + 1:] = 0.0
            for h in range(6):
                fcast[i + h + 1] = params[0]
                fcast[i + h + 1] += params[1] * fcast[i + h:i + h + 1]
                fcast[i + h + 1] += params[2] * fcast[
                                                i + h - 4:i + h + 1].mean()
                fcast[i + h + 1] += params[3] * fcast[
                                                i + h - 21:i + h + 1].mean()
            direct.iloc[i, :] = fcast[i + 1:i + 7]
        assert isinstance(forecasts, ARCHModelForecast)
        # TODO
        # assert_frame_equal(direct, forecasts)
        forecasts = res.forecast(res.params, horizon=6)
        assert isinstance(forecasts, ARCHModelForecast)
        # TODO
        # assert_frame_equal(direct, forecasts)

        assert_equal(har.hold_back, None)
        assert_equal(har.lags, [1, 5, 22])
        assert_equal(har.name, 'HAR')
        assert_equal(har.use_rotated, False)

        har = HARX(self.y_series, lags=[1, 5, 22])
        res = har.fit(disp=DISPLAY)
        direct = pd.DataFrame(index=self.y_series.index,
                              columns=['h.' + str(i + 1) for i in range(6)],
                              dtype=np.float64)
        forecasts = res.forecast(horizon=6)
        params = np.asarray(res.params)
        fcast = np.zeros(t + 6)
        for i in range(21, t):
            fcast[:i + 1] = self.y[:i + 1]
            fcast[i + 1:] = 0.0
            for h in range(6):
                fcast[i + h + 1] = params[0]
                fcast[i + h + 1] += params[1] * fcast[i + h:i + h + 1]
                fcast[i + h + 1] += params[2] * fcast[
                                                i + h - 4:i + h + 1].mean()
                fcast[i + h + 1] += params[3] * fcast[
                                                i + h - 21:i + h + 1].mean()
            direct.iloc[i, :] = fcast[i + 1:i + 7]
        assert isinstance(forecasts, ARCHModelForecast)
Пример #15
0
    def test_harx(self):
        harx = HARX(self.y, self.x, lags=[1, 5, 22])
        assert harx.x is self.x
        params = np.array([1.0, 0.4, 0.3, 0.2, 1.0, 1.0])
        harx.simulate(params, self.T, x=self.rng.randn(self.T + 500, 1))
        iv = self.rng.randn(22, 1)
        data = harx.simulate(
            params, self.T, x=self.rng.randn(self.T + 500, 1), initial_value=iv
        )
        assert_equal(data.shape, (self.T, 3))
        cols = ["data", "volatility", "errors"]
        for c in cols:
            assert c in data

        bounds = harx.bounds()
        for b in bounds:
            assert_equal(b[0], -np.inf)
            assert_equal(b[1], np.inf)
        assert_equal(len(bounds), 5)

        assert_equal(harx.num_params, 1 + 3 + self.x.shape[1])
        assert_equal(harx.constant, True)
        a, b = harx.constraints()
        assert_equal(a, np.empty((0, 5)))
        assert_equal(b, np.empty(0))
        res = harx.fit(disp=DISPLAY)
        with pytest.raises(ValueError):
            res.forecast(params=np.array([1.0, 1.0]))
        nobs = self.T - 22
        rhs = np.ones((nobs, 5))
        y = self.y
        lhs = y[22:]
        for i in range(self.T - 22):
            rhs[i, 1] = y[i + 21]
            rhs[i, 2] = np.mean(y[i + 17 : i + 22])
            rhs[i, 3] = np.mean(y[i : i + 22])
        rhs[:, 4] = self.x[22:, 0]
        params = np.linalg.pinv(rhs).dot(lhs)
        assert_almost_equal(params, res.params[:-1])

        assert harx.hold_back is None
        assert_equal(harx.lags, [1, 5, 22])
        assert_equal(harx.name, "HAR-X")
        assert_equal(harx.use_rotated, False)
        assert isinstance(harx.__repr__(), str)
        harx._repr_html_()
        res = harx.fit(cov_type="mle", disp=DISPLAY)
        assert isinstance(res.__repr__(), str)
Пример #16
0
def get_forecast_5d(dependent, exogenous, lags, volatility, distribution_):
    har = HARX(y = dependent, x = exogenous, lags = [1,5,22], volatility = volatility, distribution = distribution_)
    res = har.fit(options = {'maxiter': 10000, 'ftol':1e-12, 'eps':1e-14}, cov_type='robust',  last_obs = split_date)
    forecast = res.forecast(horizon = 5, align = 'target', method = 'bootstrap', start = split_date)
    forecast = forecast.mean.dropna()
    return forecast
Пример #17
0
def get_forecast_egarch(dependent, exogenous, lags, distribution_):
    har = HARX(y = dependent, x = exogenous, lags = [1,5,22], volatility = EGARCH(1,1), distribution = distribution_)
    res = har.fit(options = {'maxiter': 10000}, cov_type='robust', first_obs=start_date, last_obs = split_date)
    forecast = res.forecast(horizon = 1, align = 'target',start = split_date)
    forecast = forecast.mean.dropna()
    return forecast
Пример #18
0
    def test_har(self):
        har = HARX(self.y, lags=[1, 5, 22])
        params = np.array([1.0, 0.4, 0.3, 0.2, 1.0])
        data = har.simulate(params, self.T)
        assert_equal(data.shape, (self.T, 3))
        cols = ['data', 'volatility', 'errors']
        for c in cols:
            assert c in data

        bounds = har.bounds()
        for b in bounds:
            assert_equal(b[0], -np.inf)
            assert_equal(b[1], np.inf)
        assert_equal(len(bounds), 4)

        assert_equal(har.num_params, 4)
        assert_equal(har.constant, True)
        a, b = har.constraints()
        assert_equal(a, np.empty((0, 4)))
        assert_equal(b, np.empty(0))
        res = har.fit(disp=DISPLAY)
        nobs = self.T - 22
        rhs = np.ones((nobs, 4))
        y = self.y
        lhs = y[22:]
        for i in range(self.T - 22):
            rhs[i, 1] = y[i + 21]
            rhs[i, 2] = np.mean(y[i + 17:i + 22])
            rhs[i, 3] = np.mean(y[i:i + 22])
        params = np.linalg.pinv(rhs).dot(lhs)
        assert_almost_equal(params, res.params[:-1])

        with pytest.raises(ValueError):
            res.forecast(horizon=6, start=0)
        forecasts = res.forecast(horizon=6)
        t = self.y.shape[0]
        direct = pd.DataFrame(index=np.arange(t),
                              columns=['h.' + str(i + 1) for i in range(6)],
                              dtype=np.float64)

        params = np.asarray(res.params)
        fcast = np.zeros(t + 6)
        for i in range(21, t):
            fcast[:i + 1] = self.y[:i + 1]
            fcast[i + 1:] = 0.0
            for h in range(6):
                fcast[i + h + 1] = params[0]
                fcast[i + h + 1] += params[1] * fcast[i + h:i + h + 1]
                fcast[i + h + 1] += params[2] * fcast[
                                                i + h - 4:i + h + 1].mean()
                fcast[i + h + 1] += params[3] * fcast[
                                                i + h - 21:i + h + 1].mean()
            direct.iloc[i, :] = fcast[i + 1:i + 7]
        assert isinstance(forecasts, ARCHModelForecast)
        # TODO
        # assert_frame_equal(direct, forecasts)
        forecasts = res.forecast(res.params, horizon=6)
        assert isinstance(forecasts, ARCHModelForecast)
        # TODO
        # assert_frame_equal(direct, forecasts)

        assert_equal(har.hold_back, None)
        assert_equal(har.lags, [1, 5, 22])
        assert_equal(har.name, 'HAR')
        assert_equal(har.use_rotated, False)

        har = HARX(self.y_series, lags=[1, 5, 22])
        res = har.fit(disp=DISPLAY)
        direct = pd.DataFrame(index=self.y_series.index,
                              columns=['h.' + str(i + 1) for i in range(6)],
                              dtype=np.float64)
        forecasts = res.forecast(horizon=6)
        params = np.asarray(res.params)
        fcast = np.zeros(t + 6)
        for i in range(21, t):
            fcast[:i + 1] = self.y[:i + 1]
            fcast[i + 1:] = 0.0
            for h in range(6):
                fcast[i + h + 1] = params[0]
                fcast[i + h + 1] += params[1] * fcast[i + h:i + h + 1]
                fcast[i + h + 1] += params[2] * fcast[
                                                i + h - 4:i + h + 1].mean()
                fcast[i + h + 1] += params[3] * fcast[
                                                i + h - 21:i + h + 1].mean()
            direct.iloc[i, :] = fcast[i + 1:i + 7]
        assert isinstance(forecasts, ARCHModelForecast)