贝叶斯SARIMA#

class pymc_extras.statespace.models.BayesianSARIMA(order: tuple[int, int, int], seasonal_order: tuple[int, int, int, int] | None = None, stationary_initialization: bool = True, filter_type: str = 'standard', state_structure: str = 'fast', measurement_error: bool = False, verbose=True)[source]#

带外生回归变量的季节性自回归积分移动平均模型

参数:
  • order (tuple(int, int, int)) –

    ARIMA 过程的阶数。 阶数表示为 (p, d, q),其中 p 是自回归滞后阶数,q 是移动平均成分的数量,d 是积分阶数——使数据平稳所需的差分次数。

    如果 d > 0,则差分被建模为隐藏状态的组成部分,并且可以使用所有可用数据。 这只有在 state_structure = 'fast' 时才有可能。 对于可解释的状态,用户必须在调用 build_statespace_graph 方法之前手动对数据进行差分。

  • seasonal_order (tuple(int, int, int, int), optional) –

    SARIMA 过程的季节性阶数。 阶数表示为 (P, D, Q, S),其中 P 是要包含的季节性滞后阶数,Q 是要包含的季节性创新滞后阶数,D 是要执行的季节性差分次数。 S 是季节的长度。

    季节性项与 ARIMA 项类似,因为它们只是数据或创新的滞后项。 因此,季节性滞后和 ARIMA 滞后可能重叠,例如如果 P <= p。 在这种情况下,将引发错误。

  • stationary_initialization (bool, default False) –

    如果为 true,则初始状态和初始状态协方差将不会被分配先验。 而是使用它们的稳态值。

    警告

    此选项对 AR 和 MA 参数的先验非常敏感。 如果给定样本的模型动态不是平稳的,则采样将失败,并显示“协方差不是正半定”错误。

  • filter_type (str, default "standard") – 要使用的卡尔曼滤波器的类型。 选项为“standard”、“single”、“univariate”、“steady_state”和“cholesky”。 有关更多详细信息,请参阅卡尔曼滤波器的文档。

  • state_structure (str, default "fast") –

    如何表示状态空间系统。 目前,有两种选择:“fast”或“interpretable”

    • “fast”对应于 [2] 使用的状态空间,在 statsmodels 中称为“Harvey”表示。

      这也是 statsmodels.tsa.statespace.SARIMAX 使用的默认表示。 状态将不同滞后的滞后和创新结合起来,以将状态向量的维度压缩到 max(p, 1+q)。 因此,它非常紧凑,但只有第一个状态具有清晰的解释。

    • “interpretable”最大程度地扩展状态向量,不进行状态压缩。 因此,状态的维度为 max(1, p) + max(1, q)。 这样做的好处是每个状态都有明显的含义,可以是数据、创新或其滞后。

  • measurement_error (bool, default True) – 如果为 true,则将测量误差项添加到模型中。

  • verbose (bool, default True) – 如果为 true,则会在终端中记录一条消息,解释变量名称、维度和支持。

注释

ARIMAX 模型是一种单变量时间序列模型,它假定平稳时间序列的未来演变将

是其过去值的函数,以及外生的“创新”及其过去的历史。 该模型由其“阶数”描述,即 3 元组 (p, d, q),其中

  • p:直接影响时间序列当前值的过去时间步数,称为

    “自回归”或 AR 分量

  • d:时间序列的“积分”阶数

  • q:直接影响时间序列当前值的过去外生创新数,

    称为“移动平均”或 MA 分量

给定此 3 元组,模型可以写为

\[(1- \phi_1 B - \cdots - \phi_p B^p) (1-B)^d y_{t} = c + (1 + \theta_1 B + \cdots + \theta_q B^q) \varepsilon_t\]

其中 B 是后移算子,\(By_{t} = y_{t-1}\)

该模型假设数据是平稳的; 也就是说,它们可以用具有固定均值和有限方差的时不变高斯分布来描述。 非平稳数据(随时间增长的数据)不适合在不进行预处理的情况下进行 ARIMA 建模。 通过顺序应用差分,可以在任何时间序列中诱导平稳性。 给定一个假设的非平稳过程

\[y_{t} = c + \rho y_{t-1} + \varepsilon_{t}\]

该过程

\[\Delta y_{t} = y_{t} - y_{t-1} = \rho \Delta y_{t-1} + \Delta \varepsilon_t\]

是平稳的,因为非平稳分量 \(c\) 已通过差分运算消除。 该过程被称为“1 阶积分”,因为它需要 1 次差分才能使其平稳。 这是 ARIMA 阶数中 d 参数的功能。

或者,可以直接估计非平稳分量。 在这种情况下,初步回归的误差被假定为 ARIMA 分布,因此

\[\begin{split}\begin{align} y_{t} &= X\beta + \eta_t \\ (1- \phi_1 B - \cdots - \phi_p B^p) (1-B)^d \eta_{t} &= (1 + \theta_1 B + \cdots + \theta_q B^q) \varepsilon_t \end{align}\end{split}\]

其中设计矩阵 X 可以包括常数项、趋势项或外生回归变量。

ARIMA 模型可以用状态空间形式表示,如 [1] 中所述。 有关更多详细信息,请参阅第 3.4、3.6 和 8.4 章。

示例

以下示例展示了如何使用 BayesianSARIMA 类构建 ARMA(1, 1) 模型 – ARIMA(1, 0, 1)

import pymc_extras.statespace as pmss
import pymc as pm

ss_mod = pmss.BayesianSARIMA(order=(1, 0, 1), verbose=True)

with pm.Model(coords=ss_mod.coords) as arma_model:
    state_sigmas = pm.HalfNormal("sigma_state", sigma=1.0, dims=ss_mod.param_dims["sigma_state"])

    rho = pm.Beta("ar_params", alpha=5, beta=1, dims=ss_mod.param_dims["ar_params"])
    theta = pm.Normal("ma_params", mu=0.0, sigma=0.5, dims=ss_mod.param_dims["ma_params"])

    ss_mod.build_statespace_graph(df, mode="JAX")
    idata = pm.sample(nuts_sampler='numpyro')

参考文献

__init__(order: tuple[int, int, int], seasonal_order: tuple[int, int, int, int] | None = None, stationary_initialization: bool = True, filter_type: str = 'standard', state_structure: str = 'fast', measurement_error: bool = False, verbose=True)[source]#

方法

__init__(order[, seasonal_order, ...])

add_default_priors()

将默认先验添加到活动的 PyMC 模型上下文中

build_statespace_graph(data[, ...])

给定参数向量 theta,构造描述状态空间模型和相关数据对数概率的完整计算图。

forecast(idata[, start, periods, end, ...])

生成状态空间模型轨迹到未来的预测。

impulse_response_function(idata[, n_steps, ...])

从状态空间模型动态生成脉冲响应函数 (IRF)。

make_and_register_data(name, shape[, dtype])

辅助函数,用于创建 pytensor 符号变量并将其注册到 _name_to_data 字典中

make_and_register_variable(name[, shape, dtype])

辅助函数,用于创建 pytensor 符号变量并将其注册到 _name_to_variable 字典中

make_symbolic_graph()

make_symbolic_graph 函数的目的是向用户隐藏繁琐的参数分配。

sample_conditional_posterior(idata[, ...])

从条件后验中采样; 也就是说,给定来自后验分布的参数抽取,计算卡尔曼滤波轨迹。

sample_conditional_prior(idata[, random_seed])

从条件先验中采样; 也就是说,给定来自先验分布的参数抽取,计算卡尔曼滤波轨迹。

sample_statespace_matrices(idata, matrix_names)

从提供的 idata 中抽取请求的状态空间矩阵样本

sample_unconditional_posterior(idata[, ...])

根据状态空间动态绘制无条件样本轨迹,使用来自模型参数后验分布的随机样本。

sample_unconditional_prior(idata[, steps, ...])

根据状态空间动态绘制无条件样本轨迹,使用来自模型参数先验分布的随机样本。

unpack_statespace()

辅助函数,用于快速获取标准顺序中的所有状态空间矩阵。

属性

coords

PyMC 模型坐标

data_info

有关需要在 PyMC 模型块中声明的数据变量的信息。

data_names

模型预期的数据变量的名称。

default_priors

参数名称和可调用函数的字典,用于为模型构建默认先验

observed_states

一个 k_endog 长度的字符串列表,与模型的观测状态相关联

param_dims

每个模型参数的命名维度的字典

param_info

有关声明先验所需的参数信息

param_names

模型参数的名称

shock_names

一个 k_posdef 长度的字符串列表,与模型的冲击过程相关联

state_names

一个 k_states 长度的字符串列表,与模型的隐藏状态相关联