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関数を使用しようとしています...この場合、close>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])はとのベクトルを作成します。これに「0」を追加するTRUEFALSE、の場合は0に、の場合はFALSE1に変換され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 に答える