量化金融R语言初级教程(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-26 05:53:26

点击下载

作者:[匈牙利] Gergely Daróczi 盖尔盖伊 等

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

量化金融R语言初级教程

量化金融R语言初级教程试读:

前言

本书将向你讲述如何使用统计计算语言R和量化金融知识来解决真实世界的量化金融问题。本书包括了丰富的主题,从时间序列分析到金融网络。每章都会简要地介绍理论知识并使用R来解决一个具体问题。本书内容

第1章“时间序列分析”(Michael Puhle),介绍了用R处理时间序列数据。并且,你会学到如何建模和预测房价,使用协整改善对冲比,以及对波动率建模。

第2章“投资组合优化”(Péter Csóka,Ferenc Illés,Gergely Daróczi),包括了投资组合选择背后的理论思想,并说明了如何将这些知识运用于真实世界的数据。

第3章“资产定价模型”(Kata Váradi,Barbara Mária Dömötör,Gergely Daróczi),建立在前一章的基础上,给出了刻画资产收益率与风险之间关系的模型。本章包括资本资产定价模型和套利定价理论。

第4章“固定收益证券”(Márton Michaletzky,Gergely Daróczi),是处理固定收益产品的基础。在这一章中,你会学到如何计算这类产品的风险,以及构建对利率变化免疫的投资组合。

第5章“估计利率期限结构”(Tamás Makara,Gergely Daróczi),介绍了收益率曲线的概念,并说明了如何使用政府债券的价格估计收益率曲线。

第6章“衍生品定价”(Ágnes Vidovics-Dancs,Gergely Daróczi),使用离散和连续时间模型解释了衍生品定价。而且,你还会学到如何计算衍生品风险的度量以及所谓的“希腊字母”。

第7章“信用风险管理”(Dániel Havran,Gergely Daróczi),介绍了信用违约模型,说明了如何使用copula对相关违约建模。

第8章“极值理论”(Zsolt Tulassay),给出了极值理论在保险和金融中的可能应用。你将学到如何对火灾损失分布的尾部拟合模型。然后用拟合模型计算在险价值(Value-at-Risk)和预期损失值。

第9章“金融网络”(Edina Berlinger,Gergely Daróczi),解释了金融网络在R中如何表示、模拟、可视化以及如何分析。我们将分析银行间借贷市场并学习如何系统化地检测重要的金融机构。阅读本书之前的准备工作

本书提供的所有代码示例都应该在预装于计算机的R控制台上来运行。你可以免费下载软件并找到安装所有主要操作系统的指导。尽管本书没有包括高级主题,比如如何在整合发展环境中使用R,对于Emacs、Eclipse、vi或者Notepad++以及其他的编辑器有许多很好的插件,并且我们高度推荐你尝试RStudio,这是一款致力于R的免费开源的IDE。

除了R的安装版本,我们还会使用一些用户贡献的R包,这些包可以很容易地从CRAN(Comprehensive R Archive Network)进行安装。要安装一个R包,可以在R控制台使用install.packages命令,如下:> install.packages('zoo')

安装之后,这个包需要在使用之前载入到当前的R会话中:> library(zoo)

在R的主页,你能找到免费的入门文章和手册,但本书面向初学者,因此并不需要读者具备额外的R语言知识。目标读者

本书为那些希望使用R来解决量化金融问题的读者而写。我们假定读者对金融有一定了解,但本书也会介绍金融理论。我们并不需要读者熟悉R,那些想开始学习R语言的读者会发现本书很有用,尽管我们没有给出完整的R语言概览,但说明了如何使用它的一部分来解决具体问题。即使你已经使用过R,也会惊讶于它所能应用的问题广度。排版约定

在本书中,你会发现多种文本样式,用以区别不同种类的信息。这里举例说明其中一些类型,及其含义的解释。

文本中的代码字、数据库表格的名字、文件夹名称、文件名称、文件扩展名、路径、虚拟URL、用户输入以及推特的处理显示如下:“我们会运用一些forecast包中的方法。”

R代码块(通常是个函数体)安排如下。logreturn <- function(x) { log(tail(x, -1) / head(x, -1))}

当我们希望一个代码块的特定部分能吸引你的注意,相应的行或者项会设置为粗体。logreturn tail(x, -1) / head(x, -1))}

任何命令行的输入和输出的格式如下。> pi[1] 3.141593

其中R控制台中显示的“>”表示等待处理的命令。多行表达式会在第一行显示相同的符号,但其余诸行会在开头有一个“+”号,表示后面的R表达式尚待完成。

新术语和重要词汇以黑体表示。你在屏幕上看到的文字,例如,在菜单中或在对话框中,就像这样出现在文本中:“按下Next键,就翻到下一屏。”警告或者重要的注解出现在这样的图标中。提示或者技巧出现在这样的图标中。读者反馈

我们始终欢迎读者的反馈。如果你对本书有任何想法,喜欢或者不喜欢什么,请让我们知道。读者的反馈对我们来说非常重要,这样我们才能出版读者最需要的图书。

一般性的反馈,请通过电子邮件发送到feedback@packtpub.com,请在邮件的主题中注明书名。

如果你精通某个领域并有兴趣写书或参与写书,请参考我们的作者指南www.packtpub.com/authors。客户支持

现在,你已经是一位Packt图书的拥有者,我们会竭尽全力帮助你充分利用手中的书。下载示例代码

可以使用你的账户从http://www.packtpub.com下载所有已购买的Packt图书的示例代码文件。如果你从其他地方购买了本书,可以访问http://www.packtpub.com/ support并注册,我们会通过电子邮件把文件发送给你。勘误表

虽然我们已经竭力确保本书内容正确,但疏漏之处在所难免。如果你在我们的图书中发现错误,无论是文本还是代码,希望能通知我们,我们将不胜感激。这样做可以减少其他读者的困扰,帮助我们改进本书的后续版本。如果你发现任何错误,请访问http://www.packtpub.com/submit-errata,选择相应的图书,单击勘误表提交表单的链接,并输入详细的说明,然后提交。勘误一经核实,你的提交就被接受,此勘误将上传到本公司网站或者添加到现有勘误表。

要查看之前提交的勘误,登录https://www.packtpub.com/books/content/support并在搜索框中输入书名。请求的信息会在勘误部分出现。侵权行为

互联网上的侵权材料是所有媒体都要面对的问题。在Packt,我们非常重视保护版权和许可证。如果你发现我们的作品在互联网上有任何形式的非法拷贝,请立即为我们提供网址或者网站名称,以便我们能够寻求补救。

请把可疑盗版材料发送到copyright@packtpub.com。

非常感谢你帮助我们保护作者以及宝贵的正版图书资源。问题

如果你对本书内容有疑问,不管是哪个方面的,都可以通过questions@packtpub.com来联系我们,我们将尽最大努力解决。第1章 时间序列分析

时间序列分析研究的是按时间顺序收集的数据。相邻的观测数据通常相互依赖。因此,时间序列分析的技术需要处理这种相依性。

本章的目标是通过一些特定应用来介绍一些常用建模技术。我们将看到如何使用R来解决现实中的这些问题。首先,我们考虑如何在R中存储和处理时间序列。接着,我们处理线性时间序列分析,并展现如何将它用于建模和预测房屋价格。其次,我们通过考虑长期趋势,使用协整的概念来改进基本的最小方差对冲比。最后,本章讲述如何将波动率模型运用于风险管理。1.1 使用时间序列数据

用于存储时间序列数据的基本R类有vector、matrix、data.frame以及ts对象。但是,它们可以存储在这些对象中的数据类型相当有限。并且,这些表达方式提供的方法范围也很有限。不过幸运的是,同名的包中的特定对象,zoo、xts或timeSeries对象,对时间序列数据提供了更一般的表达形式。

对每个时间序列分析问题都创建时间序列对象是不必要的,但是复杂程度较高的分析则需要创建时间序列对象。你可以先将时间序列数据存储成向量形式,再计算数据的均值和方差,但如果你想用decompose对数据做季节分解,那就必须将数据存储在时间序列对象中。

下面的例子假定你使用了zoo对象,因为zoo对象是使用最广泛的包之一。在使用zoo对象之前,需要使用下面的命令安装并载入zoo包(如果你已经安装,那只需要载入它)。>install.packages("zoo")>library("zoo")

为了熟悉可用方法,我们使用苹果公司股票的日收盘价,创建一个名为appl的zoo对象,存储在CSV文件aapl.csv中。表格的每一行包括一个日期和一个价格,两项通过逗号分隔。第一行包含了列名(Date和Close)。日期格式符合ISO8601推荐的基本标准符号(YYYY-MM-DD)。收盘价根据股票的拆分、股利以及相关改变进行调整。小提示 下载示例代码你对于在http://www.packtpub.com网站购买的所有Packt图书,都可以用自己在的账户从网站下载示例代码。如果你从其他途径购买了书籍,则可以访问http://www.packtpub.com/support并注册账号,示例代码会直接通过电子邮件发送给你。

使用下面的命令,可以从当前工作目录载入数据。> aapl<-read.zoo("aapl.csv",+  sep=",", header = TRUE, format = "%Y-%m-%d")

为了初步了解数据,我们画出股票价格图形,并为整个图形设定一个标题(使用main参数)和对x轴和y轴标注了名称(分别使用xlab和ylab)。> plot(aapl, main = "APPLE Closing Prices on NASDAQ",+  ylab = "Price (USD)", xlab = "Date")

使用下面的命令,我们可以提取时间序列开头部分或结尾部分。> head(aapl)2000-01-03 2000-01-04 2000-01-05 2000-01-06 2000-01-07 2000-01-10   27.58   25.25   25.62   23.40   24.51   24.08> tail(aapl)2013-04-17 2013-04-18 2013-04-19 2013-04-22 2013-04-23 2013-04-24   402.80   392.05   390.53   398.67   406.13   405.46

使用下面的命令,可以找出苹果股价在所有时间中的高点,和这个高点发生的日期。> aapl[which.max(aapl)]2012-09-19  694.86

当处理时间序列时,通常收益率更受关注,价格却不会。其原因是收益率通常平稳。因此我们会计算简单收益率或连续复合收益率(按百分比的形式)。> ret_simple <- diff(aapl) / lag(aapl, k = -1) * 100> ret_cont  <- diff(log(aapl)) * 100

同时,我们也可以得到简单收益率的概括统计。在这里,我们使用coredata方法来表明我们仅仅关注股票价格,而非索引(日期)。> summary(coredata(ret_simple))   Min. 1st Qu. Median  Mean 3rd Qu.   Max.-51.86000 -1.32500 0.07901 0.12530 1.55300 13.91000

可以看出,最大的单日损失是−51.86%。我们还可以使用下面的命令获得这个损失发生的日期。> ret_simple[which.min(ret_simple)]2000-09-29 -51.85888

上网快速搜索可以发现,这个股价的剧烈变动缘于一个盈利预警的发布。我们可以画出直方图来加深理解日收益率的相关频率。对收益率数据进行分组时,我们可以使用break参数来指定每组的元素个数。> hist(ret_simple, breaks=100, main = "Histogram of Simple Returns",+ xlab="%")

我们也可以把分析限定于时间序列的一个子集(window)中。比如,苹果股价在2013年的最高点可以通过运行下面的命令的找到。> aapl_2013 <- window(aapl, start = '2013-01-01', end = '2013-12-31')> aapl_2013[which.max(aapl_2013)]2013-01-02  545.85

从风险管理的角度看,收益率分布的分位数很有意义。比如,我们使用简单的历史模拟法,可以很容易确定一天中置信水平为99%的在险价值(Value-at-Risk)。> quantile(ret_simple, probs = 0.01)    1%-7.042678

因此,在任意给定的一天中,收益率低于−7%的概率只有1%。但是如果这一天发生了这样的情形(每年大约会发生2.5次),7%将是最小的损失量。线性时间序列的建模与预测

线性时间序列的一类重要模型是自回归单整移动平均(Autoregressive Integrated Moving Average,ARIMA)模型族,它由Box 和 Jenkins(1976年)提出。ARIMA模型假定了时间序列的当前值只依赖于自身的过去值和某些误差项的过去值。

根据Box和Jenkins的研究,建立ARIMA模型包含了以下3个阶段。

1.模型识别。

2.模型估计。

3.模型诊断检验。

模型识别的阶段包括了使用图方法或信息准则来确定试验模型的阶数(包含的过去值个数和过去误差项个数)。模型阶数确定之后需要估计模型参数,通常会使用最小二乘方法或者极大似然方法。最后,为了检查模型可能存在的缺陷,必须仔细检查拟合的模型。这个目的可以通过保证模型残差的行为符合白噪声的特点来实现,换句话说,残差不存在线性依赖。1.2 对英国房屋价格建模并预测

除了zoo包,我们还会使用到forecast包的一些方法。如果你还没安装它,那就需要运行下面的命令来安装forecast包。> install.packages("forecast")

接着我们运行下面的命令载入类。> library("forecast")

首先,我们在时间序列对象zoo中存储月度房屋价格数据(来源:全英房屋抵押贷款协会)。> hp <- read.zoo("UKHP.csv", sep = ",",+  header = TRUE,format = "%Y-%m", FUN = as.yearmon)

参数FUN对日期列调用给定的函数(as.yearmon,表示月度数据点)。为了确认指定as.yearmon真正存储了月度数据(每个周期12个子周期),我们可以查询数据序列的频率。> frequency(hp)[1] 12

结果表示,一个周期(称为年)中有12个子周期(称为月)。为了深入分析,我们再次计算数据的简单收益率。> hp_ret <- diff(hp) / lag(hp, k = -1) * 1001.2.1 模型识别和估计

我们使用forecast包提供的auto.arima函数,在一步中同时识别最优模型并估计参数。除了收益率序列(hp_ret),函数还使用了几个参数。通过指定stationary = TRUE,我们将搜索仅仅限于平稳模型。同样地,seasonal = FALSE将搜索限定于非平稳模型。此外,我们选择模型时,选择赤池信息量来度量模型的相对质量。> mod <- auto.arima(hp_ret, stationary = TRUE, seasonal =FALSE,+  ic="aic")

为了确定拟合系数的值,我们可以查询模型的输出。> modSeries: hp_retARIMA(2,0,0) with non-zero meanCoefficients:     ar1  ar2 intercept   0.2299 0.3491  0.4345s.e. 0.0573 0.0575  0.1519sigma^2 estimated as 1.105: log likelihood=-390.97AIC=789.94  AICc=790.1  BIC=804.28

根据赤池信息量准则,看起来AR(2)模型拟合数据最好。为了视觉层次的确认,我们可以使用命令pacf画出偏自相关函数。图形显示了到滞后两阶的非零偏自相关,阶数为2的AR过程看来比较合适。AR(2)模型给出了两个AR系数、截距(如果模型包含AR项,截距实际上是均值)以及相应的标准误。在下面的例子中,因为水平为5%的置信区间没有包括0,所以这些统计量都在5%的水平上显著。> confint(mod)       2.5 %  97.5 %ar1    0.1174881 0.3422486ar2    0.2364347 0.4617421intercept 0.1368785 0.7321623

如果模型包含不显著的系数,我们可以使用带有fixed参数的arima函数重新估计模型,这相当于输入元素为0和NA的向量。NA表示相应的变量系数需要估计而0表示相应的变量系数需要设置为0。1.2.2 模型诊断检查

一个快速验证模型的方法是运行下面的命令画出时间序列的诊断图。> tsdiag(mod)

上述命令的输出在图1-1中显示。图1-1 时间序列的诊断

标准化残差看来没有表现出波动率聚集,ACF图中的残差自相关并不显著,还有自相关的Ljung-Box检验的p值看起来很高,综上所以残差独立的原假设不能被拒绝,因此模型看来良好。

为了评估模型对样本数据的拟合良好程度,我们可以画出原始的月回报(细的黑色实线)与拟合值(宽的红色点线)的对比图形。> plot(mod$x, lty = 1, main = "UK house prices: raw data vs.fitted + values", ylab = "Return in percent", xlab = "Date")> lines(fitted(mod), lty = 2,lwd = 2, col = "red")

输出显示在图1-2中。图1-2 英国房屋数据

此外,我们可以计算精确性的常用度量。> accuracy(mod)ME   RMSE   MAE   MPE  MAPE  MASE0.00120 1.0514  0.8059  -Inf  Inf   0.792980241

这个命令返回平均误差、均方误差、平均绝对误差、平均百分比误差、平均绝对值百分比误差和平均绝对比例误差。1.2.3 预测

为了预测接下来3个月的月收益率(2013年4~6月),我们使用下面的   命令。> predict(mod, n.ahead=3)$pred      Apr    May    Jun2013 0.5490544 0.7367277 0.5439708$se     Apr   May   Jun2013 1.051422 1.078842 1.158658

所以,我们预期在接下来的3个月中,平均房屋价格稍有增长,但标准误比较高,大约为1%。为了画出带有标准误的预测,我们可以使用下面的命令。> plot(forecast(mod))1.3 协整

协整的思想缘于Granger(1981年)提出的一个概念,后来由Engle和Granger(1987年)加以形式化。协整的思想是指寻找非平稳时间序列之间的一个线性组合,这个线性组合是一个平稳时间序列。因此,协整方法可以用于检测非平稳时间序列(比如价格)之间的稳定长期关系。航空燃油的交叉对冲

航空公司很自然需要购买航空燃油。但由于航空燃油价格的波动很剧烈,大部分航空公司会将它们对航空燃油价格变化的风险敞口对冲掉一部分。如果市场中缺乏航空燃油OTC产品(译注:OTC产品指交易所场外柜台交易产品),航空公司会使用相关交易所交易的期货合约(比如,取暖油)来实现对冲。在下面的部分中,我们首先使用经典方法导出最优对冲比率,这种方法仅仅考虑两种价格之间短期波动。然后考察价格之间的长期稳定联系,进而改进最优对冲比。

首先,我们载入需要使用的包。urca包有一些有用的方法,可以用于单位根检验和估计协整关系。> library("zoo")> install.packages("urca")> library("urca")

我们导入航空燃油和取暖油的月价格。> prices <- read.zoo("JetFuelHedging.csv", sep = ",",+ FUN =as.yearmon, format = "%Y-%m", header = TRUE)

现在我们仅仅考虑两种商品的短期行为(月价格改变)。通过拟合一个用取暖油价格变化来解释航空燃油价格的线性模型,可以推导出两种商品的最小方差对冲比率。线性模型中的beta系数就是最优对冲比。> simple_mod <- lm(diff(prices$JetFuel) ~ diff(prices$HeatingOil)+0)

函数lm(用于线性模型)估计了航空燃油价格变动对取暖油价格变动的最佳拟合系数。+0项表示截距设置为0,意味着航空公司不持有现金。> summary(simple_mod)Call:lm(formula = diff(prices$JetFuel) ~ diff(prices$HeatingOil) +  0)Residuals:   Min    1Q Median   3Q   Max-0.52503 -0.02968 0.00131 0.03237 0.39602Coefficients:            Estimate Std. Error t value Pr(>|t|)diff(prices$HeatingOil) 0.89059  0.03983  22.36  <2e-16***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 0.0846 on 189 degrees of freedomMultiple R-squared: 0.7257, Adjusted R-squared: 0.7242F-statistic: 499.9 on 1 and 189 DF, p-value: < 2.2e-16

结果得到了方差比为0.89059和残差标准差为0.0846。但是,交叉对冲并非完美无缺,推导出的对冲组合结果仍然有风险。

现在,我们通过考察航空燃油和取暖油期货价格之间存在的长期关系,尝试改进方差比。我们使用下列命令画出两个价格序列(取暖油价格用红色),通过观察图形你可能已经猜出存在着这种长期关系。> plot(prices$JetFuel, main = "Jet Fuel and Heating Oil Prices",+  xlab = "Date", ylab = "USD")> lines(prices$HeatingOil, col = "red")

我们使用Engle和Granger的两步估计方法。首先,使用增强的Dickey-Fuller检验(augmented Dickey-Fuller test,ADF检验)对两个序列进行单位根检验(非平稳性)。> jf_adf <- ur.df(prices$JetFuel, type = "drift")> summary(jf_adf)################################################ Augmented Dickey-Fuller Test Unit Root Test ################################################Test regression driftCall:lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)Residuals:   Min    1Q Median   3Q   Max-1.06212 -0.05015 0.00566 0.07922 0.38086Coefficients:      Estimate Std. Error t value Pr(>|t|)(Intercept) 0.03050  0.02177  1.401 0.16283z.lag.1  -0.01441  0.01271 -1.134 0.25845z.diff.lag 0.19471  0.07250  2.686 0.00789 **---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 0.159 on 186 degrees of freedomMultiple R-squared: 0.04099, Adjusted R-squared: 0.03067F-statistic: 3.975 on 2 and 186 DF, p-value: 0.0204Value of test-statistic is: -1.1335 0.9865Critical values for test statistics:   1pct 5pct 10pcttau2 -3.46 -2.88 -2.57phi1 6.52 4.63 3.81

结果显示,因为检验统计量值−1.1335大于临界值−3.46,所以在1%的置信水平上不能拒绝非平稳(航空燃油时间序列包含一个单位根)的原假设。同样的结果对取暖油也成立(检验统计量是−1.041)。> ho_adf <- ur.df(prices$HeatingOil, type = "drift")> summary(ho_adf)

现在我们可以继续估计静态均衡模型,并使用ADF方法检验时间序列的残差是否平稳。请注意,目前的研究序列是上一步的估计结果,因此,我们现在必须使用不同的临界值[参见Engle和Yoo1987发表的论文]。> mod_static <- summary(lm(prices$JetFuel ~ prices$HeatingOil))> error <- residuals(mod_static)> error_cadf <- ur.df(error, type = "none")> summary(error_cadf)

得到的检验统计量是−8.912,而规模为200的样本在1%的置信水平上的临界值为−4.00。所以,我们拒绝非平稳的原假设。因此我们发现了两个协整变量并且可以进行第二步,两个协整变量意味着一个误差修正模型(ECM)。ECM是一个动态模型,刻画了系统如何(以及多快)返回之前估计的静态均衡,这个静态均衡存储在变量mod_static中。> djf <- diff(prices$JetFuel)> dho <- diff(prices$HeatingOil)> error_lag <- lag(error, k = -1)> mod_ecm <- lm(djf ~ dho + error_lag)> summary(mod_ecm)Call:lm(formula = djf ~ dho + error_lag + 0)Residuals:   Min    1Q Median   3Q   Max-0.19158 -0.03246 0.00047 0.02288 0.45117Coefficients:     Estimate Std. Error t value Pr(>|t|)Dho  0.90020  0.03238 27.798  <2e-16 ***error_lag -0.65540 0.06614 -9.909  <2e-16 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 0.06875 on 188 degrees of freedomMultiple R-squared: 0.8198, Adjusted R-squared: 0.8179F-statistic: 427.6 on 2 and 188 DF, p-value: < 2.2e-16

通过考察航空燃油价格和取暖油价格之间存在的长期联系(协整),对冲比现在稍微提高了一点(0.90020),并且残差标准差显著地降低了(−0.65540)。误差项的系数为负(−0.65540):两个价格之间原先较大的偏差有所修正,价格向它们的长期稳定关系移动。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中显示。图1-3 英特尔公司的月收益

我们可以使用统计假设检验来验证自己的想法。两种常用检验如下。● 用于平方收益率(波动率的一种代理)自相关的Ljung-Box检

验。● Engle(1982年)提出的拉格朗日乘子(LM)检验。

首先,我们运行下面的命令,从而在平方收益率的前12阶滞后值上执行Ljung-Box检验。> Box.test(coredata(intc^2), type = "Ljung-Box", lag = 12)  Box-Ljung testdata: 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 effectsdata: 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-normBacktest Length:  312Data:==========================================alpha:       1%Expected Exceed:   3.1Actual VaR Exceed:  5Actual %:      1.6%Unconditional Coverage (Kupiec)Null-Hypothesis:  Correct ExceedancesLR.uc Statistic:  0.968LR.uc Critical:   6.635LR.uc p-value:   0.325Reject Null:   NOConditional Coverage (Christoffersen)Null-Hypothesis:  Correct Exceedances and        Independence of FailuresLR.cc Statistic:  1.131LR.cc Critical:   9.21LR.cc p-value:   0.568Reject 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中显示了上述命令行的输出。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载