ARCH 模型
关于如何使用 ARCH 模型
与 Statsforecast
的循序渐进指南。
目录
引言
金融时间序列分析在最近几十年一直是热门研究课题之一。在本指南中,我们将通过真实的金融数据来说明金融时间序列的典型事实。为了刻画这些事实,需要不同于 Box-Jenkins 模型的新模型。因此,ARCH 模型由 R. F. Engle 于 1982 年首次提出,此后被大量学者所拓展。我们还将演示如何使用 Python 及其库来实现 ARCH
。
众所周知,许多时间序列都具有 ARCH 效应,即虽然(建模残差)序列是白噪声,但其平方序列可能存在自相关。更重要的是,在实践中发现大量金融时间序列具有这一特性,因此 ARCH 效应已成为金融时间序列的典型事实之一。
金融时间序列的典型事实
现在我们简要列出并描述金融收益序列的几个重要典型事实(特征)
-
厚尾(重尾):收益的分布密度函数通常比相应的正态分布密度函数的尾部更厚(更重)。
-
ARCH 效应:虽然收益序列通常可以看作是白噪声,但其平方(和绝对值)序列通常可能存在自相关,并且这些自相关几乎不是负的。
-
波动性聚集:大的收益变化倾向于在时间上聚集,小的变化倾向于跟随小的变化。
-
不对称性:众所周知,资产收益的分布略微负偏。一种可能的解释是交易者对不利信息的反应比对有利信息的反应更强烈。
ARCH 模型的定义
具体而言,我们给出 ARCH 模型的定义如下。
定义 1. 阶数为 的 模型形式如下
其中 和 是常数,,且 独立于 。如果随机过程 满足方程 (1),则称其为 过程。
根据定义 1,(以及 )独立于 。此外,通常进一步假设 。然而,有时为了捕捉金融时间序列的更多特征,我们需要进一步假设 服从标准化(偏)学生 T 分布或广义误差分布。
设 表示由 生成的信息集,即 域。容易看出,对于任意 , 独立于 。根据定义 1 和条件数学期望的性质,我们有
和
这意味着 是 的条件方差,并且它根据 的先前值演变,类似于 模型。因此,模型 (1) 被命名为 模型。
作为 ARCH(p) 模型的一个示例,我们考虑 ARCH(1) 模型
明确地说,无条件均值 。
此外,ARCH(1) 模型可以表示为
即,
其中 。可以证明 $\eta_t$ 是一个新的白噪声,这留给读者作为练习。因此,如果 $0 < \alpha_1 < 1$,方程 (4) 是序列 Xt2 的平稳 AR(1) 模型。因此,无条件方差
即
此外,对于 $h > 0$,根据条件数学期望的性质和 (2) 式,我们有
综上所述,如果 $0 < \alpha_1 < 1$,我们有
-
任何由公式 (3) 定义的 ARCH(1) 过程 $\{X_t \}$ 服从白噪声 $WN(0, \omega/(1 − \alpha_1))$。
-
由于 $X_{t}^2$ 是由 (4) 定义的 AR(1) 过程,因此 $\operatorname{Corr}(X_{t}^2,X_{t+h}^2) = \alpha_{1}^{|h|} > 0$,这揭示了 ARCH 效应。
-
显然,$E(\eta_t|\mathscr{F}_s)=0$ 对于任何 $t>s$ 成立,且结合方程 (4),对于任何 $k>1$: $\operatorname{Var}(X_{t+k}|\mathscr{F}_t)=E(X_{t+K}^2|\mathscr{F}_t)$ $= E(\omega + \alpha_1 X_{t+k-1}+ \eta_{t+k}|\mathscr{F}_t )$ $= \omega + \alpha_1 \operatorname{Var}(X_{t+k−1}|\mathscr{F}_t),$
这反映了波动率聚类现象,即大(小)波动之后是大(小)波动。
此外,我们可以证明由方程 (3) 定义的 Xt 具有比相应正态分布更重的尾部。最后,请注意 ARCH(1) 模型的这些性质可以推广到 ARCH(p) 模型。
自回归条件异方差 (ARCH) 模型的优点和缺点
优点 | 缺点 |
---|---|
- ARCH 模型对于金融时间序列中的波动率建模很有用,这对于投资决策和风险管理非常重要。 | - ARCH 模型假设预测误差是独立同分布的,这在某些情况下可能不切实际。 |
- ARCH 模型考虑了异方差性,这意味着它可以对随时间变化的方差的时间序列进行建模。 | - ARCH 模型可能难以拟合具有许多参数的数据,这可能需要大量数据或高级估计技术。 |
- ARCH 模型相对易于使用,可以使用标准计量经济学软件实现。 | - ARCH 模型没有考虑时间序列的均值和方差之间可能存在的关系,这在某些情况下可能很重要。 |
注意
ARCH 模型是金融时间序列中波动率建模的有用工具,但与任何计量经济学模型一样,它也有局限性,应根据所建模数据的具体特征谨慎使用。
自回归条件异方差 (ARCH) 应用
-
金融 - ARCH 模型广泛应用于金融领域,对股票价格、汇率、利率等金融时间序列的波动率进行建模。
-
经济学 - ARCH 模型可用于对 GDP、通货膨胀、失业率等经济数据的波动率进行建模。
-
工程 - ARCH 模型可用于工程领域,对能源、气候、污染、工业生产等相关数据的波动率进行建模。
-
社会科学 - ARCH 模型可用于社会科学领域,对人口学、健康、教育等相关数据的波动率进行建模。
-
生物学 - ARCH 模型可用于生物学领域,对进化、遗传学、流行病学等相关数据的波动率进行建模。
加载库和数据
提示
需要 Statsforecast。要安装,请参阅 说明。
接下来,我们导入绘图库并配置绘图样式。
读取数据
让我们从 Yahoo Finance 网站获取 S&P500 股票数据。
价格 | 日期 | 调整后收盘价 | 收盘价 | 最高价 | 最低价 | 开盘价 | 成交量 |
---|---|---|---|---|---|---|---|
股票代码 | ^GSPC | ^GSPC | ^GSPC | ^GSPC | ^GSPC | ^GSPC | |
0 | 2015-01-02 00:00:00+00:00 | 2058.199951 | 2058.199951 | 2072.360107 | 2046.040039 | 2058.899902 | 2708700000 |
1 | 2015-01-05 00:00:00+00:00 | 2020.579956 | 2020.579956 | 2054.439941 | 2017.339966 | 2054.439941 | 3799120000 |
2 | 2015-01-06 00:00:00+00:00 | 2002.609985 | 2002.609985 | 2030.250000 | 1992.439941 | 2022.150024 | 4460110000 |
3 | 2015-01-07 00:00:00+00:00 | 2025.900024 | 2025.900024 | 2029.609985 | 2005.550049 | 2005.550049 | 3805480000 |
4 | 2015-01-08 00:00:00+00:00 | 2062.139893 | 2062.139893 | 2064.080078 | 2030.609985 | 2030.609985 | 3934010000 |
StatsForecast 的输入始终是一个具有三列的长格式数据框:unique_id、ds 和 y
-
unique_id
(字符串、整数或类别)表示序列的标识符。 -
ds
(日期戳)列应为 Pandas 预期的格式,日期最好是 YYYY-MM-DD,时间戳最好是 YYYY-MM-DD HH:MM:SS。 -
y
(数值)表示我们希望预测的测量值。
ds | y | unique_id | |
---|---|---|---|
0 | 2015-01-02 00:00:00+00:00 | 2058.199951 | 1 |
1 | 2015-01-05 00:00:00+00:00 | 2020.579956 | 1 |
2 | 2015-01-06 00:00:00+00:00 | 2002.609985 | 1 |
3 | 2015-01-07 00:00:00+00:00 | 2025.900024 | 1 |
4 | 2015-01-08 00:00:00+00:00 | 2062.139893 | 1 |
使用 plot 方法探索数据
使用 StatsForecast 类的 plot 方法绘制序列。此方法会从数据集中随机打印一个序列,对于基本探索性数据分析 (EDA) 非常有用。
增广迪基-福勒检验
增广迪基-福勒 (ADF) 检验是一种统计检验,用于确定时间序列数据中是否存在单位根。单位根可能导致时间序列分析中出现不可预测的结果。在单位根检验中,会建立一个零假设,以确定时间序列数据受趋势影响的强度。通过接受零假设,我们接受时间序列数据不平稳的证据。通过拒绝零假设或接受备择假设,我们接受时间序列数据是由平稳过程生成的证据。此过程也称为平稳趋势。ADF 检验统计量的值为负。ADF 值越低,表示对零假设的拒绝越强。
增广迪基-福勒检验是一种常用的统计检验,用于检验给定时间序列是否平稳。我们可以通过定义零假设和备择假设来实现这一点。
零假设:时间序列不平稳。它给出了一个时间相关的趋势。备择假设:时间序列平稳。换句话说,该序列不依赖于时间。
ADF 或 t 统计量 < 临界值:拒绝零假设,时间序列是平稳的。ADF 或 t 统计量 > 临界值:未能拒绝零假设,时间序列是不平稳的。
让我们检查一下我们正在分析的序列是否是平稳序列。让我们创建一个函数,使用 Dickey Fuller
检验进行检查。
在前面的结果中,我们可以看到 Augmented_Dickey_Fuller
检验给出了 p-value
0.864700,这告诉我们不能拒绝零假设,另一方面,我们序列的数据是不平稳的。
我们需要对时间序列进行差分,以便将数据转换为平稳数据。
收益率序列
自 20 世纪 70 年代以来,随着计算机和互联网技术的发展,金融业非常繁荣。金融产品(包括各种衍生品)的交易产生了大量数据,形成了金融时间序列。对于金融而言,金融产品的收益率是最令人感兴趣的,因此我们关注的重点是收益率序列。如果 $P_t$ 是某个金融产品在时间 t 的收盘价,则该产品的收益率是
log(Pt)−log(Pt−1).
对收益率序列 $\{X_t \}$ 进行了大量独立研究。并总结了许多金融工具、市场和时间段共同的重要特征。请注意,如果您购买金融产品,则该产品成为您的资产,其收益率成为您的资产收益率。现在让我们看以下示例。
我们可以使用 pandas 的 DataFrame.pct_change()
函数来估算收益率序列。pct_change()
函数有一个 periods 参数,其默认值为 1。如果要计算 30 天收益率,则必须将该值更改为 30。
ds | y | unique_id | 收益率 | |
---|---|---|---|---|
1 | 2015-01-05 00:00:00+00:00 | 2020.579956 | 1 | -1.827811 |
2 | 2015-01-06 00:00:00+00:00 | 2002.609985 | 1 | -0.889347 |
3 | 2015-01-07 00:00:00+00:00 | 2025.900024 | 1 | 1.162984 |
4 | 2015-01-08 00:00:00+00:00 | 2062.139893 | 1 | 1.788828 |
5 | 2015-01-09 00:00:00+00:00 | 2044.810059 | 1 | -0.840381 |
创建平方收益率
ds | y | unique_id | 收益率 | 平方收益率 | |
---|---|---|---|---|---|
1 | 2015-01-05 00:00:00+00:00 | 2020.579956 | 1 | -1.827811 | 3.340891 |
2 | 2015-01-06 00:00:00+00:00 | 2002.609985 | 1 | -0.889347 | 0.790938 |
3 | 2015-01-07 00:00:00+00:00 | 2025.900024 | 1 | 1.162984 | 1.352532 |
4 | 2015-01-08 00:00:00+00:00 | 2062.139893 | 1 | 1.788828 | 3.199906 |
5 | 2015-01-09 00:00:00+00:00 | 2044.810059 | 1 | -0.840381 | 0.706240 |
收益率 vs 平方收益率
Ljung-Box 检验
Ljung-Box 是一种自相关性检验,我们可以结合 ACF 和 PACF 图使用它。Ljung-Box 检验接收我们的数据,可选地包括要检验的滞后值或要考虑的最大滞后值,以及是否计算 Box-Pierce 统计量。Ljung-Box 和 Box-Pierce 是两种相似的检验统计量 Q,它们与卡方分布进行比较,以确定序列是否为白噪声。我们可以在模型的残差上使用 Ljung-Box 检验来查找自相关性,理想情况下,我们的残差应该是白噪声。
- 零假设:数据独立分布,无自相关。
- 备择假设:数据不独立分布;它们表现出序列相关。
带有 Box-Pierce 选项的 Ljung-Box 检验将为每个滞后返回 Ljung-Box 检验统计量、Ljung-Box p 值、Box-Pierce 检验统计量和 Box-Pierce p 值。
如果 $p<\alpha (0.05)$,我们拒绝零假设。
lb_stat | lb_pvalue | bp_stat | bp_pvalue | |
---|---|---|---|---|
1 | 49.222273 | 2.285409e-12 | 49.155183 | 2.364927e-12 |
2 | 62.991348 | 2.097020e-14 | 62.899234 | 2.195861e-14 |
3 | 63.944944 | 8.433622e-14 | 63.850663 | 8.834380e-14 |
4 | 74.343652 | 2.742989e-15 | 74.221024 | 2.911751e-15 |
5 | 80.234862 | 7.494100e-16 | 80.093498 | 8.022242e-16 |
将数据分割成训练集和测试集
让我们将数据分成几个集合
- 用于训练
ARCH
模型的数据 - 用于测试模型的数据
对于测试数据,我们将使用最后 30 天的数据来测试和评估模型的性能。
现在让我们绘制训练数据和测试数据。
使用 StatsForecast 实现 ARCH
要了解更多关于 ARCH Model
函数的参数,请参见下文列表。有关更多信息,请访问文档。
加载库
构建模型
导入并实例化模型。设置参数有时比较棘手。大师 Rob Hyndmann 的这篇关于季节性周期的文章可能会有所帮助。season_length。
我们通过实例化一个带有以下参数的新 StatsForecast 对象来拟合模型
models:模型列表。从 models 中选择您需要的模型并导入。
-
freq:
一个字符串,表示数据的频率。(参见 pandas 的可用频率。) -
n_jobs:
n_jobs:int,用于并行处理的作业数,使用 -1 表示所有核心。 -
fallback_model:
如果模型失败时使用的模型。
任何设置都传递给构造函数。然后调用其 fit 方法并传入历史数据框。
拟合模型
让我们看看 ARCH 模型的结果。我们可以使用以下指令观察它:
现在让我们可视化模型的残差。
如我们所见,上面获得的结果是字典形式的输出,要从字典中提取每个元素,我们将使用 .get()
函数提取元素,然后将其保存在 pd.DataFrame()
中。
残差模型 | |
---|---|
0 | NaN |
1 | NaN |
2 | -1.071764 |
… | … |
2109 | 1.495836 |
2110 | -2.222393 |
2111 | 0.248642 |
预测方法
如果您希望在具有多个序列或模型的产品设置中提高速度,我们建议使用 StatsForecast.forecast
方法,而不是 .fit
和 .predict
。
主要区别在于 .forecast
不存储拟合值,并且在分布式环境中具有高度可伸缩性。
forecast 方法接受两个参数:预测未来 h
(horizon)步和 level
。
-
h (int):
表示未来 h 步的预测。在此示例中,为未来 12 个月。 -
level (list of floats):
此可选参数用于概率预测。设置预测区间的水平(或置信百分位数)。例如,level=[90]
表示模型期望真实值在 90% 的时间内位于该区间内。
此处的 forecast 对象是一个新的数据框,其中包含一列模型名称和 y hat 值,以及不确定性区间的列。根据您的计算机,此步骤大约需要 1 分钟。
unique_id | ds | ARCH(2) | |
---|---|---|---|
0 | 1 | 2023-05-25 00:00:00+00:00 | 1.681839 |
1 | 1 | 2023-05-26 00:00:00+00:00 | -0.777029 |
2 | 1 | 2023-05-29 00:00:00+00:00 | -0.677962 |
… | … | … | … |
79 | 1 | 2023-09-13 00:00:00+00:00 | 0.695591 |
80 | 1 | 2023-09-14 00:00:00+00:00 | -0.176075 |
81 | 1 | 2023-09-15 00:00:00+00:00 | -0.158605 |
unique_id | ds | y | ARCH(2) | |
---|---|---|---|---|
0 | 1 | 2015-01-05 00:00:00+00:00 | -1.827811 | NaN |
1 | 1 | 2015-01-06 00:00:00+00:00 | -0.889347 | NaN |
2 | 1 | 2015-01-07 00:00:00+00:00 | 1.162984 | 2.234748 |
3 | 1 | 2015-01-08 00:00:00+00:00 | 1.788828 | -0.667577 |
4 | 1 | 2015-01-09 00:00:00+00:00 | -0.840381 | -0.752438 |
使用 forecast 方法添加 95% 置信区间
unique_id | ds | ARCH(2) | ARCH(2)-lo-95 | ARCH(2)-hi-95 | |
---|---|---|---|---|---|
0 | 1 | 2023-05-25 00:00:00+00:00 | 1.681839 | -0.419326 | 3.783003 |
1 | 1 | 2023-05-26 00:00:00+00:00 | -0.777029 | -3.939054 | 2.384996 |
2 | 1 | 2023-05-29 00:00:00+00:00 | -0.677962 | -3.907262 | 2.551338 |
… | … | … | … | … | … |
79 | 1 | 2023-09-13 00:00:00+00:00 | 0.695591 | -0.937585 | 2.328766 |
80 | 1 | 2023-09-14 00:00:00+00:00 | -0.176075 | -1.405359 | 1.053210 |
81 | 1 | 2023-09-15 00:00:00+00:00 | -0.158605 | -1.381915 | 1.064705 |
ds | unique_id | y | ARCH(2) | |
---|---|---|---|---|
0 | 2023-05-25 00:00:00+00:00 | 1 | 0.875758 | 1.681839 |
1 | 2023-05-26 00:00:00+00:00 | 1 | 1.304909 | -0.777029 |
2 | 2023-05-30 00:00:00+00:00 | 1 | 0.001660 | -0.968703 |
… | … | … | … | … |
79 | 2023-09-19 00:00:00+00:00 | 1 | -0.215101 | NaN |
80 | 2023-09-20 00:00:00+00:00 | 1 | -0.939479 | NaN |
81 | 2023-09-21 00:00:00+00:00 | 1 | -1.640093 | NaN |
带有置信区间的预测方法
使用 predict 方法生成预测。
predict 方法接受两个参数:预测未来的 h
(horizon)和 level
。
-
h (int):
表示未来 h 步的预测。在此示例中,为未来 12 个月。 -
level (list of floats):
此可选参数用于概率预测。设置预测区间的水平(或置信百分位数)。例如,level=[95]
表示模型期望真实值在 95% 的时间内位于该区间内。
此处的 forecast 对象是一个新的数据框,其中包含一列模型名称和 y hat 值,以及不确定性区间的列。
此步骤应不到 1 秒。
unique_id | ds | ARCH(2) | |
---|---|---|---|
0 | 1 | 2023-05-25 00:00:00+00:00 | 1.681839 |
1 | 1 | 2023-05-26 00:00:00+00:00 | -0.777029 |
2 | 1 | 2023-05-29 00:00:00+00:00 | -0.677962 |
… | … | … | … |
79 | 1 | 2023-09-13 00:00:00+00:00 | 0.695591 |
80 | 1 | 2023-09-14 00:00:00+00:00 | -0.176075 |
81 | 1 | 2023-09-15 00:00:00+00:00 | -0.158605 |
unique_id | ds | ARCH(2) | ARCH(2)-lo-95 | ARCH(2)-lo-80 | ARCH(2)-hi-80 | ARCH(2)-hi-95 | |
---|---|---|---|---|---|---|---|
0 | 1 | 2023-05-25 00:00:00+00:00 | 1.681839 | -0.419326 | 0.307961 | 3.055716 | 3.783003 |
1 | 1 | 2023-05-26 00:00:00+00:00 | -0.777029 | -3.939054 | -2.844566 | 1.290508 | 2.384996 |
2 | 1 | 2023-05-29 00:00:00+00:00 | -0.677962 | -3.907262 | -2.789488 | 1.433564 | 2.551338 |
… | … | … | … | … | … | … | … |
79 | 1 | 2023-09-13 00:00:00+00:00 | 0.695591 | -0.937585 | -0.372285 | 1.763467 | 2.328766 |
80 | 1 | 2023-09-14 00:00:00+00:00 | -0.176075 | -1.405359 | -0.979860 | 0.627711 | 1.053210 |
81 | 1 | 2023-09-15 00:00:00+00:00 | -0.158605 | -1.381915 | -0.958485 | 0.641274 | 1.064705 |
我们可以使用 pandas 函数 pd.concat()
将预测结果与历史数据连接起来,然后使用该结果进行绘图。
unique_id | y | ARCH(2) | ARCH(2)-lo-95 | ARCH(2)-lo-80 | ARCH(2)-hi-80 | ARCH(2)-hi-95 | |
---|---|---|---|---|---|---|---|
ds | |||||||
2023-03-07 00:00:00+00:00 | 1 | -1.532692 | NaN | NaN | NaN | NaN | NaN |
2023-03-08 00:00:00+00:00 | 1 | 0.141479 | NaN | NaN | NaN | NaN | NaN |
2023-03-09 00:00:00+00:00 | 1 | -1.845936 | NaN | NaN | NaN | NaN | NaN |
… | … | … | … | … | … | … | … |
2023-09-13 00:00:00+00:00 | 1 | NaN | 0.695591 | -0.937585 | -0.372285 | 1.763467 | 2.328766 |
2023-09-14 00:00:00+00:00 | 1 | NaN | -0.176075 | -1.405359 | -0.979860 | 0.627711 | 1.053210 |
2023-09-15 00:00:00+00:00 | 1 | NaN | -0.158605 | -1.381915 | -0.958485 | 0.641274 | 1.064705 |
让我们使用 Statsforecast
中自带的 plot 函数绘制相同的图,如下所示。
交叉验证
在前面的步骤中,我们使用历史数据来预测未来。但是,为了评估其准确性,我们还想知道模型在过去会表现如何。要评估模型在数据上的准确性和稳健性,请执行交叉验证。
对于时间序列数据,交叉验证是通过在历史数据上定义一个滑动窗口并预测其后续周期来完成的。这种形式的交叉验证使我们能够在更广泛的时间实例上更好地估计模型的预测能力,同时保持训练集中的数据是连续的,这是模型所要求的。
下图描绘了这种交叉验证策略
执行时间序列交叉验证
时间序列模型的交叉验证被认为是最佳实践,但大多数实现速度非常慢。Statsforecast 库将交叉验证实现为分布式操作,从而减少了执行过程的时间。如果数据集很大,您还可以使用 Ray、Dask 或 Spark 在分布式集群中执行交叉验证。
在此示例中,我们希望评估模型在过去 5 个月(n_windows=5
)的性能,每隔 12 个月(step_size=12
)进行预测。根据您的计算机,此步骤大约需要 1 分钟。
StatsForecast 类的 cross_validation 方法接受以下参数。
-
df:
训练数据框 -
h (int):
表示预测未来 h 步。在此示例中,为未来 12 个月。 -
step_size (int):
每个窗口之间的步长。换句话说:您希望多久运行一次预测过程。 -
n_windows(int):
用于交叉验证的窗口数。换句话说:您希望评估过去多少次预测过程。
crossvaldation_df 对象是一个新的数据框,包含以下列:
unique_id:
序列标识符ds:
日期戳或时间索引cutoff:
n_windows 的最后一个日期戳或时间索引。y:
真实值"model":
包含模型名称和拟合值的列。
unique_id | ds | cutoff | y | ARCH(2) | |
---|---|---|---|---|---|
0 | 1 | 2022-12-21 00:00:00+00:00 | 2022-12-20 00:00:00+00:00 | 1.486799 | 1.382105 |
1 | 1 | 2022-12-22 00:00:00+00:00 | 2022-12-20 00:00:00+00:00 | -1.445170 | -0.651618 |
2 | 1 | 2022-12-23 00:00:00+00:00 | 2022-12-20 00:00:00+00:00 | 0.586810 | -0.595213 |
… | … | … | … | … | … |
407 | 1 | 2023-05-22 00:00:00+00:00 | 2023-01-26 00:00:00+00:00 | 0.015503 | 0.693070 |
408 | 1 | 2023-05-23 00:00:00+00:00 | 2023-01-26 00:00:00+00:00 | -1.122203 | -0.176181 |
409 | 1 | 2023-05-24 00:00:00+00:00 | 2023-01-26 00:00:00+00:00 | -0.731860 | -0.157522 |
模型评估
现在我们将根据预测结果评估模型,我们将使用不同类型的指标 MAE、MAPE、MASE、RMSE、SMAPE 来评估准确性。
metric | ARCH(2) | |
---|---|---|
0 | mae | 0.949721 |
1 | mape | 11.789856 |
2 | mase | 0.875298 |
3 | rmse | 1.164914 |
4 | smape | 0.725702 |
参考资料
- Changquan Huang • Alla Petukhina. Springer series (2022). Applied Time Series Analysis and Forecasting with Python.
- Engle, R. F. (1982). Autoregressive conditional heteroscedasticity with estimates of the variance of United Kingdom inflation. Econometrica: Journal of the econometric society, 987-1007..
- James D. Hamilton. Time Series Analysis Princeton University Press, Princeton, New Jersey, 1st Edition, 1994.
- Nixtla Parameters.
- Pandas 可用频率.
- Rob J. Hyndman 和 George Athanasopoulos (2018). “Forecasting Principles and Practice (3rd ed)”.
- 季节性周期 - Rob J Hyndman.