r - 优化 R 代码 - S&P500 系列的抽样返回

标签 r optimization

我试图了解“获胜百分比”如何影响交易策略的返回。

我下载了标准普尔的价格并计算每日返回。然后,我随机选择这些返回的 x% 并说我正确预测了它的方向,因此返回为正。对于剩下的 1-x%,我说我错了,返回是负数。我重复这个过程 1000 次并收集年化几何返回。

我以 0.01 的增量间隔将 x 从 0.5 更改为 0.6。

这是我的代码:

library(quantmod)
library(multicore)

getSymbols("^GSPC", from = "1950-1-1")
ret <- ROC(GSPC)[-1,4]

set.seed(123)

winpct <- seq(0.5, 0.6, 0.01)
ret <- coredata(ret)

system.time(res <- simplify2array(mclapply(winpct, function(x) replicate(1000, drawsample(ret, x)))))

drawsample <- function(ret, winpct){
  len = length(ret)
  ret = abs(ret)

  win = sample(1:len, round(winpct * len))
  a = c(ret[win], -ret[-win])
  return(prod(1 + a) ^ (252 / length(a)) - 1)
}

所用时间:

   user  system elapsed 
 18.904   0.842   5.580 

我可以做进一步的优化来加快速度吗?

最佳答案

我做了以下两项调整:

1/使用 exp(sum(a)) 而不是 prod(1+a)。我认为您无论如何都想要这个,因为您已经使用 ROC(GSPC)[-1,6] 创建了一个日志返回系列。根据 rbenchmark,这使我的速度提高了约 7%。

2/从c(-1,-1)中采样得到ret序列的长度,然后与ret序列相乘,得到有符号序列的返回。这让我又赚了 30%。

请注意,在我的代码中,我已将您的 a 重命名为 bin

drawsample2 <- function(ret, winpct){
  len = length(ret)
  win = sample(c(-1,1), len, replace=TRUE, prob = c((1-winpct), winpct))
  ret <- abs(ret)
  bin <- ret*win
  return(exp(sum(bin))^(252/length(ret)) - 1)
}

针对您的 drawsample() 进行基准测试,我获得了约 37% 的加速。

bb <- benchmark(simplify2array(mclapply(winpct, function(x) replicate(1000, drawsample(ret, x)))), 
          simplify2array(mclapply(winpct, function(x) replicate(1000, drawsample2(ret, x)))),
          columns =c('test', 'elapsed', 'relative'),
          replications = 10,
          order = 'elapsed')

在我的 MBP 上,以下是基准:

> bb

  elapsed relative
2  17.254    1.000
1  27.734    1.607

关于r - 优化 R 代码 - S&P500 系列的抽样返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13909761/

相关文章:

r - 在 rpart.plot 中格式化拆分标签

使用 gcc 展开循环的正确方法

performance - 并行成本和并行工作有什么区别?

.net - 在 .NET3.5 中优化独立的 foreach 迭代

r - 在 super 计算机上并行化,然后合并并行结果 (R)

r - 无法在 R 上安装包

R:在逻辑回归上使用 Caret 进行交叉验证的特征选择

r - 如何在列名中间按字符折叠数据框列?

c++ - 在 C++ 中对大量元素进行分组的最快方法

performance - 分析 Haskell 函数的运行时效率