GARCH进行波动率预测的Python代码 如何预测波动率_随机过程


对于不确定性的准确估计是金融领域一直追求的目标,而价格变化的波动率通常被用来作为不确定性的度量,因此波动率估计在投资、估值、风险管理和货币政策制定等金融领域中都是非常重要的。这篇文章将会介绍一种利用变分自动编码器(Variational Auto-Encoders,VAE)来估计波动率的模型——NSVM,其整体思路主要是参考我前一篇文章中介绍过的VRNN和SRNN模型,建议没看过文章的同学先看一下。


段易通:生成时间序列的VAE——VRNN与SRNN模型浅析zhuanlan.zhihu.com

GARCH进行波动率预测的Python代码 如何预测波动率_时间序列_02


波动率模型

在金融领域中,用来估计和预测波动率的模型被叫做波动率模型,我们可以用它来描述波动率的动态变化。在介绍NSVM之前,我们先简单地总结一下金融领域中常见的波动率模型,一般按照确定性和随机性而分成两类:确定性波动率模型(Deterministic Volatility Models)和随机波动率模型(Stochastic Volatility Models)。

  1. 确定性波动率模型

这类模型认为未来的波动率与已知的历史信息具有确定的关系,例如非常经典的GARCH模型:



其中


是时间序列的第t步,


是第t步的波动率。


在GARCH的基础上还有很多衍生模型,这类模型都是确定性的波动率模型。

2. 随机波动率模型

这类模型认为波动率是并不是确定的,例如经典的Heston模型,模型的dynamic为:



其中


是对数收益率,



代表两个相关的Wiener过程,满足



可以看出,这类模型的波动率是由一个潜在的随机过程


来决定的。


一般形式

设时间序列为


,潜在的随机过程(latent stochastic process)为


,那么波动率的process可以写做:



我们可以对



稍作一些限制,让它们在给定历史的条件下服从高斯分布,即有如下的自回归形式:



这里说一下采用这种自回归的潜在随机过程的原因:首先我们认为一支股票的波动率不会仅仅受到自身的影响,还会受到外部环境的作用,而且外部环境也是一直在变化的,因此我们用一个潜在随机过程


来表示它;另外相比于i.i.d,基于历史的自回归方式更适合于具有一定历史依赖性的时间序列。


Neural Stochastic Volatility Models

接下里就正式开始介绍NSVM,对于上面的自回归形式,其实看过之前那篇文章后就会发现,它其实就是序列VAE的生成过程:先从一个已知历史信息的先验分布中采样得到潜变量


,再根据由历史信息和


确定的

条件生成分布中采样得到生成样本

。这样一来,序列VAE自然而然地就可以作为一个波动率模型。


和前一篇文章类似,我们还是从生成和推断两部分来看:

1.生成过程



,序列的

联合概率分布可以写为:



其中


代表生成网络的参数,


的联合概率分布可写做:



我们用RNN的隐层状态


来代表历史信息

,则可以得到生成网络:


生成过程如下图所示:


GARCH进行波动率预测的Python代码 如何预测波动率_时间序列_03


简单说一下两个子网络的流程:

  • 自回归网络:如上图a所示,对于 ,首先通过 得到 (RNN的输入为 ),然后用 从中得到先验分布的均值和方差,最后采样得到 。
  • 条件生成网络:如上图b所示,对于 ,首先通过 得到隐状态 (注意这里RNN的输入为 ),然后用 从中得到条件生成分布的均值和方差,最后采样得到 。

2.推断过程

对于潜变量


,我们认为它

与历史

以及整个序列

都有关

,因此近似后验分布可以写为:


其中


代表推断网络的参数。


为了能够捕捉到



的信息,我们用一个自回归RNN和一个双向RNN来构建推断网络:



推断过程如下图所示:


GARCH进行波动率预测的Python代码 如何预测波动率_arch模型的思路_04


简单说一下流程:先用



捕捉到整个序列


的信息,然后通过包含有


信息的


得到隐状态


,接着通过


得到近似后验分布的均值和方差,最后从该正态分布中采样得到


,即推断出



3.目标函数

NSVM的目标函数如下,虽然形式不同,但其实将


展开后,与前一篇文章中的序列VAE的目标函数是一致的。



4.预测未来序列

作为一个波动率模型,NSVM除了要对时间序列进行建模以外,还需要能够基于历史信息来对未来做出预测,接下来就利用NSVM,从历史序列


中生成未来一步的



思路也很简单,只需要计算:



其中


是后验分布,可以由推断网络来代替;


可以通过自回归网络得到;而


可以通过条件生成网络来得到。


具体步骤如下:

  1. 利用训练好的推断网络,得到 的S条采样路径
  2. 利用自回归网络,计算下一时间步的潜变量分布 ,采样得到
  3. 利用条件生成网络,计算下一时间步的序列值分布
  4. 对所有路径求均值

这样我们就通过蒙特卡洛的方法估计出了


的概率分布,可以看出该分布是

由S个高斯分布混合而成的。如果接下来继续要做多步预测的话,就从这个分布中采样得到

,然后重复上面的步骤,如下面的算法所示。


GARCH进行波动率预测的Python代码 如何预测波动率_arch模型的思路_05


实验

为了验证这个波动率模型的有效性,论文在真实的股票序列上进行了实验,这次稍微详细介绍一下实验。

数据处理

原始数据是162支来自中国A股的日频close价格序列,每个序列都是单变量的,选择的股票都是2006年或更早上市、且停牌时间小于50天的,这样就能尽可能地减小于由于序列不够长或数值缺失而引起的噪声;对于缺失的数据,这里用了stochastic regression imputation来进行填充(在前20天数据拟合出来的高斯分布中采样填充);序列


采用对数收益率,即


,并对其做归一化。


现在我们把样本的序列变为多变量的,设定一个参数d,从162个单变量序列中选d个出来,组成一个d维变量的时间序列,用它作为一个样本,实验中设定d=6,这样最多就有


个样本,当然这里并不会构造这么多,大概只有2000条样本;时间序列的长度是2570(大约7年),其中前2000步作为训练集,剩下的570步作为测试集。


baseline模型

确定性波动率模型:

  • Quadratic models:ARCH(1)、 GARCH(1,1)、GJR-GARCH(1,1,1)
  • Absolute value models:AVARCH(1)、AVGARCH(1,1)、TARCH(1,1,1)
  • Exponential models:EARCH(1)、EGARCH(1,1)

随机波动率模型:

  • MCMC volatility model:stochvol
  • Gaussian process volatility model:GP-Vol

模型设定

具体参数这里就不说了,这里主要说一下模型在实验中是如何做训练和预测的。训练阶段的流程图如下


GARCH进行波动率预测的Python代码 如何预测波动率_随机过程_06


训练阶段可以分为3步:

  1. 把历史序列 输入到推断网络当中,然后从中采样得到潜变量序列
  2. 将 输入到条件生成网络当中,结合已知的前一步序列值 ,逐时间步地给出重构序列的概率分布
  3. 计算真实序列在输出概率分布上的似然值,通过上文中的目标函数来对生成和推断网络进行训练。

预测阶段的流程图如下:


GARCH进行波动率预测的Python代码 如何预测波动率_随机过程_07


预测阶段可以分为3步:

  1. 把历史序列 输入到推断网络当中,然后从中采样得到潜变量序列
  2. 利用自回归网络,输入潜变量序列 ,得到下一时间步的
  3. 利用条件生成网络,预测下一时间步的 。

在实验中模型会连续重复步骤20次,预测出未来20步的序列,然后再扩充训练集序列长度并重新训练模型。

结果

下图是NSVM与其它baseline模型在测试集上的预测结果,这里采用的评价指标是negative log-likelihood (NLL),其中-diag和-corr分别代表对角矩阵和rank-1 perturbation的两种协方差矩阵(即方差网络输出的协方差


可以取这两种形式)。可以看出,NSVM-corr的表现优于其它baseline模型。


GARCH进行波动率预测的Python代码 如何预测波动率_arch模型的思路_08


下图模型在真实股票序列上的波动率建模结果,可以看出NSVM在适度价格波动(moderate price fluctuation)的区间上更稳定(如[1600,2250]),而在剧烈变化的地方更敏感(如2250之后),而且NSVM的非线性性质也令其能快速适应当前的波动水平,而GARCH则会衰退得慢一些(如[1000,2000])。


GARCH进行波动率预测的Python代码 如何预测波动率_arch模型的思路_09


总结

对比前一篇文章中的那两个序列VAE模型,可以发现这次的NSVM其实就是VRNN和SRNN的融合版本,它的自回归网络来自于VRNN,而推断网络中的双向RNN则来自于SRNN。通过baseline中的随机波动率模型,可以看出潜变量在波动率模型当中是很常见的,因此序列VAE这种引入了潜变量序列的模型确实也比较贴合这个金融问题。

参考文献

[1] A neural stochastic volatility model