波动性预测 (GARCH & ARCH)
在本例中,我们将使用 GARCH 和 ARCH 模型预测标普500指数和几家上市公司的波动性
先决条件
本教程假设您对 StatsForecast 有基本了解。如需最简单的示例,请访问快速入门
引言
广义自回归条件异方差 (GARCH) 模型用于处理随时间表现出非恒定波动性的时间序列。这里的波动性指的是条件标准差。GARCH(p,q) 模型由下式给出
其中 是独立同分布的,均值为零,方差为单位方差,且 根据下式演变
上述方程中的系数必须满足以下条件
- , 对于所有 ,且 对于所有
- 。这里假设 对于 且 对于 。
GARCH 模型的一个特例是 ARCH 模型,其中 。这两种模型在金融领域常用于模拟股票价格、汇率、利率及其他金融工具的波动性。它们也用于风险管理,以估计金融资产价格大幅波动的概率。
学完本教程后,您将很好地了解如何在StatsForecast中实现 GARCH 或 ARCH 模型,以及如何使用它们分析和预测金融时间序列数据。
大纲
- 安装库
- 加载和探索数据
- 训练模型
- 执行时间序列交叉验证
- 评估结果
- 预测波动性
提示
您可以使用 Colab 交互式地运行此 Notebook
安装库
我们假设您已经安装了 StatsForecast。如果还没有,请查看此指南了解如何安装 StatsForecast 的说明
使用 pip install statsforecast
安装必要的包
加载和探索数据
在本教程中,我们将使用标普500指数和几家上市公司的近5年价格数据。可以使用yfinance从 Yahoo! Finance 下载数据。要安装它,请使用 pip install yfinance
。
我们还需要 pandas
来处理数据帧。
价格 | 调整收盘价 | … | 成交量 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
股票代码 | AAPL | AMZN | GOOG | META | MSFT | NFLX | NKE | NVDA | SPY | TSLA | … | AAPL | AMZN | GOOG | META | MSFT | NFLX | NKE | NVDA | SPY | TSLA |
日期 | |||||||||||||||||||||
2018-01-01 | 39.388084 | 72.544502 | 58.353695 | 186.328979 | 88.027702 | 270.299988 | 63.341862 | 6.078998 | 252.565216 | 23.620667 | … | 2638717600 | 1927424000 | 574768000 | 495655700 | 574258400 | 238377600 | 157812200 | 11456216000 | 1985506700 | 1864072500 |
2018-02-01 | 41.902908 | 75.622498 | 55.101181 | 177.784729 | 86.878807 | 291.380005 | 62.236938 | 5.985018 | 243.381882 | 22.870667 | … | 3711577200 | 2755680000 | 847640000 | 516251600 | 725663300 | 184585800 | 160317000 | 14915528000 | 2923722000 | 1637850000 |
2018-03-01 | 39.631344 | 72.366997 | 51.463116 | 159.310333 | 84.959763 | 295.350006 | 61.689133 | 5.731123 | 235.766373 | 17.742001 | … | 2854910800 | 2608002000 | 907066000 | 996201700 | 750754800 | 263449400 | 174066700 | 14118440000 | 2323561800 | 2359027500 |
2018-04-01 | 39.036106 | 78.306503 | 50.741886 | 171.483688 | 87.054207 | 312.459991 | 63.691761 | 5.565567 | 237.934006 | 19.593332 | … | 2664617200 | 2598392000 | 834318000 | 750072700 | 668130700 | 262006000 | 158981900 | 11144008000 | 1998466500 | 2854662000 |
2018-05-01 | 44.140598 | 81.481003 | 54.116600 | 191.204315 | 92.006393 | 351.600006 | 66.867508 | 6.240908 | 243.717957 | 18.982000 | … | 2483905200 | 1432310000 | 636988000 | 401144100 | 509417900 | 142050800 | 129566300 | 11978240000 | 1606397200 | 2333671500 |
下载的数据包含不同的价格。我们将使用调整收盘价,这是考虑了股票分割或股息分配等任何公司行为后的收盘价。它也是用于检验历史回报的价格。
注意,yfinance
返回的数据帧具有MultiIndex(多重索引),因此我们需要同时选择调整后的价格和股票代码。
股票代码 | 日期 | SPY | MSFT | AAPL | GOOG | AMZN | TSLA | NVDA | META | NKE | NFLX |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2018-01-01 | 252.565216 | 88.027702 | 39.388084 | 58.353695 | 72.544502 | 23.620667 | 6.078998 | 186.328979 | 63.341862 | 270.299988 |
1 | 2018-02-01 | 243.381882 | 86.878807 | 41.902908 | 55.101181 | 75.622498 | 22.870667 | 5.985018 | 177.784729 | 62.236938 | 291.380005 |
2 | 2018-03-01 | 235.766373 | 84.959763 | 39.631344 | 51.463116 | 72.366997 | 17.742001 | 5.731123 | 159.310333 | 61.689133 | 295.350006 |
3 | 2018-04-01 | 237.934006 | 87.054207 | 39.036106 | 50.741886 | 78.306503 | 19.593332 | 5.565567 | 171.483688 | 63.691761 | 312.459991 |
4 | 2018-05-01 | 243.717957 | 92.006393 | 44.140598 | 54.116600 | 81.481003 | 18.982000 | 6.240908 | 191.204315 | 66.867508 | 351.600006 |
StatsForecast 的输入是一个长格式的数据帧,包含三列:unique_id
、ds
和 y
unique_id
:(字符串、整数或类别)序列的唯一标识符。ds
:(日期戳或整数)格式为 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS 的日期戳,或表示时间的整数索引。y
:(数值)我们希望预测的度量值。
因此,我们需要重塑数据。我们将通过创建一个名为 price
的新数据帧来完成此操作。
unique_id | ds | y | |
---|---|---|---|
0 | SPY | 2018-01-01 | 252.565216 |
1 | SPY | 2018-02-01 | 243.381882 |
2 | SPY | 2018-03-01 | 235.766373 |
3 | SPY | 2018-04-01 | 237.934006 |
4 | SPY | 2018-05-01 | 243.717957 |
… | … | … | … |
595 | NFLX | 2022-08-01 | 223.559998 |
596 | NFLX | 2022-09-01 | 235.440002 |
597 | NFLX | 2022-10-01 | 291.880005 |
598 | NFLX | 2022-11-01 | 305.529999 |
599 | NFLX | 2022-12-01 | 294.880005 |
我们可以使用 StatsForecast 类的 plot
方法绘制此序列。
利用价格数据,我们可以计算标普500指数和上市公司的对数回报率。这是我们感兴趣的变量,因为它可能与 GARCH 框架配合良好。对数回报率由下式给出
我们将在 price 数据帧上计算回报率,然后创建一个符合 StatsForecast 格式的回报率数据帧。为此,我们需要 numpy
。
unique_id | ds | y | |
---|---|---|---|
0 | SPY | 2018-01-01 | NaN |
1 | SPY | 2018-02-01 | -0.037038 |
2 | SPY | 2018-03-01 | -0.031790 |
3 | SPY | 2018-04-01 | 0.009152 |
4 | SPY | 2018-05-01 | 0.024018 |
… | … | … | … |
595 | NFLX | 2022-08-01 | -0.005976 |
596 | NFLX | 2022-09-01 | 0.051776 |
597 | NFLX | 2022-10-01 | 0.214887 |
598 | NFLX | 2022-11-01 | 0.045705 |
599 | NFLX | 2022-12-01 | -0.035479 |
警告
如果数据的量级非常小(例如 ),
scipy.optimize.minimize
可能无法成功终止。在这种情况下,请重新缩放数据,然后生成 GARCH 或 ARCH 模型。
从这张图可以看出,回报率似乎适合 GARCH 框架,因为大的冲击往往会伴随着其他的大的冲击。这并不意味着每次大的冲击后我们都应该期待另一次;仅仅意味着大方差的概率大于小方差的概率。
训练模型
我们首先需要从 statsforecast.models
中导入GARCH和ARCH模型,然后通过实例化一个新的 StatsForecast 对象来拟合它们。请注意,我们将使用不同的 和 值。在下一节中,我们将使用交叉验证来确定哪个模型产生最准确的结果。我们还将导入Naive模型,因为我们将它用作基准。
要实例化一个新的 StatsForecast 对象,我们需要以下参数
df
:包含训练数据的数据帧。models
:上一步中定义的模型列表。freq
:一个字符串,指示数据频率。这里我们将使用 **MS**,对应于月初。您可以在此处查看 panda 可用频率的列表。n_jobs
:一个整数,指示并行处理中使用的作业数。使用 -1 选择所有核心。
执行时间序列交叉验证
时间序列交叉验证是一种评估模型在过去表现的方法。它通过在历史数据上定义一个滑动窗口并预测其后续时期来工作。这里我们将使用 StatsForercast 的 cross-validation
方法来确定标普500指数和所选公司最准确的模型。
此方法接受以下参数
df
:包含训练数据的数据帧。h
(整数):表示未来 h 步将要预测的时长。step_size
(整数):每个窗口之间的步长,表示您希望多久运行一次预测过程。n_windows
(整数):用于交叉验证的窗口数量,表示您希望评估的过去预测过程的数量。
对于本例,我们将使用 4 个窗口,每个窗口为 3 个月,即一年中的所有季度。
cv_df
对象是一个包含以下列的数据帧
unique_id
:序列标识符。ds
:日期戳或时间索引cutoff
:n_windows
的最后一个日期戳或时间索引。y
:真实值"model"
:包含模型名称和拟合值的列。
unique_id | ds | 截止日期 | 实际值 | ARCH(1) | ARCH(2) | GARCH(1,1) | GARCH(1,2) | GARCH(2,2) | GARCH(2,1) | Naive | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | AAPL | 2022-01-01 | 2021-12-01 | -0.015837 | 0.142421 | 0.144016 | 0.142954 | 0.141682 | 0.141682 | 0.144015 | 0.073061 |
1 | AAPL | 2022-02-01 | 2021-12-01 | -0.056856 | -0.056893 | -0.057158 | -0.056388 | -0.058786 | -0.058785 | -0.057158 | 0.073061 |
2 | AAPL | 2022-03-01 | 2021-12-01 | 0.057156 | -0.045901 | -0.046479 | -0.047513 | -0.045711 | -0.045711 | -0.046478 | 0.073061 |
3 | AAPL | 2022-04-01 | 2022-03-01 | -0.102178 | 0.138650 | 0.140222 | 0.228138 | 0.136118 | 0.136132 | 0.140211 | 0.057156 |
4 | AAPL | 2022-05-01 | 2022-03-01 | -0.057505 | -0.056007 | -0.056268 | -0.087833 | -0.057078 | -0.057085 | -0.056265 | 0.057156 |
您可以在此处找到关于交叉验证的教程。
评估结果
为了计算预测的准确性,我们将使用平均绝对误差 (mae),它是绝对误差的总和除以预测数量。
需要为每个窗口计算 MAE,然后对所有窗口的结果取平均。为此,我们将创建以下函数。
ARCH(1) | ARCH(2) | GARCH(1,1) | GARCH(1,2) | GARCH(2,2) | GARCH(2,1) | Naive | |
---|---|---|---|---|---|---|---|
unique_id | |||||||
AAPL | 0.071773 | 0.068927 | 0.080182 | 0.075321 | 0.069187 | 0.068817 | 0.110426 |
AMZN | 0.127390 | 0.113613 | 0.118859 | 0.119930 | 0.109910 | 0.109910 | 0.115189 |
GOOG | 0.093849 | 0.093753 | 0.109662 | 0.101583 | 0.094648 | 0.103389 | 0.083233 |
META | 0.198334 | 0.198893 | 0.199615 | 0.199711 | 0.199712 | 0.198892 | 0.185346 |
MSFT | 0.082373 | 0.075055 | 0.072241 | 0.072765 | 0.073006 | 0.082066 | 0.086951 |
NFLX | 0.159386 | 0.159528 | 0.199623 | 0.232477 | 0.230075 | 0.230770 | 0.167421 |
NKE | 0.108337 | 0.098918 | 0.103366 | 0.110278 | 0.107179 | 0.102708 | 0.160404 |
NVDA | 0.189461 | 0.207871 | 0.198999 | 0.196170 | 0.211932 | 0.211940 | 0.215289 |
SPY | 0.058511 | 0.058583 | 0.058701 | 0.062492 | 0.057053 | 0.068192 | 0.089012 |
TSLA | 0.192003 | 0.192618 | 0.190225 | 0.192354 | 0.191620 | 0.191423 | 0.218857 |
因此,描述苹果公司股票对数回报率最准确的模型是 GARCH(2, 1),对于亚马逊公司的股票是 GARCH(2,2),依此类推。
预测波动性
我们现在可以生成下一季度的预测。为此,我们将使用 forecast
方法,该方法需要以下参数
h
:(整数)预测范围。level
:(浮点数列表)预测区间的置信水平fitted
:(布尔值 = False)返回样本内预测。
unique_id | ds | ARCH(1) | ARCH(1)-下限-95 | ARCH(1)-下限-80 | ARCH(1)-上限-80 | ARCH(1)-上限-95 | ARCH(2) | ARCH(2)-下限-95 | ARCH(2)-下限-80 | … | GARCH(2,1) | GARCH(2,1)-下限-95 | GARCH(2,1)-下限-80 | GARCH(2,1)-上限-80 | GARCH(2,1)-上限-95 | Naive | Naive-下限-80 | Naive-下限-95 | Naive-上限-80 | Naive-上限-95 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | AAPL | 2023-01-01 | 0.150457 | 0.133641 | 0.139462 | 0.161453 | 0.167273 | 0.150158 | 0.133409 | 0.139206 | … | 0.147602 | 0.131418 | 0.137020 | 0.158184 | 0.163786 | -0.128762 | -0.284462 | -0.366885 | 0.026939 | 0.109362 |
1 | AAPL | 2023-02-01 | -0.056943 | -0.073924 | -0.068046 | -0.045839 | -0.039961 | -0.057207 | -0.074346 | -0.068414 | … | -0.059512 | -0.078060 | -0.071640 | -0.047384 | -0.040964 | -0.128762 | -0.348956 | -0.465520 | 0.091433 | 0.207997 |
2 | AAPL | 2023-03-01 | -0.048391 | -0.064843 | -0.059148 | -0.037633 | -0.031939 | -0.049282 | -0.066345 | -0.060439 | … | -0.054539 | -0.075438 | -0.068204 | -0.040875 | -0.033641 | -0.128762 | -0.398443 | -0.541204 | 0.140920 | 0.283681 |
3 | AMZN | 2023-01-01 | 0.152147 | 0.134952 | 0.140904 | 0.163391 | 0.169343 | 0.148658 | 0.132242 | 0.137924 | … | 0.148599 | 0.132196 | 0.137873 | 0.159324 | 0.165001 | -0.139141 | -0.315716 | -0.409190 | 0.037435 | 0.130909 |
4 | AMZN | 2023-02-01 | -0.057301 | -0.074497 | -0.068545 | -0.046058 | -0.040106 | -0.061187 | -0.080794 | -0.074007 | … | -0.069303 | -0.094457 | -0.085750 | -0.052856 | -0.044150 | -0.139141 | -0.388856 | -0.521048 | 0.110575 | 0.242767 |
根据上一节的结果,我们可以为标普500指数和所选公司选择最佳模型。部分图表如下所示。请注意,我们在 plot
方法中使用了一些附加参数
level
:(整数列表)预测区间的置信水平(此参数已定义)。unique_ids
:(字符串、整数或类别列表)要绘制的 ID。models
:(字符串列表)。要绘制的模型。在此示例中,是交叉验证选择的模型。