R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析(上)

简介: R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析

原文链接:http://tecdat.cn/?p=19469 


本文将分析工业指数(DJIA)。工业指数(DIJA)是一个股市指数,表明30家大型上市公司的价值。工业指数(DIJA)的价值基于每个组成公司的每股股票价格之和。


获取数据


利用quantmod软件包中提供的getSymbols()函数,我们可以获得2007年至2018年底的工业平均指数。

getSymbols("^DJI", from = "2007-01-01", to = "2019-01-01")
dim(DJI)
## \[1\] 3020    6
class(DJI)
## \[1\] "xts" "zoo"

让我们看一下DJI xts对象,它提供了六个时间序列,我们可以看到。

head(DJI)
##            DJI.Open DJI.High  DJI.Low DJI.Close DJI.Volume DJI.Adjusted
## 2007-01-03 12459.54 12580.35 12404.82  12474.52  327200000     12474.52
## 2007-01-04 12473.16 12510.41 12403.86  12480.69  259060000     12480.69
## 2007-01-05 12480.05 12480.13 12365.41  12398.01  235220000     12398.01
## 2007-01-08 12392.01 12445.92 12337.37  12423.49  223500000     12423.49
## 2007-01-09 12424.77 12466.43 12369.17  12416.60  225190000     12416.60
## 2007-01-10 12417.00 12451.61 12355.63  12442.16  226570000     12442.16
tail(DJI)
##            DJI.Open DJI.High  DJI.Low DJI.Close DJI.Volume DJI.Adjusted
## 2018-12-21 22871.74 23254.59 22396.34  22445.37  900510000     22445.37
## 2018-12-24 22317.28 22339.87 21792.20  21792.20  308420000     21792.20
## 2018-12-26 21857.73 22878.92 21712.53  22878.45  433080000     22878.45
## 2018-12-27 22629.06 23138.89 22267.42  23138.82  407940000     23138.82
## 2018-12-28 23213.61 23381.88 22981.33  23062.40  336510000     23062.40
## 2018-12-31 23153.94 23333.18 23118.30  23327.46  288830000     23327.46

更准确地说,我们有可用的OHLC(开盘,高,低,收盘)指数值,调整后的收盘价和交易量。在这里,我们可以看到生成的相应图表。

我们在此分析调整后的收盘价。

DJI\[,"DJI.Adjusted"\]

简单对数收益率

简单的收益定义为:

对数收益率定义为:

我们计算对数收益率

CalculateReturns(dj_close, method = "log")

让我们看看。

head(dj_ret)
##             DJI.Adjusted
## 2007-01-04  0.0004945580
## 2007-01-05 -0.0066467273
## 2007-01-08  0.0020530973
## 2007-01-09 -0.0005547987
## 2007-01-10  0.0020564627
## 2007-01-11  0.0058356461
tail(dj_ret)
##            DJI.Adjusted
## 2018-12-21 -0.018286825
## 2018-12-24 -0.029532247
## 2018-12-26  0.048643314
## 2018-12-27  0.011316355
## 2018-12-28 -0.003308137
## 2018-12-31  0.011427645

给出了下面的图。

可以看到波动率的急剧上升和下降。第3部分将对此进行深入验证。


辅助函数


我们需要一些辅助函数来简化一些基本的数据转换,摘要和绘图。

1.从xts转换为带有year and value列的数据框。这样就可以进行年度总结和绘制。

df\_t <- data.frame(year = factor(year(index(data\_xts))), value = coredata(data_xts))
  colnames(df_t) <- c( "year", "value")

2.摘要统计信息,用于存储为数据框列的数据。

rownames(basicStats(rnorm(10,0,1))) # 基本统计数据输出行名称
with(dataset, tapply(value, year, basicStats))

3.返回关联的列名。

colnames(basicstats\[r, which(basicstats\[r,\] > threshold), drop = FALSE\])

4.基于年的面板箱线图。

p <- ggplot(data = data, aes(x = year, y = value)) + theme\_bw() + theme(legend.position = "none") + geom\_boxplot(fill = "blue")

5.密度图,以年份为基准。

p <- ggplot(data = data, aes(x = value)) + geom_density(fill = "lightblue") 
  p <- p + facet_wrap(. ~ year)

6.基于年份的QQ图。

p <- ggplot(data = dataset, aes(sample = value)) + stat\_qq(colour = "blue") + stat\_qq_line() 
  p <- p + facet_wrap(. ~ year)

7. Shapiro检验

pvalue <- function (v) {
  shapiro.test(v)$p.value
}


每日对数收益率探索性分析


我们将原始的时间序列转换为具有年和值列的数据框。这样可以按年简化绘图和摘要。

head(ret_df)
##   year         value
## 1 2007  0.0004945580
## 2 2007 -0.0066467273
## 3 2007  0.0020530973
## 4 2007 -0.0005547987
## 5 2007  0.0020564627
## 6 2007  0.0058356461
tail(ret_df)
##      year        value
## 3014 2018 -0.018286825
## 3015 2018 -0.029532247
## 3016 2018  0.048643314
## 3017 2018  0.011316355
## 3018 2018 -0.003308137
## 3019 2018  0.011427645


基本统计摘要


给出了基本统计摘要。

##                   2007       2008       2009       2010       2011
## nobs        250.000000 253.000000 252.000000 252.000000 252.000000
## NAs           0.000000   0.000000   0.000000   0.000000   0.000000
## Minimum      -0.033488  -0.082005  -0.047286  -0.036700  -0.057061
## Maximum       0.025223   0.105083   0.066116   0.038247   0.041533
## 1. Quartile  -0.003802  -0.012993  -0.006897  -0.003853  -0.006193
## 3. Quartile   0.005230   0.007843   0.008248   0.004457   0.006531
## Mean          0.000246  -0.001633   0.000684   0.000415   0.000214
## Median        0.001098  -0.000890   0.001082   0.000681   0.000941
## Sum           0.061427  -0.413050   0.172434   0.104565   0.053810
## SE Mean       0.000582   0.001497   0.000960   0.000641   0.000837
## LCL Mean     -0.000900  -0.004580  -0.001207  -0.000848  -0.001434
## UCL Mean      0.001391   0.001315   0.002575   0.001678   0.001861
## Variance      0.000085   0.000567   0.000232   0.000104   0.000176
## Stdev         0.009197   0.023808   0.015242   0.010182   0.013283
## Skewness     -0.613828   0.224042   0.070840  -0.174816  -0.526083
## Kurtosis      1.525069   3.670796   2.074240   2.055407   2.453822
##                   2012       2013       2014       2015       2016
## nobs        250.000000 252.000000 252.000000 252.000000 252.000000
## NAs           0.000000   0.000000   0.000000   0.000000   0.000000
## Minimum      -0.023910  -0.023695  -0.020988  -0.036402  -0.034473
## Maximum       0.023376   0.023263   0.023982   0.038755   0.024384
## 1. Quartile  -0.003896  -0.002812  -0.002621  -0.005283  -0.002845
## 3. Quartile   0.004924   0.004750   0.004230   0.005801   0.004311
## Mean          0.000280   0.000933   0.000288  -0.000090   0.000500
## Median       -0.000122   0.001158   0.000728  -0.000211   0.000738
## Sum           0.070054   0.235068   0.072498  -0.022586   0.125884
## SE Mean       0.000470   0.000403   0.000432   0.000613   0.000501
## LCL Mean     -0.000645   0.000139  -0.000564  -0.001298  -0.000487
## UCL Mean      0.001206   0.001727   0.001139   0.001118   0.001486
## Variance      0.000055   0.000041   0.000047   0.000095   0.000063
## Stdev         0.007429   0.006399   0.006861   0.009738   0.007951
## Skewness      0.027235  -0.199407  -0.332766  -0.127788  -0.449311
## Kurtosis      0.842890   1.275821   1.073234   1.394268   2.079671
##                   2017       2018
## nobs        251.000000 251.000000
## NAs           0.000000   0.000000
## Minimum      -0.017930  -0.047143
## Maximum       0.014468   0.048643
## 1. Quartile  -0.001404  -0.005017
## 3. Quartile   0.003054   0.005895
## Mean          0.000892  -0.000231
## Median        0.000655   0.000695
## Sum           0.223790  -0.057950
## SE Mean       0.000263   0.000714
## LCL Mean      0.000373  -0.001637
## UCL Mean      0.001410   0.001175
## Variance      0.000017   0.000128
## Stdev         0.004172   0.011313
## Skewness     -0.189808  -0.522618
## Kurtosis      2.244076   2.802996

在下文中,我们对上述一些相关指标进行了具体评论。


平均值


每日对数收益率具有正平均值的年份是:

filter_stats(stats, "Mean", 0)
## \[1\] "2007" "2009" "2010" "2011" "2012" "2013" "2014" "2016" "2017"

按升序排列。

##           2008      2018   2015     2011     2007    2012     2014
## Mean -0.001633 -0.000231 -9e-05 0.000214 0.000246 0.00028 0.000288
##          2010  2016     2009     2017     2013
## Mean 0.000415 5e-04 0.000684 0.000892 0.000933


中位数


正中位数是:

filter\_stats(dj\_stats, "Median", 0)
## \[1\] "2007" "2009" "2010" "2011" "2013" "2014" "2016" "2017" "2018"

以升序排列。

##            2008      2015      2012     2017     2010     2018     2014
## Median -0.00089 -0.000211 -0.000122 0.000655 0.000681 0.000695 0.000728
##            2016     2011     2009     2007     2013
## Median 0.000738 0.000941 0.001082 0.001098 0.001158


偏度


偏度(Skewness)可以用来度量随机变量概率分布的不对称性。

公式:

其中 是均值, 是标准差。

几何意义:

偏度的取值范围为(-∞,+∞)

当偏度<0时,概率分布图左偏(也叫负偏分布,其偏度<0)。

当偏度=0时,表示数据相对均匀的分布在平均值两侧,不一定是绝对的对称分布。

当偏度>0时,概率分布图右偏(也叫正偏分布,其偏度>0)。

例如上图中,左图形状左偏,右图形状右偏。

每日对数收益出现正偏的年份是:

## \[1\] "2008" "2009" "2012"

按升序返回对数偏度。

stats\["Skewness",order(stats\["Skewness",
##               2007      2011      2018      2016      2014      2013
## Skewness -0.613828 -0.526083 -0.522618 -0.449311 -0.332766 -0.199407
##               2017      2010      2015     2012    2009     2008
## Skewness -0.189808 -0.174816 -0.127788 0.027235 0.07084 0.224042


峰度


峰度(Kurtosis)可以用来度量随机变量概率分布的陡峭程度。

公式:

其中 是均值, 是标准差。

几何意义:

峰度的取值范围为[1,+∞),完全服从正态分布的数据的峰度值为 3,峰度值越大,概率分布图越高尖,峰度值越小,越矮胖。

例如上图中,左图是标准正太分布,峰度=3,右图的峰度=4,可以看到右图比左图更高尖。

通常我们将峰度值减去3,也被称为超值峰度(Excess Kurtosis),这样正态分布的峰度值等于0,当峰度值>0,则表示该数据分布与正态分布相比较为高尖,当峰度值<0,则表示该数据分布与正态分布相比较为矮胖。


点击标题查阅往期内容


R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据


01

02

03

04


每日对数收益出现超值峰度的年份是:

##  \[1\] "2007" "2008" "2009" "2010" "2011" "2012" "2013" "2014" "2015" "2016"
## \[11\] "2017" "2018"

按升序返回超值峰度。

##             2012     2014     2013     2015     2007     2010    2009
## Kurtosis 0.84289 1.073234 1.275821 1.394268 1.525069 2.055407 2.07424
##              2016     2017     2011     2018     2008
## Kurtosis 2.079671 2.244076 2.453822 2.802996 3.670796

2018年的峰度最接近2008年。


箱形图


我们可以看到2008年出现了最极端的值。从2009年开始,除了2011年和2015年以外,其他所有值的范围都变窄了。但是,与2017年和2018年相比,产生极端值的趋势明显改善。


密度图

densityplot(ret_df)

2007年具有显着的负偏。2008年的特点是平坦。2017年的峰值与2018年的平坦度和左偏一致。


R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析(中):https://developer.aliyun.com/article/1491668

相关文章
|
3月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
4月前
|
存储 数据采集 数据处理
R语言数据变换:使用tidyr包进行高效数据整形的探索
【8月更文挑战第29天】`tidyr`包为R语言的数据整形提供了强大的工具。通过`pivot_longer()`、`pivot_wider()`、`separate()`和`unite()`等函数,我们可以轻松地将数据从一种格式转换为另一种格式,以满足不同的分析需求。掌握这些函数的使用,将大大提高我们处理和分析数据的效率。
|
3月前
R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图
【9月更文挑战第9天】在R语言中,利用`ggplot2`包可绘制多系列柱状图与直方图。首先读取数据文件`data.csv`,加载`ggplot2`包后,使用`ggplot`函数指定轴与填充颜色,并通过`geom_bar`或`geom_histogram`绘图。参数如`stat`, `position`, `alpha`等可根据需要调整,实现不同系列的图表展示。
|
3月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
|
3月前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
4月前
|
数据采集 机器学习/深度学习 数据挖掘
R语言数据清洗:高效处理缺失值与重复数据的策略
【8月更文挑战第29天】处理缺失值和重复数据是数据清洗中的基础而重要的步骤。在R语言中,我们拥有多种工具和方法来有效地应对这些问题。通过识别、删除或插补缺失值,以及删除重复数据,我们可以提高数据集的质量和可靠性,为后续的数据分析和建模工作打下坚实的基础。 需要注意的是,处理缺失值和重复数据时,我们应根据实际情况和数据特性选择合适的方法,并在处理过程中保持谨慎,以避免引入新的偏差或错误。
|
4月前
|
数据处理
R语言数据合并:掌握`merge`与`dplyr`中`join`的巧妙技巧
【8月更文挑战第29天】如果你已经在使用`dplyr`进行数据处理,那么推荐使用`dplyr::join`进行数据合并,因为它与`dplyr`的其他函数(如`filter()`、`select()`、`mutate()`等)无缝集成,能够提供更加流畅和一致的数据处理体验。如果你的代码中尚未使用`dplyr`,但想要尝试,那么`dplyr::join`将是一个很好的起点。
|
4月前
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。
|
4月前
|
资源调度 数据挖掘
R语言回归分析:线性回归模型的构建与评估
【8月更文挑战第31天】线性回归模型是统计分析中一种重要且实用的工具,能够帮助我们理解和预测自变量与因变量之间的线性关系。在R语言中,我们可以轻松地构建和评估线性回归模型,从而对数据背后的关系进行深入的探索和分析。
|
4月前
|
SQL 数据挖掘 数据处理
R语言数据操作:使用dplyr进行数据处理的深度探索
【8月更文挑战第27天】`dplyr`包以其简洁、强大的数据处理能力,在R语言的数据分析领域占据了重要地位。通过`select()`、`filter()`、`arrange()`、`mutate()`和`summarise()`等核心函数,结合管道操作符`%>%`,我们可以轻松地完成数据筛选、排序、变换和汇总等操作。掌握`dplyr`的使用,将极大地提高我们在R语言中进行
下一篇
DataWorks