Python金融数据分析-资产波动率模型1
一、资产波动率模型
波动率模型简介
波动率是衡量金融资产价格变动幅度的指标,反映了市场的不确定性。波动率模型的目的是预测未来的波动率,帮助投资者评估风险和做出投资决策。在金融市场分析中,波动率模型是非常重要的工具。
波动率模型的种类
- 历史波动率模型:通过计算过去一段时间内资产价格的标准差来估计波动率。
- 隐含波动率模型:利用期权价格来推断市场对未来波动率的预期。
- GARCH模型(广义自回归条件异方差模型):用于预测时间序列数据的波动率,考虑了波动率随时间变化的特性。
历史波动率和隐含波动率的相关内容在以往的文章中已有涉猎,在这里不展开。
通常来说,波动率模型的建立有以下四个步骤:
- 通过检验序列的自相关性建立均值的方程, 必要时还可以引入适当的解释变量;
- 对均值方程的残差作白噪声检验, 通过后,对残差检验ARCH效应;
- 如果ARCH效应检验结果显著, 则指定一个波动率模型, 对均值方程和波动率方程进行联合估计;
- 对得到的模型进行验证, 需要时做改进。
需要注意的是,当序列均值显著不为0的时候需要进行去中心化处理,从而得到零均值序列。
ARCH效应的检验
金融时间序列通常具有以下四个特征:
- 波动率聚集:大的价格变动倾向于被后续的大的价格变动所跟随;
- 波动率不出现跳跃式波动;
- 平稳:波动率总在一定范围内变化;
- 杠杆效应:相较于大幅上升,大幅下降时波动率更大。
本节介绍的ARCH(自回归条件异方差)效应检验是金融计量经济学中的一个重要概念,用于检测金融时间序列(如股票收益率)中的波动聚集现象。在ARCH模型框架下,一个时间序列的当前波动率不仅取决于历史信息,还取决于其过去波动的大小。
检测ARCH效应的基本步骤包括:
- 模型设定:首先,设定一个基本的时间序列模型,如简单的自回归模型(AR模型)来描述变量的均值行为。
- 残差分析:从上一步中的模型中得到残差序列,进一步检验这些残差的平方是否具有自回归特性,这是检测ARCH效应的关键。
- Lagrange乘子检验(LM检验):这是最常用的检测ARCH效应的方法。通过对残差序列平方
进行自回归(AR)模型进行最小二乘拟合,然后使用LM统计量来检验残差平方的自回归系数是否显著不为零。(或Ljung-Box白噪声检验)
import numpy as np
import pandas as pd
from statsmodels.stats.diagnostic import het_arch
from statsmodels.regression.linear_model import OLS
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
# 读取时间序列
file_path = 'm-intcsp7309.txt'
data_ts = pd.read_csv(file_path, header=None, squeeze=True)
# 进行Ljung-Box检验
# 这里的lags参数是你想要检验自相关性的滞后数
lags = 10
test_result = acorr_ljungbox(data_ts, lags=[lags], return_df=True)
# 使用OLS模型拟合时间序列,获取残差平方
model = OLS(data_ts, np.ones(n))
results = model.fit()
resid = results.resid
# 进行ARCH效应的LM检验
test_result = het_arch(resid)
print("LM Statistic:", test_result[0])
print("LM Test p-value:", test_result[1])
print("F-Statistic:", test_result[2])
print("F-Test p-value:", test_result[3])
二、ARCH模型
ARCH模型的基本思想是:
- 资产收益率的扰动序列
是前后不相关的, 但是前后不独立。
的不独立性, 描述为
可以用
的滞后值的线性组合表示。
具体而言,ARCH(q)模型可以如下表达:

ARCH之所以可以满足资产收益波动聚集的现象是因为其系数都是非负数, 所以历史值
较大意味着条件方差较大, 即大波动后面更倾向出现大波动。
ARCH模型的性质
以最简单的ARCH(1)为例讨论模型的性质。 模型为。注意为了使方差有限,参数α需满足一定的条件。考虑其无条件期望为0和方差有限有:
由于标准正态分布的高阶矩条件已知,我们可以借助此计算ARCH模型的高阶矩,在这里不赘述。高阶ARCH模型的性质和低阶的情况相似但是推导更为复杂。
总结来说,ARCH模型的核心是:资产的收益率误差项(或者说新信息的冲击)的波动性是随着时间变化的。过去的波动会影响当前的波动性,这使得模型能够描述和预测现实中常见的金融市场波动行为。通过对模型参数的估计,我们可以对未来的波动性进行预测,为风险管理和投资决策提供依据。但是ARCH模型仍有明显的不足:从表达式我们不难看出,无论正还是负的过往波动对现在的影响符号相同,这在现实中不太合理。
ARCH模型的建模
1、根据PACF图确定模型的阶数
- 绘制PACF图。
- 观察PACF图中的棒图(lag bars)。
- 找到棒图明显切入零线之后的点,这通常意味着该滞后阶数之后的数据点不再显著。
- 选择最后一个显著非零的棒图对应的滞后阶数作为模型的阶数。
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_pacf
# 假设你的数据存储在CSV文件中,列名为'returns',代表资产的收益率
# 你需要将'path_to_your_data.csv'替换为你数据文件的路径
data = pd.read_csv('path_to_your_data.csv')
# 提取收益率并计算平方,因为我们关心的是波动性(即误差项的平方)
returns_squared = data['returns'] ** 2
# 绘制PACF图
fig, ax = plt.subplots(figsize=(10, 6))
plot_pacf(returns_squared, ax=ax, lags=40)
# 显示图形
plt.show()
以上图为例,在29阶后图形大致位于置信区间内,因此应该取29阶模型
2、模型估计
当假定为独立同标准正态分布分布随机变量列时, 在已知
条件下,
看成已知数,
的条件分布为
, 于是似然函数为

在金融领域中,厚尾特性对于理解和预测金融市场中的极端事件,如市场崩溃或者大规模价格波动,至关重要,下述是厚尾现象的定义。
厚尾现象的定义:在统计学中,如果一个概率分布的尾部比正态分布的尾部更“厚”或更“重”,则称该分布具有厚尾特性,这意味着极端值出现的概率比正态分布预期的要高。这种分布能更好地捕捉到数据中的极端变化,特别是在金融市场中的极端损失或收益。
因此在实际情况中可能会将 看作自由度为
的标准t分布。其分布密度为:
据此可得条件似然函数并求得在t分布下的最大似然估计。注意:先验地通常取3至6之间。
特别地,对于有偏的资产收益率分布,可以进入有偏化t分布,其密度为:
3、模型估计
import numpy as np
import pandas as pd
from arch import arch_model
from statsmodels.stats.diagnostic import acorr_ljungbox
from scipy.stats import shapiro
# 建立并拟合ARCH模型
model = arch_model(returns, vol='Arch', p=1)
model_fit = model.fit(disp='off')
# 输出模型拟合摘要
print(model_fit.summary())
# 检验残差的自相关性
ljung_box_results = acorr_ljungbox(model_fit.resid, lags=[10], return_df=True)
print(ljung_box_results)
# 检验残差的正态性
shapiro_results = shapiro(model_fit.resid)
print('Shapiro-Wilk Test statistics =', shapiro_results[0], ', p-value =', shapiro_results[1])
# 打印出AIC和BIC
print('AIC:', model_fit.aic)
print('BIC:', model_fit.bic)
# 预测未来的波动率
forecasts = model_fit.forecast(horizon=5)
print(forecasts.variance[-1:])
当赤池信息准则(AIC)和贝叶斯信息准则(BIC)取值较小时说明模型拟合的效果较好。
4、模型预测
# 假设 ARCH_model 是已经拟合好的模型实例
# 假设想要预测的时间范围是5个时间点的波动率
# 预测未来5个时间点的波动率
forecasts = ARCH_model.forecast(horizon=5)
# 打印预测的波动率
predicted_var = forecasts.variance[-1:].values
print('预测的波动率为:', predicted_var)
三、小结和声明
本文主要介绍了笼统的波动率模型和ARCH模型的相关内容,是笔者学习李东风老师金融序列分析讲义所得内容。框架借鉴了李老师的讲义,但内容上进行了补充,并且提供python代码实现。若有不足有误之处,还望温和批评指正。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)