Stata波动率专题:历史波动率、预测波动率、隐含波动率

发布时间:2021-05-08 阅读 1122

Stata连享会   主页 || 视频 || 推文 || 知乎

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装命令如下:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:李青塬 (广东工业大学)
邮箱qingyuanli95@gmail.com


目录


1. 小马该穿什么衣服?

住在广州十多年的小马在 6 月的某天早晨起床,他必须决定当天要穿什么衣服。他会穿厚重的冬季大衣吗?或许这并不是一个符合常识的选择。因为小马知道历史上 6 月的广州并没有冷到需要他穿冬季大衣的程度。于是,他打开手机收听天气预报。天气预报正在预报今天天朗气清,惠风和畅,气温大约 30 摄氏度。依靠这些信息,于是他决定今天穿一件短袖衬衫,不用穿冬季大衣,也不用带伞。不过,为了保险起见,他决定看看窗外的路人甲都穿什么衣服。令他吃惊的是!街上的行人每个都穿着冬季大衣,带着雨伞。窗外的人通过衣着暗示了与天气预报截然相反的天气。基于这些矛盾信息,小马纠结了,到底应该穿什么衣服呢?应该相信谁呢?他其实没有确切的答案,因为只有过完今天后,才知道今天的天气。答案更多取决于对当地情况的了解,也许他住在离天气预报观测点很远的地方,那么就应该主要考虑窗外的情况。

上面这个故事,可把天气类比成波动率。有三组类比:历史波动率、预测波动率和隐含波动率。分别类比成什么呢?小马通过自己的居住经验知道 6 月的广州不会冷到穿大衣的程度,可以类比成历史波动率。通过手机收听天气预报,天气预报的天气情况类比为预测波动率。通过打开窗帘,实时观察窗外的路人穿着,暗示出的天气情况就是隐含波动率。

2. 从随机游走到波动率

我们可以先来玩一个弹球迷宫游戏,也可以叫做高尔顿钉板游戏。由于小球的重力作用,小球从顶部穿过很多障碍,最终落入底部。小球碰到每个障碍都有 50% 的概率向左或者向右滑落。然后,小球会再次掉落到新的一层又遇到一个新的障碍,最后小球掉入其中一个槽中。小球从上到下的运动过程,遵循随机游走,当小球进入迷宫后,我们不能做任何事去改变它的运动路径,也不能一开始就能预测准确小球运行的路径。如果有 1000 颗小球滑落进迷宫会发生什么呢?我们将得到小球的分布,如图所示。不难发现,大多数小球会集中在迷宫的中间区域,远离中间区域的小球会逐渐减少,整体来看,会形成一个钟形分布,也叫正态分布。当小球的数量达到无限个时,最终的分布结果就非常接近正态分布。正态分布的曲线被用来描述随机事件的可能结果,均值就是分布曲线峰值所在的位置。那么波动率是什么呢?


图 1 弹球迷宫游戏

如果我们稍微改造一下迷宫,小球每次滑落的时候必须下降两层才能遇到一个障碍。如果向迷宫中投入足够多的小球可能会出现与下图相似的曲线。由于小球向下运动受到一定的限制,与没有限制的运动结果相比,可以发现它的峰值较高,尾部也更窄,但仍是正态分布曲线。


图 2 低波动率分布
如果我们再次稍微改造一下迷宫,把水平的两个障碍中阻挡起来,让小球每次需要向左右移动两个障碍才能滑落到下一层。当我们放入足够多的小球,可以得到另一个正态分布曲线。可以发现,它的峰值更低,但尾部延伸得更快。

图 3 高波动率分布
我们可以把波动率理解为曲线向左右两边伸展的速度。所以,上面三个弹球迷宫游戏的结果分别表示可能的中波动率、低波动率和高波动率的价格分布。可以通过 Stata 来模拟不同波动率下的正态分布图。
. twoway function y=normalden(x), range(-5 5)  ///
      || function y=normalden(x, 0, 1.5),        ///
	     range(-5 5) lpattern(dash)            ///
      || function y=normalden(x, 0, 0.7),        /// 
	     range(-5 5) lpattern(dash_dot)        ///
      || , title("不同波动率的正态分布")        ///
         legend(ring(1) pos(6) cols(3)  ///
                label(1 "中波动率")     ///
                label(2 "高波动率")     ///
                label(3 "低波动率"))    ///
         scheme(s1color) note(资料来源:Stata连享会)

图 4 不同波动率的正态分布

3. 历史波动率

历史波动率是过去一段时间标的资产价格的波动程度。度量历史波动率的方法有很多,包括收盘价-收盘价波动率、Parkinson 波动率、RogersSatchell 波动率、Garman-Klass 波动率和 Yang-Zhang 波动率。大道至简,以简驭繁。本文使用收盘价-收盘价估计,数据的提取可以直接在Stata中用cntrade获得。使用ssc install cntrade,replace下载最新版命令。该命令能够从网易(Net Ease)批量下载中国股票市场中的历史市场报价数据。不仅可以下载个股数据,也可以对指数进行提取。下载后的数据自动存储于当前工作路径下,名称为 “000300.dta”。

. ssc install cntrade, replace      // 安装 cntrade

. cntrade 300, index                // 提取沪深 300 指数数据

. global s 20210506 
. gen t = _n
. gen return=clsprc/clsprc[_n-1]-1 //获取收益率
. rangestat (sd) return, interval(date -19 0)   //计算滚动标准差
. gen hv=return_sd*sqrt(252)                    //折算成为年化收益率
. drop if number<3
. rename hv 历史波动率
. keep if t>4300    

. twoway (line 历史波动率 date, yaxis(1))  ///
         (line clsprc date, yaxis(2) lpattern(dash)),  ///
               scheme(s1color)   ///
               legend(ring(1) pos(6)) ///
               note(资料来源:Stata连享会)  ///
               title("沪深300历史波动率($s)")

图 5 20 日历史波动率

沪深 300 指数代表上海和深圳最好的 300 家上市公司,或许其更能代表中国股票市场的表现。 2019 年年底,以沪深 300 为标的的三款期权上市,是中国金融衍生品市场上具有里程碑意义的事件。本文分别滚动计算沪深 300 过去 20 交易日、过去 60 交易日、过去 120 交易日的历史波动率。当沪深 300 过去 20 日的波动率为 15% 时,意味着未来 20 天,沪深 300 的价格上涨或下跌 15% 的概率有三分之二。

. cntrade 300, index

. global s 20210506
. gen t = _n
. gen return=clsprc/clsprc[_n-1]-1
. gen return2=clsprc/clsprc[_n-1]-1
. gen return3=clsprc/clsprc[_n-1]-1

. rangestat (sd) return, interval(date -19 0)    // 滚动计算过去 20 日波动率

. gen hv20=return_sd*sqrt(252)
. rangestat (sd) return2, interval(date -59 0)   // 滚动计算过去 60 日波动率
. gen hv60=return2_sd*sqrt(252)

. rangestat (sd) return3, interval(date -119 0)  // 滚动计算过去 120 日波动率

. gen hv120=return3_sd*sqrt(252)
. label var hv20  "20日历史波动率"
. label var hv120 "120日历史波动率"
. label var hv60  "60日历史波动率"
. keep if t>4300 

*-----------------graph-------begin----
#d ;
  twoway (line hv20 date, yaxis(1))  
         (line hv60  date, yaxis(1) lpattern(dash_dot)) 
         (line hv120 date, yaxis(1) lpattern(dash)), 
          scheme(s1color) 
          legend(ring(1) pos(6) col(3)) 
          note(资料来源:Stata连享会)  
          title("沪深300不同时间段历史波动率($s)") ;
#d cr
*-----------------graph-------begin----

图 6 沪深 300 不同时间段历史波动率

上图描述的是沪深 300 不同时间段的历史波动率。通过对比可发现,波动率是不断变化的,选取的时间越长,波动率越平滑。120 日历史波动率曲线明显比 20 日波动率曲线平滑得多。

4. 预测波动率

预测波动率又称为预期波动率,是通过统计推断的方法对波动率进行预测的方法。 由于与交易决策相关的预测更偏重于短期,指数加权移动平滑模型成为较早的一类波动率预测模型,对于短期金融市场出现的波动聚集现象有着较为良好的刻画。 指数移动平滑模型(EWMA)只是针对短期的波动聚集特性建立的,无法刻画波动率长期收敛的特性,此外,指数平滑更侧重于对原始的历史波动率数据进行平滑处理,预测效力有限。EWMA 模型有两个因素被忽略,其一是连续回报之间可能具有相关性,其二波动率具有均值回归的特征。 为了更好地将波动率的长短期特征同时融入模型当中,Engel (1982)等人构建了自回归条件异方差模型(ARCH),ARCH 模型可以同时刻画波动率的长短期特性,成为风险管理的重要工具。但是,利用 ARCH 模型刻画金融时间序列波动率的变化需要较多的参数,Bollerslev (1986)提出的广义自回归条件异方差模型 GARCH 降低了参数的复杂度,从而被广泛地使用。 GARCH 模型由三部分组成:波动率的估计值;相关性因素;均值回归因素。


. cntrade 300, index

. global s 20210506

. gen t = _n
. keep if t>3000
. gen return=clsprc/clsprc[_n-1]-1

. line return date, scheme(s1color)  title("沪深300收益率的时间趋势($s)") note(资料来源:Stata连享会)

. tsset t
. varsoc return, maxlag(8)    //用信息准则确定自回归模型的阶数
. var return, lags(1/7)
.   estimates store OLS

. predict e1, res
. g e2=e1^2

. ac  e2, scheme(s1color)    //画残差平方的自相关图
. pac e2, scheme(s1color)    //画残差平方的偏自相关图

. corrgram e2, lags(20)

. varsoc e2                                 //为了确定 p

. arch return L(1/7).return, arch(1/4) nolog          //ARCH(4)模型
.   estimates store ARCH4
. arch return L(1/7).return, arch(1) garch(1) nolog   //GARCH(1, 1)模型
.   estimates store GARCH11
. arch return L(1/7).return, arch(1) egarch(1) nolog  //EGARCH(1, 1)模型
.   estimates store EGARCH11
. arch return L(1/7).return, arch(1) garch(1) tarch(1) nolog  //TARCH(1)模型
.   estimates store TARCH1

//核密度图
. kdensity return, normopt(lpattern("-"))  ///
          scheme(s1color) col(2)          ///
          title("日收益率的核密度和正态密度") ///
          note(资料来源:Stata连享会)

. quietly var return, lags(1/8)  //对扰动项的正态性进行统计检验
. varnorm
. arch return L(1/8).return, arch(1) garch(1) dist(t) nolog
.   estimates store GARCH11t
.   estimates table OLS ARCH4 GARCH11 EGARCH11 GARCH11t TARCH1   //对比不同方法
. quietly arch return L(1/8).return , arch(1) garch(1) nolog
. predict garchh, variance 
. quietly arch return L(1/8).return, arch(1) dist(t) nolog
. predict archh, variance
. quietly arch return L(1/8).return, arch(1) egarch(1) nolog
. predict egarchh, variance                                     //预测条件方差
. keep if t>4500

*-绘图-----------------begin----
#d ;
. twoway (line archh date, yaxis(1))
        (line garchh date, yaxis(1))
        (line egarchh date, yaxis(1))
        , 
        scheme(s1color)    
        legend(ring(1) cols(3) pos(6) 
               label(1 "ARCH(1)")
               label(2 "GARCH(1, 1)") 
               label(3 "EGARCH(1, 1)")) 
        note(资料来源:Stata连享会)  
        title("沪深300预测波动率($s)");
*-绘图-----------------over-----

通过观察日度收益率的时间趋势图,可以发现存在波动性聚集。


图 7 沪深 300 日收益率的时间趋势

通过日收益率的核密度图与正态分布图相比,不难发现,沪深 300 的核密度图在尾部明显更厚,特别是分布在左端。而中间腰部更细更尖,也就是通常所说的“尖峰厚尾性”。


图 8 沪深 300 日收益率的核密度和正态分布

最终本文选取了沪深 300 最近一百多个交易日的收益率数据,对比了 ARCH(1) 模型、GARCH(1, 1) 模型和 EGARCH(1, 1) 的预测结果,可以发现日收益率的条件方差有时波动剧烈。


图 9 沪深 300 预测波动率

5. 隐含波动率

毫无疑问,隐含波动率在金融实务中有极大的价值,隐含波动率相对期权,好比市盈率相对股票。Black-Scholes 期权定价模型 在业界里最重要的应用不是计算理论价值,而是根据期权的交易价格反推出隐含波动率。根据 B-S 公式,我们利用看涨期权的价格反推出隐含波动率,需要用到数值算法。常见的一个数值算法叫做两点法。这个算法很简单,就是随便取两个点,如果一个点对应的数值大于期权的价格,一个点对应的数值小于期权的价格,那么期权的真实波动率就应该在这两个点的中间,依次类推和迭代,我们就可以得到真实的隐含波动率。

以下代码非原创,已经有前辈写好上传到 SSC 了(ssc install hrimvol 可以下载)。在 mata 环境里,首先写出 B-S 公式 的函数:

real scalar bs(real scalar s0, real scalar k, real scalar t, real scalar r, real scalar d, real scalar sigma){
   x=log(s0/k)+(r-d)*t
   sig=sigma*sqrt(t)
   d1=x/sig+sig/2
   d2=d1-sig
   pv=exp(-r*t)
   result=s0*normal(d1)-pv*k*normal(d2)
   return(result)
}

然后再写出来 两点法 的程序:

real scalar hrimvol(real scalar s0, real scalar k, real scalar t, real scalar r, real scalar d, real scalar C){
    sigmaL=1e-10
    CL=bs(s0, k, t, r, d, sigmaL)
    sigmaH=10
    CH=bs(s0, k, t, r, d, sigmaH)
    while (mean(sigmaH-sigmaL)>1e-10){
    sigma=(sigmaL+sigmaH)/2
    CM=bs(s0, k, t, r, d, sigma);
    CL=CL+(CM<C)*(CM-CL)
    sigmaL=sigmaL+(CM<C)*(sigma-sigmaL)
    CH=CH+(CM>=C)*(CM-CH)
    sigmaH=sigmaH+(CM>=C)*(sigma-sigmaH)
}
return(sigma)
}

把上面两个函数在 mata 环境里封装到一块, 其实这个程序就是一个简单的期权隐含波动率计算器。

6. 总结

本文从小马应该如何穿衣的故事引入,将历史波动率、预测波动率和隐含波动率进行类比。之后,从弹球迷宫游戏出发,分别阐述随机游走、均值和波动率,同时用 Stata 模拟不同波动率情况下的正态分布。最后,理论联系实践,用沪深 300 分别对历史波动率、预测波动率和隐含波动率进行探究。

7. 参考文献

  • 《高级计量经济学与 Stata 应用》陈强. -Link-
  • 《期权波动率与定价:高级交易策略与技巧(原书第2版) 》 -Link-
  • 《量化投资与对冲基金丛书:波动率交易》尤安·辛克莱 -Link-
  • Stata计算期权隐含波动率 - 期权论坛 -Link-
  • 《赢在期权:期权交易制胜攻略》方世圣,高子剑 -Link-
  • 《基于Python的金融分析与风险管理》斯文 -Link-
  • 《小马白话期权》-Link-
  • 《品位期权》余力 -Link-

8. 相关推文

Note:产生如下推文列表的命令为:lianxh Bootstrap 蒙特卡洛, m

安装最新版 lianxh 命令:ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh