对于不确定性的准确估计是金融领域一直追求的目标,而价格变化的波动率通常被用来作为不确定性的度量,因此波动率估计在投资、估值、风险管理和货币政策制定等金融领域中都是非常重要的。这篇文章将会介绍一种利用变分自动编码器(Variational Auto-Encoders,VAE)来估计波动率的模型——NSVM,其整体思路主要是参考我前一篇文章中介绍过的VRNN和SRNN模型,建议没看过文章的同学先看一下。
段易通:生成时间序列的VAE——VRNN与SRNN模型浅析zhuanlan.zhihu.com
波动率模型
在金融领域中,用来估计和预测波动率的模型被叫做波动率模型,我们可以用它来描述波动率的动态变化。在介绍NSVM之前,我们先简单地总结一下金融领域中常见的波动率模型,一般按照确定性和随机性而分成两类:确定性波动率模型(Deterministic Volatility Models)和随机波动率模型(Stochastic Volatility Models)。
- 确定性波动率模型
这类模型认为未来的波动率与已知的历史信息具有确定的关系,例如非常经典的GARCH模型:
其中
是时间序列的第t步,
是第t步的波动率。
在GARCH的基础上还有很多衍生模型,这类模型都是确定性的波动率模型。
2. 随机波动率模型
这类模型认为波动率是并不是确定的,例如经典的Heston模型,模型的dynamic为:
其中
是对数收益率,
和
代表两个相关的Wiener过程,满足
。
可以看出,这类模型的波动率是由一个潜在的随机过程
来决定的。
一般形式
设时间序列为
,潜在的随机过程(latent stochastic process)为
,那么波动率的process可以写做:
我们可以对
和
稍作一些限制,让它们在给定历史的条件下服从高斯分布,即有如下的自回归形式:
这里说一下采用这种自回归的潜在随机过程的原因:首先我们认为一支股票的波动率不会仅仅受到自身的影响,还会受到外部环境的作用,而且外部环境也是一直在变化的,因此我们用一个潜在随机过程
来表示它;另外相比于i.i.d,基于历史的自回归方式更适合于具有一定历史依赖性的时间序列。
Neural Stochastic Volatility Models
接下里就正式开始介绍NSVM,对于上面的自回归形式,其实看过之前那篇文章后就会发现,它其实就是序列VAE的生成过程:先从一个已知历史信息的先验分布中采样得到潜变量
,再根据由历史信息和
确定的
条件生成分布中采样得到生成样本
。这样一来,序列VAE自然而然地就可以作为一个波动率模型。
和前一篇文章类似,我们还是从生成和推断两部分来看:
1.生成过程
令
,
,序列的
联合概率分布可以写为:
其中
代表生成网络的参数,
的联合概率分布可写做:
我们用RNN的隐层状态
来代表历史信息
,则可以得到生成网络:
生成过程如下图所示:
简单说一下两个子网络的流程:
- 自回归网络:如上图a所示,对于 ,首先通过 得到 (RNN的输入为 ),然后用 从中得到先验分布的均值和方差,最后采样得到 。
- 条件生成网络:如上图b所示,对于 ,首先通过 得到隐状态 (注意这里RNN的输入为 ),然后用 从中得到条件生成分布的均值和方差,最后采样得到 。
2.推断过程
对于潜变量
,我们认为它
与历史
以及整个序列
都有关
,因此近似后验分布可以写为:
其中
代表推断网络的参数。
为了能够捕捉到
和
的信息,我们用一个自回归RNN和一个双向RNN来构建推断网络:
推断过程如下图所示:
简单说一下流程:先用
和
捕捉到整个序列
的信息,然后通过包含有
信息的
得到隐状态
,接着通过
得到近似后验分布的均值和方差,最后从该正态分布中采样得到
,即推断出
。
3.目标函数
NSVM的目标函数如下,虽然形式不同,但其实将
展开后,与前一篇文章中的序列VAE的目标函数是一致的。
4.预测未来序列
作为一个波动率模型,NSVM除了要对时间序列进行建模以外,还需要能够基于历史信息来对未来做出预测,接下来就利用NSVM,从历史序列
中生成未来一步的
。
思路也很简单,只需要计算:
其中
是后验分布,可以由推断网络来代替;
可以通过自回归网络得到;而
可以通过条件生成网络来得到。
具体步骤如下:
- 利用训练好的推断网络,得到 的S条采样路径
- 利用自回归网络,计算下一时间步的潜变量分布 ,采样得到
- 利用条件生成网络,计算下一时间步的序列值分布
- 对所有路径求均值
这样我们就通过蒙特卡洛的方法估计出了
的概率分布,可以看出该分布是
由S个高斯分布混合而成的。如果接下来继续要做多步预测的话,就从这个分布中采样得到
,然后重复上面的步骤,如下面的算法所示。
实验
为了验证这个波动率模型的有效性,论文在真实的股票序列上进行了实验,这次稍微详细介绍一下实验。
数据处理
原始数据是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
模型设定
具体参数这里就不说了,这里主要说一下模型在实验中是如何做训练和预测的。训练阶段的流程图如下
训练阶段可以分为3步:
- 把历史序列 输入到推断网络当中,然后从中采样得到潜变量序列
- 将 输入到条件生成网络当中,结合已知的前一步序列值 ,逐时间步地给出重构序列的概率分布
- 计算真实序列在输出概率分布上的似然值,通过上文中的目标函数来对生成和推断网络进行训练。
预测阶段的流程图如下:
预测阶段可以分为3步:
- 把历史序列 输入到推断网络当中,然后从中采样得到潜变量序列
- 利用自回归网络,输入潜变量序列 ,得到下一时间步的
- 利用条件生成网络,预测下一时间步的 。
在实验中模型会连续重复步骤20次,预测出未来20步的序列,然后再扩充训练集序列长度并重新训练模型。
结果
下图是NSVM与其它baseline模型在测试集上的预测结果,这里采用的评价指标是negative log-likelihood (NLL),其中-diag和-corr分别代表对角矩阵和rank-1 perturbation的两种协方差矩阵(即方差网络输出的协方差
可以取这两种形式)。可以看出,NSVM-corr的表现优于其它baseline模型。
下图模型在真实股票序列上的波动率建模结果,可以看出NSVM在适度价格波动(moderate price fluctuation)的区间上更稳定(如[1600,2250]),而在剧烈变化的地方更敏感(如2250之后),而且NSVM的非线性性质也令其能快速适应当前的波动水平,而GARCH则会衰退得慢一些(如[1000,2000])。
总结
对比前一篇文章中的那两个序列VAE模型,可以发现这次的NSVM其实就是VRNN和SRNN的融合版本,它的自回归网络来自于VRNN,而推断网络中的双向RNN则来自于SRNN。通过baseline中的随机波动率模型,可以看出潜变量在波动率模型当中是很常见的,因此序列VAE这种引入了潜变量序列的模型确实也比较贴合这个金融问题。
参考文献
[1] A neural stochastic volatility model