R语言时间序列数据应用xts

zoo是时间序列的基础库,是面向通用的设计。 xts 是对时间序列库(zoo) 的一种扩展实现。xts 类型继承了zoo 类型,丰富了时间序列数据处理的函数。

一、xts对象的结构和定义

1xts对象是一个具有时间索引的观测值矩阵,结构如下

xts = matrix + times

2、创建xts对象,函数如下:

xts (x= ,  order.by= ,  …  )

参数   x : 数据,必须是一个向量或者矩阵;

order.by: 索引(index),是一个与x行数相同的升序排列的时间对象。

创建示例:

data <- rnorm(5)

dates <- seq(as.Date("2016-01-01"), length = 5, by = "days")

smith <- xts(x = data, order.by = dates)

3属性(Attr

xts允许数据绑定任意键值属性,可用来保存对象的元数据。创建xts对象时添加属性,只需要将name=value参数传送给xts()函数。

#使用 POSIXct日期类对象创建bday

bday <- as.POSIXct("1899-05-08")

# 创建xts对象,并新增born属性

hayek <- xts(x = data, order.by = dates, born = bday)

4、分解xts对象

xts 和 zoo的核心是一个简单的R矩阵和一些附加属性,最重要的属性是索引( index)。索引包含了将数据作为时间序列的所有信息。

coredata()   获取xts对象中的矩阵部分。

index()      获取xts对象的index部分。

5、转换成xts对象

as.xts()

6xts与其他时间序列的主要区别

xts与R大部分其他时间序列对象的主要区别是: xts可以使用表示时间的任何类,不管是POSIXct, Date 还是其他类,xts将它们转换成一种内部格式,使用户尽可能自然地选取子集。

a <- xts(x = 1:2,
as.Date("2012-01-01") + 0:1)

a[index(a)]

7、索引的属性

查看索引的类别 indexClass()

查看索引的时区 indexTZ()

显示或修改索引时间格式   indexFormat()

# 修改时间表示格式

indexFormat(temps) <- "%m/%d/%Y"

tzone(), 用于提取或设置时区。

tzone(x) <- "Time_Zone"

Xts对象的索引的原始向量是自UNIX纪元(1970-01-01)以来的累计秒数的向量

.index()可获取索引的原始向量。

以下函数用于提取类似于POSIXlt 类型的时间组件:

.indexday()

.indexmon()

.indexyear()

#创建一个周末日期索引

index <- which(.indexwday(temps) == 0 | .indexwday(temps) == 6)

二、输入和输出xts数据

1、实际应用中从硬盘或者网络中读取数据。

例如,硬盘中的tmp_file文件的内容如下:

a,b

1/02/2015, 1, 3

2/03/2015, 2, 4

输入示例1:

# 读取tmp_file文件

dat<-read.csv(tmp_file)

#将dat转换成xts格式

xts(dat, order.by = as.Date(rownames(dat), "%m/%d/%Y"))

输入示例2:

#使用read.zoo读取tmp_file文件

dat_zoo <- read.zoo(tmp_file, index.column = 0, sep = ",", format
= "%m/%d/%Y")

#将dat_zoo转换成xts

dat_xts <- xts(dat_zoo)

输入示例3:

# FUN = as.yearmon将时间字符串转换成更合适的时间类。

sun <- read.zoo(tmp_file, sep =
",", FUN = as.yearmon)

# 转换成xts对象

sun_xts<-xts(sun)

2、 输出xts 对象

主要有两种方式:

1、使用saveRDS() 和readRDS() 将单个R对象序列化。

2、使用 zoo中的函数 write.zoo()

#获取临时文件名

tmp <- tempfile()

#使用zoo将xts对象写入tmp文件

write.zoo(data_xts, sep = ",", file = tmp)

三、查询时间范围

1、查询日期范围

Xts可快速有效地确定日期和时点范围的子集,并提取相应的观测值。

使用特殊字符和日期搭配就可提取xts对象的日期范围。

A["20090825"]      
## 20090825

A["201203/201212"]       ## 201203至201212

A["/201601"]       ##
自 201601开始

2、提取每日时间间隔

# 选取所有日期9:30-16:00之间的观测值

NYSE["T09:30/T16:00"]

3、观测值的更新或替换

# 将dates向量中对应的观测值设置为NA

x[dates] <- NA

# 自2016-06-09至今的观测值修改为0

x["2016-06-09/"] <- 0

4、定位时间周期的开始和结束

last(temps, "1 week")

last(lastweek, 2)

first(lastweek, "-2 days")

可以将first()和last()组合起来使用

#第1周的后3天

last(first(Temps, ‘1 week‘), ‘3 days‘)

5、查看时间周期性和次数

periodicity()  查看时间序列的周期

ndays() , nmonths(), nquarters()  查看周期的次数

 

四、xts对象的合并运算

xts objects在做数学计算时,会遵循时间并且只返回有时间交集的数据。

1、用merge按列合并xts

merge()将一个或多个序列按列合并。适用于按固定日期来规范观测值。

merge(a, b, join = "right", fill
= 9999)

3个关键参数:

... :用于合并的任意个的对象

Join :规定如何合并序列,例如inner或left方式。

Fill : 规定如何设置序列合并后出现的缺失值

2、用rbind按行合并xts

合并结果按时间升序排列

 

五、观测值的NA值处理

1、前一个或下个观测值结转法

取缺失值的前一个观测值来填补缺失值。可防止先窥偏差(look-ahead bias)

# 使用上个观测值

na.locf(x)

#设置fromLast = TRUE,可使用下个观测值填补空缺

na.locf(x, fromLast = TRUE)

2、使用 na.approx()插补缺值

na.approx()基于两点之间的简单线性插值,数据点使用索引值之间的距离来估算,估算值在时间上是线性的。

六、时间序列操作

1、偏移函数lag()

k是偏移的步长。在xts中,k为正,序列的观测值将向下(时间后方)偏移;k为负,观测值将向上偏移。Zoo与xts相反。

> a

[,1]

2016-01-01    1

2016-01-02    2

2016-01-03    3

> lag(a)

[,1]

2016-01-01   NA

2016-01-02    1

2016-01-03    2

> lag(a,k=-1)

[,1]

2016-01-01    2

2016-01-02    3

2016-01-03    NA

2、差分函数diff()

一个简单的差分例如:  x(t)
- x(t-k)  其中k是序列偏移的步长。高阶差分是对每个之前的差分计算结果的重复应用。

diff(xtsdata,  lag = , differences = )

参数说明:

Lag:偏移数;

differences:差分的次序(例如:调用多少次 diff )。

# 下面两条指令的效果相同

diff(x, differences = 2)

diff(diff(x))

3endpoints()函数,按时间间隔分割数据

endpoints(data,on=, k= )

该函数接收一个时间序列并返回每个时间区间的最后一个观测值的位置向量。返回值以0开始,以数据长度(总行数)结束。

参数on 支持各种时间周期, 包括"years", "quarters", "months","hours"和 "minutes"等。

参数K用于找到第k个周期。例如,设置on = "weeks", k = 2, 可取每两周的最后一天。注意最后一个返回值总是数据的长度,即便是与间隔周期不一致。

例如,下列代码显示某数据每年的最后一个观测值

endpoints(Air, on = "years")

[1] 0 12 24 36 48
60 72 84 96 108 120 132 144

4、用period.apply按时间分割数据,并运算

period.apply(x, INDEX, FUN, ...)

使用举例:

# 计算每周的端点

ep <- endpoints(temps, on = "weeks")

# 计算每周均值并显示结果

period.apply(temps, INDEX = ep, FUN =
mean)

5、用 split-lapply-rbind分割数据并运算

#按周来划分数据,f参数是一个字符串,用于描述划分的间隔(例如:"months", "years")

data_weekly <- split(data, f =
"weeks")

#创建一个每周均值的列表

temps_avg <- lapply(X = data_weekly,
FUN = mean)

x_list_rbind <- do.call(rbind, temps_avg)

do.call(rbind, ...)

向rbind传送一个list,而不是一次传送一个对象。

6、单变量序列转换成OHLC数据(Open-High-Low-Close data

基于常规窗口整合不同频次的序列可以使分析更容易。

to.period()函数格式如下,参数包括序列x, 表示周期的字符k等

to.period(x,

period = "months",

k = 1,

indexAt,

name=NULL,

OHLC = TRUE,

...)

使用举例:

usd_eur_weekly <- to.period(usd_eur, period = "weeks")

usd_eur_yearly <- to.period(usd_eur, period = "years", OHLC =
FALSE)

7、转换成低频序列

to.period()也可将序列转换成低调整频次的数据,类似于二次抽样。

# 转换成季度OHLC格式

mkt_quarterly <- to.period(eq_mkt,
period = "quarters")

#使用快捷功能转换成季度OHLC格式

mkt_quarterly2 <- to.quarterly(eq_mkt,
name = "edhec_equity", indexAt = "firstof")

indexAt参数设置为firstof ,选取区间时间的起点。设置参数name可以改变每一列的基础名。

8、计算时间序列的滚动标准差

时间序列数据的另一个常用需求是在数据的滚动窗口应用函数。

xts 对象可使用zoo函数rollapply()来实行。

该函数参数有时间序列对象x,窗口大小width,应用于每个滚动周期的函数FUN。

Width参数规定了窗口中的观测值数量。例如,选取一个序列的10天滚动。

rollapply(x, width = 10, FUN = max, na.rm
= TRUE)

注意:如果是日观测值的序列是选取10天,如果是月观测值的序列会选取10个月。

七、修改时间戳

1、在高频次数据中发现具有相同时间戳的观测值时,一般有效的做法是强制时间唯一,增加毫秒随机数。

make.index.unique(data,eps= , 
drop=  ,…)

参数说明:

eps:epsilon or small change的缩写,控制相同的时间被扰乱的程度。

drop = TRUE:移除全部重复观测值。

举例

make.index.unique(x, eps = 1e-4)  #  增加随机数

make.index.unique(x, drop = TRUE) # 去除重复项

2、 某些情形时间戳过于精确,最好是近似到一些固定的间隔点。例如观测值可能在一小时内的任何时点发生,但只需记录最近的下个整点。

以下一个时间对齐数据,秒,分钟,小时。

align.time(data,n= )  
参数n,表示要近似到的秒数

align.time(x, n = 60) # 近似到分钟

时间: 2024-10-20 00:55:05

R语言时间序列数据应用xts的相关文章

R语言进行数据预处理

R语言进行数据预处理wranging li_volleyball 2016年3月22日 data wrangling with Rpackages:tidyr dplyr Ground rules library(tidyr) library(dplyr) ## ## Attaching package: 'dplyr' ## The following objects are masked from 'package:stats': ## ## filter, lag ## The follo

R语言进行数据预处理wranging

R语言进行数据预处理wranging li_volleyball 2016年3月22日 data wrangling with R used packagesP:tidyr dplyr Ground rules library(tidyr) library(dplyr) ## ## Attaching package: 'dplyr' ## The following objects are masked from 'package:stats': ## ## filter, lag ## Th

R语言将数据框转成xts

R语言初学者,不这么会,今天碰到的问题,差了好久才找到,原来如此简单 尼玛,下次再忘记抽自己3巴掌 转换的代码和结果

R语言之数据可视化 - R的绘图颜色

5. R语言绘图之 颜色 · grDevice 包 - colorRamp() 和 colorRampPalette() - 颜色名字可使用 colors() 获取 · RColorBrewer 包 - 三类调色板: 1. sequential:从一个极端渐变到另一个极端,适合用于呈现顺序数据 2. diverging:两端鲜艳而中间较淡,适合凸显处在极端的数值,即想强调高低对比时可选择 3. qualitative:颜色间对比鲜明,适合呈现分类变量 - 调色板信息可与 colorRamp /

R语言外部数据读取

0  引言 使用R语言.Python等进行数据处理的第一步就是要导入数据(也可以使用UCI数据集),下文主要根据R语言的帮助文档来介绍外部文件数据的导入方法和注意事项. 1 格式read.table read.table(file, header = FALSE, sep ="", quote = "\"'",dec = ".", skip = 0,strip.white = FALSE, blank.lines.skip =TRUE,

R语言之数据输入与输出

一.数据的录入与保存 1.算数表达式的输入与保存R中的算数表达式是直接输入的,输入完成之后按下回车便显示结果,如果想保存输入的结果,直接将其命名一个变量即可,如 > a<- 1+2> a[1] 3 将1+2的结果保存在a变量中,查看结果直接输入变量a即可 2.样本数据的输入与保存 <1>c()函数最常使用的是c()函数,括号内的内容可以是数字或文本,也可以是存储结果的变量,内容间用逗号分割,如果既有文本也有数字,那么数字将会被强制转换为文本.由于是手动输入,因此只适合数据较少

R语言时间序列应用(decompose、Holt-Winters初步)

对于明显的周期性时间序列,可以使用decompose函数对数据进行分解成季节部分.趋势部分.随机部分三种.decompose函数有两种type,即"additive"以及"multiplicative"两种,还有一个fliter选项,表示是否加入线性滤波,一般fliter选择NULL即可.下面的例子展现了使用decompose分析含有季节因素时间序列数据的例子 将某地区1962-1970年平均每头奶牛的月度产奶量数据导入outcome内.对于时间序列数据,常常还要使

R语言时间序列中的时间设置

时间序列的不同时间分段设置 1. 普通的时间序列:年.月.季 1 myserises<-ts(data,start=,end=,frequency=)#其中frequency=1代表年:frequency=12代表月:frequency=4代表季度数据 2. 如果以天为单位的时间序列 1 t<-ts(1:365,frequency=1,start=as.Date("2017-05-01")) 2 s<-as.Date("2017-05-01") 3

R语言时间序列ARMAX建模

建立ARMAX模型需要运用R的dse包,在R的dse包中The ARMA model representation is general, so that VAR, VARX,ARIMA, ARMAX, ARIMAX can all be considered to be special cases. 数据集为天然气炉中的天然气(input)与产生的CO2(output),数据来源为王燕应用时间序列分析第三版附录表A1-24,首先队数据做简要的分析,做出时序图以及协方差图 input<-ts(i