金融时间序列建模:Python处理日期、自相关性与ARMA模型实战指南

01 引言

金融时间序列建模:Python处理日期、自相关性与ARMA模型实战指南

作为金融时间序列的专题推文,【手把手教你】时间序列之日期处理:主要介绍了利用 Python 处理时间序列的日期以及进行统计分析;【Python 量化基础】时间序列的自相关性与平稳性:主要介绍了时间序列的一些基础概念,涵盖自相关性、偏自相关性、白噪声和平稳性;而【手把手教你】使用 Python 玩转金融时间序列模型:主要介绍了 AR、MA、ARMA 和 ARIMA 模型的基本原理以及 Python 的实现。从上一篇推文可以明显看出,用 ARMA 等模型对股票收益率的时间序列进行建模,其效果并不理想。主要原因是忽略了时间序列的异方差以及波动聚集特性。所谓波动聚集,意味着金融时间序列的波动呈现出这样的特征:大波动之后接着大波动,小波动之后接着小波动,也就是波峰和波谷具有连续性。ARCH 模型是基于条件异方差和波动聚集的特性进行建模的。GARCH 模型也是基于条件异方差和波动聚集的特性进行建模的。本次推文着重介绍 ARCH 模型的基本原理及其 Python 实现,同时也着重介绍 GARCH 模型的基本原理及其 Python 实现。

02 股票收益率时间序列特点

在介绍 ARCH 和 GARCH 模型之前,我们首先来看金融资产收益率的时间序列具有哪些较为突出的特点。依旧以沪深 300 指数为例,对其收益率时间的分布以及统计特性进行考察。接下来的 Python 代码与上一篇推文相近,包含导入所需用到的库、定义画图函数以及利用 tushare 获取数据等内容。

import pandas as pd

import numpy as np

导入 statsmodels.tsa.api 并将其命名为 smt 。

#tsa为Time Series analysis缩写

import statsmodels.api as sm

import scipy.stats as scs

from arch import arch_model

#画图

引入了 matplotlib 库的绘图模块 plt 。

import matplotlib as mpl

%matplotlib inline

#正常显示画图时出现的中文和负号

from pylab import mpl

mpl 的 rcParams 中的 'font.sans-serif' 被设置为 ['SimHei'] 。

mpl.rcParams 中关于 'axes.unicode_minus' 的设置为 False 。

如果给定了数据 data 且滞后参数 lags 也给定了,同时标题 title 也给定了,那么就进行 ts_plot 操作;如果只给定了数据 data 且滞后参数 lags 未给定,同时标题 title 给定了,那么就进行 ts_plot 操作;如果只给定了数据 data 且滞后参数 lags 给定了,同时标题 title 未给定,那么就进行 ts_plot 操作;如果只给定了数据 data 且滞后参数 lags 和标题 title 都未给定,那么就进行 ts_plot 操作。

如果 data 不是 pd.Series 类型的话。

data = pd.Series(data)

#matplotlib官方提供了五种不同的图形风格,

包括 bmh 这种样式,还有 ggplot 这种绘图工具,以及 dark_background 这种背景设置。

#fivethirtyeight和grayscale

使用 plt.style.context('ggplot') 这个操作;通过 plt.style.context('ggplot') 来进行相关设置;利用 plt.style.context('ggplot') 达成某种效果;借助 plt.style.context('ggplot') 以实现特定目的。

fig 被创建出来,其大小被设定为(10, 8),这是通过 plt.figure(figsize=(10, 8))实现的。

layout = (3, 2)

plt 利用 subplot2grid 方法创建了一个子图布局,其中 ts_ax 被指定为布局中的第一个子图,位于第 0 行第 0 列。

plt.subplot2grid(layout, (1, 0)) 赋值给了 acf_ax

通过 plt 的 subplot2grid 方法,以 layout 和 (1, 1) 为参数,生成了 pacf_ax。

qq_ax 是通过 plt.subplot2grid(layout, (2, 0)) 得到的;plt 调用 subplot2grid 函数并传入 layout 和 (2, 0) 作为参数,从而创建出了 qq_ax;在这个过程中,layout 确定了布局,(2, 0) 表示在布局中的具体位置,最终生成了 qq_ax 这个对象。

plt 利用 subplot2grid 函数创建一个子图布局,其中 pp_ax 被指定为布局中的一个子图,其位置为 (2, 1) 。

data.plot(ax=ts_ax)

ts_ax.set_title(title+'时序图')

smt.graphics 绘制自相关图(data),滞后项(lags)设置为给定的 lags 。

ax=acf_ax, alpha=0.5)

acf_ax.set_title('自相关系数')

smt.graphics 绘制自相关函数图,数据为 data,滞后阶数为 lags,即绘制 data 的自相关函数图,滞后阶数设定为 lags

ax=pacf_ax, alpha=0.5)

pacf_ax.set_title('偏自相关系数')

绘制数据的 Q-Q 图,指定线条类型为's',并将绘图结果放置在指定的轴对象 qq_ax 上。

qq_ax.set_title('QQ 图')

scs 进行概率图绘制,数据参与其中,参数 sparams 为数据的均值以及

data.std()), plot=pp_ax)

pp_ax.set_title('PP 图')

plt.tight_layout()

return

使用tushare获取沪深300交易数据

import tushare as ts

token='输入你的token'

pro=ts.pro_api(token)

df 是通过 pro.index_daily 函数获取的,其参数 ts_code 为'000300.SH'

df 的索引被设置为将 df 中的 trade_date 转换为日期时间类型后的值。

del df.index.name

df=df.sort_index()

df 的['ret']等于 np.log(df 的 close 除以 df 的 close 进行 shift(1))

#df.head()

使用 df.ret.dropna() 进行绘图操作,设置滞后值为 30,图表标题为“沪深 300 收益率”。

从上图能够看出,沪深 300 指数收益率的时间序列展现出了如下一些现象,并且这些现象具有一定的普遍性。

03 ARCH模型

ARCH模型的全称是自回归条件异方差模型。它被称为 Autoregressive Conditionally Heteroskedastic Models - ARCH(p)。该模型是 Engle 在 1982 年分析英国通货膨胀率时提出的。它主要用于刻画波动率的统计特征。

通常会首先假设收益率序列符合某个经典的时间序列模型,比如 MA 模型、AR 模型或者 ARMA 模型。以 AR(1)模型作为一个例子:

收益率 yt 的波动率(条件方差)能够通过残差项的波动率来进行描绘。

为了刻画资产收益率的这种波动特性,能够让残差项的条件方差与过去残差项的平方产生关联。所以,ARCH(p)模型能够被表示为:

其中,w 是一个时间序列,它的均值为 0,方差为 1,并且是独立同分布的。同时,w 满足一定条件,使得它的无条件方差是有限的。ARCH(p)模型能够很好地描绘金融资产收益率序列的波动特性以及厚尾现象,然而,该模型本身并不能用于解释金融资产收益率为何会具有这样的特征。此处不详细阐述关于 ARCH 模型的估计事宜,倘若有兴趣的话,可以去查看 Ruey S. Tray 的《金融时间序列分析》以及计量经济学教材。接着简要地介绍一下 ARCH 模型的建模步骤:

检验收益率序列是否平稳,依据自相关性构建合适的均值方程,像 ARMA 模型那样,用以描述收益率随时间的变化情况,接着依据拟合的模型以及实际值,从而得到残差序列。

对拟合的均值方程所得到的残差序列进行 ARCH 效应检验,也就是检验收益率围绕均值的偏差是否存在时而大时而小的情况。有两种方法可以检验序列是否具有 ARCH 效应,分别是 Ljung-Box 检验和 LM 检验。

若 ARCH 效应在统计方面是显著的,那么就需要另外设定一个波动率模型,以对波动率的动态变化进行刻画。

假设实际数据服从前面设定的均值方差和波动率方差,然后对均值方差和波动率方差中的参数进行联合估计,并且得到估计的误差。

对拟合的模型进行检验。若估计结果(残差项)不符合模型本身的假设,那么模型的可用性就比较差。

使用 Python 来模拟 ARCH 模型,并且对沪深 300 收益率的 ARCH 效应进行统计检验。

# 模拟ARCH时间序列

np.random.seed(2)

a0 = 2

a1 = .5

y 等于 w,w 等于 np.random.normal(size=1000) 。

Y = np.empty_like(y)

for t in range(1,len(y)):

np.sqrt((a0 + a1*y[t-1]**2))与 w[t]相乘得到 Y[t]。

使用 ts_plot 函数绘制 Y 的图像,滞后阶数设置为 30,标题为“模拟 ARCH”。

def ret_plot(ts, title=''):

ts1=ts**2

ts2=np.abs(ts)

with plt.style.context('ggplot'):

fig 被创建,其大小被设定为(12, 6),通过 plt.figure 函数实现

layout = (2, 1)

plt.subplot2grid(layout, (0, 0), colspan=2) 被赋值给了 ts1_ax

通过 plt 的 subplot2grid 方法,传入 layout 与 (1, 0) 得到了 ts2_ax

ts1.plot(ax=ts1_ax)

ts1_ax 为某个对象,它设置了标题,标题为 title 加上“日收益率平方”

ts2.plot(ax=ts2_ax)

ts2_ax 为某个对象,该对象调用 set_title 方法,设置的标题为 title 加上“日收益率绝对值”

plt.tight_layout()

return

使用 df.ret.dropna() 进行 ret_plot 操作,并且设置标题为'沪深300'。

从沪深 300 的日收益平方和绝对值的走势图能够看出,有较明显的波动聚集现象。由此初步可以判断出沪深 300 日收益序列存在 ARCH 效应。接着使用 Ljung-Box 统计量来对收益率平方的自相关性进行统计检验。计算 Q 统计量使用的是 python 中 statsmodels 模块的 acorr_ljungbox 方法。在默认情况下,此方法只计算 LB 统计量。只有当参数 boxpierce 被设置为 True 时,才会输出 Q 统计量。从 LB 白噪声检验可知,Q 统计量的 p 值都低于 0.05。这意味着原假设成立的概率极小,所以能够拒绝沪深 300 收益率的平方是白噪音序列这一原假设,从而说明原序列(沪深 300 收益率)存在 ARCH 效应。

def whitenoise_test(ts):

计算 box pierce 统计量,同时也计算 box ljung 统计量。

使用 statsmodels 中的 stats.diagnostic 模块的 acorr_ljungbox 函数。

q,p=acorr_ljungbox(ts)

with plt.style.context('ggplot'):

创建了一个名为 fig 的图形对象,其大小设置为宽 10 单位、高 4 单位,即 fig = plt.figure,图形大小为(10, 4)

axes = fig.subplots(1,2)

axes[0].plot(q, label='Q统计量')

axes[0].set_ylabel('Q')

axes[1].plot(p, label='p值')

axes[1].set_ylabel('P')

axes[0].legend()

axes[1].legend()

plt.tight_layout()

return

ret=df.ret.dropna()

whitenoise_test(ret**2)

04 GARCH模型

GARCH 模型是由 Bollerslev 在 1986 年提出的。它全称为广义自回归条件异方差模型,即 Generalized Autoregressive Conditionally Heteroskedastic Models - GARCH(p,q)。并且它是 ARCH 模型的扩展。GARCH 模型认为,时间序列在每个时间点上变量的波动率,是由最近的 p 个时间点的残差平方进行线性组合得到的,并且与最近的 q 个时间点变量的波动率进行线性组合后相加而得。GARCH 模型的条件方差是滞后残差平方的线性函数,同时也是滞后条件方差的线性函数。所以,在计算量不大的情况下,GARCH 模型能够方便地描述高阶的 ARCH 过程,并且具有更大的适用性。

其中有一种是白噪音,若不是这样,模型就会是非平稳的。GARCH 模型的估计与 ARCH 模型相近,关于其具体的推导过程可查阅计量经济学相关的书籍。在实际运用里,GARCH(1,1)以及 GARCH(2,1)通常能够满足对自回归条件异方差的描述。接下来使用 Python 对 GARCH(1,1)模型进行模拟和估计。

Python中的ARCH包

首先来看 arch 包中 arch_model 函数的各个参数所具有的含义,接着来看该函数的模型设定方法。

arch.arch_model 函数接受参数 y 和 x (默认为 None),指定均值为 'Constant',滞后阶数为 0,波动率为 'Garch',p 值为 1,o 值为 0,q 值为 1,幂次方为 2.0,分布为 'Normal',保留期为 None 。

各参数含义:

y : 因变量。

x : 外生变量,如果没有外生变量则模型自动省略。

均值模型的名称有多种选择,分别是‘Constant’、‘Zero’、‘ARX’以及‘HARX’。

lags:滞后阶数。

波动率模型有多种可选类型,其中包括“GARCH”(这是默认的),还有“ARCH”“EGARCH”“FIARCH”以及“HARCH”。

p :– 对称随机数的滞后阶,即扣除均值后的部分。

o :非对称数据的滞后阶。

q :波动率或对应变量的滞后阶。

power:使用GARCH或相关模型的精度。

dist 表示误差分布,有以下可选类型:正态分布,可表示为“normal”或“gaussian”(默认);学生 T 分布,可表示为“t”或“studentst”;偏态学生 T 分布,可表示为“skewstudent”或“skewt”;通用误差分布,可表示为“ged”或“generalized error”。

在对同一样本使用不同的滞后阶以比较模型时,会使用该参数。

# 模拟GARCH(1, 1) 过程

np.random.seed(1)

a0 = 0.2

a1 = 0.5

b1 = 0.3

n = 10000

w = np.random.normal(size=n)

garch = np.zeros_like(w)

sigsq = np.zeros_like(w)

for i in range(1, n):

sigsq[i]等于 a0 加上 a1 乘以(garch[i-1]的平方)再加上 b1 乘以 sigsq[i-1]

garch[i]等于 w[i]乘以 np.sqrt(sigsq[i])。

使用 ts_plot 函数绘制 garch 图形,设置滞后阶数为 30,标题为“模拟 GARCH”。

#update_freq=0 意味着不会输出中间的结果,而仅仅会输出最终的结果。

# 使用模拟的数据进行 GARCH(1, 1) 模型拟合

#arch_model默认建立GARCH(1,1)模型

am = arch_model(garch)

res = am.fit(update_freq=0)

print(res.summary())

#拟合沪深300收益率数据

Y=ret*100.0

使用 arch_model 函数,传入参数 Y,p 为 1,o 为 1,q 为 1,分布为 'StudentsT',并将结果赋值给 am 变量。

res = am.fit(update_freq=0)

#update_freq=0表示不输出中间结果,只输出最终结果

print(res.summary())

res.resid 进行绘图操作,图形的尺寸设定为(12,5)。

plt 为标题设置了“沪深 300 收益率拟合 GARCH(1,1)残差”,字号为 15

plt.show()

使用 res.conditional_volatility 进行绘图,绘图的尺寸为(12, 5),颜色为红色。

plt 为图表设置标题为“沪深 300 收益率条件方差”,标题字号为 15

plt.show()

05 结语

本文对 ARCH 和 GARCH 模型的基本原理及 Python 实现做了简要介绍,其应用方面还有待进一步拓展和挖掘。ARCH 模型和 GARCH 模型能够较好地刻画金融资产收益率的波动性聚集现象以及厚尾现象。所以在量化投资上的应用主要体现在对波动率的估计上,尤其在金融工程(期权波动率)和风险管理(VaR 模型)方面有应用。同时,我们注意到,ARCH 和 GARCH 模型在应用中存在一定的局限性与不足。其一,模型假设波动是对称的,也就是过去的波动对现在条件方差的影响是一样的,然而学术上的实证结果显示,当坏消息(或好消息)发布时,股票收益率的波动会增大(或减小);其二,模型对参数的限制条件较为严格,特别是高阶模型,其参数需要满足的约束十分复杂。模型最后没有给出关于波动率变化的更深入解释,只是对波动率变化的统计行为进行了拟合。鉴于现有模型存在不足,学者们在 GARCH 模型的基础上提出了一系列模型,这些模型被简称为 GARCH 模型族,其中包含 IGARCH、TGARCH、EGARCH 等。更复杂的模型还有 BEKK-GARCH、Coupla-GARCH 等。模型不是越复杂就越好。尤其在学术上用到的那些复杂模型,在现实的量化投资中能够被用到的情况往往是很少的。

参考资料:

《金融时间序列分析》第 3 版的作者是 Ruey S. Tsay ,还有 statsmodels 的官方文档。Python 中的时间序列分析(TSA) - 从线性模型到 GARCH。蔡立耑所著的《量化投资以 Python 为工具》由电子工业出版社于 2017 年出版。

关于Python金融量化

专注于将 Python 应用于金融量化领域并进行分享。加入知识星球后,能够免费获得量化投资的视频资料,以及量化金融相关的 PDF 资料。还能获取公众号文章中 Python 的完整源码,以及量化投资的前沿分析框架。同时,可以与博主直接交流,并且结识圈内的朋友。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

26阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

27阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

23阅读