《量化金融R语言初级教程》一1.4 波动率建模
本节书摘来异步社区《量化金融R语言初级教程》一书中的第1章,第1.4节,作者: 【匈牙利】Gergely Daróczi(盖尔盖伊) , 等 译者: 高蓉 , 李茂 责编: 胡俊英,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.4 波动率建模正如我们之前所见,ARIMA模型常常用于过程的过去值已知时的条件期望建模。过去值已知的过程的条件方差是常数。真实世界的金融时间序列存在着波动性聚集和其他特点,换句话说,突发波动率打破了相对稳定的时期。
在这一节中,我们来考查GARCH时间序列模型。GARCH模型研究真实世界的(金融)时间序列的这个典型化事实——波动性聚集,并进一步运用这些模型预测在险价值(Value at Risk,VaR)。
1.4.1 风险管理的波动率预测金融机构使用VaR来度量他们的活动风险,通常在10个工作日范围内计算置信水平为99%的临界值。这意味着在这10天内,只有1%的时间会出现预期损失超过临界值。
我们载入zoo包并导入英特尔公司的月收益率数据,时间范围从1973年1月~2008年12月。
library("zoo") intc - read.zoo("intc.csv", header = TRUE, + sep = ",", format = "%Y-%m", FUN = as.yearmon)1.4.2 检验ARCH效应
收益率图形表明,在月收益率数据中可能存在ARCH效应。
plot(intc, main = "Monthly returns of Intel Corporation", + xlab = "Date", ylab = "Return in percent")
上面命令的输出在图1-3中显示。
我们可以使用统计假设检验来验证自己的想法。两种常用检验如下。
用于平方收益率(波动率的一种代理)自相关的Ljung-Box检验。
Engle(1982年)提出的拉格朗日乘子(LM)检验。
首先,我们运行下面的命令,从而在平方收益率的前12阶滞后值上执行Ljung-Box检验。
Box.test(coredata(intc^2), type = "Ljung-Box", lag = 12) Box-Ljung test data: coredata(intc^2) X-squared = 79.3451, df = 12, p-value = 5.502e-12
我们可以在1%的置信水平上拒绝原假设,原假设是平方收益率中不存在自相关。或者,我们可以使用FinTS包的LM检验,它输出相同的结果。
install.packages("FinTS") library("FinTS") ArchTest(coredata(intc)) ARCH LM-test; Null hypothesis: no ARCH effects data: coredata(intc) Chi-squared = 59.3647, df = 12, p-value = 2.946e-08
两种检验都确定了英特尔的月收益率中存在ARCH效应。因此,收益率时间序列的建模应该使用ARCH或GARCH模型。
1.4.3 GARCH模型设定GARCH(1,1)模型是GARCH模型中最常用的一种,也是一种最适于金融时间序列建模的模型。我们使用rugarch包提供的函数来设定模型、估计参数、回测以及预测。如果你还没有安装这个包,运行下面的命令。
install.packages("rugarch")
然后,我们可以运行下面的命令来载入这个包。
library("rugarch")
首先,我们需要使用函数ugarchspec设定模型。对于一个GARCH(1,1)模型,我们需要设置garchOrder为c(1,1)。而且均值模型(mean.model)是一个白噪声过程,因此等同于armaOrder = c(0,0)。
intc_garch11_spec - ugarchspec(variance.model = list( + garchOrder = c(1, 1)), + mean.model = list(armaOrder = c(0, 0)))1.4.4 GARCH模型估计
通过ugarchfit函数设定模型,输入为收益率数据,就可以用极大似然方法精确拟合模型的系数。
intc_garch11_fit - ugarchfit(spec = intc_garch11_spec, + data = intc)
其他参数的使用请参见ugarchfit的帮助文档。拟合模型的输出(使用命令intc_garch11_fit)展示了有用信息,比如最优参数值、对数似然函数值,以及信息准则。
1.4.5 回测风险模型检验模型表现的有效方法是历史回测。在回测风险模型时,我们对比整个时期的真实收益率和估计的VaR。如果收益率比VaR损失更大,我们得到一次VaR突破(VaR exceedance)。在我们的例子中,一次VaR突破应该仅仅发生在1%的情形中(因为我们设定了置信区间为99%)。
函数ugarchroll对一个设定的GARCH模型(在这里,这个模型是intc_garch11_spec)执行历史回测。我们指定回测如下。
使用的收益率数据存储在zoo对象intc中。
回测的起始期(n.start)应该是序列开始(就是1983年1月)时的前120个月。
每月都需要重新估计模型(refit.every = 1)。
我们使用移动(moving)窗口来估计。
我们使用一个混合(hybrid)的解决方法。
我们希望计算VAR在99%的尾部置信水平上(VaR.alpha = 0.01)的临界值(calculate.VaR = TRUE)。
我们希望保留估计的系数(keep.coef = TRUE)。
下面的命令显示了满足上述所有要求的回测。
intc_garch11_roll - ugarchroll(intc_garch11_spec, intc, + n.start = 120, refit.every = 1, refit.window = "moving", + solver = "hybrid", calculate.VaR = TRUE, VaR.alpha = 0.01, + keep.coef = TRUE)
我们可以使用report函数检查回测报告。通过把这个参数的type参数设定为VaR,这个函数对突破值执行无条件和有条件覆盖检验。VaR.alpha是尾部概率,conf.level是置信区间,条件覆盖的假设检验基于此建立。
report(intc_garch11_roll, type = "VaR", VaR.alpha = 0.01, +conf.level = 0.99) VaR Backtest Report =========================================== Model: sGARCH-norm Backtest Length: 312 Data: ========================================== alpha: 1% Expected Exceed: 3.1 Actual VaR Exceed: 5 Actual %: 1.6% Unconditional Coverage (Kupiec) Null-Hypothesis: Correct Exceedances LR.uc Statistic: 0.968 LR.uc Critical: 6.635 LR.uc p-value: 0.325 Reject Null: NO Conditional Coverage (Christoffersen) Null-Hypothesis: Correct Exceedances and Independence of Failures LR.cc Statistic: 1.131 LR.cc Critical: 9.21 LR.cc p-value: 0.568 Reject Null: O
Kupiec的无条件覆盖方法比较了给定VaR尾部概率时,预期突破值数目和实际突破值数目,而Christoffersen检验方法则是一种对无条件覆盖和突破值的独立性的联合检验。在我们的例子中,尽管预期突破有3次但实际发生了5次,我们不能拒绝突破是正确并且独立的原假设。
回测表现的图形也很容易生成。首先,使用ugarchroll对象的精确预测VaR创建一个zoo对象。
intc_VaR - zoo(intc_garch11_roll@forecast$VaR[, 1])
我们仍然使用这个“zoo”对象,通过rownames(年和月)重写这个对象的index属性。
index(intc_VaR) - as.yearmon(rownames(intc_garch11_roll@forecast$VaR))
对同时存储在ugarchroll对象中的真实收益率,我们加以同样的处理。
intc_actual - zoo(intc_garch11_roll@forecast$VaR[, 2]) index(intc_actual) - as.yearmon(rownames(intc_garch11_roll@forecast$VaR))
现在,我们可以使用下面的命令,画出VaR对比英特尔真实收益率的图形。
plot(intc_actual, type = "b", main = "99% 1 Month VaR Backtesting", + xlab = "Date", ylab = "Return/VaR in percent") lines(intc_VaR, col = "red") legend("topright", inset=.05, c("Intel return","VaR"), col = c("black","red"), lty = c(1,1))
图1-4中显示了上述命令行的输出。
我们现在有理由相信风险模型运行正常,我们也可以生成VaR预测。函数ugarchforecast选取以下两个参数,一个是拟合的GARCH函数(intc_garch11_fit),另一个是应该产生预测的周期数(n.ahead = 12,即12个月)。
intc_garch11_fcst - ugarchforecast(intc_garch11_fit, n.ahead = 12)
我们可以通过查询以下命令行显示的预测对象,来预期未来结果。
intc_garch11_fcst *------------------------------------* * GARCH Model Forecast * *------------------------------------* Model: sGARCH Horizon: 12 Roll Steps: 0 Out of Sample: 0 0-roll forecast [T0=Dec 2008]: Series Sigma T+1 0.01911 0.1168 T+2 0.01911 0.1172 T+3 0.01911 0.1177 T+4 0.01911 0.1181 T+5 0.01911 0.1184 T+6 0.01911 0.1188 T+7 0.01911 0.1191 T+8 0.01911 0.1194 T+9 0.01911 0.1197 T+10 0.01911 0.1200 T+11 0.01911 0.1202 T+12 0.01911 0.1204
波动率(sigma)的一步预期是0.1168。因为我们假定了正态分布,置信水平为99%的VaR可以使用标准正态分布的99%分位数(输入qnorm(0.99))来计算。因此对下一个周期,一个月的99%VaR就是qnorm(0.99)*0.1168 =0.2717。结果,月收益率高于−27%的概率是99%。
《量化金融R语言初级教程》一导读 本书将向你讲述如何使用统计计算语言R和量化金融知识来解决真实世界的量化金融问题。本书包括了丰富的主题,从时间序列分析到金融网络。每章都会简要地介绍理论知识并使用R来解决一个具体问题。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- 性能测试业务建模的三件事|性能测试业务建模方法与思考
- 双轴机械臂建模分析数据
- 数仓建模—增量数据处理
- 数仓建模—美团数据质量监管平台实践
- 数仓建模—用户画像
- 数仓建模—OneData体系
- 一文看懂推荐系统:排序04:视频播放建模
- Elasticsearch 数据建模实例
- 乐逗高级数据分析师谢佳标:基于R语言的大数据处理及建模技术
- 第1章 准备预测建模1.2 模型的类型
- 《工作流管理——模型、方法和系统》笔记2:Petri网对工作流建模
- 《量化金融R语言高级教程》一2.2 在R中建模
- 《威胁建模:设计和交付更安全的软件》——第2章威胁建模策略2.1 “你的威胁模型是什么样?”
- 《软件建模与设计: UML、用例、模式和软件体系结构》一一1.6 UML标准
- 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.2 设计验证和确认
- 浩辰3D趣味排球建模,你学会了嘛?