温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装命令如下:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
⛳ Stata 系列推文:
作者:李青塬 (广东工业大学)
邮箱:qingyuanli95@gmail.com
目录
住在广州十多年的小马在 6 月的某天早晨起床,他必须决定当天要穿什么衣服。他会穿厚重的冬季大衣吗?或许这并不是一个符合常识的选择。因为小马知道历史上 6 月的广州并没有冷到需要他穿冬季大衣的程度。于是,他打开手机收听天气预报。天气预报正在预报今天天朗气清,惠风和畅,气温大约 30 摄氏度。依靠这些信息,于是他决定今天穿一件短袖衬衫,不用穿冬季大衣,也不用带伞。不过,为了保险起见,他决定看看窗外的路人甲都穿什么衣服。令他吃惊的是!街上的行人每个都穿着冬季大衣,带着雨伞。窗外的人通过衣着暗示了与天气预报截然相反的天气。基于这些矛盾信息,小马纠结了,到底应该穿什么衣服呢?应该相信谁呢?他其实没有确切的答案,因为只有过完今天后,才知道今天的天气。答案更多取决于对当地情况的了解,也许他住在离天气预报观测点很远的地方,那么就应该主要考虑窗外的情况。
上面这个故事,可把天气类比成波动率。有三组类比:历史波动率、预测波动率和隐含波动率。分别类比成什么呢?小马通过自己的居住经验知道 6 月的广州不会冷到穿大衣的程度,可以类比成历史波动率。通过手机收听天气预报,天气预报的天气情况类比为预测波动率。通过打开窗帘,实时观察窗外的路人穿着,暗示出的天气情况就是隐含波动率。
我们可以先来玩一个弹球迷宫游戏,也可以叫做高尔顿钉板游戏。由于小球的重力作用,小球从顶部穿过很多障碍,最终落入底部。小球碰到每个障碍都有 50% 的概率向左或者向右滑落。然后,小球会再次掉落到新的一层又遇到一个新的障碍,最后小球掉入其中一个槽中。小球从上到下的运动过程,遵循随机游走,当小球进入迷宫后,我们不能做任何事去改变它的运动路径,也不能一开始就能预测准确小球运行的路径。如果有 1000 颗小球滑落进迷宫会发生什么呢?我们将得到小球的分布,如图所示。不难发现,大多数小球会集中在迷宫的中间区域,远离中间区域的小球会逐渐减少,整体来看,会形成一个钟形分布,也叫正态分布。当小球的数量达到无限个时,最终的分布结果就非常接近正态分布。正态分布的曲线被用来描述随机事件的可能结果,均值就是分布曲线峰值所在的位置。那么波动率是什么呢?
如果我们稍微改造一下迷宫,小球每次滑落的时候必须下降两层才能遇到一个障碍。如果向迷宫中投入足够多的小球可能会出现与下图相似的曲线。由于小球向下运动受到一定的限制,与没有限制的运动结果相比,可以发现它的峰值较高,尾部也更窄,但仍是正态分布曲线。
. 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连享会)
历史波动率是过去一段时间标的资产价格的波动程度。度量历史波动率的方法有很多,包括收盘价-收盘价波动率、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)")
沪深 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----
上图描述的是沪深 300 不同时间段的历史波动率。通过对比可发现,波动率是不断变化的,选取的时间越长,波动率越平滑。120 日历史波动率曲线明显比 20 日波动率曲线平滑得多。
预测波动率又称为预期波动率,是通过统计推断的方法对波动率进行预测的方法。 由于与交易决策相关的预测更偏重于短期,指数加权移动平滑模型成为较早的一类波动率预测模型,对于短期金融市场出现的波动聚集现象有着较为良好的刻画。 指数移动平滑模型(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-----
通过观察日度收益率的时间趋势图,可以发现存在波动性聚集。
通过日收益率的核密度图与正态分布图相比,不难发现,沪深 300 的核密度图在尾部明显更厚,特别是分布在左端。而中间腰部更细更尖,也就是通常所说的“尖峰厚尾性”。
最终本文选取了沪深 300 最近一百多个交易日的收益率数据,对比了 ARCH(1) 模型、GARCH(1, 1) 模型和 EGARCH(1, 1) 的预测结果,可以发现日收益率的条件方差有时波动剧烈。
毫无疑问,隐含波动率在金融实务中有极大的价值,隐含波动率相对期权,好比市盈率相对股票。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 环境里封装到一块, 其实这个程序就是一个简单的期权隐含波动率计算器。
本文从小马应该如何穿衣的故事引入,将历史波动率、预测波动率和隐含波动率进行类比。之后,从弹球迷宫游戏出发,分别阐述随机游走、均值和波动率,同时用 Stata 模拟不同波动率情况下的正态分布。最后,理论联系实践,用沪深 300 分别对历史波动率、预测波动率和隐含波动率进行探究。
Note:产生如下推文列表的命令为:
lianxh Bootstrap 蒙特卡洛, m
安装最新版
lianxh
命令:ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh