1

我想R结合使用quantmod来生成基于烛台图表模式的交易信号。我的计划是编写一个用户定义的函数,它根据 OHLC 数据计算每个时间段的信号。到目前为止,我所拥有的是:

getSymbols("IBM", src="google")
candle = function(data, ...)
{
    if (abs(Op(data)-Cl(data)) < (Op(data)*0.0005))
        doji = "doji"
    else
        doji = "non-doji"   
    return(doji)
}
apply.daily(IBM, FUN=candle)

此函数返回 xts 对象中每一天的值。现在我想在函数candle中添加一些基于上一个或下一个值的计算。如何访问相邻的值?

data我在函数中拥有的对象candle似乎只有一行(至少这是我调用时得到的nrow)。我尝试使用lag但我总是得到NA(大概是因为我的 xts 对象只有一行长)。

任何帮助,将不胜感激。此外,我很高兴在哪里可以了解更多关于 quantmod 的指针。网站上似乎暗示了某种工作流程,但我找不到真正的文档。

编辑:

我想澄清我的实际目标:

我将采用细粒度的 OHLC 数据并将其聚合到某个时间段(例如每小时)。因此,每一小时代表烛台图表中的一根烛台。

现在我正在通过这些数据点寻找特定的模式(例如,如果一根具有 x 属性的蜡烛棒后面跟着两个相同的蜡烛棒,然后是一根具有 y 属性的蜡烛棒)。

4

1 回答 1

1

apply.daily旨在用于日内数据。它按天拆分数据并将函数应用于每一天。由于您有每日数据,因此每天只有一行数据。

对于您到目前为止所显示的内容,无需使用apply.daily.

data(sample_matrix)
dat <- as.xts(sample_matrix)

# Create an object with the same index as dat, and fill with "non-doji"
doji <- xts(rep("non-doji", nrow(dat)), index(dat))
# now, anywhere your condition is true, replace "non-doji" with "doji"
# This takes advantage of the vectorized nature of R
doji[abs(Op(dat) - Cl(dat)) < (Op(dat) * 0.0005)] <- "doji"
tail(doji)
#           [,1]      
#2007-06-25 "non-doji"
#2007-06-26 "non-doji"
#2007-06-27 "doji"    
#2007-06-28 "non-doji"
#2007-06-29 "non-doji"
#2007-06-30 "non-doji"

虽然,我可能只是添加另一个名为“doji”的列,dat并在满足您的条件时给它一个值,否则为零。(请注意,xts 对象的所有数据必须属于同一类型)。

dat$doji <- 0 # create a column called "doji" and fill it with zeros
# now set "doji" to 1 anywhere your condition is true
dat$doji[abs(Op(dat) - Cl(dat)) < (Op(dat) * 0.0005)] <- 1

R> tail(dat)
               Open     High      Low    Close doji
2007-06-25 47.20471 47.42772 47.13405 47.42772    0
2007-06-26 47.44300 47.61611 47.44300 47.61611    0
2007-06-27 47.62323 47.71673 47.60015 47.62769    1
2007-06-28 47.67604 47.70460 47.57241 47.60716    0
2007-06-29 47.63629 47.77563 47.61733 47.66471    0
2007-06-30 47.67468 47.94127 47.67468 47.76719    0
于 2013-03-30T02:56:24.987 回答