我的目标是使用相同的数据结构和快速的速度将 5 只股票(xts 对象)的每日回报映射到 90 天回顾期的滚动标准差(计算过去 90 天回报的 SD) . 使用核心功能“lapply”的方法效果很好。但是,由于某些原因,降雪包中的并行方法“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 是因为它可以使用不同的功能。