R语言中动态时间规整 r语言的时间序列分析_数据

在金融市场里,最重要的一个维度就是时间,没有了时间,价格叠加在一起的数组也瞬然变成了混乱无序的字符。只有在时间的演变下,金融市场上的一切交易和价格才会变得合理并随着时间一点一滴地被记录着。R语言里有一特定的数据结构,时间序列,是专门用来做带有时间的数据分析的。本文主要介绍R里面的一个功能全面的程序包xts,它里面的很多计算方程在金融领域还是有不少用武之地的。

首先,先要创建时间元素:

# 第一次用需要安装程序包
> install.packages("xts")
# 加载程序包
> library(xts)

> sample.date as.Date("2019-03-07")
> class(sample.date)
[1] "Date"

需要注意日期输入的格式,要加双引号,里面的是按年月日顺序,as.Date( )方程其中Date的D要大写。如果想要自己更改输入格式,用format( )方程,几种常见的输入日期格式如下:

  • %Y  四位年份  2018
  • %y  二位年份   18
  • %m  二位月份  01
  • %d   二位日期   13
  • %H   小时
  • %M   分钟
  • %S    秒
> as.Date("13,01,2018",format = "%d,%m,%Y")
[1] "2018-01-13"

可以看到,最终R输出的年份格式一样,format是根据输入日期格式来写的。接下来创建xts,假设2019年一月一号至一月10号,某市场苹果的价格随机产生如下,

# 创建时间
date from = as.Date("2019-01-01"), to = as.Date("2019-01-10"),
            by = "days")

# 创建随机苹果价格,rnorm随机正态分布数(几个,均值,标准差)
apple.price 10, mean = 10,sd = 2)

price.data by = date)

price.data
                [,1]
2019-01-01 11.030254
2019-01-02 11.971463
2019-01-03  7.096614
2019-01-04 11.483626
2019-01-05  7.037904
2019-01-06 14.432470
2019-01-07 11.371040
2019-01-08 13.218316
2019-01-09 16.961284
2019-01-10 10.980430

xts格式里,时间是内嵌属性,并不会跟随计算,只有当用index( )才被提取出来。

# 仅提取时间
> index(price.data)
 [1] "2019-01-01" "2019-01-02" "2019-01-03" "2019-01-04" "2019-01-05"
 [6] "2019-01-06" "2019-01-07" "2019-01-08" "2019-01-09" "2019-01-10"

# 时间不被计算
> price.data*2
               [,1]
2019-01-01 22.06051
2019-01-02 23.94293
2019-01-03 14.19323
2019-01-04 22.96725
2019-01-05 14.07581
2019-01-06 28.86494
2019-01-07 22.74208
2019-01-08 26.43663
2019-01-09 33.92257
2019-01-10 21.96086

> min(price.data)
[1] 7.037904
> max(price.data)
[1] 16.96128

以上是模拟数据的应用,接下来做一些更贴近实际的计算。众所周知,2019年以来,中国股市开始强势上扬,一反去年颓势的常态,市场热度急剧上升,单日成交金额屡次突破万亿。那么想要分析最近一年上证指数的时间序列数据分析该如何操作,首先获取数据(quantmod获取法将在以后单独介绍),数据是从2018年1月1号到2019年3月7号:

> library(quantmod)

> data "000001.SS", from = "2018-01-01",
                    to = "2019-03-07",auto.assign = FALSE,
                    src = "yahoo")

R语言中动态时间规整 r语言的时间序列分析_时间序列_02

导入的数据截选如图

接下来介绍几种常用方程:

1. ndays( ),nweeks( ),nmonths( ). 

# 提取收盘价第六列数据
> data.close 6]

# 此数据计算天数,周数,月数
> ndays(data.close)
[1] 284
> nweeks(data.close)
[1] 60
> nmonths(data.close)
[1] 15

2. split( ). 按指定时间长度拆分

如:想要对近一年多上证指数收盘价数据按季度分组

# split(数据,f:日期,k:每组包含几个)
> split(data.close, f = "months", k = 3)
[[1]]
           000001.SS.Adjusted
2018-01-02           3348.326
2018-01-03           3369.108
2018-01-04           3385.710
2018-01-05           3391.750
2018-01-08           3409.480

此数据显示太多,只展示部分结果,但最终被拆分成5组,分别为2018年四个季度加2019年第一季度到3月7号。

3. to.period( ): 变换时间窗口,但操作数据必须是OHLC格式(包含开盘价,收盘价,最高价,最低价)

# 变换成按周
> data.week # 变换成按月
> data.month

R语言中动态时间规整 r语言的时间序列分析_数据_03

部分截选如图,操作后日期按周显示,检查数据确实一一对应

R语言中动态时间规整 r语言的时间序列分析_时间序列_04

按月显示截选如图

3. apply.monthly( ), apply.weekly( ), apply.quarterly( ), apply.yearly( ). 在特定时间范围内计算。如:计算上证指数近一年,每个月里,单日成交量平均值。

> apply.monthly(data.v, FUN = mean)

           000001.SS.Volume
2018-01-31         218086.4
2018-02-28         192593.3
2018-03-30         168368.2
2018-04-27         149944.4
2018-05-31         135418.2
2018-06-29         131205.0
2018-07-31         138600.0
2018-08-31         122678.3
2018-09-28         113073.7
2018-10-31         152250.0
2018-11-30         184218.2
2018-12-28         128545.0
2019-01-31         153890.9
2019-02-28         294786.7
2019-03-06         462625.0

可以看到2019年2月28到3月6号的单日平均成交量是去年3月平均水平的将近三倍。需要注意的是,用quantmod数据导出的成交量是千位值,所以具体计算的时候需要乘1000,出来的是具体的成交量,然后再乘以加权平均价格就得出成交金额了。以2019年3月6号为例,quantmod导出此日成交量为555000,乘以1000,得5.55亿手,然后再乘以加权平均价格得到总成交金额,此计算复杂就不在这讨论了。

4. rollmeanr( ) 计算均线

如:计算上证指数近一年5日均线

> data.close$five.day.mean 5)

R语言中动态时间规整 r语言的时间序列分析_时间序列_05

结果截选如图

可以看到前4个显示NA空缺值,正是因为计算五日均价,前四个不满五个所以没有结果。

以上是比较常用的计算函数,还有一些如rollapply( )rollmeanr( )原理类似,不同在于可以rollapply( )可以应用其他方程,如标准差。还有比如merge( ) 合并数据阵或时间序列用的,na.locf( ) 用前值或后值来替换NA空缺值的等等,在此不一一介绍了,感兴趣可以自行上网查询学习。