'Calculate future values of the time series.
Parameters
steps : int
Prediction horizon.
alpha : float, 0 < `alpha` < 1 or None
If None, compute point forecast only.
If float, compute confidence intervals too. In this case the
argument stands for the confidence level.
exog : ndarray (steps x self.exog.shape[1])
If self.exog is not None, then information about the future values
of exog have to be passed via this parameter. The ndarray may be
larger in it\'s first dimension. In this case only the first steps
rows will be considered.
Returns
forecast - ndarray (steps x neqs) or three ndarrays
In case of a point forecast: each row of the returned ndarray
represents the forecast of the neqs variables for a specific
period. The first row (index [0]) is the forecast for the next
period, the last row (index [steps-1]) is the steps-periods-ahead-
forecast.'

def predict(self, steps=5, alpha=None, exog_fc=None, exog_coint_fc=None):

    if ((self.exog is not None) and (exog_fc is None)):
        raise ValueError("exog_fc    is    None:    Please    pass    the    future    values    of    the    VECM's    exog    terms    via    the    exog_fc    argument!")
    if ((self.exog is None) and (exog_fc is not None)):
        raise ValueError("This    VECMResult-instance's    exog    attribute    is    None.    Please    don't    pass    a    non-None    value    as    the    method's    exog_fc-argument.")
    if ((exog_fc is not None) and (exog_fc.shape[0] < steps)):
        raise ValueError('The    argument    exog_fc    must    have    at    least    steps    elements    in    its    first    dimension')
    if ((self.exog_coint is not None) and (exog_coint_fc is None)):
        raise ValueError("exog_coint_fc    is    None:    Please    pass    the    future    values    of    the    VECM's    exog_coint    terms    via    the    exog_coint_fc    argument!")
    if ((self.exog_coint is None) and (exog_coint_fc is not None)):
        raise ValueError("This    VECMResult-instance's    exog_coint    attribute    is    None.    Please    don't    pass    a    non-None    value    as    the    method's    exog_coint_fc-argument.")
    if ((exog_coint_fc is not None) and (exog_coint_fc.shape[0] < (steps - 1))):
        raise ValueError('The    argument    exog_coint_fc    must    have    at    least    steps    elements    in    its    first    dimension')
    last_observations = self.y_all.T[(- self.k_ar):]
    exog = []
    trend_coefs = []
    exog_const = np.ones(steps)
    nobs_tot = (self.nobs + self.k_ar)
    if (self.const.size > 0):
        exog.append(exog_const)
        trend_coefs.append(self.const.T)
    if (self.seasons > 0):
        first_future_season = ((self.first_season + nobs_tot) % self.seasons)
        exog_seasonal = seasonal_dummies(self.seasons, steps, first_future_season, True)
        exog.append(exog_seasonal)
        trend_coefs.append(self.seasonal.T)
    exog_lin_trend = _linear_trend(self.nobs, self.k_ar)
    exog_lin_trend = ((exog_lin_trend[(-1)] + 1) + np.arange(steps))
    if (self.lin_trend.size > 0):
        exog.append(exog_lin_trend)
        trend_coefs.append(self.lin_trend.T)
    if (exog_fc is not None):
        exog.append(exog_fc[:steps])
        trend_coefs.append(self.exog_coefs.T)
    if ('ci' in self.deterministic):
        exog.append(exog_const)
        trend_coefs.append(self.alpha.dot(self.const_coint.T).T)
    exog_lin_trend_coint = _linear_trend(self.nobs, self.k_ar, coint=True)
    exog_lin_trend_coint = ((exog_lin_trend_coint[(-1)] + 1) + np.arange(steps))
    if ('li' in self.deterministic):
        exog.append(exog_lin_trend_coint)
        trend_coefs.append(self.alpha.dot(self.lin_trend_coint.T).T)
    if (exog_coint_fc is not None):
        if (exog_coint_fc.ndim == 1):
            exog_coint_fc = exog_coint_fc[:, None]
        exog_coint_fc = np.vstack((self.exog_coint[(-1):], exog_coint_fc[:(steps - 1)]))
        exog.append(exog_coint_fc)
        trend_coefs.append(self.alpha.dot(self.exog_coint_coefs.T).T)
    exog = (np.column_stack(exog) if (exog != []) else None)
    if (trend_coefs != []):
        trend_coefs = np.row_stack(trend_coefs)
    else:
        trend_coefs = None
    if (alpha is not None):
        return forecast_interval(last_observations, self.var_rep, trend_coefs, self.sigma_u, steps, alpha=alpha, exog=exog)
    else:
        return forecast(last_observations, self.var_rep, trend_coefs, steps, exog)
