itc*_*lpl 3 r time-series aggregate-functions
我有以下OHLC数据(每隔3分钟)
library(tseries)
library(xts)
library(quantmod)
> str(tickmin)
An ‘xts’ object from 2010-06-30 15:47:00 to 2010-09-08 15:14:00 containing:
Data: num [1:8776, 1:5] 9215 9220 9205 9195 9195 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:5] "zv.Open" "zv.High" "zv.Low" "zv.Close" ...
Indexed by objects of class: [POSIXct,POSIXt] TZ:
xts Attributes:
NULL
>tickmin
2010-09-08 15:02:00 20
2010-09-08 15:04:00 77
2010-09-08 15:08:00 86
2010-09-08 15:11:00 7
2010-09-08 15:14:00 43
> start(tickmin)
[1] "2010-06-30 15:47:00 EDT"
> end(tickmin)
[1] "2010-09-08 15:14:00 EDT"
Run Code Online (Sandbox Code Playgroud)
我试图使用以下内容聚合它:
> by <-timeSequence(from = start(tickmin), to = end(tickmin), format="%Y-%m-%d %H%M", by = "day")
>by
[61] [2010-08-29 19:47:00] [2010-08-30 19:47:00] [2010-08-31 19:47:00]
[64] [2010-09-01 19:47:00] [2010-09-02 19:47:00] [2010-09-03 19:47:00]
[67] [2010-09-04 19:47:00] [2010-09-05 19:47:00] [2010-09-06 19:47:00]
[70] [2010-09-07 19:47:00]
> aggregate(Vo(tickmin),by,sum)
Error: length(time(x)) == length(by[[1]]) is not TRUE
Run Code Online (Sandbox Code Playgroud)
..会不会对如何解决错误提出任何建议.
mat*_*fee 23
我会解释你的错误并告诉你如何解决它,但是有更好的方法来做你正在做的事情.所以一定要读完我的答案!
从错误消息中,您的长度by与长度不同Vo(tickmin).您必须生成by每个相应值的一个值tickmin.
作为一个例子,我生成一个xts对象:
# generate a set of times from 2010-06-30 onwards at 20 minute intervals
tms <- as.POSIXct(seq(0,3600*24*30,by=60*20),origin="2010-06-30")
n <- length(tms)
# generate volumes for those intervals, random 0 -- 100, turn into xts object
xts.ts <- xts(sample.int(100,n,replace=T),tms)
colnames(xts.ts)<-'Volume'
Run Code Online (Sandbox Code Playgroud)
产量:
> head(xts.ts)
Volume
2010-06-30 00:00:00 97
2010-06-30 00:20:00 78
2010-06-30 00:40:00 38
2010-06-30 01:00:00 86
2010-06-30 01:20:00 79
2010-06-30 01:40:00 55
Run Code Online (Sandbox Code Playgroud)
要访问xts.ts您使用的日期,index(xts.ts)它会提供一大堆日期字符串,例如"2010-07-30 00:00:00 EST".
要将这些舍入到最近的一天,您可以使用as.Date:
> as.Date(index(xts.ts))
[1] "2010-06-29" "2010-06-29" "2010-06-29" "2010-06-29" "2010-06-29"
....
Run Code Online (Sandbox Code Playgroud)
然后用aggregate你做:
> aggregate(Vo(xts.ts),as.Date(index(xts.ts)),sum)
2010-06-29 1858
2010-06-30 3733
2010-07-01 3906
2010-07-02 3359
2010-07-03 3838
...
Run Code Online (Sandbox Code Playgroud)
该xts包装具有的功能apply.daily,apply.monthly等等(用途ls('package:xts'),看看有什么功能它都有-有可能是那些你感兴趣的).
apply.daily(x,FUN,...)不正是你想要的.见?apply.daily.要使用它,您可以:
> apply.daily(xts.ts,sum)
Volume
2010-06-30 23:40:00 4005
2010-07-01 23:40:00 4093
2010-07-02 23:40:00 3419
2010-07-03 23:40:00 3737
...
Run Code Online (Sandbox Code Playgroud)
或者,如果你的xts对象有其他栏目一样Open,Close等等,你可以做apply.daily(xts.ts, function(x) sum(Vo(x))).
请注意,使用apply.daily该aggregate ... as.Date方法时答案略有不同.这是因为apply.daily每天去start(xts.ts)到end(xts.ts)(或多或少),而aggregate只是去一天从午夜到午夜.
看看你的问题,apply.daily似乎最接近你想要做的事情(xts无论如何都提供,所以为什么不使用它?)