我已经说过具有以下值的xts对象(数据)......
SPY.Adjusted SMA
2012-08-02 136.64 137.115
2012-08-03 139.35 137.995
2012-08-06 139.62 139.485
2012-08-07 140.32 139.970
2012-08-08 140.49 140.405
2012-08-09 140.61 140.550
2012-08-10 140.84 140.725
我正在尝试使用apply函数向其附加信号,如果满足某些条件...在这种情况下,当关闭> SMA。我的功能:
signal<-function(x,y,z)
{
z$signals<-ifelse(x>y,1,0)
}
我试着......
apply(data,1,FUN=signal(data$SPY.Adjusted,data$SMA,data))
返回错误:
Error in match.fun(FUN) : 'signal(data$SPY.Adjusted, data$SMA, data)'
is not a function, character or symbol
可能出现什么问题?我传入了一个函数,如果满足某些条件,它会进入传递给它的对象数据以创建一个新列。
答案 0 :(得分:4)
当您使用MARGIN=1
致电申请时,就像将每行传递给FUN
一样。您的功能已经过矢量化,因此您不需要使用apply
。但是,您的功能不会返回任何内容。试试这个:
library(quantmod)
getSymbols("SPY", src='yahoo', from='2010-01-01', to='2012-01-01')
dat <- cbind(Ad(SPY), SMA=SMA(Ad(SPY)))
signal<-function(x,y,z)
{
z$signals<-ifelse(x>y,1,0)
z
}
tail(signal(dat[, 1], dat[, 2], dat))
# SPY.Adjusted SMA signals
#2011-12-22 124.08 121.693 1
#2011-12-23 125.19 121.805 1
#2011-12-27 125.29 122.108 1
#2011-12-28 123.64 122.361 1
#2011-12-29 124.92 122.871 1
#2011-12-30 124.31 123.276 1
实际上,我试图在这种情况下避免ifelse
,因为它比这样做慢
signal<-function(x,y,z)
{
z$signals <- 0
z$signals[x > y] <- 1
z
}
答案 1 :(得分:2)
@ GSee的answer解决了您的实际问题,但我发现这更加直接:
dat$signal = (dat[,1] > dat[,2]) + 0
部分(dat[,1] > dat[,2])
会创建TRUE
和FALSE
的向量,当您向其添加“0”时,会将其转换为0表示FALSE
和1表示TRUE
。
(在此示例中,dat
与@ GSee的dat
相同。)
当然,您可以使用它来匹配多个条件:
set.seed(1)
dat$SAMPLE = sample(as.vector(c(dat$SPY.Adjusted, dat$SMA)), nrow(dat))
dat$signal = (dat$SPY.Adjusted > dat$SMA & dat$SPY.Adjusted > dat$SAMPLE) + 0
tail(dat, 15)
# SPY.Adjusted SMA SAMPLE signal
# 2011-12-09 124.07 122.421 125.990 0
# 2011-12-12 122.26 122.864 124.260 0
# 2011-12-13 121.11 123.159 128.350 0
# 2011-12-14 119.82 122.839 114.966 0
# 2011-12-15 120.26 122.565 128.490 0
# 2011-12-16 120.44 122.320 126.486 0
# 2011-12-19 119.15 121.812 128.598 0
# 2011-12-20 122.75 121.660 127.605 0
# 2011-12-21 122.99 121.485 119.150 1
# 2011-12-22 124.08 121.693 116.030 1
# 2011-12-23 125.19 121.805 104.870 1
# 2011-12-27 125.29 122.108 116.460 1
# 2011-12-28 123.64 122.361 126.127 0
# 2011-12-29 124.92 122.871 119.750 1
# 2011-12-30 124.31 123.276 104.110 1