将函数应用于xts对象

时间:2012-08-18 04:05:46

标签: r xts

我已经说过具有以下值的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

可能出现什么问题?我传入了一个函数,如果满足某些条件,它会进入传递给它的对象数据以创建一个新列。

2 个答案:

答案 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])会创建TRUEFALSE的向量,当您向其添加“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