## x y
## 2018-01-04 107 112
## 2018-01-07 111 111
cumsum()
, cumprod()
,
cummin()
, cummax()
等函数仍可作用到zoo时间序列的每个序列上。
如果序列是价格,用如下方法计算简单收益率与对数收益率:
## x y
## [1,] 9 10
## [2,] 10 13
## [3,] 10 9
## [4,] 5 10
## [5,] 9 8
## [6,] 5 13
## [7,] 8 8
## [8,] 9 11
## [9,] 5 10
## [10,] 6 13
## [11,] 7 8
## [12,] 5 13
## 2018-01-01 2018-01-02 2018-01-03 2018-01-04 2018-01-05 2018-01-06 2018-01-07
## NA NA 1.3038405 1.3038405 1.0000000 1.0000000 0.8366600
## 2018-01-08 2018-01-09 2018-01-10 2018-01-11 2018-01-12
## 0.8366600 0.5477226 0.5477226 NA NA
对一些常用的滚动计算zoo包含提供了单独的函数,
rollmean()
, rollmedian()
, rollmax()
, rollsum()
,
这几个是结果时间点对应滚动窗口中心的。
而rollmeanr()
, rollmedianr()
, rollmaxr()
, rollsumr()
则是结果时间点对准滚动窗口末尾时间点的。
xts包的设计目标是使得以xts为输入的函数可以兼容其它时间序列类型的输入,
并可以很方便地增加属性。
xts包提供了xts时间序列类型,
这本质上是zoo包的zoo类型,
所以针对zoo类型的做法也适用于xts类型。
xts类型与zoo类型的差别如下:
xts类型必须使用正式的时间类型作为时间下标,
zoo类型的时间下标更普遍。
xts目前仅允许使用Date, POSIXct, chron, yearmon, yearqtr, timeDate作为时间下标。
xts包含一些独有的内部属性,
包括.CLASS
, .ROWNAMES
等。
这是为了能够无损地与其他时间序列类型互相转换而保存的其它时间序列类型的部分额外信息。
xts具有用户添加属性。
这使得xts类型是用户可定制的数据类型,
用户可以随意添加或者删除自定义属性,
不会影响到数据的显示和计算。
与其他时间序列类型互相转换所需的部分额外信息也保存为用户添加属性。
## [,1]
## 1月 1949 112
## 2月 1949 118
## 3月 1949 132
## 4月 1949 129
## 5月 1949 121
## 6月 1949 135
## 7月 1949 148
## 8月 1949 148
## 9月 1949 136
## 10月 1949 119
## 11月 1949 104
## 12月 1949 118
又比如,设x
是某个股票的每分钟的数据,
则x["2018-01-18 08"]
取出2018-1-18 8:00-9:00之间的所有数据。
也可以用"from/to"
的格式指定一个日期时间范围,
而且也不需要开始点和结束点恰好有数据,
from
和to
的时间精度也不需要与数据的实际采样频率相同。
省略from
则从头开始,
省略to
则直到末尾。
## [,1]
## 2018-01-10 5
## 2018-01-11 5
## 2018-01-12 4
first(x, n)
和last(x, n)
类似于head(x, n)
和last(x, n)
,
但是对xts对象x
,n
除了可以取正整数值以外,
还允许用字符串指定时间长度,
允许的单位包括
secs, seconds, mins, minutes, hours, days, weeks, months, quarters, years。
比如,取出开头的三个月:
endpoints(x, on)
给出按某种频率的分界点,
频率包括"us"
(微秒), "microseconds"
,
"ms"
(毫秒), "milliseconds"
,
"secs"
, "seconds"
,
"mins"
, "minutes"
,
"hours"
, "days"
,
"weeks"
, "months"
, "years"
。
## [1] 0 12 24 36 48 60 72 84 96 108 120 132 144
结果是分组用的坐标,
对输出\(t_0, t_1, \dots, t_n\),
\((t_{i-1}, t_i], i=1,2,\dots,n\)是结果分出的区间。
对于OHLC形式的金融时间序列,
即开盘价(open)、最高价(high)、最低价(low)、收盘价(close)四个成分的时间序列,
并且成分变量名也采用Open
, High
, Low
, Close
,
可以用to.period(x, period)
将其降频成period
指定的采样频率。
比如,对分钟数据x
,
可以用to.period(x, period="days")
降频成日数据。
降频后时间点一般采用每个周期内最后一个时间点,
可以用indexAt
选项指定其他的时间点选择。
如果x
是分钟数据,
to.minutes3(x)
,
to.minutes5(x)
,
to.minutes10(x)
,
to.minutes15(x)
,
to.minutes30(x)
,
to.hourly(x)
将x
降频为3分钟到60分钟的数据。
to.daily(x)
将x
降频为每天的数据,
并在时间下标中删去时间部分。
to.weekly(x)
将x
降频为每周的数据,
并在时间下标中删去时间部分,
日期采用每周最后一天(周六)的日期。
to.monthly(x)
将x
降频到月度数据并将时间下标改为yearmon类型,
toquarterly(x)
将x
降频到季度数据并将时间下标改为yearqtr类型。
toyearly(x)
将x
降频到年度数据,日期采用每年有数据的最后一天的日期。
如果数据中原来有成交量,
这些降频函数也会计算合并的成交量。
如果x
是一元时间序列,
to.period(x, period)
可以将其降频并得到OHLC四个序列,
比如,从收盘价日数据可以降频得到周数据的开盘、最高、最低、收盘,
但是并不是严格意义上的开盘、最高、最低。
## [,1]
## 12月 1949 126.6667
## 12月 1950 139.6667
## 12月 1951 170.1667
## 12月 1952 197.0000
## 12月 1953 225.0000
## 12月 1954 238.9167
## 12月 1955 284.0000
## 12月 1956 328.2500
## 12月 1957 368.4167
## 12月 1958 381.0000
## 12月 1959 428.3333
## 12月 1960 476.1667
常用操作如求和等有专门的函数,
如period.sum()
, period.min()
,
period.max()
, period.prod()
。
专用函数运行效率更高。
常用的周期也有专门的函数,
如apply.daily()
, apply.weekly()
,
apply.monthly()
, apply.quarterly()
,
apply.yearly()
。
这些函数实际是调用period.apply()
。