优化R代码-S&;的采样返回;P500系列
我试图了解“获胜百分比”如何影响交易策略的回报 我下载标准普尔的价格并计算每日回报。然后,我随机选择这些回报的x%,并说我正确地预测了它的方向,所以回报是正的。对于剩余的1-x%,我说我错了,回报率为负。我重复这个过程1000次,然后收集年化几何回报 I以0.01增量间隔将x从0.5变化到0.6 这是我的密码:优化R代码-S&;的采样返回;P500系列,r,optimization,R,Optimization,我试图了解“获胜百分比”如何影响交易策略的回报 我下载标准普尔的价格并计算每日回报。然后,我随机选择这些回报的x%,并说我正确地预测了它的方向,所以回报是正的。对于剩余的1-x%,我说我错了,回报率为负。我重复这个过程1000次,然后收集年化几何回报 I以0.01增量间隔将x从0.5变化到0.6 这是我的密码: library(quantmod) library(multicore) getSymbols("^GSPC", from = "1950-1-1") ret <- ROC(GS
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)
}
我可以做进一步的优化来加快速度吗?我做了以下两个调整: 1/使用
exp(sum(a))
而不是prod(1+a)
。我认为您无论如何都希望这样,因为您已经用ROC(GSPC)[-1,6]
创建了一个日志返回系列。根据rbenchmark
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)
}
在我的MBP中,以下是基准:
> bb
elapsed relative
2 17.254 1.000
1 27.734 1.607
这里有一个函数的调整,对于较大的对象更快。我删除了对mclappy
的调用,以避免多核处理所需的网络开销,从而隔离函数的性能
drawsample_r <- 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_j <- function(ret, winpct){
len <- length(ret)
win <- c(-1L,1L)[sample.int(2L,len,TRUE,c(1-winpct,winpct))]
exp(sum(abs(ret)*win))^(252L/len)-1L
}
library(rbenchmark)
set.seed(123)
ret <- rnorm(1e6)/100 # 1 million observations
winpct <- seq(0.5, 0.6, 0.01)
benchmark(sapply(winpct, drawsample_r, ret=ret),
sapply(winpct, drawsample_j, ret=ret),
replications=10, order='elapsed')[,1:5]
# test replications elapsed relative user.self
# 2 sapply(winpct, drawsample_j, ret=ret) 10 6.963 1.000 6.956
# 1 sapply(winpct, drawsample_r, ret=ret) 10 10.852 1.559 10.689
drawsample\u r+1。这是一个非常好的调整。一般来说,显式使用整数会加快速度吗?@ricardo:是的,对于RAM速度成为瓶颈的大向量,整数比双倍快得多。在这种情况下,它们在创建win
时帮助最大;我怀疑在最后一行中转换为整数会有多大影响。
> bb
elapsed relative
2 17.254 1.000
1 27.734 1.607
drawsample_r <- 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_j <- function(ret, winpct){
len <- length(ret)
win <- c(-1L,1L)[sample.int(2L,len,TRUE,c(1-winpct,winpct))]
exp(sum(abs(ret)*win))^(252L/len)-1L
}
library(rbenchmark)
set.seed(123)
ret <- rnorm(1e6)/100 # 1 million observations
winpct <- seq(0.5, 0.6, 0.01)
benchmark(sapply(winpct, drawsample_r, ret=ret),
sapply(winpct, drawsample_j, ret=ret),
replications=10, order='elapsed')[,1:5]
# test replications elapsed relative user.self
# 2 sapply(winpct, drawsample_j, ret=ret) 10 6.963 1.000 6.956
# 1 sapply(winpct, drawsample_r, ret=ret) 10 10.852 1.559 10.689