1

私の目標は、同じデータ構造と高速で、5 株 (xts オブジェクト) の毎日のリターンを 90 日間のルックバック期間 (過去 90 日間のリターンの SD を計算) のローリング標準偏差にマッピングすることです。 . コア関数「lapply」を使用したアプローチはうまく機能します。ただし、snowfall パッケージの並列アプローチ「sfLapply」は、何らかの理由で機能しませんでした。ここにイラストがあります:

ライブラリの初期化とデータセットとパラメータのシミュレーション:

require(PerformanceAnalytics)
require(quantmod)
require(snowfall)

adjReturns <- replicate(5, rnorm(10000, mean = 0.01, sd = 0.008))
colnames(adjReturns) <- c('stock1','stock2','stock3','stock4','stock5')
timeIndex <- seq.Date(as.Date("2015-01-01", "%Y-%m-%d"), by ="day", length.out = 10000)
adjReturns <- as.xts(adjReturns, order.by = timeIndex)

lapply を使用してローリング SD を計算すると、機能するソリューションが得られます。

rollingSD <- list()
rollingSD <- lapply(adjReturns, function(x) apply.rolling(x, width = 90, FUN = "sd"))
rollingSD <- do.call(cbind, rollingSD)

動作しなかった並列バージョンは次のとおりです。

sfInit(parallel = TRUE, cpus = 4, type = "SOCK", socketHosts = rep("localhost", 2))
sfLibrary(snowfall)
sfLibrary(PerformanceAnalytics)
sfLibrary(xts)
sfLibrary(quantmod)
sfExportAll()

rollingSDSnow <- list()
rollingSDSnow <- sfLapply(adjReturns, function(x) apply.rolling(x, width = 90, FUN = "sd"))
rollingSDSnow <- do.call(cbind, rollingSDSnow)

sfStop()

上記のコードは、次のエラーを返します。

Error in `[.xts`(x, i) : subscript out of bounds

独自の for ループを作成していないため、なぜこのエラーが発生するのかわかりません。考えられる間違いを指摘してください。どんな考えでも大歓迎です。助けてくれてありがとう!

環境: R:3.2.0/ RStudio:0.99.472 / 雪:0.3-13 / 降雪:1.84-6/ xts:0.9-7/ PerfomanceAnalytics:1.4.3541

PS runSD は、apply.rolling の代わりに使用できます。apply.rolling は、さまざまな関数で機能するため、使用されます。

4

1 に答える 1

1

は次のtracebackとおりです。

> rollingSDSnow <- sfLapply(adjReturns, function(x) apply.rolling(x, 90, FUN = sd))
Error in `[.xts`(x, i) : subscript out of bounds
> traceback()
13: stop("subscript out of bounds")
12: `[.xts`(x, i)
11: x[i]
10: FUN(X[[i]], ...)
9: lapply(splitIndices(length(x), ncl), function(i) x[i])
8: splitList(x, length(cl))
7: staticClusterApply(cl, fun, length(x), argfun)
6: clusterApply(cl, splitList(x, length(cl)), lapply, fun, ...)
5: lapply(args, enquote)
4: do.call("fun", lapply(args, enquote))
3: docall(c, clusterApply(cl, splitList(x, length(cl)), lapply, 
       fun, ...))
2: parLapply(sfGetCluster(), x, fun, ...)
1: sfLapply(adjReturns, function(x) apply.rolling(x, 90, FUN = sd))

splitList関数は失敗しているものです。リスト ( の「L」sfLapply) が必要なため失敗しますが、xts オブジェクトを渡しました。xts オブジェクトのlengthは観測数であり、範囲外であるxtsオブジェクトの th 行x[i]を返そうとします。iinrow(x)*ncol(x)


解決策はsfApply代わりに使用することです(実行が完了するrunSDのを待ちたくないので使用します)。apply.rolling

rollingSD <- list()
rollingSD <- lapply(adjReturns, runSD, n=90)
rollingSD <- do.call(cbind, rollingSD)

sfInit(parallel = TRUE, cpus = 4, type = "SOCK", socketHosts = rep("localhost", 2))
sfLibrary(snowfall)
sfLibrary(quantmod)
sfExportAll()
rollingSDSnow <- list()
rollingSDSnow <- sfApply(adjReturns, 2, runSD, n=90)
rollingSDSnow <- xts(rollingSDSnow, index(adjReturns))
sfStop()

all.equal(rollingSDSnow, rollingSD)
# [1] TRUE
于 2015-09-14T12:02:33.987 に答える