2

我让我们说一个具有以下值的 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

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

4

2 回答 2

4

当您使用 调用 apply 时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
}
于 2012-08-18T04:18:02.063 回答
2

@GSee 的回答解决了您的实际问题,但我发现这更直接:

dat$signal = (dat[,1] > dat[,2]) + 0

该部分(dat[,1] > dat[,2])创建 和 的向量TRUEFALSE当您向其中添加“0”时,将其转换为 0FALSE和 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
于 2012-08-18T04:35:15.210 回答