为什么xts :: apply.daily失败了cummin或cummax?

时间:2013-11-09 09:18:51

标签: r xts finance

我正在尝试做一件非常简单的事情:以这样的方式转换OHLC货币数据:我将Hi替换为最大值,直到某一天的那个时刻,并用最小的低值替换Lo,直到那一刻某一天的时间。

require(quantmod)
require(FinancialInstrument)

Symbols <- "EURUSD"

base_dir <- "/home/samop/data/sources/truefx/" 
sec_dir <- paste0(base_dir, "sec/")

EURUSD.sec <- getSymbols(Symbols, src='FI', dir=sec_dir, extension='RData', split_method='days', from='2009-10-07', to='2011-09-15', days_to_omit="Saturday", auto.assign=FALSE)
EURUSD.min <- to.minutes(EURUSD.sec)

EURUSD.min.Lo.cumulative <- apply.daily(Lo(EURUSD.min), cummin)
EURUSD.min.Hi.cumulative <- apply.daily(Hi(EURUSD.min), cummax)

EURUSD.min.OHLC.cumulative <- cbind(Cl(EURUSD.min), EURUSD.min.Hi.cumulative, EURUSD.min.Lo.cumulative, Cl(EURUSD.min))

失败了:

> EURUSD.min.Lo.cumulative <- apply.daily(Lo(EURUSD.min), cummin)
> EURUSD.min.Hi.cumulative <- apply.daily(Hi(EURUSD.min), cummax)
> EURUSD.mi.cumulative <- cbind(Op(EURUSD.min), EURUSD.min.Hi.cumulative, EURUSD.min.Lo.cumulative, Cl(EURUSD.min))
Error in merge.xts(..., all = all, fill = fill, suffixes = suffixes) : 
  (list) object cannot be coerced to type 'double'

有趣的是:

> head(cummin(Lo(EURUSD.min["2011-09-15"])))
                    EURUSD.sec.Low
2011-09-15 00:00:59        1.37446
2011-09-15 00:01:59        1.37446
2011-09-15 00:02:58        1.37446
2011-09-15 00:03:59        1.37446
2011-09-15 00:04:57        1.37446
2011-09-15 00:05:59        1.37446
Warning message:
timezone of object (GMT) is different than current timezone (UTC). 
> apply.daily(Lo(EURUSD.min["2011-09-15"]), cummin)
Error in array(r, dim = d, dimnames = if (!(is.null(n1 <- names(x[[1L]])) &  : 
  length of 'dimnames' [1] not equal to array extent

所以,cummin有效,但应用包裹在xts :: apply.daily失败......

我能在这里做些更聪明的事吗?

注意:我使用以下脚本从TrueFX下载了数据:https://r-forge.r-project.org/scm/viewvc.php/pkg/FinancialInstrument/inst/parser/download.TrueFX.R?view=markup&revision=1349&root=blotter

1 个答案:

答案 0 :(得分:1)

apply.daily是一个聚合函数,因此它希望传递给它的函数每列返回一个观察值。 cummin会返回一个向量,这就是为什么它不能与apply.daily一起使用。

我认为ave符合您的要求:

EURUSD.cumulative.Lo <- ave(Lo(EURUSD.min), .indexday(EURUSD.min), FUN=cummin)
EURUSD.cumulative.Hi <- ave(Hi(EURUSD.min), .indexday(EURUSD.min), FUN=cummax)