我想将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的蜡烛)。
答案 0 :(得分: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"
虽然,我可能只会向dat
添加另一个名为“doji”的列,并在满足条件时将其值设为1,否则为零。 (请注意,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