这里我有这样的数据:
time price volume price*volume
14:56:42 31.15 173 540327
14:56:36 31.15 100 311500
14:56:27 31.16 4 12464
14:56:24 31.16 1 3116
14:56:21 31.16 46 143336
14:56:18 31.15 32 99680
14:56:15 31.16 6 18696
14:56:12 31.16 12 37392
14:56:06 31.16 15 46740
14:56:03 31.16 54 168264
14:55:57 31.19 1 3119
14:55:54 31.19 10 31190
当我使用to.period()
时,它只返回一个价格为ohlc的xts对象,数量和价格*数量缺失,我将如何将这样的数据转换为5min OHLCV
答案 0 :(得分:2)
这是一个自定义功能:
period.apply.ohlc <- function(x,FUN= 'mean',INDEX=endpoints(x,"mins",k=1)){
ll <- sapply(1:(length(INDEX) - 1), function(y) {
xi <- x[(INDEX[y] + 1):INDEX[y + 1]]
sapply(xi,FUN)
})
xts(t(ll),order.by=index(dat.xts[INDEX]))
}
period.apply.ohlc(dat.xts)
# price volume price_volume
# 2013-11-10 14:55:57 31.190 5.5 17154.5
# 2013-11-10 14:56:42 31.157 44.3 138151.5
其中dat.xts
:
dat.xts <- read.zoo(text='time price volume price_volume
14:56:42 31.15 173 540327
14:56:36 31.15 100 311500
14:56:27 31.16 4 12464
14:56:24 31.16 1 3116
14:56:21 31.16 46 143336
14:56:18 31.15 32 99680
14:56:15 31.16 6 18696
14:56:12 31.16 12 37392
14:56:06 31.16 15 46740
14:56:03 31.16 54 168264
14:55:57 31.19 1 3119
14:55:54 31.19 10 31190',tz="",index=1,format="%H:%M:%S",header=TRUE)
答案 1 :(得分:1)
借用agstudy答案的数据(因此制作1分钟,而不是5分钟),我会用这个:
dat.xts <- as.xts(dat.xts) ## otherwise you get an error align.time
## since (dat.xts is a zoo object)
bars <- period.apply(dat.xts,
endpoints(dat.xts,"secs",60),
function(xx){
ticks=coredata(xx$price)
c( first(ticks),max(ticks), min(ticks),
last(ticks), sum(xx$volume), sum(xx$price_volume) )
})
colnames(bars) <- c("Open","High","Low","Close","Volume","Price*Volume")
align.time(bars,60)
即。 period.apply()
给出一个xts对象,持有给定1分钟的刻度。我使用first
,max
,min
和last
来制作OHLC数据。 (我必须使用coredata
否则这些函数会抱怨。)
然后将volume和price_volume汇总为每个时期。
在主循环之后,我分配列标题,并将时间戳向上舍入。输出是:
Open High Low Close Volume Price*Volume
2013-11-11 14:56:00 31.19 31.19 31.19 31.19 11 34309
2013-11-11 14:57:00 31.16 31.16 31.15 31.15 443 1381515