《量化金融R语言初级教程》一1.4 波动率建模

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中显示了上述命令行的输出。

1.4.6 预测

我们现在有理由相信风险模型运行正常,我们也可以生成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%。

时间: 2024-10-06 08:49:40

《量化金融R语言初级教程》一1.4 波动率建模的相关文章

《量化金融R语言初级教程》一导读

前 言 量化金融R语言初级教程 本书将向你讲述如何使用统计计算语言R和量化金融知识来解决真实世界的量化金融问题.本书包括了丰富的主题,从时间序列分析到金融网络.每章都会简要地介绍理论知识并使用R来解决一个具体问题. 本书内容 第1章"时间序列分析"(Michael Puhle),介绍了用R处理时间序列数据.并且,你会学到如何建模和预测房价,使用协整改善对冲比,以及对波动率建模. 第2章"投资组合优化"(Péter Csóka,Ferenc Illés,Gergely

《量化金融R语言初级教程》一第1章 时间序列分析

第1章 时间序列分析 量化金融R语言初级教程时间序列分析研究的是按时间顺序收集的数据.相邻的观测数据通常相互依赖.因此,时间序列分析的技术需要处理这种相依性. 本章的目标是通过一些特定应用来介绍一些常用建模技术.我们将看到如何使用R来解决现实中的这些问题.首先,我们考虑如何在R中存储和处理时间序列.接着,我们处理线性时间序列分析,并展现如何将它用于建模和预测房屋价格.其次,我们通过考虑长期趋势,使用协整的概念来改进基本的最小方差对冲比.最后,本章讲述如何将波动率模型运用于风险管理.

《量化金融R语言初级教程》一第2章 投资组合优化

第2章 投资组合优化 量化金融R语言初级教程到现在为止,我们已经熟悉了R语言的基础.我们知道如何去分析数据.调用它的内置函数并把它们运用到我们选择的时间序列分析问题上.在本章中,我们既运用这些知识,又通过一种重要的实践应用来扩展这种知识,即投资组合分析,换句话说也叫证券选择.这一节涵盖了投资组合优化背后的思想:数学模型和理论求解.为了提高编程技巧,我们使用真实数据解决一个现实中的问题,并逐行实施算法.同时,我们也在相同的数据集上使用预先写好的R包. 想象我们生活在一个热带岛屿,只有100美元可以

《量化金融R语言初级教程》一2.3 使用真实数据

2.3 使用真实数据 投资组合的最优化完全整合在随后我们会讨论的多个R包中,知道这一点非常有用.但是,跑步之前最好先会走路.因此,我们从一个简单的自制R函数开始,我们把它一行行地在下面列出来. minvariance <- function(assets, mu = 0.005) { return <- log(tail(assets, -1) / head(assets, -1)) Q <- rbind(cov(return), rep(1, ncol(assets)), colMea

《量化金融R语言初级教程》一2.6 如果方差不够用

2.6 如果方差不够用 方差可以很容易地度量风险,但也存在一些缺陷.例如,在使用方差时,收益率中的正向变化也会被视为风险的增加.因此,人们开发了一些更复杂的风险度量方法. 比如下面的这个简例,主要关于多种方法运用于之前描述过的IT_return资产,它的目的是快速回顾fPortfolio包提供的选择. > Spec <- portfolioSpec() > setSolver(Spec) <- "solveRshortExact" > setTargetR

《量化金融R语言初级教程》一2.4 切线组合和资本市场线

2.4 切线组合和资本市场线 当组合中加入一个无风险资产R,会发生什么?如果σR=0并且X是任意的一个风险投资组合,那么Var(αR+(1−α)X=(1−α)2Var(X),并且显然也有E(αR+(1−α)X)= αE(R)+(1−α)E(X).这意味着这些组合在均值-标准差平面上形成了一条直线.位于这条直线上的任何投资组合都可以通过投资于R和X来得到.很明显,X的最佳选择位于这条直线与有效边界的切点.这个切点叫作市场组合或者切点组合,而风险资产的有效前沿在这个点的切线叫作资本市场线(Capit

《量化金融R语言初级教程》一2.5 协方差矩阵中的噪声

2.5 协方差矩阵中的噪声 当我们优化投资组合时,其实我们并没有真实的协方差矩阵和预期收益率向量(它们是均值-方差模型的输入量).我们使用观测来估计它们,并得到Q.r,而模型的输出仍然是随机变量. 如果不深入细节,我们可以说模型中会产生惊人的巨大不确定性.尽管有强大数定律的保证,最优的投资组合权重会不时地在±200%之间变动.幸运的是,如果我们掌握有几年的数据(日收益率),测量风险的相对误差就仅为20%-25%.

《量化金融R语言初级教程》一2.2 解的概念

2.2 解的概念 在过去的50年中,人们开发了许多表现良好的伟大算法用于数值优化,尤其用于二次函数的情形.正如我们在上一节中看到的,我们只有二次函数和约束.所以这些方法(它们也在R中实现)可以用于最糟的情形(如果没有任何更好的情形). 然而,数值优化的细节讨论超出了本书范围.幸运的是,在线性约束和二次函数约束的特殊情况下,这些方法不是并不必要.我们可以使用18世纪提出的拉格朗日定理. 那么,这里存在系数λ1, λ2, -, λm使得f'(a)+sum{{{lambda }_{i}}}g'(a)=

《量化金融R语言初级教程》一2.1 均方差模型

2.1 均方差模型 马科维茨[Markowitz,H.M.(March 1952)]提出的均方差模型,其实是冰 淇淋/雨伞交易模型在高维上的体现.为了得到数学公式,我们需要一些相关的定义. 定义的解释如下. 资产Xi意味着一个方差有限的随机变量. 投资组合意味着资产的组合:P = sum {{w_i}{X_i}} ,其中sum {{w_i}} = woverrightarrow 1 并且overrightarrow 1 = (1,;1, cdots, 1) .这个组合可以是仿射的或者凸的.在凸组