一、资产波动率模型

波动率模型简介

波动率是衡量金融资产价格变动幅度的指标,反映了市场的不确定性。波动率模型的目的是预测未来的波动率,帮助投资者评估风险和做出投资决策。在金融市场分析中,波动率模型是非常重要的工具。

波动率模型的种类
  1. 历史波动率模型:通过计算过去一段时间内资产价格的标准差来估计波动率。
  2. 隐含波动率模型:利用期权价格来推断市场对未来波动率的预期。
  3. GARCH模型(广义自回归条件异方差模型):用于预测时间序列数据的波动率,考虑了波动率随时间变化的特性。

历史波动率和隐含波动率的相关内容在以往的文章中已有涉猎,在这里不展开。

通常来说,波动率模型的建立有以下四个步骤:

  1. 通过检验序列的自相关性建立均值的方程, 必要时还可以引入适当的解释变量;
  2. 对均值方程的残差作白噪声检验, 通过后,对残差检验ARCH效应;
  3. 如果ARCH效应检验结果显著, 则指定一个波动率模型, 对均值方程和波动率方程进行联合估计;
  4. 对得到的模型进行验证, 需要时做改进。

需要注意的是,当序列均值显著不为0的时候需要进行去中心化处理,从而得到零均值序列。

ARCH效应的检验

金融时间序列通常具有以下四个特征:

  1. 波动率聚集:大的价格变动倾向于被后续的大的价格变动所跟随;
  2. 波动率不出现跳跃式波动;
  3. 平稳:波动率总在一定范围内变化;
  4. 杠杆效应:相较于大幅上升,大幅下降时波动率更大。

本节介绍的ARCH(自回归条件异方差)效应检验是金融计量经济学中的一个重要概念,用于检测金融时间序列(如股票收益率)中的波动聚集现象。在ARCH模型框架下,一个时间序列的当前波动率不仅取决于历史信息,还取决于其过去波动的大小。

检测ARCH效应的基本步骤包括:

  1. 模型设定:首先,设定一个基本的时间序列模型,如简单的自回归模型(AR模型)来描述变量的均值行为。
  2. 残差分析:从上一步中的模型中得到残差序列,进一步检验这些残差的平方是否具有自回归特性,这是检测ARCH效应的关键。
  3. Lagrange乘子检验(LM检验):这是最常用的检测ARCH效应的方法。通过对残差序列平方\left \{ {a_t}^2 \right \}进行自回归(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模型的基本思想是:

  1. 资产收益率的扰动序列a_t = r_t - E(r_t|F_{t-1})是前后不相关的, 但是前后不独立。
  2. \left \{ a_t \right \}的不独立性, 描述为 Var(a_t|F_{t-1}) = Var(r_t|F_{t-1 }) 可以用{a_t}^2的滞后值的线性组合表示。

具体而言,ARCH(q)模型可以如下表达:

ARCH之所以可以满足资产收益波动聚集的现象是因为其系数\alpha_j都是非负数, 所以历史值\varepsilon _{i-j}较大意味着条件方差较大, 即大波动后面更倾向出现大波动。

ARCH模型的性质

以最简单的ARCH(1)为例讨论模型的性质。 模型为\epsilon _t = \sigma _t z_t,\sigma^2_t = \alpha_0+\alpha_1\epsilon _{t-1}^2。注意为了使方差有限,参数α需满足一定的条件。考虑其无条件期望为0和方差有限有:E(\epsilon _t) = E(r_t - \mu) = E(r_t - E(r_t|F_{t-1})) = 0

Var(\epsilon _t) = E(r_t^2) = E(E(r_t^2|Ft-1)) = E(\sigma^2E(z_t|F_{t-1})) = \alpha_0 +\alpha_1E(\epsilon_{t-1})

由于标准正态分布的高阶矩条件已知,我们可以借助此计算ARCH模型的高阶矩,在这里不赘述。高阶ARCH模型的性质和低阶的情况相似但是推导更为复杂。

总结来说,ARCH模型的核心是:资产的收益率误差项(或者说新信息的冲击)的波动性是随着时间变化的。过去的波动会影响当前的波动性,这使得模型能够描述和预测现实中常见的金融市场波动行为。通过对模型参数的估计,我们可以对未来的波动性进行预测,为风险管理和投资决策提供依据。但是ARCH模型仍有明显的不足:从表达式我们不难看出,无论正还是负的过往波动对现在的影响符号相同,这在现实中不太合理。

ARCH模型的建模

1、根据PACF图确定模型的阶数
  1. 绘制PACF图。
  2. 观察PACF图中的棒图(lag bars)。
  3. 找到棒图明显切入零线之后的点,这通常意味着该滞后阶数之后的数据点不再显著。
  4. 选择最后一个显著非零的棒图对应的滞后阶数作为模型的阶数。
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、模型估计

当假定z_t为独立同标准正态分布分布随机变量列时, 在已知\alpha_0,...,\alpha_{t-1}条件下,\sigma_t^2 = \alpha_0 +\alpha_1\epsilon _{t-1}^2+...+\alpha_m\epsilon _{t-m}^2看成已知数, \epsilon _t的条件分布为N(0,\sigma_t^2), 于是似然函数为

在金融领域中,厚尾特性对于理解和预测金融市场中的极端事件,如市场崩溃或者大规模价格波动,至关重要,下述是厚尾现象的定义。

厚尾现象的定义:在统计学中,如果一个概率分布的尾部比正态分布的尾部更“厚”或更“重”,则称该分布具有厚尾特性,这意味着极端值出现的概率比正态分布预期的要高。这种分布能更好地捕捉到数据中的极端变化,特别是在金融市场中的极端损失或收益。

因此在实际情况中可能会将 z_t看作自由度为\nu的标准t分布。其分布密度为:据此可得条件似然函数并求得在t分布下的最大似然估计。注意:先验地\nu通常取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代码实现。若有不足有误之处,还望温和批评指正。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐