3

と呼ばれる独自の関数を設計しましたSharpeRatio(data)

data は nx2 行列です。

この関数は特定のマトリックス dat に対して正常に動作しますが、使用しようとするrollapply(dat, 20, SharpeRatio)と次のエラーが発生します: dat[, 1] のエラー: 次元の数が正しくありません

関数の定義は次のとおりです。

SharpeRatio <- function(dat){
  Returns = dat[,1]
  RiskFree = dat[,2]

  ER = (Returns - RiskFree)/100
  Volatility = sd(Returns/100)
  return((exp(mean(log(1+ER))) - 1)/Volatility)
}
4

3 に答える 3

7

rollapply配列のローリング マージンに関数を適用します。しかし、これは列ごとに行われます。つまり、関数に配列を提示するのではなく、ベクトルを N 回 (この場合は N=2) 提示します。

次に例を示します。

(m <- matrix(1:10, ncol=2))
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10

を実行し、各反復で何が渡されるかを確認しますrollapplymean

y <- rollapply(m, width=2, FUN=function(x) {print(x); mean(x)})
## [1] 1 2
## [1] 2 3
## [1] 3 4
## [1] 4 5
## [1] 6 7
## [1] 7 8
## [1] 8 9
## [1]  9 10

関数には行列は渡されず、個々のベクトルのみが渡されます。 rollapply次に、結果を正しい形状の配列としてパッケージ化します。

y
##      [,1] [,2]
## [1,]  1.5  6.5
## [2,]  2.5  7.5
## [3,]  3.5  8.5
## [4,]  4.5  9.5

修正は Grothendieck 氏のコメントにありby.column=FALSEますrollapply

z <- rollapply(m, width=2, by.column=FALSE, FUN=function(x) {print(x); colMeans(x)})
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
##      [,1] [,2]
## [1,]    2    7
## [2,]    3    8
##      [,1] [,2]
## [1,]    3    8
## [2,]    4    9
##      [,1] [,2]
## [1,]    4    9
## [2,]    5   10

ここでは、それぞれ 2 行の行列が関数に渡されています。結果は上記と同じです。

z
##      [,1] [,2]
## [1,]  1.5  6.5
## [2,]  2.5  7.5
## [3,]  3.5  8.5
## [4,]  4.5  9.5
于 2014-01-28T04:28:22.663 に答える
6

rollapplyby.column=FALSE引数が使用されていない限り、列ごとに機能するので、これを試してください:

rollapply(dat, 20, SharpeRatio, by.column = FALSE)
于 2014-01-28T13:11:00.843 に答える
0

行列を取得する現在のロール適用では、「不正な次元数」が返されます。これは、行列を取得するためのものではないためです。私は自分のものを書きました

rollmatapply <- function(m,by=100,FUN)
{
  v = vector()  
  for(i in 1:(nrow(m)-by))
  {
    v[i] = do.call(FUN,list(m[i:(by+i-1),]))
  }
  v
}
于 2018-07-16T13:09:21.367 に答える